Finish up the remaining TODOs in bootsect.asm
This commit is contained in:
parent
8d67cdf201
commit
de098cb9f3
61
bootsect.asm
61
bootsect.asm
|
@ -121,8 +121,15 @@ search_root:
|
||||||
je .end
|
je .end
|
||||||
|
|
||||||
test byte [si + 11], 0x08 + 0x10
|
test byte [si + 11], 0x08 + 0x10
|
||||||
jz .isfile
|
jnz .skipentry
|
||||||
|
|
||||||
|
; Make sure the file has non-zero size
|
||||||
|
cmp word [si + 28], 0
|
||||||
|
jne .isfile
|
||||||
|
cmp word [si + 30], 0
|
||||||
|
jne .isfile
|
||||||
|
|
||||||
|
.skipentry:
|
||||||
add si, 32
|
add si, 32
|
||||||
jmp .entry
|
jmp .entry
|
||||||
|
|
||||||
|
@ -154,18 +161,12 @@ search_root:
|
||||||
.end:
|
.end:
|
||||||
|
|
||||||
notfound:
|
notfound:
|
||||||
; TODO: Better error messages
|
mov si, notfound_msg
|
||||||
mov ax, 0x0e00 + '?'
|
jmp fatal_error
|
||||||
int 0x10
|
|
||||||
|
|
||||||
hang:
|
|
||||||
hlt
|
|
||||||
jmp hang
|
|
||||||
|
|
||||||
found:
|
found:
|
||||||
; SI points to 11 bytes after the start of the entry, so adjust all
|
; SI points to 11 bytes after the start of the entry, so adjust all
|
||||||
; offsets
|
; offsets
|
||||||
; TODO: Handle zero-length files
|
|
||||||
mov ax, [si - 11 + 26] ; First cluster
|
mov ax, [si - 11 + 26] ; First cluster
|
||||||
push ax
|
push ax
|
||||||
|
|
||||||
|
@ -248,8 +249,13 @@ loadsectors:
|
||||||
push ax
|
push ax
|
||||||
push cx
|
push cx
|
||||||
push dx
|
push dx
|
||||||
|
push di
|
||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
|
mov di, 3 ; Retry thrice
|
||||||
|
|
||||||
|
.retry:
|
||||||
|
|
||||||
push ax
|
push ax
|
||||||
push cx
|
push cx
|
||||||
|
|
||||||
|
@ -286,9 +292,9 @@ loadsectors:
|
||||||
mov al, 1
|
mov al, 1
|
||||||
mov dl, [drivenumber]
|
mov dl, [drivenumber]
|
||||||
int 0x13
|
int 0x13
|
||||||
|
|
||||||
; TODO: Handle reset & retry
|
; TODO: Handle reset & retry
|
||||||
jnc .noerror
|
jc .error
|
||||||
.noerror:
|
|
||||||
|
|
||||||
pop cx
|
pop cx
|
||||||
pop ax
|
pop ax
|
||||||
|
@ -298,15 +304,46 @@ loadsectors:
|
||||||
|
|
||||||
loop .loop
|
loop .loop
|
||||||
|
|
||||||
|
pop di
|
||||||
pop dx
|
pop dx
|
||||||
pop cx
|
pop cx
|
||||||
pop ax
|
pop ax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
%include "hexprint.inc"
|
.error:
|
||||||
|
; Do we still have retries remaining?
|
||||||
|
mov si, diskerror_msg
|
||||||
|
test di, di
|
||||||
|
jz fatal_error ; No, fail
|
||||||
|
dec di
|
||||||
|
|
||||||
|
; Yes, reset disk
|
||||||
|
xor ah, ah
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
; Execute the loop again
|
||||||
|
pop cx
|
||||||
|
pop ax
|
||||||
|
jmp .retry
|
||||||
|
|
||||||
|
fatal_error:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz hang
|
||||||
|
mov ah, 0xe
|
||||||
|
int 0x10
|
||||||
|
jmp fatal_error
|
||||||
|
|
||||||
|
hang:
|
||||||
|
hlt
|
||||||
|
jmp hang
|
||||||
|
|
||||||
|
|
||||||
kernel_name: db "KERNEL BIN"
|
kernel_name: db "KERNEL BIN"
|
||||||
|
|
||||||
|
notfound_msg: db "Kernel not found", 0
|
||||||
|
diskerror_msg: db "Disk error", 0
|
||||||
|
|
||||||
times 510-($-$$) db 0
|
times 510-($-$$) db 0
|
||||||
db 0x55, 0xaa
|
db 0x55, 0xaa
|
||||||
_end:
|
_end:
|
||||||
|
|
Loading…
Reference in New Issue