| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- //
- // Copyright 2020 Electronic Arts Inc.
- //
- // TiberianDawn.DLL and RedAlert.dll and corresponding source code 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 3 of the License, or (at your option) any later version.
- // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
- // in the hope that it will be useful, but with permitted additional restrictions
- // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
- // distributed with this program. You should have received a copy of the
- // GNU General Public License along with permitted additional restrictions
- // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
- #include "types.h"
- #include "mgenord.h"
- #include "magic.h"
- #include "rtq.h"
- #include <mem.h>
- #include <i86.h>
- #include <assert.h>
- #include "mplib.h"
- #define CHUNNEL_INT 0x48
- typedef union REGS REGISTERS;
- void
- Yield(void)
- {
- REGISTERS regs;
- regs.w.ax = 0x1680;
- int386(0x2f, ®s, ®s);
- }
- void
- PostWindowsMessage(void)
- {
- REGISTERS regs;
- regs.x.eax = DPMIAPI_POST_WINDOWS_ORD << 16 | MGENVXD_DEVICE_ID;
- regs.x.ebx = 0;
- regs.x.ecx = 0;
- int386(CHUNNEL_INT, ®s, ®s);
- }
- int MGenGetQueueCtr(int qNo)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_GETQUEUECTR_ORD << 16 | MGENVXD_DEVICE_ID;
- regs.x.ebx = qNo;
- int386(CHUNNEL_INT, ®s, ®s);
- return regs.x.eax;
- }
- RTQ_NODE *MGenMoveTo(int qFrom, int qTo)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_MOVENODE_ORD << 16 | MGENVXD_DEVICE_ID;
- regs.x.ebx = qFrom;
- regs.x.ecx = qTo;
- int386(CHUNNEL_INT, ®s, ®s);
- return (RTQ_NODE *) regs.x.eax;
- }
- RTQ_NODE *MGenGetNode(int q)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_GETNODE_ORD << 16 | MGENVXD_DEVICE_ID;
- regs.x.ebx = q;
- int386(CHUNNEL_INT, ®s, ®s);
- return (RTQ_NODE *) regs.x.eax;
- }
- RTQ_NODE *MGenGetMasterNode(unsigned *size)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_MASTERNODE_ORD << 16 | MGENVXD_DEVICE_ID;
- int386(CHUNNEL_INT, ®s, ®s);
- *size = regs.x.ecx;
- return (RTQ_NODE *) regs.x.eax;
- }
- int MGenFlushNodes(int qFrom, int qTo)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_FLUSHNODE_ORD << 16 | MGENVXD_DEVICE_ID;
- regs.x.ebx = qFrom;
- regs.x.ecx = qTo;
- int386(CHUNNEL_INT, ®s, ®s);
- return regs.x.eax;
- }
- int MGenMCount(unsigned lowerOrderBits, unsigned upperOrderBits)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_MCOUNT_ORD << 16 | MGENVXD_DEVICE_ID;
- regs.x.ebx = lowerOrderBits;
- regs.x.ecx = upperOrderBits;
- int386(CHUNNEL_INT, ®s, ®s);
- return regs.x.eax;
- }
- int MGenSanityCheck(void)
- {
- REGISTERS regs;
- regs.x.eax = MGENVXD_SANITYCHECK_ORD << 16 | MGENVXD_DEVICE_ID;
- int386(CHUNNEL_INT, ®s, ®s);
- return regs.x.eax;
- }
|