mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-27 06:34:11 +00:00
235 lines
5.5 KiB
C
235 lines
5.5 KiB
C
/*
|
|
mplib.c
|
|
|
|
@description@
|
|
|
|
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:
|
|
|
|
Free Software Foundation, Inc.
|
|
59 Temple Place - Suite 330
|
|
Boston, MA 02111-1307, USA
|
|
|
|
$Id$
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#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);
|
|
}
|