2019-03-13 21:11:19 +01:00
|
|
|
; assumptions about the starting envionment
|
2019-03-10 20:23:09 +01:00
|
|
|
cpu 8086
|
2019-03-23 21:17:47 +01:00
|
|
|
org 0x0000
|
2019-03-23 21:37:18 +01:00
|
|
|
; es:bx pxeenv+ structure
|
2019-03-13 21:11:19 +01:00
|
|
|
; ss:sp functional stack
|
2019-03-10 20:23:09 +01:00
|
|
|
|
2019-03-23 21:37:18 +01:00
|
|
|
_startup:
|
|
|
|
xor ax, ax
|
2019-03-24 18:59:45 +01:00
|
|
|
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:
|
|
|
|
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
|
|
|
|
int 0x18
|
|
|
|
.mbr:
|
|
|
|
mov ax, 0x0050
|
|
|
|
mov ds, ax
|
|
|
|
mov [0xFFFE], ss ; save current stack configuration onto new stack
|
|
|
|
mov [0xFFFC], sp
|
|
|
|
mov ss, ax
|
|
|
|
mov sp, 0xFFFC
|
2019-03-23 21:54:08 +01:00
|
|
|
|
2019-03-24 18:59:45 +01:00
|
|
|
push dx
|
|
|
|
push bx ; possible far ptr to pxeenv+ struct
|
|
|
|
push es
|
2019-03-23 21:54:08 +01:00
|
|
|
|
2019-03-24 18:59:45 +01:00
|
|
|
mov es, ax ; 0x0050
|
|
|
|
mov di, 0x0000
|
2019-03-23 21:37:18 +01:00
|
|
|
|
2019-03-24 18:59:45 +01:00
|
|
|
xor ax, ax
|
|
|
|
mov ds, ax
|
2019-03-23 21:37:18 +01:00
|
|
|
mov si, 0x7C00
|
2019-03-24 18:59:45 +01:00
|
|
|
|
2019-03-23 22:27:25 +01:00
|
|
|
mov cx, _reloc_end
|
2019-03-23 21:37:18 +01:00
|
|
|
rep movsb
|
2019-03-10 20:23:09 +01:00
|
|
|
|
2019-03-24 18:59:45 +01:00
|
|
|
call 0x0050:main
|
|
|
|
.halt:
|
|
|
|
hlt
|
|
|
|
jmp .halt
|
2019-03-13 18:28:38 +01:00
|
|
|
|
2019-03-23 21:23:17 +01:00
|
|
|
%include "kernel/main.asm"
|
2019-03-23 21:37:18 +01:00
|
|
|
|
|
|
|
_reloc_end:
|