Compare commits

...

3 Commits

Author SHA1 Message Date
Juhani Krekelä 4dc7266f6a Make debug hexprint work under PCem too 2021-07-04 19:13:34 +03:00
Juhani Krekelä de098cb9f3 Finish up the remaining TODOs in bootsect.asm 2021-07-04 19:12:59 +03:00
Juhani Krekelä 8d67cdf201 Always do disk reads one sector at a time
PCem emulating IBM PC 5150 seems to have a bug where int 0x13/2 will report
it read zero sectors regardless of how many sectors it actually read.
2021-07-04 18:52:11 +03:00
2 changed files with 59 additions and 35 deletions

View File

@ -121,8 +121,15 @@ search_root:
je .end
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
jmp .entry
@ -154,18 +161,12 @@ search_root:
.end:
notfound:
; TODO: Better error messages
mov ax, 0x0e00 + '?'
int 0x10
hang:
hlt
jmp hang
mov si, notfound_msg
jmp fatal_error
found:
; SI points to 11 bytes after the start of the entry, so adjust all
; offsets
; TODO: Handle zero-length files
mov ax, [si - 11 + 26] ; First cluster
push ax
@ -248,8 +249,13 @@ loadsectors:
push ax
push cx
push dx
push di
.loop:
mov di, 3 ; Retry thrice
.retry:
push ax
push cx
@ -282,45 +288,62 @@ loadsectors:
and al, 0xC0
or cl, al
; Copy number of sectors to still read to ax and cap at 127
pop ax
push ax
cmp al, 127
jbe .read
mov al, 127
mov ah, 2
mov al, 1
mov dl, [drivenumber]
int 0x13
.read:
mov ah, 2
mov dl, [drivenumber]
int 0x13
; TODO: Handle reset & retry
jc .error
; Decrement cx by the number of sectors read
pop cx
xor ah, ah
sub cx, ax
pop ax
; Increment bx by the number of sectors read times 512
xor dx, dx
mov dh, al
shl dx, 1
add bx, dx
inc ax
add bx, 512
; Increment ax by the number of sectors read
pop dx
add ax, dx
test cx, cx
jnz .loop
loop .loop
pop di
pop dx
pop cx
pop ax
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"
notfound_msg: db "Kernel not found", 0
diskerror_msg: db "Disk error", 0
times 510-($-$$) db 0
db 0x55, 0xaa
_end:

View File

@ -10,18 +10,19 @@ hexprint8:
mov cl, al
xor bx, bx
mov ah, 0xe
shr al, 1
shr al, 1
shr al, 1
shr al, 1
mov bl, al
mov al, [.digits + bx]
mov ah, 0xe
int 0x10
mov bl, 0xf
and bl, cl
mov al, [.digits + bx]
mov ah, 0xe
int 0x10
pop cx