Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5131 | clevermous | 1 | /* |
2 | Copyright (C) 1996-1997 Id Software, Inc. |
||
3 | |||
4 | This program is free software; you can redistribute it and/or |
||
5 | modify it under the terms of the GNU General Public License |
||
6 | as published by the Free Software Foundation; either version 2 |
||
7 | of the License, or (at your option) any later version. |
||
8 | |||
9 | This program is distributed in the hope that it will be useful, |
||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||
12 | |||
13 | See the GNU General Public License for more details. |
||
14 | |||
15 | You should have received a copy of the GNU General Public License |
||
16 | along with this program; if not, write to the Free Software |
||
17 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||
18 | |||
19 | */ |
||
20 | #include |
||
21 | |||
22 | //#include "types.h" |
||
23 | typedef unsigned char BYTE; |
||
24 | typedef unsigned short WORD; |
||
25 | typedef unsigned long DWORD; |
||
26 | |||
27 | //#include "mgenord.h" |
||
28 | #define MGENVXD_REGISTER_ORD 1 |
||
29 | #define MGENVXD_GETMEM_ORD 2 |
||
30 | #define MGENVXD_DEREGISTER_ORD 3 |
||
31 | #define MGENVXD_WAKEUP_ORD 4 |
||
32 | #define MGENVXD_MAKEDQS_ORD 5 |
||
33 | |||
34 | |||
35 | // Virtual 8086 API Ordinals |
||
36 | #define V86API_GETSELECTOR16_ORD (1) |
||
37 | #define V86API_GETSELECTOR32_ORD (2) |
||
38 | #define V86API_GETFLAT32_ORD (3) |
||
39 | #define V86API_MOVERP_ORD (6) |
||
40 | #define V86API_MOVEPR_ORD (7) |
||
41 | #define V86API_POST_ORD (8) |
||
42 | #define V86API_INIT_ORD (9) |
||
43 | #define V86API_UNINIT_ORD (10) |
||
44 | #define V86API_INSERTKEY_ORD (11) |
||
45 | #define V86API_REMOVEHOTKEY_ORD (12) |
||
46 | #define V86API_INSTALLHOTKEY_ORD (13) |
||
47 | #define V86API_HOOKINT48_ORD (14) |
||
48 | #define V86API_WAKEUPDLL_ORD (15) |
||
49 | |||
50 | #define DPMIAPI_GETFLAT32_ORD (1) |
||
51 | #define DPMIAPI_POST_WINDOWS_ORD (2) |
||
52 | // these are DPMI functions. Make sure they don't clash with the |
||
53 | // other MGENVXD_XXXX functions above, or the DPMI functions! |
||
54 | #define MGENVXD_GETQUEUECTR_ORD 6 |
||
55 | #define MGENVXD_MOVENODE_ORD 7 |
||
56 | #define MGENVXD_GETNODE_ORD 8 |
||
57 | #define MGENVXD_FLUSHNODE_ORD 9 |
||
58 | #define MGENVXD_MCOUNT_ORD 10 |
||
59 | #define MGENVXD_MASTERNODE_ORD 11 |
||
60 | #define MGENVXD_SANITYCHECK_ORD 12 |
||
61 | #define MGENVXD_WAKEUPDLL_ORD 13 |
||
62 | #define MGENVXD_WAIT_ORD 14 |
||
63 | |||
64 | // |
||
65 | #define HWND_OFFSET (0) |
||
66 | #define UMSG_OFFSET (1) |
||
67 | #define SIZEREQUEST_OFFSET (2) |
||
68 | #define HVXD_OFFSET (3) |
||
69 | #define DATUM_OFFSET (4) |
||
70 | #define SLOT_OFFSET (5) |
||
71 | #define SIZEGIVEN_OFFSET (6) |
||
72 | #define SELECTOR32_OFFSET (7) |
||
73 | #define SELECTOR16_OFFSET (8) |
||
74 | |||
75 | //#include "magic.h" |
||
76 | #define MGENVXD_DEVICE_ID 0x18AA |
||
77 | |||
78 | //#include "rtq.h" |
||
79 | #define RTQ_NODE struct rtq_node |
||
80 | |||
81 | RTQ_NODE |
||
82 | { |
||
83 | RTQ_NODE *self; // Ring zero address of this node |
||
84 | RTQ_NODE *left; // Ring zero address of preceding node |
||
85 | RTQ_NODE *right; // Ring zero address of succeding node |
||
86 | BYTE * rtqDatum; // Ring 3 Datum of Buffer (start of preface) |
||
87 | BYTE * rtqInsert; // Ring 3 insertion position |
||
88 | WORD rtqLen; // Length of buffer, excluding preface |
||
89 | WORD rtqUpCtr; // Up Counter of bytes used so far |
||
90 | WORD rtqQCtr; // number of nodes attached |
||
91 | WORD padding; // DWORD alignment |
||
92 | }; |
||
93 | |||
94 | #define RTQ_PARAM_MOVENODE struct rtq_param_movenode |
||
95 | RTQ_PARAM_MOVENODE |
||
96 | { |
||
97 | WORD rtqFromDQ; |
||
98 | WORD rtqToDQ; |
||
99 | }; |
||
100 | |||
101 | RTQ_NODE* rtq_fetch(RTQ_NODE*, RTQ_NODE*); // To, From |
||
102 | |||
103 | int _int86(int vector, __dpmi_regs *iregs, __dpmi_regs *oregs); |
||
104 | |||
105 | #define CHUNNEL_INT 0x48 |
||
106 | |||
107 | #define int386 _int86 |
||
108 | #define REGISTERS __dpmi_regs |
||
109 | |||
110 | void |
||
111 | Yield(void) |
||
112 | { |
||
113 | __dpmi_yield(); |
||
114 | } |
||
115 | |||
116 | void |
||
117 | PostWindowsMessage(void) |
||
118 | { |
||
119 | REGISTERS regs; |
||
120 | |||
121 | regs.d.eax = DPMIAPI_POST_WINDOWS_ORD << 16 | MGENVXD_DEVICE_ID; |
||
122 | regs.d.ebx = 0; |
||
123 | regs.d.ecx = 0; |
||
124 | int386(CHUNNEL_INT, ®s, ®s); |
||
125 | } |
||
126 | |||
127 | int |
||
128 | MGenWait(void) |
||
129 | { |
||
130 | REGISTERS regs; |
||
131 | |||
132 | regs.d.eax = MGENVXD_WAIT_ORD << 16 | MGENVXD_DEVICE_ID; |
||
133 | int386(CHUNNEL_INT, ®s, ®s); |
||
134 | return regs.d.eax; |
||
135 | } |
||
136 | |||
137 | int MGenGetQueueCtr(int qNo) |
||
138 | { |
||
139 | REGISTERS regs; |
||
140 | |||
141 | regs.d.eax = MGENVXD_GETQUEUECTR_ORD << 16 | MGENVXD_DEVICE_ID; |
||
142 | regs.d.ebx = qNo; |
||
143 | int386(CHUNNEL_INT, ®s, ®s); |
||
144 | |||
145 | return regs.d.eax; |
||
146 | } |
||
147 | |||
148 | RTQ_NODE *MGenMoveTo(int qFrom, int qTo) |
||
149 | { |
||
150 | REGISTERS regs; |
||
151 | |||
152 | regs.d.eax = MGENVXD_MOVENODE_ORD << 16 | MGENVXD_DEVICE_ID; |
||
153 | regs.d.ebx = qFrom; |
||
154 | regs.d.ecx = qTo; |
||
155 | int386(CHUNNEL_INT, ®s, ®s); |
||
156 | |||
157 | return (RTQ_NODE *) regs.d.eax; |
||
158 | } |
||
159 | |||
160 | RTQ_NODE *MGenGetNode(int q) |
||
161 | { |
||
162 | REGISTERS regs; |
||
163 | |||
164 | regs.d.eax = MGENVXD_GETNODE_ORD << 16 | MGENVXD_DEVICE_ID; |
||
165 | regs.d.ebx = q; |
||
166 | int386(CHUNNEL_INT, ®s, ®s); |
||
167 | |||
168 | return (RTQ_NODE *) regs.d.eax; |
||
169 | } |
||
170 | |||
171 | RTQ_NODE *MGenGetMasterNode(unsigned *size) |
||
172 | { |
||
173 | REGISTERS regs; |
||
174 | |||
175 | regs.d.eax = MGENVXD_MASTERNODE_ORD << 16 | MGENVXD_DEVICE_ID; |
||
176 | int386(CHUNNEL_INT, ®s, ®s); |
||
177 | *size = regs.d.ecx; |
||
178 | |||
179 | return (RTQ_NODE *) regs.d.eax; |
||
180 | } |
||
181 | |||
182 | RTQ_NODE *MGenFlushNodes(int qFrom, int qTo) |
||
183 | { |
||
184 | REGISTERS regs; |
||
185 | |||
186 | regs.d.eax = MGENVXD_FLUSHNODE_ORD << 16 | MGENVXD_DEVICE_ID; |
||
187 | regs.d.ebx = qFrom; |
||
188 | regs.d.ecx = qTo; |
||
189 | int386(CHUNNEL_INT, ®s, ®s); |
||
190 | |||
191 | return (RTQ_NODE *) regs.d.eax; |
||
192 | } |
||
193 | |||
194 | int MGenMCount(unsigned lowerOrderBits, unsigned upperOrderBits) |
||
195 | { |
||
196 | REGISTERS regs; |
||
197 | |||
198 | regs.d.eax = MGENVXD_MCOUNT_ORD << 16 | MGENVXD_DEVICE_ID; |
||
199 | regs.d.ebx = lowerOrderBits; |
||
200 | regs.d.ecx = upperOrderBits; |
||
201 | int386(CHUNNEL_INT, ®s, ®s); |
||
202 | |||
203 | return regs.d.eax; |
||
204 | } |
||
205 | |||
206 | int MGenSanityCheck(void) |
||
207 | { |
||
208 | REGISTERS regs; |
||
209 | |||
210 | regs.d.eax = MGENVXD_SANITYCHECK_ORD << 16 | MGENVXD_DEVICE_ID; |
||
211 | int386(CHUNNEL_INT, ®s, ®s); |
||
212 | |||
213 | return regs.d.eax; |
||
214 | } |
||
215 | |||
216 | void MGenWakeupDll(void) |
||
217 | { |
||
218 | REGISTERS regs; |
||
219 | |||
220 | regs.d.eax = MGENVXD_WAKEUPDLL_ORD << 16 | MGENVXD_DEVICE_ID; |
||
221 | int386(CHUNNEL_INT, ®s, ®s); |
||
222 | }><>><>><>><>><>><>><>><>><>><> |