cpu 8086 org 0x0000 db 0x55, 0xAA optrom_length: db 0x00 jmp optrom_init str_vendor: db "Nero", 0 align 16 str_product: db "Nero DOS", 0 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: xor ax, ax mov es, ax mov di, 0x0060 ; vector (0x18 * 4 bytes) mov ax, start stosw mov ax, cs stosw retf putc: push bx push cx mov ah, 0x0e mov bx, 0x0000 int 0x10 pop cx pop bx ret announce: push cs mov ax, str_product push ax call printf db "%S (CS=%Xh)", 0x0A, 0x0D, 0x00 add sp, 4 ret start: mov ax, cs mov ds, ax call announce ; clear memory until 0x01000 xor ax, ax mov es, ax mov di, 0x500 mov cx, 0xB00 rep stosb call intr_init sti sub sp, 0x10 mov si, sp mov word [ss:si+0x00], 0 mov word [ss:si+0x02], 1 mov word [ss:si+0x04], 0 mov word [ss:si+0x06], 0x2000 mov word [ss:si+0x08], 0x07fc mov word [ss:si+0x0A], 0 mov word [ss:si+0x0C], 0 mov word [ss:si+0x0E], 0 mov ah, 0x42 push ss pop ds call ramdisk_io push ax call printf db "AX=%X", 0x0A, 0x0D, 0x00 pop ax add sp, 0x10 .halt: hlt jmp .halt %include "ramdisk.inc" %include "printf.inc" %include "intr.asm" %include "debug.asm" %include "kprintf.asm" %include "dosapi.asm" _reloc_end: align 512