1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
PAGE 80,132 ;
TITLE DEBERR.ASM - DEBUGGER DISK ERROR HANDLER
;******************* START OF SPECIFICATIONS *****************************
;
; MODULE NAME:DEBERR.SAL
;
; DESCRIPTIVE NAME: DISK ERROR HANDLER
;
; FUNCTION: THIS ROUTINE IS A CATCHALL ERROR HANDLER. IT PRIMARILY
; HANDLES DISK ERROR.
;
; ENTRY POINT: ANY CALLED ROUTINE
;
; INPUT: NA
;
; EXIT-NORMAL: NA
;
; EXIT-ERROR: NA
;
; INTERNAL REFERENCES:
;
;
; EXTERNAL REFERENCES:
;
; NOTES: THIS MODULE SHOULD BE PROCESSED WITH THE SALUT PRE-PROCESSOR
; WITH OPTIONS "PR".
; LINK DEBUG+DEBCOM1+DEBCOM2+DEBCOM3+DEBASM+DEBUASM+DEBERR+DEBCONST+
; DEBDATA+DEBMES
;
; REVISION HISTORY:
;
; AN000 VERSION DOS 4.0 - MESSAGE RETRIEVER IMPLEMENTED. DMS:6/17/87
;
;
; COPYRIGHT: "MS DOS DEBUG Utility"
; "Version 4.00 (C) Copyright 1988 Microsoft"
; "Licensed Material - Property of Microsoft "
;
;******************** END OF SPECIFICATIONS ******************************
IF1
%OUT COMPONENT=DEBUG, MODULE=DEBERR
ENDIF
.XLIST
.XCREF
INCLUDE DOSSYM.INC
.CREF
.LIST
INCLUDE DEBEQU.ASM
FIRSTDRV EQU "A"
CODE SEGMENT PUBLIC BYTE
CODE ENDS
CONST SEGMENT PUBLIC BYTE
EXTRN RDFLG:BYTE
EXTRN DRVLET:BYTE
EXTRN dr1_ptr:word,dr2_ptr:word,dr3_ptr:word,dr4_ptr:word ;ac000
CONST ENDS
CSTACK SEGMENT STACK
CSTACK ENDS
DATA SEGMENT PUBLIC BYTE
EXTRN PARITYFLAG:BYTE
DATA ENDS
DG GROUP CODE,CONST,CSTACK,DATA
CODE SEGMENT PUBLIC BYTE
ASSUME CS:DG,DS:DG,ES:DG,SS:DG
EXTRN RESTART:NEAR
PUBLIC DRVERR, TRAPPARITY, RELEASEPARITY, NMIINT, NMIINTEND
TRAPPARITY:
IF IBMJAPAN
PUSH BX
PUSH ES
PUSH DX ; save location of new offset
MOV DX,OFFSET DG:NMIINT ; DS:DX has new interrupt vector
CALL SWAPINT ; diddle interrupts
ASSUME ES:NOTHING
MOV WORD PTR [NMIPTR],BX ; save old offset
MOV WORD PTR [NMIPTR+2],ES ; save old segment
POP DX ; get old regs back
POP ES ; restore old values
ASSUME ES:DG
POP BX
MOV BYTE PTR [PARITYFLAG],0 ; no interrupts detected yet!
RET
SWAPINT:
PUSH AX
MOV AX,(GET_INTERRUPT_VECTOR SHL 8) + 2
INT 21H ; Get old NMI Vector
MOV AX,(SET_INTERRUPT_VECTOR SHL 8) + 2
INT 21h ; let OS set new vector
POP AX
ENDIF
RET
RELEASEPARITY:
IF IBMJAPAN
PUSH DX
PUSH DS
PUSH BX
PUSH ES
LDS DX,DWORD PTR [NMIPtr] ; get old vector
CALL SwapInt ; diddle back to original
POP ES
POP BX
POP DS
POP DX
MOV [PARITYFLAG],0 ; no interrupts possible!
ENDIF
RET
NMIInt:
IF IBMJAPAN
PUSH AX ; save AX
IN AL,0A0H ; get status register
OR AL,1 ; was there parity check?
POP AX ; get old AX back
JZ NMICHAIN ; no, go chain interrupt
OUT 0A2H,AL ; reset NMI detector
MOV CS:[PARITYFLAG],1 ; signal detection
IRET
NMICHAIN:
JMP DWORD PTR CS:[NMIPTR] ; chain the vectors
NMIPTR DD ? ; where old NMI gets stashed
ENDIF
NMIINTEND:
DRVERR:
or al,al ;ac000;see if drive specified
; $if nz ;an000;drive specified
JZ $$IF1
add byte ptr drvlet,firstdrv;ac000;determine drive letter
cmp byte ptr rdflg,write ;ac000;see if it is read/write
; $if z ;an000;it is write
JNZ $$IF2
mov dx,offset dg:dr2_ptr ;an000;message
; $else ;an000;it is read
JMP SHORT $$EN2
$$IF2:
mov dx,offset dg:dr1_ptr ;an000;message
; $endif ;an000;
$$EN2:
; $else ;an000;write protect error
JMP SHORT $$EN1
$$IF1:
add byte ptr drvlet,firstdrv;ac000;determine drive letter
cmp byte ptr rdflg,write ;ac000;see if it is read/write
; $if z ;an000;it is write
JNZ $$IF6
mov dx,offset dg:dr4_ptr ;an000;message
; $else ;an000;it is read
JMP SHORT $$EN6
$$IF6:
mov dx,offset dg:dr3_ptr ;an000;message
; $endif ;an000;
$$EN6:
; $endif ;an000;
$$EN1:
; CLEAN OUT THE DISK...
MOV AH,DISK_RESET
INT 21H
JMP RESTART
CODEEND:
CODE ENDS
END
|