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 str_vendor: db "Nero", 0 str_product: db "Nero DOS ", 60, 234, 62, 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 ds 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 pop ds 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