bits 16
KERNEL_FLAT_ADDRESS: equ 0x00100000
; void load_kernel()
load_kernel:
.setup:
mov si, loadingKernelMessage
call print_string
maxSectorsPerRead: equ 32
sectorsAlreadyRead: dw 0
numberOfSectorsToReadNext: dw 0
.calculate_number_of_sectors:
mov ax, word [kernelNumberOfSectors]
sub ax, word [sectorsAlreadyRead]
cmp ax, maxSectorsPerRead
jle .do_read
mov ax, maxSectorsPerRead
.do_read:
mov [numberOfSectorsToReadNext], ax
; Load kernel to low memory 0x80000 (segment 0x8000, offset varies)
; Real-mode can only access 0x0–0xFFFFF, so we load here and let paging handle relocation
movzx eax, word [sectorsAlreadyRead]
shl eax, 9
mov bx, ax
mov ax, 0x8000
mov es, ax
mov cx, word [kernelStartSector]
add cx, word [sectorsAlreadyRead]
mov ax, word [numberOfSectorsToReadNext]
call read_disk
mov ax, word [sectorsAlreadyRead]
add ax, word [numberOfSectorsToReadNext]
mov word [sectorsAlreadyRead], ax
cmp ax, word [kernelNumberOfSectors]
jl .calculate_number_of_sectors
.done:
mov si, loadedKernelMessage
call print_string
ret
loadingKernelMessage: db "Info: Loading kernel...", CR, LF, 0
loadedKernelMessage: db "Info: Loaded kernel!", CR, LF, 0