94 lines
1.4 KiB
NASM
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 |