; assumptions about the starting envionment cpu 8086 org 0x0000 _startup: xor ax, ax ; trash ax mov ax, cs cmp ax, 0x0000 ; MBR or NBP, CS=0000 IP=7C00 je .mbr cmp ax, 0x07C0 ; MBR on weird BIOS, CS=07C0 IP=0000 je .mbr .dos: ; ROP because call only works on immediate or memory mov ax, cs push ax ; return CS mov ax, .dosret add ax, 0x0100 push ax ; return IP mov ax, cs add ax, 0x0010 push ax ; main CS mov ax, main push ax ; main IP retf .dosret: int 0x20 jmp .halt .mbr: push si ; index of partition table entry push ds ; segment for ^ push dx ; dl might contain drive number push bx ; possible offset for pxeenv+ struct push es ; segment for ^ mov ax, 0x0050 mov es, ax mov di, 0x0000 xor ax, ax mov ds, ax mov si, 0x7C00 mov cx, _reloc_end rep movsb call 0x0050:main .halt: hlt jmp .halt main: mov ax, cs mov ds, ax call heap_init call ivt_backup call debug_init int 0x2E retf %include "heap.asm" %include "intr.asm" %include "debug.asm" %include "kprintf.asm" _reloc_end: align 16 heap: