; Public Domain ; by C. Masloch, 2023 cpu 8086 org 256 start: cmp sp, stack.top jae .stackgood mov dx, msg.stackbad mov ah, 09h int 21h mov ax, 4CFFh int 21h .stackgood: mov sp, stack.top mov bx, (stack.top - start + 256 + 15) / 16 mov ah, 4Ah int 21h xor ax, ax xchg ax, word [2Ch] mov es, ax test ax, ax jz .noenv mov ah, 49h int 21h .noenv: xor cx, cx mov ax, 352Dh int 21h cmp bx, -1 je .2Dinv mov ax, es test ax, ax jz .2Dinv inc cx jmp .2Ddone .2Dinv: mov dx, msg.2Dinv mov ah, 09h int 21h .2Ddone: mov ax, 352Fh int 21h cmp bx, -1 je .2Finv mov ax, es test ax, ax jz .2Finv inc ch jmp .2Fdone .2Finv: mov dx, msg.2Finv mov ah, 09h int 21h .2Fdone: cmp cx, 101h jne .install mov dx, msg.bothvalid mov ah, 09h int 21h mov ax, 4C01h int 21h .install: mov bx, 1 mov ah, 48h int 21h jnc .memgood mov dx, msg.membad mov ah, 09h int 21h mov ax, 4C02h int 21h .memgood: mov bx, cx mov es, ax xor di, di mov si, handler mov cx, 8 push cx rep movsw dec ax mov es, ax inc ax mov word [es:1], ax pop di ; = 8 mov cx, di rep movsb mov ds, ax xor dx, dx test bl, bl jnz .no2D mov ax, 252Dh int 21h .no2D: test bh, bh jnz .no2F mov ax, 252Fh int 21h .no2F: mov ax, 4C00h int 21h align 16, db 0 handler: iret align 16, nop mcbname: db "INST2D2F" msg: .stackbad: db "Out of stack!",13,10,36 .membad: db "Out of memory!",13,10,36 .2Dinv: db "Installing interrupt 2Dh iret handler.",13,10,36 .2Finv: db "Installing interrupt 2Fh iret handler.",13,10,36 .bothvalid: db "Both interrupts already valid, not installing.",13,10,36 absolute $ alignb 16 stack: resb 512 .top: