Archival snapshot of the Virtual World Entertainment Tesla cockpit software, 1994-1996: MUNGA engine and L4 pod layer source (Borland C++ 5.0), BT/RP game code, and game content (models, audio, maps, gauges, Division renderer data). Includes third-party libraries: Division dVS/DPL graphics, HMI SOS audio, WATTCP networking. Files are preserved byte-for-byte (.gitattributes disables all line-ending conversion). README.md documents the layout, target hardware, and toolchain. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
281 lines
6.5 KiB
C++
281 lines
6.5 KiB
C++
//===========================================================================//
|
|
// File: PCSPAK.hh //
|
|
// Project: MUNGA Brick: Platform-specific IO //
|
|
// Contents: PC serial packet interface class //
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- -----------------------------------------------------------//
|
|
// 01/16/95 CPB Initial coding. //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1995, Virtual World Entertainment, Inc. All rights reserved //
|
|
// PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
#if !defined(L4PCSPAK_HPP)
|
|
|
|
# define L4PCSPAK_HPP
|
|
|
|
# if !defined(STYLE_HPP)
|
|
# include <style.hpp>
|
|
# endif
|
|
|
|
# if defined(TRACE_RIO_RECEIVE_PACKET)
|
|
extern BitTrace RIO_Receive_Packet;
|
|
# define SET_RIO_RECEIVE_PACKET() RIO_Receive_Packet.Set()
|
|
# define CLEAR_RIO_RECEIVE_PACKET() RIO_Receive_Packet.Clear()
|
|
# else
|
|
# define SET_RIO_RECEIVE_PACKET()
|
|
# define CLEAR_RIO_RECEIVE_PACKET()
|
|
# endif
|
|
|
|
# if defined(TRACE_RIO_SEND_PACKET)
|
|
extern BitTrace RIO_Send_Packet;
|
|
# define SET_RIO_SEND_PACKET() RIO_Send_Packet.Set()
|
|
# define CLEAR_RIO_SEND_PACKET() RIO_Send_Packet.Clear()
|
|
# else
|
|
# define SET_RIO_SEND_PACKET()
|
|
# define CLEAR_RIO_SEND_PACKET()
|
|
# endif
|
|
|
|
class PCSerialPacket;
|
|
class PCSerialPacketScanner;
|
|
|
|
enum
|
|
{
|
|
PCSPAKInitErrDPMI = -2,
|
|
PCSPAKInitErrAlloc = -1,
|
|
PCSPAKInitOk = 0
|
|
};
|
|
|
|
extern "C" int // see error codes, above
|
|
PCSPAKInit(
|
|
PCSerialPacket *ptr,
|
|
Word rate,
|
|
Word port,
|
|
Word intnum,
|
|
Byte *rxLength,
|
|
Word rxMaximum,
|
|
Byte *txLength,
|
|
Word txMaximum
|
|
);
|
|
|
|
extern "C" void
|
|
PCSPAKTerm(
|
|
PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" Logical
|
|
PCSPAKTestInstance(
|
|
PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" int
|
|
PCSPAKReceive(
|
|
PCSerialPacket *ptr,
|
|
Byte *destPtr
|
|
);
|
|
|
|
extern "C" void
|
|
PCSPAKSend(
|
|
PCSerialPacket *ptr,
|
|
Byte *srcPtr
|
|
);
|
|
|
|
extern "C" int
|
|
PCSPAKActive(
|
|
PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" Word
|
|
PCSPAKErrors(
|
|
PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" Logical
|
|
PCSPAKIRQState();
|
|
|
|
extern "C" int
|
|
PCSPAKIsSignatureBad(
|
|
const volatile PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" int
|
|
PCSPAKReceiveCount(
|
|
PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" int
|
|
PCSPAKTransmitCount(
|
|
PCSerialPacket *ptr
|
|
);
|
|
|
|
extern "C" void
|
|
PCSPAKSetDTR(
|
|
PCSerialPacket *ptr,
|
|
Logical on
|
|
);
|
|
|
|
// WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING
|
|
// Do NOT change ANY of the following lines without making
|
|
// corresponding changes in PCSerial.asm! PCSPAK.hh exists
|
|
// ONLY to inform C++ compilers of the data and structures
|
|
// used by PCSPAK.asm!
|
|
// WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING
|
|
|
|
// These are purposely grouped as two parameters in one equate.
|
|
// The standard PC COM ports ALWAYS use these combinations.
|
|
# define PCSP_COM1 0x3F8,0x0C // portAddress,interruptNumber
|
|
# define PCSP_COM2 0x2F8,0x0B
|
|
# define PCSP_COM3 0x3E8,0X0C
|
|
# define PCSP_COM4 0x2E8,0x0B
|
|
|
|
// Data rates
|
|
# define PCSP_300 0x0180 // 300 Baud
|
|
# define PCSP_1200 0x0060 // 1200 Baud
|
|
# define PCSP_2400 0x0030 // 2400 Baud
|
|
# define PCSP_9600 0x000C // 9600 Baud
|
|
# define PCSP_19P2 0x0006 // 19200 Baud
|
|
# define PCSP_38P4 0x0003 // 38400 Baud
|
|
# define PCSP_115K 0x0001 // 115,200 Baud (not supported on all PC's)
|
|
|
|
// This is for INTERNAL USE only (reflects structure in .ASM file)
|
|
struct PCSerPackBuf
|
|
{
|
|
Word head, tail, tempHead, tempTail, count, tempIn, tempOut;
|
|
Byte data[512]; // was 256 before 7-13-95 cpb
|
|
// WARNING: make ABSOLUTELY SURE this matches pcspak.asm
|
|
};
|
|
|
|
class PCSerialPacket
|
|
{
|
|
friend class PCSerialPacketScanner;
|
|
|
|
public:
|
|
PCSerialPacket()
|
|
{ }
|
|
|
|
~PCSerialPacket()
|
|
{
|
|
PCSPAKTerm(this);
|
|
}
|
|
|
|
// Only call Initialize(...) ONCE during the lifetime of the object!
|
|
int
|
|
Initialize(
|
|
Word rate,
|
|
Word port,
|
|
Word intNum,
|
|
Byte *rxLengths,
|
|
Word rxCount,
|
|
Byte *txLengths,
|
|
Word txCount
|
|
)
|
|
{
|
|
return PCSPAKInit(
|
|
this,
|
|
rate,
|
|
port,
|
|
intNum,
|
|
rxLengths,
|
|
rxCount,
|
|
txLengths,
|
|
txCount
|
|
);
|
|
}
|
|
|
|
Logical
|
|
TestInstance()
|
|
{ return PCSPAKTestInstance(this); }
|
|
|
|
int
|
|
ReceivePacket(Byte *destPtr) // returns len (zero if none)
|
|
{
|
|
SET_RIO_RECEIVE_PACKET();
|
|
int result = PCSPAKReceive(this, destPtr);
|
|
CLEAR_RIO_RECEIVE_PACKET();
|
|
return result;
|
|
}
|
|
|
|
void
|
|
SendPacket(Byte *srcPtr) // sends packet
|
|
{
|
|
SET_RIO_SEND_PACKET();
|
|
PCSPAKSend(this, srcPtr);
|
|
CLEAR_RIO_SEND_PACKET();
|
|
}
|
|
|
|
// error bits returned by PCSerialPacket::Errors()
|
|
enum ErrorBits {
|
|
overrunError=0x0002,
|
|
parityError=0x0004,
|
|
framingError=0x0008,
|
|
breakDetect=0x0010,
|
|
initError=0x0100,
|
|
txEarlyReply=0x0200,
|
|
txAbandonPacket=0x0400,
|
|
txRestart=0x0800,
|
|
txNakReply=0x1000,
|
|
rxSequenceError=0x2000,
|
|
rxChecksumError=0x4000,
|
|
rxCommandError=0x8000
|
|
};
|
|
|
|
int
|
|
ReceiveQueueCount()
|
|
{ return PCSPAKReceiveCount(this); }
|
|
|
|
int
|
|
TransmitQueueCount()
|
|
{ return PCSPAKTransmitCount(this); }
|
|
|
|
void
|
|
SetDTR(Logical on)
|
|
{ PCSPAKSetDTR(this, on); }
|
|
|
|
int
|
|
IsActive()
|
|
{ return PCSPAKActive(this); }
|
|
|
|
Word
|
|
Errors() // returns error value, clears it
|
|
{ return PCSPAKErrors(this); }
|
|
|
|
# if defined(USE_SIGNATURE)
|
|
friend int
|
|
Is_Signature_Bad(const volatile PCSerialPacket *ptr)
|
|
{ return PCSPAKIsSignatureBad(ptr); }
|
|
# endif
|
|
|
|
protected:
|
|
Word portBase;
|
|
Word Error;
|
|
|
|
Byte enabled;
|
|
Byte txHoldOff;
|
|
Byte txReply;
|
|
Byte txState;
|
|
Byte txCount;
|
|
Byte txResetCount;
|
|
Byte txErrorCount;
|
|
Byte txIdleCount;
|
|
Byte txChecksum;
|
|
Byte txMaximum;
|
|
|
|
Byte rxFlags;
|
|
Byte rxState;
|
|
Byte rxCount;
|
|
Byte rxChecksum;
|
|
Byte rxMaximum;
|
|
|
|
LWord txLengthPtr;
|
|
LWord rxLengthPtr;
|
|
|
|
LWord intDataPtr;
|
|
// LWord hackCount; //WGR previously missing: seen in pcspak.asm
|
|
|
|
PCSerPackBuf txBuf;
|
|
PCSerPackBuf rxBuf;
|
|
};
|
|
|
|
#endif
|
|
|