Initial work on disk reading
This commit is contained in:
parent
2147d93fc4
commit
3ffab6de1f
|
@ -0,0 +1,77 @@
|
||||||
|
SECTOR_SEG equ 0x0000
|
||||||
|
SECTOR_ADDR equ 0x7C00
|
||||||
|
|
||||||
|
; get and store drive parameters
|
||||||
|
; inputs:
|
||||||
|
; none
|
||||||
|
; outputs:
|
||||||
|
; none
|
||||||
|
disk_init:
|
||||||
|
push es
|
||||||
|
xor ax, ax
|
||||||
|
mov es, ax ; ES:DI should be zero to prevent some BIOS bugs apparently
|
||||||
|
mov di, ax
|
||||||
|
mov ah, 0x08
|
||||||
|
mov dl, byte [bootdisk]
|
||||||
|
int 0x13
|
||||||
|
inc dh
|
||||||
|
movzx bx, dh
|
||||||
|
mov word [bootdisk_heads], bx
|
||||||
|
and cx, 63
|
||||||
|
mov word [bootdisk_sectorspt], cx
|
||||||
|
pop es
|
||||||
|
ret
|
||||||
|
|
||||||
|
; read a sector into the sector buffer
|
||||||
|
; inputs:
|
||||||
|
; SI: LBA
|
||||||
|
; outputs:
|
||||||
|
; none
|
||||||
|
read_sector:
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push es
|
||||||
|
.retry:
|
||||||
|
mov es, SECTOR_SEG
|
||||||
|
mov bx, SECTOR_ADDR
|
||||||
|
call lba2chs
|
||||||
|
mov ax 0x0201
|
||||||
|
int 0x13
|
||||||
|
jc .retry
|
||||||
|
pop es
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
; convert LBA addressing to CHS addressing
|
||||||
|
; these outputs can be fed directly into int 0x13, AH 0x02
|
||||||
|
; based on this StackOverflow answer:
|
||||||
|
; https://stackoverflow.com/questions/45434899/why-isnt-my-root-directory-being-loaded-fat12/45495410#45495410
|
||||||
|
; sector: (LBA mod SPT) + 1
|
||||||
|
; head: (LBA / SPT) mod heads
|
||||||
|
; cylinder: (LBA / SPT) / heads
|
||||||
|
; inputs:
|
||||||
|
; SI: LBA
|
||||||
|
; outputs:
|
||||||
|
; DH: head
|
||||||
|
; CH: cylinder
|
||||||
|
; CL: sector/cylinder
|
||||||
|
lba2chs:
|
||||||
|
push ax
|
||||||
|
mov ax, si
|
||||||
|
xor dx, dx
|
||||||
|
div word [bootdisk_sectorspt] ; LBA / SPT
|
||||||
|
mov cl, dl
|
||||||
|
inc cl ; CL = (LBA mod SPT) + 1
|
||||||
|
xor dx, dx
|
||||||
|
div word [bootdisk_heads] ; (LBA / SPT) / heads
|
||||||
|
mov dh, dl ; DH = (LBA / SPT) mod heads
|
||||||
|
mov ch, al ; CH = (LBA / SPT) / heads
|
||||||
|
shl ah, 6 ; store upper 2 bits of 10-bit cylinder into...
|
||||||
|
or cl, ah ; ...upper 2 bits of cector (CL)
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
bootdisk: db 0
|
||||||
|
bootdisk_heads: dw 0
|
||||||
|
bootdisk_sectorspt: dw 0
|
|
@ -7,6 +7,9 @@ kjmp: ; MUST be a jmp due to loader config
|
||||||
%include "int21/int21.s"
|
%include "int21/int21.s"
|
||||||
|
|
||||||
kernel_entry:
|
kernel_entry:
|
||||||
|
mov byte [bootdisk], dl
|
||||||
|
call disk_init
|
||||||
|
|
||||||
mov ah, 0x9
|
mov ah, 0x9
|
||||||
mov dx, hello_string
|
mov dx, hello_string
|
||||||
int 0x21
|
int 0x21
|
||||||
|
@ -15,4 +18,5 @@ kernel_entry:
|
||||||
|
|
||||||
hello_string: db "hello world!", 13, 10, '$'
|
hello_string: db "hello world!", 13, 10, '$'
|
||||||
|
|
||||||
|
%include "disk.s"
|
||||||
%include "vga.s"
|
%include "vga.s"
|
||||||
|
|
Loading…
Reference in New Issue