Files
2025-02-25 01:14:52 +00:00

119 lines
2.0 KiB
NASM

[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