Problem with bootloader
Posted: Tue Feb 08, 2011 11:57 am
What is the problem with the following bootloader?
bits 16
org 0x7C00
start: jmp main
TIMES 0Bh-$+start DB 0
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
main:
push cs
pop ds
push cs
pop es
xor ax,ax
xor bx,bx
xor cx,cx
; reset floppy
mov ah,0
mov dl,0
int 0x13
;------------------------------------------
; load root directory at 7c00:0200
;------------------------------------------
mov bx,0x0200
mov ah,0x02
mov al,14 ; (224 * 32) / 512
mov ch,0 ; track = (((9+9+1) / 18) / 2)
mov cl,2 ; sector = 19 % 18 + 1
mov dh,1 ; head = (19 / 18) % 2
mov dl,0
int 0x13
;-----------------------------------
; find file
;-----------------------------------
findfl_start:
mov di,0x0200
mov si,filename
mov cx,224
.LOOP:
push cx
mov cx,11
rep cmpsb
je LOAD_FAT
pop cx
add di,32
loop .LOOP
;--------------------------------------
;Load FAT
;--------------------------------------
LOAD_FAT:
mov ax, WORD [di + 26]
mov WORD [cluster],ax
mov bx,0x0200
mov ah,0x02
mov al,9
mov ch,0 ; track = ((1 / 18) / 2)
mov cl,2 ; sector = 1 % 18 + 1
mov dh,1 ; head = (1 / 18) % 2
mov dl,0
int 0x13
;------------------------------------
;Load file
;------------------------------------
mov ax,0x0050
mov es,ax
xor bx,bx
LOAD_FILE:
mov ax, WORD [cluster]
add ax,31
xor dx,dx
mov di,18
div di
mov cl,dl
add cl,1 ; cl = sector = (logical % 18 + 1)
mov dx,0
mov di,2
div di
mov ch, al ; ch = track = ((logical / 18) / 2)
mov dh, dl ; dh = head = ((logical / 18) % 2)
mov ah,0x02
mov al,1
mov dl,0
int 0x13
mov ax, WORD [cluster]
mov cx,ax
mov dx,ax
shr dx,0x0001
add cx,dx
mov bx,0x0200
add bx,cx
mov dx, WORD [bx]
test ax,0x0001
jnz .ODD_CLUSTER
.EVEN_CLUSTER:
and dx, 0000111111111111b
jmp .DONE
.ODD_CLUSTER:
shr dx,0x0004
.DONE:
mov WORD [cluster],dx
cmp dx,0x0FF0
jb LOAD_FILE
filename db "KRNLDR SYS",0
cluster dw 0x0000
times 510-($-$$) db 0
dw 0XAA55
bits 16
org 0x7C00
start: jmp main
TIMES 0Bh-$+start DB 0
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
main:
push cs
pop ds
push cs
pop es
xor ax,ax
xor bx,bx
xor cx,cx
; reset floppy
mov ah,0
mov dl,0
int 0x13
;------------------------------------------
; load root directory at 7c00:0200
;------------------------------------------
mov bx,0x0200
mov ah,0x02
mov al,14 ; (224 * 32) / 512
mov ch,0 ; track = (((9+9+1) / 18) / 2)
mov cl,2 ; sector = 19 % 18 + 1
mov dh,1 ; head = (19 / 18) % 2
mov dl,0
int 0x13
;-----------------------------------
; find file
;-----------------------------------
findfl_start:
mov di,0x0200
mov si,filename
mov cx,224
.LOOP:
push cx
mov cx,11
rep cmpsb
je LOAD_FAT
pop cx
add di,32
loop .LOOP
;--------------------------------------
;Load FAT
;--------------------------------------
LOAD_FAT:
mov ax, WORD [di + 26]
mov WORD [cluster],ax
mov bx,0x0200
mov ah,0x02
mov al,9
mov ch,0 ; track = ((1 / 18) / 2)
mov cl,2 ; sector = 1 % 18 + 1
mov dh,1 ; head = (1 / 18) % 2
mov dl,0
int 0x13
;------------------------------------
;Load file
;------------------------------------
mov ax,0x0050
mov es,ax
xor bx,bx
LOAD_FILE:
mov ax, WORD [cluster]
add ax,31
xor dx,dx
mov di,18
div di
mov cl,dl
add cl,1 ; cl = sector = (logical % 18 + 1)
mov dx,0
mov di,2
div di
mov ch, al ; ch = track = ((logical / 18) / 2)
mov dh, dl ; dh = head = ((logical / 18) % 2)
mov ah,0x02
mov al,1
mov dl,0
int 0x13
mov ax, WORD [cluster]
mov cx,ax
mov dx,ax
shr dx,0x0001
add cx,dx
mov bx,0x0200
add bx,cx
mov dx, WORD [bx]
test ax,0x0001
jnz .ODD_CLUSTER
.EVEN_CLUSTER:
and dx, 0000111111111111b
jmp .DONE
.ODD_CLUSTER:
shr dx,0x0004
.DONE:
mov WORD [cluster],dx
cmp dx,0x0FF0
jb LOAD_FILE
filename db "KRNLDR SYS",0
cluster dw 0x0000
times 510-($-$$) db 0
dw 0XAA55