rdos/kernel/drive.asm

50 lines
973 B
NASM

; drive table
%define drivetab_type 0x00 ; BYTE 0=unassigned, 1=BIOS/CHS, 2=BIOS/LBA
%define drivetab_num 0x01 ; BYTE DL number
%define drivetab_heads 0x02 ; CHS heads
%define drivetab_spt 0x03 ; CHS sectors per track
%define drivetab_sectors 0x04 ; total number of sectors
%define drivetab_offset 0x08 ; partition offset
%define drivetab_size 0x0C
drive_table:
dw 0
.count:
dw 4
; DI is incremented for the space taken
; IN ES:DI
drive_setup:
xor cx, cx
mov [drive_table], di
mov al, drivetab_size
mov ah, BYTE [drive_table.count]
mul ah
xchg cx, ax
; this increments DI and also fills table with zeros
rep stosb
ret
; Load a drive table entry
; IN DL drive number
; OUT DS:SI ptr to table item
drive_load:
; bail out if number too high
cmp dl, [cs:drive_table.count]
jnc .err
push cs
pop ds
mov si, [drive_table]
push ax
mov al, drivetab_size
mul dl
add si, ax
pop ax
ret
.err:
stc
ret