kernel: read A: geometry from BIOS
This commit is contained in:
parent
734ab3852a
commit
fde87d651c
@ -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
71
kernel/drive.asm
Normal 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
|
Loading…
Reference in New Issue
Block a user