diff options
Diffstat (limited to 'WinQuake/mplib.c')
| -rw-r--r-- | WinQuake/mplib.c | 444 |
1 files changed, 222 insertions, 222 deletions
diff --git a/WinQuake/mplib.c b/WinQuake/mplib.c index 8ad33ff..6009286 100644 --- a/WinQuake/mplib.c +++ b/WinQuake/mplib.c @@ -1,222 +1,222 @@ -/* -Copyright (C) 1996-1997 Id Software, Inc. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -#include <dpmi.h> - -//#include "types.h" -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned long DWORD; - -//#include "mgenord.h" -#define MGENVXD_REGISTER_ORD 1 -#define MGENVXD_GETMEM_ORD 2 -#define MGENVXD_DEREGISTER_ORD 3 -#define MGENVXD_WAKEUP_ORD 4 -#define MGENVXD_MAKEDQS_ORD 5 - - -// Virtual 8086 API Ordinals -#define V86API_GETSELECTOR16_ORD (1) -#define V86API_GETSELECTOR32_ORD (2) -#define V86API_GETFLAT32_ORD (3) -#define V86API_MOVERP_ORD (6) -#define V86API_MOVEPR_ORD (7) -#define V86API_POST_ORD (8) -#define V86API_INIT_ORD (9) -#define V86API_UNINIT_ORD (10) -#define V86API_INSERTKEY_ORD (11) -#define V86API_REMOVEHOTKEY_ORD (12) -#define V86API_INSTALLHOTKEY_ORD (13) -#define V86API_HOOKINT48_ORD (14) -#define V86API_WAKEUPDLL_ORD (15) - -#define DPMIAPI_GETFLAT32_ORD (1) -#define DPMIAPI_POST_WINDOWS_ORD (2) -// these are DPMI functions. Make sure they don't clash with the -// other MGENVXD_XXXX functions above, or the DPMI functions! -#define MGENVXD_GETQUEUECTR_ORD 6 -#define MGENVXD_MOVENODE_ORD 7 -#define MGENVXD_GETNODE_ORD 8 -#define MGENVXD_FLUSHNODE_ORD 9 -#define MGENVXD_MCOUNT_ORD 10 -#define MGENVXD_MASTERNODE_ORD 11 -#define MGENVXD_SANITYCHECK_ORD 12 -#define MGENVXD_WAKEUPDLL_ORD 13 -#define MGENVXD_WAIT_ORD 14 - -// -#define HWND_OFFSET (0) -#define UMSG_OFFSET (1) -#define SIZEREQUEST_OFFSET (2) -#define HVXD_OFFSET (3) -#define DATUM_OFFSET (4) -#define SLOT_OFFSET (5) -#define SIZEGIVEN_OFFSET (6) -#define SELECTOR32_OFFSET (7) -#define SELECTOR16_OFFSET (8) - -//#include "magic.h" -#define MGENVXD_DEVICE_ID 0x18AA - -//#include "rtq.h" -#define RTQ_NODE struct rtq_node - -RTQ_NODE - { - RTQ_NODE *self; // Ring zero address of this node - RTQ_NODE *left; // Ring zero address of preceding node - RTQ_NODE *right; // Ring zero address of succeding node - BYTE * rtqDatum; // Ring 3 Datum of Buffer (start of preface) - BYTE * rtqInsert; // Ring 3 insertion position - WORD rtqLen; // Length of buffer, excluding preface - WORD rtqUpCtr; // Up Counter of bytes used so far - WORD rtqQCtr; // number of nodes attached - WORD padding; // DWORD alignment - }; - -#define RTQ_PARAM_MOVENODE struct rtq_param_movenode -RTQ_PARAM_MOVENODE - { - WORD rtqFromDQ; - WORD rtqToDQ; - }; - -RTQ_NODE* rtq_fetch(RTQ_NODE*, RTQ_NODE*); // To, From - -int _int86(int vector, __dpmi_regs *iregs, __dpmi_regs *oregs); - -#define CHUNNEL_INT 0x48 - -#define int386 _int86 -#define REGISTERS __dpmi_regs - -void -Yield(void) -{ - __dpmi_yield(); -} - -void -PostWindowsMessage(void) -{ - REGISTERS regs; - - regs.d.eax = DPMIAPI_POST_WINDOWS_ORD << 16 | MGENVXD_DEVICE_ID; - regs.d.ebx = 0; - regs.d.ecx = 0; - int386(CHUNNEL_INT, ®s, ®s); -} - -int -MGenWait(void) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_WAIT_ORD << 16 | MGENVXD_DEVICE_ID; - int386(CHUNNEL_INT, ®s, ®s); - return regs.d.eax; -} - -int MGenGetQueueCtr(int qNo) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_GETQUEUECTR_ORD << 16 | MGENVXD_DEVICE_ID; - regs.d.ebx = qNo; - int386(CHUNNEL_INT, ®s, ®s); - - return regs.d.eax; -} - -RTQ_NODE *MGenMoveTo(int qFrom, int qTo) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_MOVENODE_ORD << 16 | MGENVXD_DEVICE_ID; - regs.d.ebx = qFrom; - regs.d.ecx = qTo; - int386(CHUNNEL_INT, ®s, ®s); - - return (RTQ_NODE *) regs.d.eax; -} - -RTQ_NODE *MGenGetNode(int q) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_GETNODE_ORD << 16 | MGENVXD_DEVICE_ID; - regs.d.ebx = q; - int386(CHUNNEL_INT, ®s, ®s); - - return (RTQ_NODE *) regs.d.eax; -} - -RTQ_NODE *MGenGetMasterNode(unsigned *size) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_MASTERNODE_ORD << 16 | MGENVXD_DEVICE_ID; - int386(CHUNNEL_INT, ®s, ®s); - *size = regs.d.ecx; - - return (RTQ_NODE *) regs.d.eax; -} - -RTQ_NODE *MGenFlushNodes(int qFrom, int qTo) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_FLUSHNODE_ORD << 16 | MGENVXD_DEVICE_ID; - regs.d.ebx = qFrom; - regs.d.ecx = qTo; - int386(CHUNNEL_INT, ®s, ®s); - - return (RTQ_NODE *) regs.d.eax; -} - -int MGenMCount(unsigned lowerOrderBits, unsigned upperOrderBits) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_MCOUNT_ORD << 16 | MGENVXD_DEVICE_ID; - regs.d.ebx = lowerOrderBits; - regs.d.ecx = upperOrderBits; - int386(CHUNNEL_INT, ®s, ®s); - - return regs.d.eax; -} - -int MGenSanityCheck(void) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_SANITYCHECK_ORD << 16 | MGENVXD_DEVICE_ID; - int386(CHUNNEL_INT, ®s, ®s); - - return regs.d.eax; -} - -void MGenWakeupDll(void) -{ - REGISTERS regs; - - regs.d.eax = MGENVXD_WAKEUPDLL_ORD << 16 | MGENVXD_DEVICE_ID; - int386(CHUNNEL_INT, ®s, ®s); -} +/*
+Copyright (C) 1996-1997 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+#include <dpmi.h>
+
+//#include "types.h"
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+
+//#include "mgenord.h"
+#define MGENVXD_REGISTER_ORD 1
+#define MGENVXD_GETMEM_ORD 2
+#define MGENVXD_DEREGISTER_ORD 3
+#define MGENVXD_WAKEUP_ORD 4
+#define MGENVXD_MAKEDQS_ORD 5
+
+
+// Virtual 8086 API Ordinals
+#define V86API_GETSELECTOR16_ORD (1)
+#define V86API_GETSELECTOR32_ORD (2)
+#define V86API_GETFLAT32_ORD (3)
+#define V86API_MOVERP_ORD (6)
+#define V86API_MOVEPR_ORD (7)
+#define V86API_POST_ORD (8)
+#define V86API_INIT_ORD (9)
+#define V86API_UNINIT_ORD (10)
+#define V86API_INSERTKEY_ORD (11)
+#define V86API_REMOVEHOTKEY_ORD (12)
+#define V86API_INSTALLHOTKEY_ORD (13)
+#define V86API_HOOKINT48_ORD (14)
+#define V86API_WAKEUPDLL_ORD (15)
+
+#define DPMIAPI_GETFLAT32_ORD (1)
+#define DPMIAPI_POST_WINDOWS_ORD (2)
+// these are DPMI functions. Make sure they don't clash with the
+// other MGENVXD_XXXX functions above, or the DPMI functions!
+#define MGENVXD_GETQUEUECTR_ORD 6
+#define MGENVXD_MOVENODE_ORD 7
+#define MGENVXD_GETNODE_ORD 8
+#define MGENVXD_FLUSHNODE_ORD 9
+#define MGENVXD_MCOUNT_ORD 10
+#define MGENVXD_MASTERNODE_ORD 11
+#define MGENVXD_SANITYCHECK_ORD 12
+#define MGENVXD_WAKEUPDLL_ORD 13
+#define MGENVXD_WAIT_ORD 14
+
+//
+#define HWND_OFFSET (0)
+#define UMSG_OFFSET (1)
+#define SIZEREQUEST_OFFSET (2)
+#define HVXD_OFFSET (3)
+#define DATUM_OFFSET (4)
+#define SLOT_OFFSET (5)
+#define SIZEGIVEN_OFFSET (6)
+#define SELECTOR32_OFFSET (7)
+#define SELECTOR16_OFFSET (8)
+
+//#include "magic.h"
+#define MGENVXD_DEVICE_ID 0x18AA
+
+//#include "rtq.h"
+#define RTQ_NODE struct rtq_node
+
+RTQ_NODE
+ {
+ RTQ_NODE *self; // Ring zero address of this node
+ RTQ_NODE *left; // Ring zero address of preceding node
+ RTQ_NODE *right; // Ring zero address of succeding node
+ BYTE * rtqDatum; // Ring 3 Datum of Buffer (start of preface)
+ BYTE * rtqInsert; // Ring 3 insertion position
+ WORD rtqLen; // Length of buffer, excluding preface
+ WORD rtqUpCtr; // Up Counter of bytes used so far
+ WORD rtqQCtr; // number of nodes attached
+ WORD padding; // DWORD alignment
+ };
+
+#define RTQ_PARAM_MOVENODE struct rtq_param_movenode
+RTQ_PARAM_MOVENODE
+ {
+ WORD rtqFromDQ;
+ WORD rtqToDQ;
+ };
+
+RTQ_NODE* rtq_fetch(RTQ_NODE*, RTQ_NODE*); // To, From
+
+int _int86(int vector, __dpmi_regs *iregs, __dpmi_regs *oregs);
+
+#define CHUNNEL_INT 0x48
+
+#define int386 _int86
+#define REGISTERS __dpmi_regs
+
+void
+Yield(void)
+{
+ __dpmi_yield();
+}
+
+void
+PostWindowsMessage(void)
+{
+ REGISTERS regs;
+
+ regs.d.eax = DPMIAPI_POST_WINDOWS_ORD << 16 | MGENVXD_DEVICE_ID;
+ regs.d.ebx = 0;
+ regs.d.ecx = 0;
+ int386(CHUNNEL_INT, ®s, ®s);
+}
+
+int
+MGenWait(void)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_WAIT_ORD << 16 | MGENVXD_DEVICE_ID;
+ int386(CHUNNEL_INT, ®s, ®s);
+ return regs.d.eax;
+}
+
+int MGenGetQueueCtr(int qNo)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_GETQUEUECTR_ORD << 16 | MGENVXD_DEVICE_ID;
+ regs.d.ebx = qNo;
+ int386(CHUNNEL_INT, ®s, ®s);
+
+ return regs.d.eax;
+}
+
+RTQ_NODE *MGenMoveTo(int qFrom, int qTo)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_MOVENODE_ORD << 16 | MGENVXD_DEVICE_ID;
+ regs.d.ebx = qFrom;
+ regs.d.ecx = qTo;
+ int386(CHUNNEL_INT, ®s, ®s);
+
+ return (RTQ_NODE *) regs.d.eax;
+}
+
+RTQ_NODE *MGenGetNode(int q)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_GETNODE_ORD << 16 | MGENVXD_DEVICE_ID;
+ regs.d.ebx = q;
+ int386(CHUNNEL_INT, ®s, ®s);
+
+ return (RTQ_NODE *) regs.d.eax;
+}
+
+RTQ_NODE *MGenGetMasterNode(unsigned *size)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_MASTERNODE_ORD << 16 | MGENVXD_DEVICE_ID;
+ int386(CHUNNEL_INT, ®s, ®s);
+ *size = regs.d.ecx;
+
+ return (RTQ_NODE *) regs.d.eax;
+}
+
+RTQ_NODE *MGenFlushNodes(int qFrom, int qTo)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_FLUSHNODE_ORD << 16 | MGENVXD_DEVICE_ID;
+ regs.d.ebx = qFrom;
+ regs.d.ecx = qTo;
+ int386(CHUNNEL_INT, ®s, ®s);
+
+ return (RTQ_NODE *) regs.d.eax;
+}
+
+int MGenMCount(unsigned lowerOrderBits, unsigned upperOrderBits)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_MCOUNT_ORD << 16 | MGENVXD_DEVICE_ID;
+ regs.d.ebx = lowerOrderBits;
+ regs.d.ecx = upperOrderBits;
+ int386(CHUNNEL_INT, ®s, ®s);
+
+ return regs.d.eax;
+}
+
+int MGenSanityCheck(void)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_SANITYCHECK_ORD << 16 | MGENVXD_DEVICE_ID;
+ int386(CHUNNEL_INT, ®s, ®s);
+
+ return regs.d.eax;
+}
+
+void MGenWakeupDll(void)
+{
+ REGISTERS regs;
+
+ regs.d.eax = MGENVXD_WAKEUPDLL_ORD << 16 | MGENVXD_DEVICE_ID;
+ int386(CHUNNEL_INT, ®s, ®s);
+}
|
