[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