DOS-debug
1
2;--- debugger entries for DPMI protected-mode
3;--- exceptions ( 0, 1, 3, 6, 7, C, D, E )
4
5;--- stack frames DPMI exception handlers 16/32-bit
6
7EXFR16 struc
8dw 8 dup (?) ; pusha
9wMsg dw ?
10dw 2 dup (?) ; far16 return to DPMI
11wErrC dw ?
12rIP dw ?
13rCS dw ?
14rFL dw ?
15rSP dw ?
16rSS dw ?
17EXFR16 ends
18
19EXFR32 struc
20dd 8 dup (?) ; pushad
21wMsg dw ?
22dd 2 dup (?) ; far32 return to DPMI
23dwErrC dd ?
24rEIP dd ?
25rCS dw ?
26dw ?
27rEFL dd ?
28rESP dd ?
29rSS dw ?
30dw ?
31EXFR32 ends
32
33excxx_16:
34pusha
35mov bp,sp
36push ds
37mov ds,cs:[dssel]
38mov ax,[bp].EXFR16.rIP
39mov bx,[bp].EXFR16.rCS
40mov cx,[bp].EXFR16.rFL
41mov dx,[bp].EXFR16.rSP
42mov si,[bp].EXFR16.rSS
43mov di,[bp].EXFR16.wMsg
44mov [bp].EXFR16.rCS, cs
45mov [bp].EXFR16.rSS, ds
46cmp [bInDbg],0 ;did the exception occur inside DEBUG?
47jz isdebuggee16
48if EXCCSIP
49mov si, bx
50endif
51mov [bp].EXFR16.rIP,offset ue_intx
52mov bx, [top_sp]
53sub bx, 3*2
54mov [bx+0], di
55if EXCCSIP
56mov [bx+2], si
57mov [bx+4], ax
58endif
59mov [bp].EXFR16.rSP, bx
60and byte ptr [bp].EXFR16.rFL+1, not 1 ;reset TF
61pop ax
62jmp back2dpmi16
63isdebuggee16:
64mov [bp].EXFR16.rIP, offset intrtn
65and byte ptr [bp].EXFR16.rFL+1, not 3 ;reset IF + TF
66mov [bp].EXFR16.rSP, offset regs.rSS
67mov [regs.rIP],ax
68mov word ptr [regs.rIP+2],0
69mov [regs.rCS],bx
70mov [regs.rFL],cx
71mov [regs.rSP],dx
72mov [regs.rSS],si
73mov [run_intw],di
74; pop ax
75; mov [regs.rDS],ax
76; mov ds,ax
77pop ds
78back2dpmi16:
79popa
80add sp, 2
81retf
82
83exc00:
84push EXC00MSG
85jmp exc_xx
86exc01:
87push EXC01MSG
88jmp exc_xx
89exc03:
90push EXC03MSG
91jmp exc_xx
92if CATCHEXC06
93exc06:
94push EXC06MSG
95jmp exc_xx
96endif
97if CATCHEXC07
98exc07:
99push EXC07MSG
100jmp exc_xx
101endif
102if CATCHEXC0C
103exc0c:
104push EXC0CMSG
105jmp exc_xx
106endif
107exc0d:
108push EXC0DMSG
109jmp exc_xx
110exc0e:
111push EXC0EMSG
112exc_xx:
113test cs:[dpmi32],1
114jz excxx_16
115
116.386
117
118pushad
119mov ebp,esp
120push ds
121mov ds,cs:[dssel]
122mov eax,[ebp].EXFR32.rEIP
123mov bx, [ebp].EXFR32.rCS
124mov ecx,[ebp].EXFR32.rEFL
125mov edx,[ebp].EXFR32.rESP
126mov si, [ebp].EXFR32.rSS
127mov di, [ebp].EXFR32.wMsg
128mov [ebp].EXFR32.rCS, cs
129mov [ebp].EXFR32.rSS, ds
130cmp [bInDbg],0 ;did the exception occur inside DEBUG?
131jz isdebuggee32
132if EXCCSIP
133;--- it's assumed that an exception in DEBUG is always in 16-bit code,
134;--- but this isn't necessarily true, since the debuggee may have hooked
135;--- exceptions. Since v2.0, this is less probable, because DebugX will
136;--- always restore exception handlers 0D/0E on entry.
137mov si, bx
138endif
139mov [ebp].EXFR32.rEIP,offset ue_intx
140movzx ebx,[top_sp]
141if EXCCSIP
142if EXCCSEIP
143sub bx, 2*2+4
144else
145sub bx, 3*2
146endif
147else
148sub bx, 2
149endif
150mov [bx+0], di ; msg
151if EXCCSIP
152mov [bx+2], si ; cs
153if EXCCSEIP
154mov [bx+4], eax
155else
156mov [bx+4], ax
157endif
158endif
159mov [ebp].EXFR32.rESP, ebx
160and byte ptr [ebp].EXFR32.rEFL+1, not 1 ;reset TF
161pop ax
162jmp back2dpmi32
163isdebuggee32:
164@dprintf "excxx: client exception"
165mov [ebp].EXFR32.rEIP, offset intrtn
166and byte ptr [ebp].EXFR32.rEFL+1, not 3;reset IF + TF
167mov [ebp].EXFR32.rESP, offset regs.rSS
168mov dword ptr [regs.rIP], eax
169mov [regs.rCS],bx
170; mov dword ptr [regs.rFL], ecx ; preferable?
171mov [regs.rFL],cx
172mov dword ptr [regs.rSP], edx
173mov [regs.rSS],si
174mov [run_intw],di
175; pop ax
176; mov [regs.rDS],ax
177; mov ds,ax
178pop ds
179back2dpmi32:
180popad
181add sp, 2
182retd
183
184