[BITS 16] [ORG 0x7C00] KERNEL_OFFSET equ 0x1000 STACK_BASE equ 0x9000 start: cli xor ax, ax mov ds, ax mov es, ax mov ss, ax mov sp, STACK_BASE sti mov [boot_drive], dl mov si, banner call print_string call load_kernel call switch_to_pm jmp $ load_kernel: mov si, loading_msg call print_string mov bx, KERNEL_OFFSET mov dh, 15 mov dl, [boot_drive] call disk_load mov si, loaded_msg call print_string ret disk_load: pusha push dx mov ah, 0x02 mov al, dh mov cl, 0x02 mov ch, 0x00 mov dh, 0x00 int 0x13 jc disk_error pop dx cmp al, dh jne sectors_error popa ret disk_error: mov si, disk_error_msg call print_string jmp disk_loop sectors_error: mov si, sectors_error_msg call print_string disk_loop: jmp $ print_string: lodsb cmp al, 0 je done mov ah, 0x0e int 0x10 jmp print_string done: ret %include "gdt.asm" %include "print32.asm" %include "switch_pm.asm" [BITS 32] BEGIN_PM: mov ebx, KERNEL_OFFSET call ebx jmp $ boot_drive db 0 banner db 'ColdBoot v1.0 - Starting...', 0x0D, 0x0A, 0 loading_msg db 'Loading kernel...', 0x0D, 0x0A, 0 loaded_msg db 'Kernel loaded, switching to 32-bit...', 0x0D, 0x0A, 0 disk_error_msg db 'Disk read error!', 0x0D, 0x0A, 0 sectors_error_msg db 'Sectors read error!', 0x0D, 0x0A, 0 times 510 - ($-$$) db 0 dw 0xaa55