72 lines
1.1 KiB
NASM
72 lines
1.1 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
|
||
|
|
||
|
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
|
||
|
ret
|