0,0 → 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); |
} |