Miscellaneous > 16 bit DOS Programming

Interrupt Hooking in MS DOS

(1/1)

aparsons:
Hi,

I am trying to find a simple example of hooking an interrupt in MS DOS.
Does anyone have any pointers to an article or even sample code.

Regards.
Andrew

FORTRANS:
Hi,

   Here is some code from a program I wrote.  A game
that I thought would need a faster response to any inputs.
Notes reference books by Ray Duncan and The Waite
Group.  A lot of code was simplified or edited out.


--- Code: ---; - - - - - -
DATASG  SEGMENT PUBLIC
; Interrupt Handlers
OldInt09 DW     2 DUP (?)
KeyFlag DB      0
OldInt1B DW     2 DUP (?)
OldInt1C DW     2 DUP (?)

; - - - - - -
; Interrupt Handlers
EekMsg1 DB      13,10,'Inconsistentcy detected when restoring Int 1C BIOS timer vector! '
        DB      13,10,'Please reboot now! $'
EekMsg2 DB      13,10,'Inconsistentcy detected when restoring Int 9 keyboard vector! '
        DB      13,10,'Please reboot now! $'

DATASG  ENDS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CODE    SEGMENT PUBLIC
        ASSUME  CS:CODE,DS:DATASG,ES:NOTHING,SS:STCKSG

START   PROC FAR        ; PROC needed for RET typing
        MOV     AX,SEG DATASG
        MOV     DS,AX
; Start up of program...

; - - - - -
; Set up the keyboard/timer IRQ handlers
        CALL IntSetup   ; Setup interrupt handlers

; - - - - -
; Restore IRQ handlers and terminate
        JMP     Quit

START   ENDP

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IntSetup PROC NEAR
;( Most code left out to simplify. )

; SCALL is a macro to generate DOS Int 21H.
; GIVEC is function 35H
; SIVEC is function 25H
; OUTSTR is function 09H
; EXIT is function 4CH

;       Get old int 1CH
        MOV     AL,1CH                  ; Function 35 interrupt 1C
        SCALL   GIVEC                   ; Get Interrupt VECtor
        MOV     [OldInt1C],BX           ; Int 1C is BIOS clock tick
        MOV     [OldInt1C+2],ES         ; Returns in ES:BX

;       Store new int 1C
        MOV     DX,OFFSET NewInt1C      ; Set clock tick
        PUSH    DS                      ; DS:DX points to new handler
        PUSH    CS
        POP     DS
        MOV     AL,1CH                  ; to point to NewInt1c
        SCALL   SIVEC                   ; Set Interrupt VECtor
        POP     DS

;       Get old int 09
        MOV     AL,09                   ; interrupt 09
        SCALL   GIVEC                   ; Get Interrupt VECtor
        MOV     [OldInt09],BX           ; Int 9 is keyboard
        MOV     [OldInt09+2],ES         ; Returns in ES:BX

;       Store new int 09
        MOV     DX,OFFSET NewInt09      ; point DS:DX to NewInt09
        PUSH    DS
        PUSH    CS
        POP     DS
        MOV     AL,9                    ; Set keyboard handler
        SCALL   SIVEC                   ; Set Interrupt VECtor
        POP     DS

        RET

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;       Close down
;       **********
;( Most code left out to simplify. )

Quit:
;       Get current int 1CH
        MOV     AL,1CH                  ; Function 35 interrupt 1C
        SCALL   GIVEC                   ; Get Interrupt VECtor
        MOV     AX,OFFSET NewInt1C
        CMP     AX,BX
        JZ      Q1
        MOV     DX,OFFSET EekMsg1
        SCALL   OUTSTR
        JMP     Q2
Q1:
        MOV     AX,ES
        MOV     BX,CS
        CMP     BX,AX
        JZ      Q2
        MOV     DX,OFFSET EekMsg1
        SCALL   OUTSTR
Q2:

        MOV     DX,[OldInt1C]           ; restore old
        MOV     BX,[OldInt1C+2]         ; interrupt 1C vector
        PUSH    DS
        MOV     DS,BX
        MOV     AL,1CH
        SCALL   SIVEC
        POP     DS

;       Get current int 09
        MOV     AL,09                   ; Function 35 interrupt 09
        SCALL   GIVEC                   ; Get Interrupt VECtor
        MOV     AX,OFFSET NewInt09
        CMP     AX,BX
        JZ      Q3
        MOV     DX,OFFSET EekMsg2
        SCALL   OUTSTR
        JMP     Q4
Q3:
        MOV     AX,ES
        MOV     BX,CS
        CMP     BX,AX
        JZ      Q4
        MOV     DX,OFFSET EekMsg2
        SCALL   OUTSTR
Q4:

        MOV     DX,[OldInt09]           ; restore old
        MOV     BX,[OldInt09+2]         ; interrupt 09 vector
        PUSH    DS
        MOV     DS,BX
        MOV     AL,9
        SCALL   SIVEC
        POP     DS

;       Enter dos
        SCALL   EXIT

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Handle Int 1CH, BIOS timer, 11/12 February 2001, SRN

NewInt1C        PROC    FAR
        PUSH    AX
        PUSH    DX
        PUSH    DS

        MOV     AX,SEG DATASG           ; for real, _before_ you try to
        MOV     DS,AX                   ; call OldInt1C

        PUSHF
        CALL    DWORD PTR OldInt1C

        CMP     [Pause],0
        JNE     NI1C_2

        CMP     [TimerFlag],0           ; Flag already set?
        JNE     NI1C_2
        MOV     [TimerFlag],1

        DEC     [PieceTime]
        JNS     NI1C_1                  ; Positive or zero?
        MOV     [PieceTime],0           ; Ensure not negative
NI1C_1:
        DEC     [LevelTime]
        JNS     NI1C_2                  ; Positive or zero?
        MOV     [LevelTime],0
NI1C_2:
        POP     DS
        POP     DX
        POP     AX

        IRET
NewInt1C        ENDP

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Interrupt handler for Int 9, BIOS Keyboard, 11 February 2001

NewInt09 PROC   FAR

        PUSH    DS
        PUSH    AX
        MOV     AX,SEG DATASG
        MOV     DS,AX
        PUSHF
        CALL    DWORD PTR OldInt09
        MOV     [KeyFlag],1     ; Indicate that a key is available.
        POP     AX
        POP     DS

        IRET

NewInt09 ENDP

CODE    ENDS
        END     START

--- End code ---

HTH,

Steve N.

Navigation

[0] Message Index

Go to full version