rdos/kernel/drive.asm

49 lines
838 B
NASM

; Load a sector from drive.
; IN DX:AX sector number
; BP ptr to BPB
drive_read:
push ax
push cx
push dx
push bx
push si
mov cx, dx
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
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 ax, 0x0201
int 0x13
.giveup:
pop si
pop bx
pop dx
pop cx
pop ax
ret
.fast: ; fast lane for boot sector
inc cl
jmp .try
.fail:
; reset disk
mov ah, 0x00
int 0x13
; loop with si
dec si
test si, si
jnz .try
stc
jmp .giveup