home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 14
/
CD_ASCQ_14_0694.iso
/
maj
/
653
/
cerrtrap.asm
< prev
next >
Wrap
Assembly Source File
|
1994-04-03
|
5KB
|
135 lines
PAGE ,132
; A sample Interrupt 24 (DOS critical error exception) handler
;
; Public domain by Bob Stout
;
; Requires MASM 5.1 or later or equivalent
;
; Assemble with: MASM /Mx /z ...
; TASM /jMASM /mx /z ...
% .MODEL memodel,C ;Add model support via command
;line macros, e.g.
;MASM /Dmemodel=LARGE
EXTRN cedevdvr:dword, cetype:word, ceerror:word, cereturn:byte
EXTRN read_err:far, write_err:far, term_err:far
EXTRN no_paper:far, fixup_ret:far, FAT_err:far
;NOTE: All the above routines MUST set cereturn to:
; 0 - Ignore
; 1 - Retry
; 2 - Abort
; 3 - Fail (DOS 3.3 and later)
.DATA?
PUBLIC osver, rmvbl, exerr, locus, class, suggest
osver db ?
rmvbl db ?
exerr dw ?
locus db ?
class db ?
suggest db ?
.CODE
;
; This is called by myint24
;
; extern int (*read_err)(),
; (*write_err)(),
; (*term_err)(),
; (*no_paper)(),
; (*fixup_ret)(),
; (*FAT_err)();
;
; Each returns: 0 - Ignore
; 1 - Retry
; 2 - Abort
; 3 - Fail (DOS 3.3 and later)
;
mynew24 PROC USES BX
mov ah,030h ;get DOS version number
int 21
or al,al ;zero means DOS 1.x
jnz NotDOS1
mov al,1
NotDOS1:
mov osver,al ;save DOS version
mov ax,cetype ;get type of exception...
mov bx,ax ; & save it for later
and ax,80h ;disk error?
jnz NotDiskErr ;no, continue
cmp al,1 ;yes, DOS 1.x?
jz wrong_DOS ;yes, can't check for removable media
mov ah,-1 ;no, assume removable media
test word PTR cedevdvr,0800h ;is the media removable?
jz removable
xor ah,ah ;no, flag fixed media
removable:
mov rmvbl,ah ;save media type
cmp al,3 ;DOS 3.0 or greater?
jb wrong_DOS ;no, skip it
push bx ;yes, save cetype info...
push ds ; & other regs
push es
push dx
push si
push di
push bp
mov ah,59h ;get extended error info
int 21
pop bp ;restore regs
pop di
pop si
pop dx
pop es
pop ds
mov exerr,ax ;save extended error code...
mov locus,ch ; locus...
mov class,bh ; class...
mov suggest,bl ; & suggested action
pop bx ;restore cetype info
wrong_DOS:
mov ax,bx ;get exception type
and ax,06h ;FAT problems?
cmp ax,02h
jnz ok_fat ;no, continue
jmp far PTR FAT_err ;yes, handle it
ok_fat:
mov ax,bx ;get exception type
and ax,01h ;handle read and write separately
jz rd_err
jmp far PTR write_err
rd_err:
jmp far PTR read_err
NotDiskErr:
test ceerror,0009h ;printer out of paper?
jnz not_eop ;no, continue
jmp far PTR no_paper ;yes, handle it
not_eop:
test word PTR cedevdvr,8000h ;character device?
jnz unknown ;no, continue
jmp far PTR term_err ;yes, assume bad terminal I/O
;
; If we get here, we haven't identified the error. We now call fixup_ret()
; to resolve which action to take. This will usually involve the information
; in exerr qualified by the version of DOS in use and is best left to coding
; in a higher level language like C.
;
; NOTE: It is IMPERATIVE that the return value of fixup_ret() default to 2
; to insure that if all else fails, the critcal error handler aborts!
;
unknown:
call far PTR fixup_ret ;unknown error - handle loose ends...
xor ah,ah ; & return
mov cereturn,al
ret
mynew24 ENDP
end