79 lines
1.2 KiB
NASM
79 lines
1.2 KiB
NASM
section .bss
|
|
|
|
drives: equ 16
|
|
|
|
; drive table entry
|
|
struc drive
|
|
.biosnum: resb 1
|
|
.flag: resb 1
|
|
.spc: resw 1
|
|
.cylinders: resw 1
|
|
.dpt: resb dpt_size
|
|
endstruc
|
|
|
|
; ptr into currently selected drive
|
|
drive_ptr: resw 1
|
|
|
|
drive_table: resb (drives * drive_size)
|
|
|
|
section .text
|
|
|
|
drives_init: int 0x11
|
|
mov cl, 6
|
|
shr ax, cl
|
|
inc ax
|
|
and ax, 3
|
|
mov cx, ax
|
|
|
|
mov bx, drive_table
|
|
xor dx, dx
|
|
|
|
.loop: push cx
|
|
push dx
|
|
mov [bx+drive.biosnum], dl
|
|
; defaults if 13h,AH=8 fails (XT 360kb)
|
|
les di, [0x1e * 4]
|
|
mov cx, 0x2709 ; 40 cylinders, 9 sectors
|
|
mov dh, 1 ; 2 heads
|
|
; ask bios
|
|
push bx
|
|
mov ah, 8
|
|
int 0x13
|
|
pop bx
|
|
; copy dpt
|
|
push es
|
|
push ds
|
|
pop es
|
|
pop ds
|
|
push cx
|
|
mov si, di
|
|
lea di, [bx+drive.dpt]
|
|
mov cx, 11
|
|
rep movsb
|
|
pop cx
|
|
; restore ds
|
|
push cs
|
|
pop ds
|
|
; get and save number of cylinders
|
|
mov ax, cx
|
|
xchg al, ah
|
|
rol ah, 1
|
|
rol ah, 1
|
|
and ax, 0x03FF
|
|
inc ax
|
|
mov [bx+drive.cylinders], ax
|
|
; save spt
|
|
mov ax, cx
|
|
and al, 0x3F
|
|
mov [bx+drive.dpt+dpt.lastsector], al
|
|
; multiply with heads and save sectors per cylinder
|
|
inc dh
|
|
mul dh ; ax = al * dh
|
|
mov [bx+drive.spc], ax
|
|
; advance loop
|
|
pop dx
|
|
pop cx
|
|
inc dl
|
|
loop .loop
|
|
ret
|