kernel: read A: geometry from BIOS

This commit is contained in:
Nero 2020-08-15 21:15:31 +00:00
parent 734ab3852a
commit fde87d651c
2 changed files with 75 additions and 4 deletions

View File

@ -48,10 +48,7 @@ intlp: movsw
mov bx, 0 mov bx, 0
call fd_write call fd_write
call dnconv call drives_init
mov al, dl
call select
call load_bpb
loop: int 0x28 loop: int 0x28
jmp loop jmp loop
@ -241,9 +238,12 @@ fputc: push ax
%include "kernel/fd.asm" %include "kernel/fd.asm"
%include "kernel/con.asm" %include "kernel/con.asm"
%include "kernel/drive.asm"
%include "kernel/diskio.asm" %include "kernel/diskio.asm"
%include "kernel/fat.asm" %include "kernel/fat.asm"
zero: dw 0
section .data section .data
vects: dw int20h, int21h, retf, retf vects: dw int20h, int21h, retf, retf

71
kernel/drive.asm Normal file
View File

@ -0,0 +1,71 @@
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