The real display's power-on test (JP1 jumper 5, firmware $B888) runs through
several drawing sequences — a solid fill, a border+grid, more — each held
briefly, to expose dead dots and addressing faults; it isn't just full on/off.
Both vPLASMA and the replica firmware now cycle 5 representative patterns:
solid, border+grid, horizontal stripes, vertical stripes, checkerboard.
- VPlasmaDevice.ShowTestPattern(int) + TestPatternCount; the app cycles them
on a 1.2s timer while jumper 5 is installed.
- PlasmaDisplay::showTestPattern(int) + TEST_PATTERN_COUNT (shared logic); the
Matrix Portal sketch's DOWN button toggles the cycling test.
(The firmware's exact byte patterns live in the display's native scan-buffer
layout, which we haven't mapped, so these stand in for that sequence rather
than reproducing it byte-for-byte.)
Verified: 29 C# tests pass; the C++ patterns render distinctly on the host.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Connection: drop the hardwired COM12; replicate vRIO's endpoint picker —
a combo of pipe:vplasma (the DOSBox-X namedpipe backend) + the COM ports,
with Rescan and Open/Close. Nothing opens automatically; baud straps drive
a COM open.
- Demo (jumper 6) now runs the REAL firmware demonstration, not the vPLASMA
self-test. The 10 demo screens are extracted verbatim from the ROM demo
pointer table ($8000) into PlasmaFirmwareDemo.cs and looped through the
parser. Added ESC I / ESC i (draw/display page select) as 1-operand
commands — consumed but not acted on in the single-page model — so the
demo's page commands don't desync the stream.
- Orientation (jumper 4 / PD5) polarity fixed: unstrapped = horizontal
128x32 (the normal cockpit setup, now the default), installed = vertical.
Verified: 29 unit tests pass (2 new: demo replay, page-select operand); the
real demo screens render with the correct text/positioning/fonts, and the
picker lists pipe:vplasma + COM ports with no auto-open.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Both now do what the firmware does, at the device level so the shared
PlasmaCanvas (and vRIO's embedded glass) are untouched:
- Jumper 4 → display orientation. VPlasmaDevice gains a PlasmaOrientation
property; in Vertical the logical space is 32x128 and every dot is rotated
onto the physical 128x32 glass via a new Plot() helper that all drawing
(text, cursor, ESC P graphics, ESC Q/R bounds) now goes through. Jumper 4
installed = horizontal (the normal cockpit setup, default), removed =
vertical. Changing it re-inits the panel, like the boot strap read.
- Jumper 5 → ShowTestPattern(): lights every dot (the power-on dead-dot
check the firmware runs at $B888). Removing the jumper clears it.
The config panel wires both up and shows the live orientation in the
counters. 27 unit tests pass (3 new: vertical rotation mapping, orientation
re-init, test pattern), including the unchanged horizontal path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Remove the COM12 auto-open and its retry timer; the serial link is now
opened manually via an "Open/Close COM12" button in the config panel.
The named-pipe transport still serves automatically. Baud straps reopen
only if already open.
- Decode the three previously-unknown JP1 config jumpers from the firmware
(boot config routine at $9190) and relabel them:
* Jumper 3 (PA3): sets flag $B7.2, driving hardware output PA5 to a
fixed level (a board config line).
* Jumper 4 (PD5): display orientation — installed = horizontal 128x32,
removed = vertical 32x128 (the demo's "HORIZONTAL OR VERTICAL").
* Jumper 5 (PD4): power-on display/pixel test pattern ($B888).
PlasmaNew/README.md's JP1 table now carries the full firmware-backed decode.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The standalone app gets its right-side config panel back, now built around
the real PD01D221's JP1 jumper block (from PlasmaNew/FIRMWARE.md): seven
toggles labelled with each strap's function and HC11 pin. The two baud
straps drive the open baud (4800/9600/19.2K/38.4K; jumper 2 = 9600 default,
the game's rate) via a new VPlasmaSerialService.Baud property; jumper 6
runs a demonstration loop, mirroring the firmware's jumper-6 demo. Plus the
Display controls (self test / clear), live counters, and the wire log.
The glass, auto-open COM12 + named-pipe transport, double-click self-test,
and right-click reset all stay. Only VPlasma.App is touched (plus the
additive Baud property) — the vPLASMA glass embedded in vRIO, which shares
PlasmaCanvas, is left exactly as it was.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replaces the guessed font/cursor model with what the firmware dump proved:
- The 8 real Babcock ROM fonts, extracted from tms27pc512.BIN into
PlasmaFonts.cs (6x8, 6x10, 7x10, 12x16, 12x20). Drops the public-domain
5x7 stand-in and PlasmaFont.cs.
- Pixel-addressed cursor with the real positioning commands: ESC Q (row Y,
0-31) and ESC R (column X, 0-127), matching the firmware's range checks.
Cursor motion (BS/HT/LF/VT/CR) now moves by font pixels, not cells.
- ESC K selects fonts 0-7 (out-of-range ignored, per firmware); ESC H
attributes are the low 4 bits (half/underline/reverse/flash).
Deferred (documented in FIRMWARE.md): the 10 double-buffered pages
(ESC I/i) and vector-graphics primitives (ESC A-F); vPLASMA keeps a
single-page model for now.
Verified: 24 unit tests pass; the three self-test pages render the real
glyphs (big font 4 banner, full charset in font 0, graphics). Next: begin
the modern-parts hardware replica, with this as the reference firmware.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Both devices now serve \.\pipe\vrio and \.\pipe\vplasma for the whole
app lifetime alongside the COM rows — the com0com-free path. Framing per
the pinned contract (0x00 len data / 0x01 DTR+RTS lines, one lines frame
on connect, unknown type = log + drop): PipeFraming/PipeFrameDecoder and
VRioPipeService (TX paced at the wire rate, peer DTR edges feed
HostHandshake) in VRio.Core, listener-only VPlasmaPipeService twin in
VPlasma.Core. Busy pipe names retry, so vRIO's built-in glass and the
standalone vPLASMA coexist. README documents the transport and the fork
conf lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The plasma glass now lives in vRIO's encoder strip: PlasmaCanvas grew a
dot-pitch parameter (default keeps the standalone glass pixel-identical)
and is compile-linked into VRio.App at pitch 3, parked at the strip's
left slot. The axis gauges move to the grid's right edge, the strip is
as tall as the glass, and the status text sits between them with the
axis readout split onto two lines. The button grid also compacts: rows
shift up past the layout's empty row 0 and the spare bottom row is
trimmed (the shared CockpitLayout is untouched, so coordinates still
match RIOJoy's map).
Control strip: the COM row labels are now the device names -- vRIO and
vPLASMA -- coloured by port status (green open, gray closed), replacing
the port-status line. The plasma row auto-opens COM12 at startup like
the RIO row does COM11; one Rescan refreshes both pickers. Plasma log
lines share the wire log under a vPLASMA: prefix, and the standalone
gestures carry over (double-click self-test, right-click reset).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The window is now just the display: 640x160 dot field (5 px pitch,
4 px bezel) plus the title bar, which carries the port status. COM12 —
the device end of the plasma's null-modem pair — is hardwired and
opened at startup, with a retry timer that keeps trying while the port
is missing or busy and reopens it if it dies. The control strip, port
picker, counters, and wire log are gone; the glass keeps two gestures:
double-click cycles the self-test pages, right-click resets the
display to its power-on state.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The cockpit's second serial device joins vRIO: the 128x32 dot-matrix
plasma on COM2 (9600 8N1) that the game draws mission text and status
graphics on. VPlasma.App opens the device end of a COM port, decodes
the display's command stream, and renders the matrix in plasma orange.
The command set is recovered from two Tesla 4.10 artifacts: the game's
driver (L4PLASMA.CPP — ESC P packed-bitmap row writes, ESC G 0 cursor
hide at boot) and the factory test tool PLASMA.EXE, whose data segment
pairs each command literal with its printf description (BS/HT/LF/VT/CR
motion, ESC @ clear, ESC L home, ESC G cursor, ESC K fonts, ESC H
attributes: intensity/underline/reverse/flash). Text renders through
the classic public-domain 5x7 set standing in for the lost ROM glyphs;
fonts 0-3 give 21x4 cells, fonts 4-7 the doubled 10x2. A Self test
cycles banner/charset/graphics pages through the same parser the wire
feeds, and the wire log shows every decoded command.
Verified end-to-end over the second com0com pair (host writing COM2,
vPLASMA listening on COM12). The verify skill gains the cross-process
combo-box lesson: string-carrying CB_* messages hang across processes,
so select ports by locally computed index via CB_SETCURSEL.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>