rdos/kernel/drive.asm
Ain 6411dc0c9c Turn CHS fields in drive table into words
CHS arithmetic will be done on 32-bit integers, the operand for division
of DX:AX is a word, so we save a conversion step.

Additionally, i might reuse these fields for pointing to a SYS driver later.
2019-09-24 08:16:22 +00:00

54 lines
1.0 KiB
NASM

; drive table
%define drivetab_type 0x00 ; BYTE 0=unassigned, 1=BIOS/CHS, 2=BIOS/LBA
%define drivetab_num 0x01 ; BYTE DL number
; CHS data for type=1
; Might be reused for driver address
%define drivetab_heads 0x02 ; WORD CHS heads
%define drivetab_spt 0x04 ; WORD CHS sectors per track
%define drivetab_sectors 0x06 ; DWORD total number of sectors
%define drivetab_offset 0x0A ; DWORD partition offset
%define drivetab_size 0x0E
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