1 | ;
|
---|
2 | ; PMINT.INC -- Handle interrupts
|
---|
3 | ;
|
---|
4 | ; Copyright (c) 1991-1996 by Eberhard Mattes
|
---|
5 | ;
|
---|
6 | ; This file is part of emx.
|
---|
7 | ;
|
---|
8 | ; emx is free software; you can redistribute it and/or modify it
|
---|
9 | ; under the terms of the GNU General Public License as published by
|
---|
10 | ; the Free Software Foundation; either version 2, or (at your option)
|
---|
11 | ; any later version.
|
---|
12 | ;
|
---|
13 | ; emx is distributed in the hope that it will be useful,
|
---|
14 | ; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
15 | ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
16 | ; GNU General Public License for more details.
|
---|
17 | ;
|
---|
18 | ; You should have received a copy of the GNU General Public License
|
---|
19 | ; along with emx; see the file COPYING. If not, write to
|
---|
20 | ; the Free Software Foundation, 59 Temple Place - Suite 330,
|
---|
21 | ; Boston, MA 02111-1307, USA.
|
---|
22 | ;
|
---|
23 | ; See emx.asm for a special exception.
|
---|
24 | ;
|
---|
25 |
|
---|
26 | ;
|
---|
27 | ; Stack (at PMINT_STACK_SNAP_SHOT):
|
---|
28 | ;
|
---|
29 | ; GS FS ES DS EDI ESI EBP ESP EBX EDX ECX EAX ERRCD EIP CS EFLAGS ESP(U) SS(U)
|
---|
30 | ; 0 2 4 6 8 12 16 20 24 28 32 36 40 44 48 52 56 60
|
---|
31 | ; ^ ----- ------------
|
---|
32 | ; | simulated only for
|
---|
33 | ; EBP for interrupts user program
|
---|
34 | ; and exc. 0..7, 16
|
---|
35 | ;
|
---|
36 | ; See also PROCESS.INC, SPECIAL.ASM, /emx/include/sys/reg.h.
|
---|
37 | ;
|
---|
38 |
|
---|
39 | ISTACKFRAME STRUC
|
---|
40 | IS_GS DW ? ; 0
|
---|
41 | IS_FS DW ? ; 2
|
---|
42 | IS_ES DW ? ; 4
|
---|
43 | IS_DS DW ? ; 6
|
---|
44 | IS_EDI DD ? ; 8
|
---|
45 | IS_ESI DD ? ; 12
|
---|
46 | IS_EBP DD ? ; 16
|
---|
47 | IS_ESP_1 DD ? ; 20
|
---|
48 | IS_EBX DD ? ; 24
|
---|
49 | IS_EDX DD ? ; 28
|
---|
50 | IS_ECX DD ? ; 32
|
---|
51 | IS_EAX DD ? ; 36
|
---|
52 | IS_ERRCD DD ? ; 40
|
---|
53 | IS_EIP DD ? ; 44
|
---|
54 | IS_CS DW ? ; 48
|
---|
55 | IS_CS_PAD DW ? ; 50
|
---|
56 | IS_EFLAGS DD ? ; 52
|
---|
57 | IS_ESP DD ? ; 56
|
---|
58 | IS_SS DW ? ; 60
|
---|
59 | IS_SS_PAD DW ? ; 62
|
---|
60 | ISTACKFRAME ENDS
|
---|
61 |
|
---|
62 | I_GS EQU [BP].IS_GS
|
---|
63 | I_FS EQU [BP].IS_FS
|
---|
64 | I_ES EQU [BP].IS_ES
|
---|
65 | I_DS EQU [BP].IS_DS
|
---|
66 | I_EDI EQU [BP].IS_EDI
|
---|
67 | I_ESI EQU [BP].IS_ESI
|
---|
68 | I_EBP EQU [BP].IS_EBP
|
---|
69 | I_ESP_1 EQU [BP].IS_ESP_1
|
---|
70 | I_EBX EQU [BP].IS_EBX
|
---|
71 | I_EDX EQU [BP].IS_EDX
|
---|
72 | I_ECX EQU [BP].IS_ECX
|
---|
73 | I_EAX EQU [BP].IS_EAX
|
---|
74 | I_ERRCD EQU [BP].IS_ERRCD
|
---|
75 | I_EIP EQU [BP].IS_EIP
|
---|
76 | I_CS EQU [BP].IS_CS
|
---|
77 | I_EFLAGS EQU [BP].IS_EFLAGS
|
---|
78 | I_ESP EQU [BP].IS_ESP
|
---|
79 | I_SS EQU [BP].IS_SS
|
---|
80 |
|
---|
81 | I_REG_DWORDS = 16 ; Cf. PROCESS.ASM
|
---|
82 |
|
---|
83 | ;
|
---|
84 | ; Size of local variables of exception/interrupt handler
|
---|
85 | ;
|
---|
86 | FRAME_SIZE = 38
|
---|
87 |
|
---|
88 | ;
|
---|
89 | ; Local variables for exceptions
|
---|
90 | ;
|
---|
91 | VOUTPUT EQU (BYTE PTR [BP-2])
|
---|
92 | SWAP_PIDX EQU (BYTE PTR [BP-3])
|
---|
93 | EXCEPT_NO EQU (BYTE PTR [BP-4])
|
---|
94 | FAULT_ADDR EQU (DWORD PTR [BP-8])
|
---|
95 | ETEXT EQU (WORD PTR [BP-10])
|
---|
96 | EBYTE EQU (WORD PTR [BP-12])
|
---|
97 | EWORD EQU (WORD PTR [BP-14])
|
---|
98 | EDWORD EQU (WORD PTR [BP-16])
|
---|
99 | ECRLF EQU (WORD PTR [BP-18])
|
---|
100 | ECHAR EQU (WORD PTR [BP-20])
|
---|
101 | EXC_UNUSED_1 EQU (DWORD PTR [BP-24])
|
---|
102 | FAULT_PROC EQU (WORD PTR [BP-26])
|
---|
103 |
|
---|
104 | ;
|
---|
105 | ; Local variables for interrupts
|
---|
106 | ;
|
---|
107 | INT_NO EQU (BYTE PTR [BP-1])
|
---|
108 | HW_INT_VEC EQU (BYTE PTR [BP-2])
|
---|
109 | ;unused EQU (BYTE PTR [BP-3])
|
---|
110 | RM_FLAGS EQU (BYTE PTR [BP-4])
|
---|
111 | INP_HANDLE EQU (WORD PTR [BP-6])
|
---|
112 | RM_AX EQU (WORD PTR [BP-8])
|
---|
113 | RM_BX EQU (WORD PTR [BP-10])
|
---|
114 | RM_CX EQU (WORD PTR [BP-12])
|
---|
115 | RM_DX EQU (WORD PTR [BP-14])
|
---|
116 | RM_SI EQU (WORD PTR [BP-16])
|
---|
117 | RM_DI EQU (WORD PTR [BP-18])
|
---|
118 | RM_BP EQU (WORD PTR [BP-20])
|
---|
119 | RM_DS EQU (WORD PTR [BP-22])
|
---|
120 | RM_ES EQU (WORD PTR [BP-24])
|
---|
121 | NREQ EQU (DWORD PTR [BP-28])
|
---|
122 | NPTR EQU (DWORD PTR [BP-32])
|
---|
123 | N_TMP EQU (WORD PTR [BP-34])
|
---|
124 | N_AX EQU (WORD PTR [BP-36])
|
---|
125 | CONV_FLAG EQU (WORD PTR [BP-38])
|
---|
126 |
|
---|
127 | ;
|
---|
128 | ; Communication area for __fpuemu()
|
---|
129 | ;
|
---|
130 | FPUEMU_COM STRUCT
|
---|
131 | FEC_NOTIFY DD ?
|
---|
132 | FEC_PNUM DD ?
|
---|
133 | FEC_SIGNAL DD ?
|
---|
134 | FEC_FRAME DD I_REG_DWORDS DUP (?)
|
---|
135 | FPUEMU_COM ENDS
|
---|
136 |
|
---|
137 | FPUC_INIT = 0
|
---|
138 | FPUC_NEXT = 1
|
---|
139 | FPUC_SIGNAL = 2
|
---|
140 |
|
---|
141 | FPUN_NEWPROC = 0
|
---|
142 | FPUN_ENDPROC = 1
|
---|
143 | FPUN_EMU = 2
|
---|
144 |
|
---|
145 | ;
|
---|
146 | ; These are the offsets of the PM/RM communication buffer
|
---|
147 | ;
|
---|
148 | ; Note: There's a bug in DOS function 5AH (COMPAQ DOS 3.31):
|
---|
149 | ; It stores a backslash DS:[DX+0FFFFH] if DX=0 !!!
|
---|
150 | ; 0 < OFFSET_1 < 16 (cf. D_READ, D_WRITE, INIT_BUFFER)
|
---|
151 | ;
|
---|
152 | OFFSET_1 = 0004H ; Used if one buffer is required
|
---|
153 | OFFSET_2 = 8000H ; Used for second buffer if two
|
---|
154 | ; buffers are required
|
---|
155 | IFNDEF __PMINT
|
---|
156 |
|
---|
157 | SV_DATA SEGMENT
|
---|
158 |
|
---|
159 | EXTRN BUF_SEG:WORD
|
---|
160 | EXTRN BUF_SEL:WORD
|
---|
161 | EXTRN BUF1_SEG:WORD
|
---|
162 | EXTRN BUF2_SEG:WORD
|
---|
163 | EXTRN PMINT0_TAB:WORD
|
---|
164 | EXTRN PMINT8_TAB:WORD
|
---|
165 | EXTRN RM_CR0:DWORD
|
---|
166 | EXTRN PM_CR0:DWORD
|
---|
167 | EXTRN DBCS_LEAD_TAB:WORD
|
---|
168 |
|
---|
169 | SV_DATA ENDS
|
---|
170 |
|
---|
171 | SV_CODE SEGMENT
|
---|
172 |
|
---|
173 | EXTRN IRQ0_ADD:BYTE
|
---|
174 | EXTRN IRQ8_ADD:BYTE
|
---|
175 |
|
---|
176 | EXTRN INTERRUPT:NEAR ; Unexpected interrupt
|
---|
177 | EXTRN V2P_CONT:NEAR ; Return from VCPI server
|
---|
178 | EXTRN DOSF_ERROR:NEAR ; Invalid function code
|
---|
179 | EXTRN BREAK_AFTER_IRET:NEAR ; Set breakpoint to ret addr
|
---|
180 | EXTRN NMI:NEAR ; NMI handler
|
---|
181 | EXTRN PMINT_10H:NEAR ; VIO interface interrupt
|
---|
182 | EXTRN PMINT_11H:NEAR ; Equipment interrupt
|
---|
183 | EXTRN PMINT_14H:NEAR ; ASY interface interrupt
|
---|
184 | EXTRN PMINT_16H:NEAR ; KBD interface interrupt
|
---|
185 | EXTRN PMINT_17H:NEAR ; PRN interface interrupt
|
---|
186 | EXTRN PMINT_21H:NEAR ; DOS interface interrupt
|
---|
187 | EXTRN PMINT_31H:NEAR ; EXT interface interrupt
|
---|
188 | EXTRN PMINT_33H:NEAR ; MOU interface interrupt
|
---|
189 | EXTRN INT_RM:NEAR ; Call RM interrupt routine
|
---|
190 | EXTRN GET_DBCS_LEAD:NEAR ; Get DBCS lead bytes
|
---|
191 |
|
---|
192 | MOVE_TO_RM PROTO NEAR
|
---|
193 | MOVE_FROM_RM PROTO NEAR
|
---|
194 |
|
---|
195 | SV_CODE ENDS
|
---|
196 |
|
---|
197 |
|
---|
198 | INIT_CODE SEGMENT
|
---|
199 |
|
---|
200 | EXTRN V2V_CONT:NEAR
|
---|
201 | EXTRN INIT_BUFFER:NEAR
|
---|
202 |
|
---|
203 | INIT_CODE ENDS
|
---|
204 |
|
---|
205 | ENDIF
|
---|