Files
TeslaRel410/emulator/vpx-device/serialport/directserial.h
T
CydandClaude Opus 4.8 0bb493dd5f Phase 3e: live texturing + serial receive-latency fixes for the RIO
Texturing (validated live -- game-live-textured.png, the ravine's brown dirt
terrain): the wire model is Division's intensity+ramp scheme. action 26
uploads 8-bit intensity texels ([node][nbytes][w][h] + rows; type 13 =
texture); texmap (12) references the texture; material (11) references its
texmap and a ramp (14: lo/hi RGB); texel color = lerp(lo, hi, i/255). The
backend bakes RGBA per material, uploads to GL, maps with wire UVs
(stride-5: floats 3-4; stride-8/9: floats 6-7).

Serial (directserial fork options, tracked in vpx-device/serialport/):
- rxpollus:<us> -- receive poll tick (stock 1ms); 100us discovers inbound
  bytes ~10x sooner. Validated: sim advanced, camera moved with real RIO.
- rxburst:<n>  -- stock DOSBox re-serializes received bytes at emulated wire
  speed (~1ms/byte at 9600) though they already paid wire time on the real
  cable; a 15-byte analog reply gained ~14ms, blowing the RIO's few-ms ACK
  window and dropping the game into its 15-second retry fallback
  (L4CTRL.CPP limit=15.0 //0.2). rxburst:16 delivers buffered bytes 16x
  faster. game_rio.conf: realport:COM1 rxpollus:100 rxburst:16.

Crash-on-advance fixed: *_TSHD.BGF terrain shadows live only in arena
subdirs the search path misses; null shadow renderable was dereferenced once
the sim moved. All 11 copied into VIDEO/GEO in the working image; game now
runs sustained (560+ frames, textured, no crash). Details in RIO-NOTES.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 16:43:21 -05:00

82 lines
2.6 KiB
C++

/*
* Copyright (C) 2002-2021 The DOSBox Team
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// include guard
#ifndef DOSBOX_DIRECTSERIAL_WIN32_H
#define DOSBOX_DIRECTSERIAL_WIN32_H
#include "dosbox.h"
#if C_DIRECTSERIAL
#define DIRECTSERIAL_AVAILIBLE
#include "serialport.h"
#include "libserial.h"
class CDirectSerial : public CSerial {
public:
CDirectSerial(Bitu id, CommandLine* cmd);
~CDirectSerial();
void updatePortConfig(uint16_t divider, uint8_t lcr) override;
void updateMSR() override;
void transmitByte(uint8_t val, bool first) override;
void setBreak(bool value) override;
void setRTSDTR(bool rts, bool dtr) override;
void setRTS(bool val) override;
void setDTR(bool val) override;
void handleUpperEvent(uint16_t type) override;
private:
COMPORT comport;
Bitu rx_state = 0;
#define D_RX_IDLE 0
#define D_RX_WAIT 1
#define D_RX_BLOCKED 2
#define D_RX_FASTWAIT 3
Bitu rx_retry; // counter of retries (every millisecond)
Bitu rx_retry_max; // how many POLL_EVENTS to wait before causing
// an overrun error.
// Host-port receive polling tick in milliseconds (default 1.0).
// Latency-critical hardware (VWE RIO cockpit board: drops comms when an
// ACK is late by a few ms) needs incoming bytes discovered faster than
// the stock 1ms tick; configurable via "rxpollus:<microseconds>".
float rx_poll_ms = 1.0f;
// Burst-delivery divisor ("rxburst:<n>"). Stock DOSBox re-serializes
// received bytes at emulated wire speed (bytetime per byte) even though
// they already paid their wire time on the physical cable and are
// sitting in the host buffer. n>1 delivers buffered bytes n times
// faster, cutting multi-byte reply latency (RIO analog packets).
float rx_burst_div = 1.0f;
bool doReceive();
#if SERIAL_DEBUG
bool dbgmsg_poll_block = false;
bool dbgmsg_rx_block = false;
#endif
};
#endif // C_DIRECTSERIAL
#endif // include guard