88 lines
1.2 KiB
NASM
88 lines
1.2 KiB
NASM
[bits 16]
|
|
[org 0x7c00]
|
|
|
|
KERNEL_ADDRESS equ 0x1000
|
|
mov [BOOT_DRIVE], DL
|
|
mov bp, 0x9000
|
|
mov sp, bp
|
|
|
|
call kernel_load
|
|
mov BX, DISK_SUCCESS_MESSAGE
|
|
call print_string
|
|
jmp switch_to_32bit
|
|
jmp done
|
|
|
|
%include "gdt.asm"
|
|
|
|
kernel_load:
|
|
pusha
|
|
mov AH, 0x02
|
|
mov AL, [NUM_SECTORS]
|
|
mov BX, KERNEL_ADDRESS
|
|
mov CH, 0x00
|
|
mov CL, 0x02
|
|
mov DH, 0x00
|
|
mov DL, [BOOT_DRIVE]
|
|
int 13h
|
|
jc disk_read_error
|
|
cmp AL, [NUM_SECTORS]
|
|
jne disk_sector_error
|
|
popa
|
|
ret
|
|
disk_read_error:
|
|
mov BX, DISK_READ_ERROR_MESSAGE
|
|
call print_string
|
|
jmp done
|
|
disk_sector_error:
|
|
mov BX, DISK_SECTOR_ERROR_MESSAGE
|
|
call print_string
|
|
jmp done
|
|
|
|
|
|
print_string:
|
|
pusha
|
|
mov AH, 0x0e
|
|
print_loop:
|
|
mov AL, [BX]
|
|
cmp AL, 0x00
|
|
je done_print
|
|
int 10h
|
|
add BX, 1
|
|
jmp print_loop
|
|
done_print:
|
|
popa
|
|
ret
|
|
|
|
done:
|
|
jmp $
|
|
|
|
|
|
switch_to_32bit:
|
|
cli
|
|
lgdt [gdt]
|
|
mov EAX, CR0
|
|
or eax, 0x01
|
|
mov CR0, EAX
|
|
jmp 0x08:begin_32bit
|
|
|
|
[bits 32]
|
|
begin_32bit:
|
|
mov AX, 0x10
|
|
mov SS, AX
|
|
mov DS, AX
|
|
mov ES, AX
|
|
mov FS, AX
|
|
mov GS, AX
|
|
mov ebp, 0x90000
|
|
mov esp, ebp
|
|
jmp KERNEL_ADDRESS
|
|
|
|
|
|
NUM_SECTORS db 0x09
|
|
DISK_SUCCESS_MESSAGE db "Read succeeded, continuing", 0
|
|
DISK_READ_ERROR_MESSAGE db "Problem with disk read", 0
|
|
DISK_SECTOR_ERROR_MESSAGE db "Read and requested sectors differ", 0
|
|
BOOT_DRIVE db 0
|
|
times 510 - ($-$$) db 0
|
|
dw 0xaa55
|