ref: bf5f906a21121a00f6b264c90539392d4a68e3ba
dir: /u/mplib.c/
/* 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); }