vPLASMA (standalone): vRIO-style picker, real firmware demo, PD5 fix

- 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>
This commit is contained in:
Cyd
2026-07-16 19:42:55 -05:00
co-authored by Claude Opus 4.8
parent 95b701ae0a
commit 79eb53253e
6 changed files with 195 additions and 72 deletions
@@ -355,6 +355,31 @@ public class VPlasmaDeviceTests
Assert.Equal(0, Pixel(device, 64, 16));
}
[Fact]
public void FirmwareDemo_ReplaysAllScreensAndDrawsText()
{
Assert.Equal(10, PlasmaFirmwareDemo.Count);
var device = new VPlasmaDevice();
foreach (byte[] screen in PlasmaFirmwareDemo.Screens)
{
Assert.NotEmpty(screen);
device.OnReceived(screen, screen.Length);
}
// The 10-screen demo puts plenty of real text on the glass.
Assert.True(device.TextCharsDrawn > 0);
}
[Fact]
public void PageSelect_ConsumesItsOperand()
{
var device = new VPlasmaDevice();
// ESC I 2 (draw page) must swallow the '2'; then 'H' is the first glyph.
Feed(device, Esc, (byte)'I', 2, Esc, (byte)'i', 3, (byte)'H');
Assert.Equal(1, device.TextCharsDrawn);
Assert.Equal(VPlasmaDevice.PixelLit, Pixel(device, 0, 0));
Assert.Equal(6, device.CursorX); // advanced exactly one cell (no stray chars)
}
[Fact]
public void Reset_RestoresPowerOnState()
{