Hello everybody! I just got done writing some more code to execute another program under my OS, but I keep running into the same problem. The code is identical to my bootloader. What's wrong with it?
progornot:
mov ax, 0003
int 10h
mov si, buff
mov di, filen
call parsefat
xor cx, cx
xor dx, dx
mov ax, 20h
mul word[RootEntries]
div word[BytesPerSector]
xchg cx, ax
mov al, byte[NumberofFATs]
mul word[SectorsPerFAT]
add ax, word[ReservedSectors]
mov word[datasector], ax
add word[datasector], cx
mov bx, 0x0200
push 0
pop es
call ReadSectors
mov ax, 0e32h
int 10h
mov cx, word[RootEntries]
mov di, 200h
loop1:
push cx
mov cx, 11
mov si, filen
push di
rep cmpsb
pop di
jz LoadFat
add di, 32d
loop loop1
jmp fail
LoadFat:
mov ax, 0e32h
int 10h
mov dx, word[di+1ah]
mov word[cluster], dx
xor ax, ax
mov al, [NumberofFATs]
mul word[SectorsPerFAT]
mov cx, ax
mov ax, word[ReservedSectors]
mov bx, 200h
call ReadSectors
mov ax, 0e33h
int 10h
mov ax, 500h
mov es, ax
xor bx, bx
push bx
LoadImage:
mov ax, word[cluster]
pop bx
call ClusterLBA
xor cx, cx
mov cl, byte[SectorsPerCluster]
call ReadSectors
push bx
mov ax, word[cluster]
mov cx, ax
mov dx, ax
shr dx, 1
add cx, dx
mov bx, 200h
add bx, cx
mov dx, word[bx]
test ax, 1
jnz odd_cluster
even_cluster:
and dx, 0000111111111111b
jmp done2
odd_cluster:
shr dx, 4
done2:
mov word[cluster], dx
cmp dx, 0ff0h
jb LoadImage
exectute:
push 500h
push 0
retf
fail:
;clc
ret
;mov ax, 0e46h
;int 10h
;xor ax, ax
;int 16h
;hlt
;jmp $
ReadSectors:
mov di, 5
sectloop:
push ax
push bx
push cx
call LBACHS
mov ah, 02
mov al, 1
mov ch, byte[absolutetrack]
mov cl, byte[absolutesector]
mov dh, byte[absolutehead]
mov dl, byte[DriveNumber]
int 13h
jnc success
xor ax, ax
int 13h
dec di
pop cx
pop bx
pop ax
jnz sectloop
int 18h
success:
mov al, 'S'
mov ah, 0eh
int 10h
pop cx bx ax
add bx, word[BytesPerSector]
inc ax
loop ReadSectors
ret
ClusterLBA:
sub ax, 2
xor cx, cx
mov cl, byte[SectorsPerCluster]
mul cx
add ax, word[datasector]
ret
LBACHS:
xor dx, dx
div word[SectorsPerTrack]
inc dl
mov byte[absolutesector], dl
xor dx, dx
div word[HeadsPerCylinder]
mov byte[absolutehead], dl
mov byte[absolutetrack], al
ret