Files
BT411/engine/MUNGA_L4/L4SERIAL.H
arcattackandClaude Opus 4.8 7b7d465e5e Initial commit: bt411 -- standalone Windows BattleTech (Tesla 4.10 port)
Clean, self-contained extraction of the BattleTech-specific work from the
reverse-engineering workspace -- engine + game + content + build, with nothing
from Red Planet or the raw archive dumps. Builds green (Win32) and runs the
single-player drive->animate->target->fire->damage->destroy loop out of the box.

Layout:
  engine/   MUNGA + MUNGA_L4 shared 2007 engine, carrying our BT render/loader
            work (bgfload/L4D3D/L4VIDEO: BSL bit-slice decode, LOD/ground/shadow
            models) + image codec; the minimal rp/ headers the audio HAL needs
  game/     reconstructed BT logic + surviving-original BT source + fwd shims
            + WinMain launcher
  content/  full runtime tree (BTL4.RES, VIDEO/, GAUGE/, AUDIO/, eggs, BTDPL.INI)
  docs/     format specs + reconstruction ledgers
  reference/ raw Ghidra pseudocode (recon source-of-truth) + decomp exporter
  tools/    MP console emulator + map/resource scanners

One top-level CMake builds munga_engine lib + bt410_l4 game lib + btl4.exe.
All paths relativized (186 fwd shims + ~437 CMake abs paths -> repo-relative);
DXSDK is the one external, overridable via -DDXSDK. Verified: builds to a
byte-identical 2.27MB exe and runs combat (TARGET DESTROYED, 0 crashes) against
the bundled content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 21:03:40 -05:00

164 lines
5.2 KiB
C++

//===========================================================================//
// File: L4Serial.hh //
// Project: MUNGA Brick: Platform-specific IO //
// Contents: PC serial interface class //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- -----------------------------------------------------------//
// 01/04/95 CPB Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1994, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#pragma once
#include "../MUNGA/STYLE.H"
//Win32 Serial support: ADB 06/30/07
#include <Windows.h>
#include <iostream>
// WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING
// Do NOT change ANY of the following lines without making
// corresponding changes in PCSerial.asm! PCSerial.hh exists
// ONLY to inform C++ compilers of the data and structures
// used by PCSerial.asm!
// WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING
//Win32 Serial support: ADB 06/30/07
// These are purposely grouped as two parameters in one equate.
// The standard PC COM ports ALWAYS use these combinations.
//#define PCS_COM1 0x3F8,0x0C // portAddress,interruptNumber
//#define PCS_COM2 0x2F8,0x0B
//#define PCS_COM3 0x3E8,0X0C
//#define PCS_COM4 0x2E8,0x0B
// Data rates
#define PCS_300 0x0180 // 300 Baud
#define PCS_1200 0x0060 // 1200 Baud
#define PCS_2400 0x0030 // 2400 Baud
#define PCS_9600 0x000C // 9600 Baud
#define PCS_19P2 0x0006 // 19200 Baud
#define PCS_38P4 0x0003 // 38400 Baud
#define PCS_115K 0x0001 // 115,200 Baud (not supported on all PC's)
// Data formats
//Win32 Serial support: ADB 06/23/07
//Added masks as follows
//00PP PTSS where SS = Speed, T = Stop Bits, & PPP = Parity
#define PCS5D 0x0000 // 5 data bits
#define PCS6D 0x0001 // 6 data bits
#define PCS7D 0x0002 // 7 data bits
#define PCS8D 0x0003 // 8 data bits
#define PCSMD 0x0003 // data size mask
#define PCS1S 0x0000 // one stop bit
#define PCS2S 0x0004 // two stop bits
#define PCSMS 0x0004 // stop bit mask
#define PCSNP 0x0000 // no parity
#define PCSOP 0x0008 // odd parity
#define PCSEP 0x0018 // even parity
#define PCSMP 0x0028 // mark parity (untested)
#define PCSSP 0x0038 // space parity (untested)
#define PCSMAP 0x0038 // parity mask
// some popular combinations-
#define PCS_N81 (PCS8D|PCS1S|PCSNP) // no parity, 8 data, 1 stop
#define PCS_E81 (PCS8D|PCS1S|PCSEP) // even parity, 8 data, 1 stop
#define PCS_O81 (PCS8D|PCS1S|PCSOP) // odd parity, 8 data, 1 stop
// Flow control
// #define PCS_NOFLOWCTRL 0x0000 // no flow control
// error bits returned by PC_Serial::Errors()
#define PCS_ERR_OVERRUN 0x0002
#define PCS_ERR_PARITY 0x0004
#define PCS_ERR_FRAMING 0x0008
#define PCS_ERR_BREAK 0x0010
#define PCS_ERR_ALLOC 0x0100 // failed at slot allocation
#define PCS_ERR_INIT 0x0200 // failed DPMI initialization
#define PCS_ERR_TXOVER 0x0400 // overran transmit buffer
#define PCS_ERR_RXOVER 0x0500 // overran receive buffer
//Win32 Serial support: ADB 01/15/07
#define PCS_ERR_OTHER 0x8000 //Other Error not listed above
// bits returned by PC_Serial::ModemStatus()
// (1st four bits not defined yet, but non-zero)
#define PCS_MS_CTS 0x0010
#define PCS_MS_DSR 0x0020
#define PCS_MS_RI 0x0040
#define PCS_MS_DCD 0x0080
class PCSerial;
HANDLE InitSerialPort(WORD rate, WORD format, const char* port, bool overlapped);
class PCSerial
{
public:
//Win32 Serial support: ADB 01/11/07
PCSerial(WORD rate, WORD format, const char* port);
~PCSerial();
//Win32 Serial support: ADB 01/15/07
Logical TestInstance();
Logical CanDraw();
//Win32 Serial support: ADB 01/15/07
int ReceiveString(char *destPtr, int maxLen);// returns length
//Win32 Serial support: ADB 01/15/07
void FlowControlEnable(Logical onOff);
//Win32 Serial support: ADB 01/15/07
void SendString(char *srcPtr, int length);
//Win32 Serial support: ADB 01/15/07
int ReceiveCharCount();
//Win32 Serial support: ADB 01/15/07
int TransmitCharCount();
//Win32 Serial support: ADB 01/15/07
int Errors();// returns error value, clears it
//Win32 Serial support: ADB 01/15/07
int IsActive();
//Win32 Serial support: ADB 01/15/07
int ModemStatus();
# if defined(USE_SIGNATURE)
friend int
Is_Signature_Bad(const volatile PCSerial *ptr)
{ return PCSerialIsSignatureBad(ptr); }
# endif
// protected:
//Word portBase;
HANDLE hComm;
OVERLAPPED mOverlappedOb;
//Word errorValue;
Byte enabled;
//Byte txFlow;
//Byte flowOverride;
//LWord intDataPtr;
//LWord hackCount;
// This is for INTERNAL USE only (reflects structure in .ASM file)
//Win32 Serial support: ADB 01/15/07
//struct PCSerBuf
//{
// Word head, tail, count;
// Byte data[1024];
//}
//txBuf, rxBuf;
};