119 lines
2.0 KiB
NASM
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
|