WIP on FCB disk i/o

This commit is contained in:
Nero 2019-10-08 17:54:39 +00:00
parent 58a95932b5
commit 7877809bc1
6 changed files with 95 additions and 103 deletions

View file

@ -1,6 +1,32 @@
; Load a sector from drive.
; IN DX:AX sector number (lba)
; BX ptr to FCB
; OUT CL Sector number
; CH Cylinder number
; DH Head number
drive_chs_calc:
push bx ; backup fcb ptr
mov bx, [bx+fcb_spt] ; nos is in BH now
push bx ; backup nos
xor bh, bh ; zero out nos so spt is left
div word bx ; ax:temp = (lba / spt)
inc dx ; dx:sector = (lba % spt) + 1
mov cl, dl ; sector number
pop bx ; restore nos
xchg bl, bh ; put nos into bl
xor bh, bh ; zero out spt
div word bx ; ax:cylinder = (temp / nos)
; dx:head = (temp % nos)
mov ch, al ; cylinder number
mov dh, dl ; head number
pop bx ; restore fcb ptr
ret
; Load a sector from drive.
; IN DX:AX sector number
; BP ptr to BPB
; BX ptr to FCB
drive_read:
push ax
push cx
@ -12,19 +38,14 @@ drive_read:
or cx, ax
jz .fast
div word [bp+13] ; ax:temp = (lba / spt)
inc dx ; dx:sector = (lba % spt) + 1
mov cl, dl ; sector number
call drive_chs_calc
div word [bp+15] ; ax:cylinder = (tmp / heads)
; dx:head = (tmp % heads)
mov ch, al ; cylinder number
mov dh, dl ; head number
mov si, 5 ; retry count
.try:
mov dl, [bp+(bpb_size-1)] ; drive number
mov bx, diskbuf
mov dl, [bx+fcb_drv] ; drive number
dec dl
mov ax, 0x0201
mov bx, diskbuf
int 0x13
.giveup:
pop si