rdos/main.asm

64 lines
1.1 KiB
NASM

; 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:
mov ax,cs
mov ds,ax
sub sp, 0x30
xor ax,ax
mov es,ax
mov ax,_int_2F
xchg ax,[es:0x2F*4]
mov ax,cs
xchg ax,[es:0x2F*4+2]
int 0x2F
test ax, 0xFF
int 0x2F
add sp, 0x30
ret
%include "dumpreg.asm"
%include "kprintf.asm"