Use ebios extensions if enabled

This commit is contained in:
Nero 2020-12-26 20:54:39 +00:00
parent 2d97bb57e5
commit af5df85c16

View File

@ -13,9 +13,11 @@ dsknum: resb 1
; bios drive we end up using ; bios drive we end up using
biosnum: resb 1 biosnum: resb 1
dap: resw 2
.buf: resw 2
; current sector number ; current sector number
; absolute, ignores partition ; absolute, ignores partition
dskseek: resd 1 dskseek: resd 2
; bit 0 (1) - dirty flag for dskbuf ; bit 0 (1) - dirty flag for dskbuf
; bit 1 (2) - controller configured ; bit 1 (2) - controller configured
@ -69,7 +71,10 @@ int13: ; debug output
; read BIOS int13h/AH=8 values ; read BIOS int13h/AH=8 values
; DPT data gets copied over our dpt ; DPT data gets copied over our dpt
; CHS data gets inserted into our bpb ; CHS data gets inserted into our bpb
getprm: mov ah, 8 getprm: test byte [dskflag], 4
jnz .nodpt
; do the query
mov ah, 8
mov dl, [biosnum] mov dl, [biosnum]
call int13 call int13
; bail out if error ; bail out if error
@ -159,9 +164,26 @@ loghdd: sub dl, 2
cmp dl, 4 cmp dl, 4
jnc logerr jnc logerr
push dx push dx
mov byte [biosnum], 0x80 mov dl, 0x80
mov byte [biosnum], dl
; test for ebios extensions
mov ah, 0x41
mov bx, 0x55AA
call int13
sbb bx, 0xAA55
jnz .chs
; enable ebios and assume controller is configured
or byte [dskflag], (2+4)
; initialize DAP
mov word [dap], 0x1000
mov word [dap+2], 1
mov word [dap+4], dskbuf
xor ax, ax
mov word [dap+6], ax
mov word [dap+12], ax
mov word [dap+14], ax
; get chs data (needed or we cant load vbr) ; get chs data (needed or we cant load vbr)
call getprm .chs: call getprm
; read mbr ; read mbr
xor ax, ax xor ax, ax
xor dx, dx xor dx, dx
@ -244,9 +266,15 @@ _read: mov ch, 2
db 0x3D ; cmp ax, imm16: causes next instr to be skipped db 0x3D ; cmp ax, imm16: causes next instr to be skipped
_write: mov ch, 3 _write: mov ch, 3
mov cl, 1 ; read len mov cl, 1 ; read len
; TODO: do ebios i/o ; check if ebios supported
test byte [dskflag], 4
jz .l00
mov ax, cx
or ah, 0x40
mov si, dap
jmp .do
; check if we can skip controller reset ; check if we can skip controller reset
test byte [dskflag], 2 .l00: test byte [dskflag], 2
jnz .l01 jnz .l01
; do controller reset ; do controller reset
mov dl, [biosnum] mov dl, [biosnum]
@ -280,8 +308,8 @@ _write: mov ch, 3
xchg ax, cx xchg ax, cx
xchg cx, dx xchg cx, dx
xchg dh, dl xchg dh, dl
mov dl, [biosnum]
mov bx, dskbuf mov bx, dskbuf
.do: mov dl, [biosnum]
; ah: subfunction selected via cx previously ; ah: subfunction selected via cx previously
; al: 1 = reading 1 sector ; al: 1 = reading 1 sector
; cx: sector and cylinder number ; cx: sector and cylinder number