; assumptions about the starting envionment cpu 8086 org 0x0000 ; if we are not at CS:0000, CS adjustment will fix it for us ; dl probable drive number ; ds:si probable pointer to partition structure ; es:bx probable pxeenv+ structure ; ss:sp functional stack _startup: ; during PXE, CS=0000 and IP=7C00 ; adjust CS so our offsets match org setting above mov ax, _exit push ax ; store exit addr on stack so main will return to it push bx ; backup bx call near .push_ip .push_ip: pop bx sub bx, .push_ip ; subtract expected value ... shr bx,1 ; shift it to 4 bits to the right shr bx,1 shr bx,1 shr bx,1 mov ax,cs add ax,bx ; so we can add it to cs pop bx ; restore bx push ax ; cs mov ax, main push ax ; ip sti retf ; jump _exit: mov si, .message call kprintf int 0x20 .loop: hlt jmp .loop .message: db "Halted: Waiting for poweroff...", 0 main: call dumpreg mov ax,cs mov ds,ax mov si, string_halt call kprintf .loop: hlt jmp .loop %include "dumpreg.asm" %include "kprintf.asm"