home *** CD-ROM | disk | FTP | other *** search
- ; ---------------------------------------------------------------
- ; FILENAME: INT24.ASM -- Critical error (interrupt 24) handler
- ;
- ; FUNCTIONS:
- ;
- ; INT24 ---- Internal function. Called by DOS on a critical error
- ; GETINT24 - Returns a critical error number to Clipper
- ; SETINT24 - Activates the critical error (interrupt 24) handler
- ; ---------------------------------------------------------------
- ; Copyright(c) 1988-1990 - James Occhiogrosso
- ;
- INCLUDE DEVELOP.MAC ; Include Developer's Library macro file
-
- ; Declare function names
- PUBLIC SETINT24 ; Sets DOS INT24 vector to our function
- PUBLIC GETINT24 ; Returns INT24 critical error code
- PUBLIC INT24 ; Our internal INT24 handler
-
-
- ; Declare Clipper externals
- EXTRN __RET:FAR ; Return nothing to Clipper
- EXTRN __RETNI:FAR ; Return numeric integer to Clipper
- EXTRN __RETL:FAR ; Return logical to Clipper
- EXTRN __PARINFO:FAR ; Get Clipper parameter information
- EXTRN __PARL:FAR ; Get Clipper logical
-
- CODESEG SEGMENT 'CODE'
- ASSUME CS:CODESEG
-
- ;----------------------------------------------------------------
- SETINT24 PROC FAR ; Toggle setting of INT24 handler
- ;----------------------------------------------------------------
-
- JMP BEGIN ; Jump around data storage area
-
- OLD_INT24 DD ? ; Storage for DOS INT24 address
- RET_VALUE DB 0 ; SETINT24 return value
- INT24_STAT DB 0 ; Current INT24 handler status
- INT24_ERR DB 0 ; GETINT24 error number
-
-
- BEGIN:
- PUSH_REGS ; Save Clipper registers
-
- P_TYPE 1 ; Get parameter type to AX
- CMP AX, 4 ; Was a logical value passed?
- MOV AH, 0 ; No! Set up for the current
- MOV AL, CS:INT24_STAT ; status byte to be
- JNE SET_RETURN ; returned to Clipper
-
- GET_PARL 1 ; Yes! Put logical value in AX
- MOV CX, AX ; Save passed parameter in CX
- MOV AH, 0
- MOV AL, CS:INT24_STAT ; Get current handler status
- CMP AX, CX ; Is it same as incoming?
- JNE CONTINUE ; No! Continue
-
- SET_RETURN:
- MOV CS:RET_VALUE, AL ; Yes! Set up return value
- JMP EXIT_SETINT24 ; and return it to Clipper
-
- CONTINUE:
- PUSH CS ; Move code segment address
- POP DS ; into data segment register
- ASSUME DS:NOTHING ; and tell the assembler.
- MOV CS:RET_VALUE, AL ; Set return to current status
- CMP CX, 1 ; Are we installing interrupt?
- JE INSTALL_INT24 ; Yes! Set DOS vector address
-
- REMOVE_INT24: ; No! Default to removing it
- CMP CS:INT24_STAT, 0 ; Is it already removed?
- JE EXIT_SETINT24 ; Yes! Return to Clipper
-
- MOV CS:INT24_STAT, 0 ; No! Change handler status byte
- MOV CS:INT24_ERR, 0 ; Reset error number to 0.
- MOV DI, OFFSET CS:OLD_INT24 ; Get data address for DOS
- ; INT24 handler
- MOV DX, [DI] ; Move offset to DX
- MOV DS, [DI+2] ; Move segment to DS
- JMP SET_VECTOR ; Set vector to original value
-
- INSTALL_INT24:
- CMP CS:INT24_STAT, 1 ; Is it already installed?
- JE EXIT_SETINT24 ; Yes! Return to Clipper
-
- MOV CS:INT24_STAT, 1 ; No! Set handler status byte
- MOV CS:RET_VALUE, 0 ; Reset return value to zero
- MOV CS:INT24_ERR, 0 ; Reset error number to 0
- MOV AL, 24h ; DOS critical error handler
- MOV AH, 35h ; DOS request for vector address
- INT 21h
-
- MOV DI, OFFSET CS:OLD_INT24 ; Get address for old vector
- MOV [DI], BX ; Save offset
- MOV [DI+2], ES ; Save segment
-
- MOV DX, OFFSET CS:INT24 ; Get address of our handler
-
- SET_VECTOR:
- MOV AL, 24h ; DOS critical error handler
- MOV AH, 25h ; DOS request to set vector
- INT 21h
-
- EXIT_SETINT24:
- SUB AH, AH ; Put Clipper return value
- MOV AL, CS:RET_VALUE ; in AX
- POP_REGS ; Restore all registers
- RET_LOGIC ; Return logic value to Clipper
-
- SETINT24 ENDP ; End SETINT24 procedure
-
-
- ;----------------------------------------------------------------
- GETINT24 PROC FAR ; Return INT24 error number to Clipper
- ;----------------------------------------------------------------
-
- SUB AX, AX ; Get pending error code
- MOV AL, CS:INT24_ERR
- MOV CS:INT24_ERR, 0 ; Reset code to zero
- RET_INT ; Return error code to Clipper
-
- GETINT24 ENDP ; End Procedure
-
-
- ;----------------------------------------------------------------
- INT24 PROC FAR ; Critical error (INT24) handler
- ;----------------------------------------------------------------
-
- ; This is the actual interrupt handler procedure. It replaced the
- ; normal DOS INT 24 handler, and stores the critical error in its
- ; code segment for return to Clipper.
-
- CMP AH, 128 ; Disk status byte - if < 128,
- JB SAVE_ERROR ; error was disk I/O, save it
-
- JMP DWORD PTR CS:[OLD_INT24] ; Otherwise, let DOS handle
- JMP EXIT_INT24 ; it, then return.
-
- SAVE_ERROR:
- MOV AX, DI ; Put the error number in AX,
- INC AL ; Increment for Clipper return
- MOV CS:INT24_ERR, AL ; and save it
- MOV AX, 3 ; Tell DOS to return
- ; using Int 23h
- EXIT_INT24:
- IRET ; Return from INT24 handler
-
- INT24 ENDP ; End interrupt handler
-
-
- CODESEG ENDS ; End of code segment
- END ; End of assembly
-
-