asm { start: ; mov [boot_drive], dl du8 0h88 du8 0h16 du16 boot_drive ; mov si, kdap du8 0hBE du16 kdap ; call lddap du8 0hE8 du16 &lddap ; mov si, pdap du8 0hBE du16 pdap ; call lddap du8 0hE8 du16 &lddap ;; Is A20 supported ; mov ax, 0h2403 du8 0hB8 du16 0h2403 int 0h15 ; jc a20ns du8 0h0F du8 0h82 du16 &a20ns test ah, ah ; jnz a20ns du8 0h0F du8 0h85 du16 &a20ns ;; Check A20 status ; mov ax, 0h2402 du8 0hB8 du16 0h2402 int 0h15 ; jc a20scfail du8 0h0F du8 0h82 du16 &a20scfail test ah, ah ; jnz a20scfail du8 0h0F du8 0h85 du16 &a20scfail test al, al ; jnz pm_phase du8 0h0F du8 0h85 du16 &pm_phase ;; Try activating ; mov ax, 0h2401 du8 0hB8 du16 0h2401 int 0h15 ; jc a20acfail du8 0h0F du8 0h82 du16 &a20acfail test ah, ah ; jnz a20acfail du8 0h0F du8 0h85 du16 &a20acfail } asm { pm_phase: cli ; disable interrupts ; lgdt [GDT_DESC] du8 0h0F du8 0h01 du8 0h16 du16 GDT_DESC ; mov eax, cr0 du8 0h0F du8 0h20 du8 0hC0 or al, 1 ; mov cr0, eax du8 0h0F du8 0h22 du8 0hC0 ; jmp CODE_DESC:pm_jump du8 0h66 du8 0hEA du32 pm_jump du16 GDT_CODE - GDT_START } asm { pm_jump: ; mov eax, DATA_DESC du8 0hC7 du8 0hC0 du32 GDT_DATA - GDT_START ; mov ds, ax du8 0h8E du8 0hD8 ; mov es, ax du8 0h8E du8 0hC0 ; mov fs, ax du8 0h8E du8 0hE0 ; mov gs, ax du8 0h8E du8 0hE8 ; mov ss, ax du8 0h8E du8 0hD0 ; jmpt to PBOOT du8 0hEA du32 0h8400 du16 GDT_CODE - GDT_START } asm { lddap: ; mov dl, [boot_drive] du8 0h8A du8 0h16 du16 boot_drive mov ah, 0h42 int 0h13 ; jc lddapfail du8 0h0F du8 0h82 du16 &lddapfail ret } asm { print: mov ah, 0h0e print_loop: du8 0h8A ; mov al, [si] du8 0h04 cmp al, 0h00 ; jz print_done du8 0h0F du8 0h84 du16 &print_done int 0h10 ; inc si du8 0hFF du8 0hC6 ; jmp print_loop du8 0hE9 du16 &print_loop print_done: ret } asm { busyloop: ; jmp busyloop du8 0hE9 du16 &busyloop } asm { a20ns: ; mov si, a20nsmg du8 0hBE du16 a20nsmsg ; call print du8 0hE8 du16 &print ; jmp busyloop du8 0hE9 du16 &busyloop } asm { a20scfail: ; mov si, a20scfailmsg du8 0hBE du16 a20scfailmsg ; call print du8 0hE8 du16 &print ; jmp busyloop du8 0hE9 du16 &busyloop } asm { a20acfail: ; mov si, a20scfailmsg du8 0hBE du16 a20acfailmsg ; call print du8 0hE8 du16 &print ; jmp busyloop du8 0hE9 du16 &busyloop } asm { lddapfail: ; mov si, a20nsmg du8 0hBE du16 lddapfailmsg ; call print du8 0hE8 du16 &print ; jmp busyloop du8 0hE9 du16 &busyloop } asm { ; PROTECTED DAP pdap: du8 0h10 du8 0 du16 1 du16 0h8400 du16 0 du64 2 } asm { ; Kernel DAP kdap: du8 0h10 du8 0 du16 1 du16 0 du16 0h4000 ; Temporary address du64 3 } asm { GDT_START: du64 0 ; null desc GDT_CODE: du16 0hFFFF du16 0 du8 0 du8 0h9A du8 0hCF du8 0 GDT_DATA: du16 0hFFFF du16 0 du8 0 du8 0h92 du8 0hCF du8 0 GDT_END: GDT_DESC: du16 GDT_END - GDT_START - 1 du32 GDT_START } asm { boot_drive: du8 0 a20nsmsg: du8 "Boot failed! A20 not supported!", 13, 10, 0 a20scfailmsg: du8 "Boot failed! Failed to check a20 status!", 13, 10, 0 a20acfailmsg: du8 "Boot failed! Failed to activate A20!", 13, 10, 0 lddapfailmsg: du8 "Boot failed! Could not load dap", 13, 10, 0 }