Note: This is the June 17, 2006 capture of http://bentong.topcities.com/comp/progs/asm/tsr.htm from the Wayback Machine. This was uploaded to the reloaded ISLESV.NET on June 22, 2023.
; TSR.SHL: Shell for TSR programs, uses INT 27H.
;
; This file Copyright (C) 2004-2005 by Vincent "Bentong" S. Isles
; http://bentong.topcities.com
; bentong_isles@yahoo.com
.MODEL SMALL
; Put the interrupt number you want to hook here...
HOOKED_INT EQU 9
.CODE
ORG 100H
ENTRY: JMP LOAD_PROG
OLD_INT LABEL WORD ; so we can treat old_int_addr
OLD_INT_ADDR DD ? ; as word and double word
PROG PROC
PUSH AX ; save all registers
PUSH BX ; there's PUSHA and POPA
PUSH CX ; for higher processors
PUSH DX
PUSH DI
PUSH SI
PUSH DS
PUSH ES
PUSHF
CALL OLD_INT_ADDR ; call old interrupt first
; prog here
; prog here
EXIT: POP ES
POP DS
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
IRET ; remember, this an interrupt
PROG ENDP
LOAD_PROG PROC ; sole purpose: set up TSR
MOV AH,35H ; get old vector into ES:BX
MOV AL,HOOKED_INT ; number of hooked interrupt
INT 21H
MOV OLD_INT,BX ; store old interrupt vector
MOV OLD_INT[2],ES
MOV AH,25H ; set new interrupt vector
LEA DX,PROG
INT 21H
EXIT_LOAD:
MOV DX,OFFSET LOAD_PROG ; last address we want to
INT 27H ; keep
LOAD_PROG ENDP
END ENTRY