wrote a basic bootloader
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
[BITS 16]
|
||||
[ORG 0x7C00]
|
||||
|
||||
; Initialize segment registers
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
mov sp, 0x7C00
|
||||
|
||||
; Reset disk system
|
||||
mov ah, 0
|
||||
int 0x13
|
||||
|
||||
; Load FAT32 BPB
|
||||
mov si, bpb_oem_name
|
||||
mov di, 0x7E00
|
||||
mov cx, bpb_size
|
||||
rep movsb
|
||||
|
||||
; Read FAT32 root directory
|
||||
mov ax, [bpb_reserved_sectors]
|
||||
mov [dapack.lba_start], ax
|
||||
|
||||
mov ah, 0x42
|
||||
mov si, dapack
|
||||
int 0x13
|
||||
jc error
|
||||
|
||||
; Find kernel file
|
||||
mov si, kernel_name
|
||||
mov di, 0x8000
|
||||
mov cx, 11 ; FAT32 8.3 filename length
|
||||
|
||||
find_kernel:
|
||||
push cx
|
||||
push si
|
||||
push di
|
||||
rep cmpsb
|
||||
pop di
|
||||
pop si
|
||||
pop cx
|
||||
je found_kernel
|
||||
|
||||
add di, 32 ; Move to next directory entry
|
||||
cmp di, 0x8200 ; Check if we've reached the end of the sector
|
||||
jl find_kernel
|
||||
|
||||
; Kernel not found
|
||||
mov si, err_no_kernel
|
||||
call print
|
||||
jmp $
|
||||
|
||||
found_kernel:
|
||||
; Get cluster number
|
||||
mov ax, [di + 20] ; High word
|
||||
shl eax, 16
|
||||
mov ax, [di + 26] ; Low word
|
||||
|
||||
; Load kernel
|
||||
mov [cluster], eax
|
||||
call load_cluster
|
||||
|
||||
; Jump to kernel
|
||||
jmp 0x8000
|
||||
|
||||
error:
|
||||
mov si, err_disk
|
||||
call print
|
||||
jmp $
|
||||
|
||||
print:
|
||||
lodsb
|
||||
or al, al
|
||||
jz .done
|
||||
mov ah, 0x0E
|
||||
int 0x10
|
||||
jmp print
|
||||
.done:
|
||||
ret
|
||||
|
||||
load_cluster:
|
||||
; Convert cluster to LBA
|
||||
sub eax, 2
|
||||
mul dword [sectors_per_cluster]
|
||||
add eax, [first_data_sector]
|
||||
|
||||
mov [dapack.lba_start], eax
|
||||
mov ah, 0x42
|
||||
mov si, dapack
|
||||
int 0x13
|
||||
ret
|
||||
|
||||
align 4
|
||||
dapack:
|
||||
db 0x10 ; Size of packet
|
||||
db 0 ; Reserved
|
||||
dw 1 ; Number of sectors
|
||||
dw 0x8000 ; Offset
|
||||
dw 0 ; Segment
|
||||
dq 0 ; LBA
|
||||
|
||||
cluster: dd 0
|
||||
sectors_per_cluster: dd 8
|
||||
first_data_sector: dd 0
|
||||
|
||||
kernel_name: db "KERNEL BIN"
|
||||
err_disk: db "Disk error", 0
|
||||
err_no_kernel: db "No kernel", 0
|
||||
|
||||
bpb_oem_name: times 8 db 0
|
||||
bpb_bytes_per_sector: dw 512
|
||||
bpb_sectors_per_cluster: db 8
|
||||
bpb_reserved_sectors: dw 32
|
||||
bpb_size: equ $ - bpb_oem_name
|
||||
|
||||
times 510-($-$$) db 0
|
||||
dw 0xAA55
|
||||
Reference in New Issue
Block a user