cpu 8086 org 0x0100 push cs pop es mov di, isr_dos_main mov ax, 0x21 call intr_register int3 cli .halt: hlt jmp .halt isr_dos_main: ; Bail out if subfunction number too high cmp ah, 0x0F jnc isr_invalid ; allocate our return address push bx ; actual BX backup push bx ; transfer subfunction number into BX xor bx, bx mov bl, ah ; table offset = AH * 2 shl bx, 1 ; fetch from table mov bx, [dos_functions+bx] ; inject our address into the stack add sp, 4 push bx sub sp, 2 ; restore BX pop bx ; reads our address from the stack and jumps there ret ; ISR for invalid subfunctions or unimplemented isr_invalid: mov bp, 0xFEFE int3 .hlt: hlt jmp .hlt ; ISR tail to set carry flag to signal error isr_error: push bp mov bp, sp ; set carry flag or WORD [SS:BP+6], 1 pop bp isr_return: iret ; Table for DOS subfunctions dos_functions: ; AH 00-03 dw isr_invalid dw isr_getc_echo dw isr_putc dw isr_invalid ; AH 04-07 dw isr_invalid dw isr_invalid dw isr_invalid dw isr_invalid ; AH 08-0B dw isr_invalid dw isr_invalid dw isr_invalid dw isr_invalid ; AH 0C-0F dw isr_invalid dw isr_invalid dw isr_invalid dw isr_invalid %include "intr.asm" %include "chario.asm" kernel_end: