rdos/kernel/main.asm

94 lines
1.4 KiB
NASM

cpu 8086
org 0x0000
db 0x55, 0xAA
optrom_length:
db 0x00
jmp optrom_init
times (0x1A - ($-$$)) db 0
dw pnp
align 16
pnp:
db "$PnP"
db 1 ; version 1
db 2 ; 2 * 16 length
dw 0 ; offset of next header
db 0
db 0 ; checksum (filled by fix-rom)
dd 0 ; device identifier
dw str_vendor ; manufacturer string
dw str_product ; product name string
db 0,0,0 ; device type string
db 0x20 ; device indicator, bit for "read cacheable" set
dw 0 ; boot connection vector
dw 0 ; boot disconnect vector
dw start ; bootstrap entry point
dw 0 ; reserved
dw 0
align 16
optrom_init:
; setup data stack below code stack
mov bp, sp
sub bp, 0x80
; intnum and offset to data stack
mov word [ss:bp], 0x18
mov word [ss:bp+2], start
call intr_register
retf
putc:
push bx
push cx
mov ah, 0x0e
mov bx, 0x0000
int 0x10
pop cx
pop bx
ret
announce:
push cs
mov ax, cs
mov ds, ax
mov ax, str_product
push ax
call printf
db "%S (CS=%Xh)", 0x0A, 0x0D, 0x00
add sp, 4
ret
start:
xor ax, ax
mov ds, ax
mov es, ax
; setup code + data stack
mov ss, ax
mov sp, ax
mov bp, sp
; data stack starts 512 bytes below code stack
sub bp, 0x200
call announce
sub bp, 4
mov word [ss:bp], 3
mov word [ss:bp+2], isr_debug
call intr_register
sti
int 3
.halt:
hlt
jmp .halt
%include "ramdisk.inc"
%include "printf.inc"
%include "intr.asm"
%include "debug.asm"
align 512