| 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
|
|---|