2019-09-19 22:12:35 +02:00
|
|
|
; drive table
|
2019-09-24 10:16:22 +02:00
|
|
|
%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
|
2019-09-19 22:02:16 +02:00
|
|
|
|
|
|
|
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
|
2019-09-19 22:12:35 +02:00
|
|
|
mov al, drivetab_size
|
2019-09-19 22:02:16 +02:00
|
|
|
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
|
2019-09-19 22:12:35 +02:00
|
|
|
mov al, drivetab_size
|
2019-09-19 22:02:16 +02:00
|
|
|
mul dl
|
|
|
|
add si, ax
|
|
|
|
pop ax
|
|
|
|
|
|
|
|
ret
|
|
|
|
.err:
|
|
|
|
stc
|
|
|
|
ret
|