asm { start: ; xor ax, ax du8 0h31 du8 0hC0 ; mov es, ax du8 0h8E du8 0hC0 ; mov ss, ax du8 0h8E du8 0hD0 ; mov ds, ax du8 0h8E du8 0hD8 ; mov sp, 0h7c00 du8 0hBC du16 0h7c00 ; mov [boot_drive], dl du8 0h88 du8 0h16 du16 boot_drive mov ah, 0h41 ; mov bx, 0h55aa du8 0hBB du16 0h55aa int 0h13 ; jc ldns du8 0h0F du8 0h82 du16 &ldns ; call ldb2 du8 0hE8 du16 &ldb2 ; mov dl, [boot_drive] du8 0h8A du8 0h16 du16 boot_drive ; jmp 0h8000 du8 0hEA du32 0h8000 } asm { ldb2: ; mov si, b2dap du8 0hBE du16 b2dap ; mov dl, [boot_drive] du8 0h8A du8 0h16 du16 boot_drive mov ah, 0h42 int 0h13 ; jc ldfail du8 0h0F du8 0h82 du16 &ldfail ret } asm { ldfail: ; mov si, ldfailmsg du8 0hBE du16 ldfailmsg ; call print du8 0hE8 du16 &print ; jmp busyloop du8 0hE9 du16 &busyloop } asm { ldns: ; mov si, ldfailmsg du8 0hBE du16 ldnsmsg ; call print du8 0hE8 du16 &print ; jmp busyloop du8 0hE9 du16 &busyloop } 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 { b2dap: du8 0h10 du8 0 du16 1 du16 0h8000 du16 0 du64 1 } asm { boot_drive: du8 0 ldfailmsg: du8 "Boot failed! Can't load b2dap.", 13, 10, 0 ldnsmsg: du8 "Boot failed! LBA not supported.", 13, 10, 0 }