70 lines
3.0 KiB
NASM
70 lines
3.0 KiB
NASM
|
TITLE BRK2 -- Break Handling Utilities Module
|
||
|
|
||
|
TRUE EQU 01H ;boolean true
|
||
|
FALSE EQU 00H ;boolean false
|
||
|
BREAKINT EQU 23H ;dos control-break intrpt
|
||
|
GETVECTOR EQU 35H ;dos get vector function
|
||
|
SETVECTOR EQU 25H ;dos set vector function
|
||
|
DOS_FUNCTION EQU 21H ;dos function call
|
||
|
|
||
|
BREAK SEGMENT PUBLIC 'CODE'
|
||
|
BREAKFLAG DB 0H ;break key hit flag
|
||
|
SAVEBRK DD 0H ;saved break vec. contents
|
||
|
ASSUME CS:BREAK
|
||
|
ASSUME DS:NOTHING
|
||
|
|
||
|
;CHECK_BREAK checks if ctrl-break has been pressed. It returns
|
||
|
;true if ctrl-break has been pressed and false if it hasn't.
|
||
|
|
||
|
PUBLIC CHECK_BREAK
|
||
|
CHECK_BREAK PROC FAR
|
||
|
XOR AX, AX ;clear ax
|
||
|
MOV AL, BREAKFLAG ;return value = breakflag
|
||
|
MOV BREAKFLAG, FALSE ;reset breakflag
|
||
|
RET
|
||
|
CHECK_BREAK ENDP
|
||
|
|
||
|
;INSTALL_BREAK_HANDLER sets up a ctrl-break interrupt handler. It
|
||
|
;also saves the address of the former break handler so that it can
|
||
|
;be restored later.
|
||
|
|
||
|
PUBLIC INST_BRK_HANDLR
|
||
|
INST_BRK_HANDLR PROC FAR
|
||
|
PUSH DS
|
||
|
MOV AL, BREAKINT ;AL = break interrupt
|
||
|
MOV AH, GETVECTOR ;AH = dos function code
|
||
|
INT DOS_FUNCTION ;call dos
|
||
|
MOV WORD PTR SAVEBRK, BX ;save offset in int vector
|
||
|
MOV WORD PTR SAVEBRK+2, ES ;save base in int vector
|
||
|
MOV AL, BREAKINT ;AL = break interrupt
|
||
|
MOV AH, SETVECTOR ;AH = dos function code
|
||
|
MOV DX, OFFSET BRK_HANDLER ;DX = offset of brk handler
|
||
|
MOV BX, CS ;BX = this segment
|
||
|
MOV DS, BX ;DS = this segment
|
||
|
INT DOS_FUNCTION ;call dos
|
||
|
POP DS
|
||
|
RET
|
||
|
INST_BRK_HANDLR ENDP
|
||
|
|
||
|
;BRK_HANDLER is invoked by the bios when ctrl_break is pressed
|
||
|
|
||
|
BRK_HANDLER PROC FAR
|
||
|
MOV BREAKFLAG, TRUE ;breakflag = yes, break hit
|
||
|
IRET
|
||
|
BRK_HANDLER ENDP
|
||
|
|
||
|
;REMOVE_BREAK_HANDLER restores the previous ctrl-break handler
|
||
|
|
||
|
REM_BRK_HANDLR PROC FAR
|
||
|
PUSH DS
|
||
|
MOV AL, BREAKINT ;AL = break interrupt
|
||
|
MOV AH, SETVECTOR ;AH = dos function code
|
||
|
MOV DX, WORD PTR SAVEBRK ;DX = saved 1st word
|
||
|
MOV BX, WORD PTR SAVEBRK+2 ;BX = saved 2nd word
|
||
|
MOV DS, BX ;DS = saved 2nd word
|
||
|
INT DOS_FUNCTION ;call dos
|
||
|
POP DS
|
||
|
RET
|
||
|
REM_BRK_HANDLR ENDP
|
||
|
BREAK ENDS
|
||
|
END
|