Wednesday, September 14, 2011


The below assembly code loads the secondary bootloader (boot2.bin) at address 0x8000 from the FAT12 filesystem and jumps to it.

;    File name : boot.asm |
;    Authour : M.Alexander |
;    Mail : |
;    Date : 09-05-2004 |
;    Description : Primary Bootloader |

[BITS 16]

; Memory Map
; |
;      _____________________ |
;     |    |  <-- 0x0000 |
;     |    | |
;     |        STACK    | |
;     |    | |
;     |_____________________|  <-- 0x05FF |
;     |    |  <-- 0x0600 |
;     |       FAT COPY    | |
;     |_____________________|  <-- 0x1800 |
;     |////////UNUSED///////| |
;     |_____________________|  <-- 0x2000 |
;     |    | |
;     |    ROOT DIRECTORY   | |
;     |_____________________|  <-- 0x3C00 |
;     |/////////////////////| |
;     |////////UNUSED///////| |
;     |/////////////////////| |
;     |_____________________|  <-- 0x7C00 |
;     |    | |
;     |_____________________|  <-- 0x7E00 |
;     |/////////////////////| |
;     |///////UNUSED////////| |
;     |/////////////////////| |
;     |_____________________|  <-- 0x8000 |
;     |    | |
;     |_____________________|  <-- ?? |
; |

%define FAT_CPY 0x0600
%define DIR_CPY 0x2000
%define SEC_BL 0x8000

[org 0x7C00]

jmp short start

BYTES_PER_SCT dw 0200h
NO_OF_FATS db 02h
ROOT_ENT dw 0E0h
NO_OF_SCTS dw 0B40h
SCTS_PER_TRK dw 012h
HDS_PER_CYL dw 02h
HDN_SCTS dd 0h


mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax       ; Initialize segment registers
mov ax, 0x5ff
mov sp, ax       ; Setup Stack space

sti       ; Enable Interrupts

;     Loads FAT copy into main memory at address 0x0600      |

xor ax, ax
add word ax, [RESERVED_SCTS]
call trans_add
mov ah, 0x02
mov al, [SCTS_PER_FAT]
mov dl, 0x00
mov bx, FAT_CPY
int 13h

;     Loads Directory Entries into main memory at     |
;     address 0x0600     |

mov al, [SCTS_PER_FAT]
mul byte [NO_OF_FATS]
add word ax, [RESERVED_SCTS]
call trans_add
mov ah, 0x02
mov al, 0x0E
mov dl, 0x00
mov bx, DIR_CPY
int 13h

;  Calculates the start of data area and saves it in the     |
;  variable DATA_AREA for future use.     |

mov ax, [SCTS_PER_FAT]
mov bx, [NO_OF_FATS]
mul bx
mov bx, ax
mov ax, [ROOT_ENT]
shl ax, 0x05
shr ax, 0x09
add ax, bx
mov [DATA_AREA], ax

;     Searching for the secondary file begins here.     |

mov bx, [ROOT_ENT] ; Move the number of root entries into bx (counter)
mov dx, DIR_CPY ; Move the address of Directory entry into dx
cld ; Clear the direction flag
mov di, sec_file ; Move the address of the secondary file into di
mov si, dx ; Load the source address
mov cx, 0x0b ; Number of characters to compare (8+3)
repe cmpsb ; Repeat till the characters not equal. Maximum 0x0b times
jnz short next ; If not found, try next entry

;  Loads the secondary file at the address SEC_BL declared   |
;  earlier.     |

mov bx, SEC_BL
mov si, dx
add si, 0x1A ; Byte 26 & 27 of the file entry
mov word ax,[si] ; (Entry cluster value)
push ax ; Push the starting cluster to the stack
xor eax, eax
xor ecx, ecx
xor dx, dx ; Clear out necessary registers

pop ax ; Pop the last computed value for the sector
push ax ; Again save it for future use

cmp ax, 0x0FFF ; If End of sector for the file, jump to exit
jz exit

mov cl, [DATA_AREA]
dec ax
dec ax ; Subtract 2 from the next sector value
add ax, cx ; Converts the data sector into LBA
call trans_add ; Converts LBA into CHS

mov ax, 0x0201
mov dl, 0x00
int 13h ; Read the next data cluster into the main memory

add bx, 0x200 ; Increment the file pointer to load the sector

xor ax, ax
pop ax ; Pop the sector value from the stack
mov cx, 0x03
mul cx ; Multiply the value with 3
rcr ax, 1 ; Divide it by 2 (3/2 = 1.5)
jc carry ; If carry set, decimal number

mov si, ax
add si, 0x0600
mov word ax, [si]
and ax, 0x0fff
push ax
jmp load
mov si, ax
add si, 0x0600
mov word ax, [si]
shr ax, 4
push ax
jmp load

jmp $ ; File found. write code here
dec bx ; Decrement number of entries to check still
jz exit ; If zero, file not found
add dx, 0x20 ; Point to next entry
jmp short srch ; Compare next entry

jmp 0000:8000h ; Jump to secondary boot loader code

;  FUNCTION :  Translates LBA sector number into CHS value   |
;  INPUT    :  AX = LBA Sector     |
;  OUTPUT   :  CH = Cylinder, DH = Head, CL = Sector     |
;     |
;  FORMULA USED:     |
;  sector   = (LBA % SPT) + 1     |
;  Head   = (LBA / SPT) % HPC     |
;  Cylinder = (LBA / SPT) / HPC     |
;     |
div word [SCTS_PER_TRK]   ; LBA / SPT     |
inc dl      ; dl = (LBA % SPT) + 1 |
mov cl, dl      ; cl = sector     |
xor dx, dx      ; Clear out dx reg.    |
div word [HDS_PER_CYL]    ; (LBA / SPT) / HPC    |
mov ch, al      ; ch = cylinder     |
mov dh, dl      ; dh = head     |
ret      ; Return     |

;  FUNCTION : Prints a string     |
;  INPUT    : SI = String Address     |
;  OUTPUT   : Prints the string     |
;     |
push ax ;     |
push bx ;     |
pchar: ;     |
cld ;     |
lodsb ;     |
or al, al ;     |
jz pexit ;     |
mov ah, 0x0e ;     |
mov bx, 0x0007 ;     |
int 10h ;     |
jmp pchar ;     |
pexit: ;     |
pop bx ;     |
pop ax ;     |
ret ;     |

sec_file db "BOOT2 BIN"
file_nt_fnd db CR,LF,'File not found',0
file_fnd db CR,LF,'File found',0
DATA_AREA db 0x00
FILE_BUF dw 0x8000

CR equ 0x0d
LF equ 0x0a

times(510-($-$$)) db 0
dw 0xaa55

Wednesday, August 03, 2011

iOmega Screenplay Director

I am a moviebuff and used to watch lot of English, Tamil, Korean, Japanese movies. I felt a media player connected to TV in my living room would be better compared to watching movies in laptop. So, here is my review of the latest gadget in my home. iOmega Screenplay Director. My first choice of media player was WD Live TV because of its low cost (it doesn't come with internal HDD) and I convinced myself to go for Screenplay Director, as one of my colleagues own it. Also, this is the only media player available in Chennai stores. It comes with two years warranty.

Screenplay Director comes with 1TB and 2TB versions. I gone for 1TB version. I copied my movie collection from my laptop and external HDD that I had. I was happy about the space that I have, which could hold hell a lot of movies.

HDD : 1 TB / 2 TB
Video formats supported: MPEG1, MPEG2, MPEG4 (upto 1080p), H.264, XviD, WMV, VC-1
Audio formats supported: AAC, AC3, FLAC, MP3, Ogg Vorbis, WAV, WMA
Photo formats supported: BMP, GIF, JPG, PNG, TIFF
Output ports: Composite (SD), Component, HDMI, Optical audio.
USB ports: 3
Ethernet port: 1

The pack comes with only Composite cable.

The media player is not a sleek one compared to other media players in market. The remote doesn't look impressive and most of the keys have dual purpose. For example, the rew / fwd, vol up / vol dwn keys have a single key and these keys are very small to press what you want to. There are Video, Music and Photo keys in the remote that lets you directly jump instead of pressing the Home key and selecting videos or music or photos.

Poor software:
The software is the worst part of the gadget. There are so many bugs, which leads you to restart the device most of the time to recover. The boot up time also takes around 2.30 minutes :(

User interface:
The UI design is okay. Not worst, not the best. There is no customization possible like changing the color of the screen.

The navigation is designed badly. While watching a movie, if you decide to play another movie, you press the Video key in remote. This takes you to the list of available HDD (internal and external) menu, instead of taking you to the last selected movie folder. I felt this is quite annoying at times. You have to keep scrolling all the times.

I haven't used any other media player, but the quality of video that I get in Composite (SD) is quite fascinating. The clarity of the video is really very good. However, some of my downloaded Tamil movies doesn't play with this media player. Not sure why is it. Haven't explored on this. There is no way to customize the subtitles, either the location or the size of the font on the screen. The text is small to read. The player doesn't upscale the audio that comes in the video. Sometimes, the audio is too low that I have to keep 100% volume in my TV.

They haven't cared much to provide a good photo viewing experience. The wide screen photos are just scaled in composite output, which doesn't appeal at all. There is no way to configure the speed for transition.

The media player doesn't have inbuild wifi capability. However, you could plug in a iOmega wifi dongle in the USB port and connect to internet. I haven't bought one dongle yet. The software supports only YouTube videos from internet.

Torrent support:
I think these guys thought about all the moviebuffs in the world, who mostly use torrents to download illegal movies. This player allows you to download any files over torrents if you have added it.

I wouldn't recommend this media player, except for its good quality video. Most of the LED TVs nowadays come with USB source, where you could plug in an external HDD and play any type of video format. If you are planning to buy such a TV shortly, don't think of going for a media player.