123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- /*
- 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);
- }
|