Subversion Repositories Kolibri OS

Rev

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
}