From db535c2adccaf13f032c9dfac16f277dd4b62745 Mon Sep 17 00:00:00 2001 From: SDD Date: Fri, 16 Oct 2026 13:02:50 +0300 Subject: [PATCH] harness: explicit monochrome palette (pen 0 black, pen 1 white) vt1200.cpp declared PALETTE(config, m_palette).set_entries(256) with no init delegate, so render_active_line()'s pens 0/1 rendered in whatever MAME's default palette held -- reported as red on screen. Use palette_device::MONOCHROME (emupal.cpp: palette_init_monochrome) with two entries, so the colour is ours and deterministic. Verified via a real MAME screenshot (screen:snapshot(), which renders through the palette -- dump_frame()'s PPM is straight from bitmap pens and cannot show colour): pal_mono_frame600.png is exactly black (0,0,0) + white (255,255,255). palverify.lua takes the screenshot; the frame is the level-1 error screen. --- harness/mame/pal_mono_frame600.png | Bin 0 -> 7962 bytes harness/mame/palverify.lua | 30 +++++++++++++++++++++++++++++ harness/mame/vt1200.cpp | 5 ++++- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 harness/mame/pal_mono_frame600.png create mode 100644 harness/mame/palverify.lua diff --git a/harness/mame/pal_mono_frame600.png b/harness/mame/pal_mono_frame600.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a992cf141bab6eeb0b7835406da41d0ff503d5 GIT binary patch literal 7962 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 literal 0 HcmV?d00001 diff --git a/harness/mame/palverify.lua b/harness/mame/palverify.lua new file mode 100644 index 0000000..e5bbcc6 --- /dev/null +++ b/harness/mame/palverify.lua @@ -0,0 +1,30 @@ +-- palverify.lua -- take a real MAME screenshot (video manager -> palette applied) +-- at a chosen frame. Unlike dump_frame()'s PPM (straight from bitmap pens), a +-- screen:snapshot() renders through the palette, so it is the correct instrument +-- for checking the mono colour ramp. +-- +-- PAL_FRAME= PAL_OUT= ... -autoboot_script palverify.lua + +local machine = manager.machine +local dbg = machine.debugger +local screens = machine.screens + +local at = tonumber(os.getenv("PAL_FRAME") or "600") +local out = os.getenv("PAL_OUT") or "/home/arti/code/k-space/vt1200/harness/mame/pal_snap.png" + +local screen = nil +for tag, s in pairs(screens) do screen = s; break end +if not screen then print("ERROR: no screen device"); machine:exit(); return end + +local n = 0 +emu.register_frame_done(function() + n = n + 1 + if n == at then + local err = screen:snapshot(out) + print(string.format("SNAP frame=%d -> %s err=%s", n, out, tostring(err))) + machine:exit() + end + if n > at + 5 then machine:exit() end +end, "vt1200-palverify") + +if dbg then dbg.execution_state = 'run' end diff --git a/harness/mame/vt1200.cpp b/harness/mame/vt1200.cpp index 430f6ef..46ee53c 100644 --- a/harness/mame/vt1200.cpp +++ b/harness/mame/vt1200.cpp @@ -1196,7 +1196,10 @@ void vt1200_state::vt1200(machine_config &config) // 256 entries so the TMS34010 renderer can encode multi-bit pixels; the // terminal's real output stage is a later question. - PALETTE(config, m_palette).set_entries(256); + // Explicit monochrome ramp: pen 0 = black, pen 1 = white. render_active_line() + // writes only pens 0/1, so with no init delegate the on-screen colour was + // whatever MAME's default palette held (reported: red). Two entries suffice. + PALETTE(config, m_palette, palette_device::MONOCHROME).set_entries(2); // The two Signetics SCN2681 DUARTs (same family as the Motorola MC68681: // 2681 = RD/WR strobes, 68681 = R/W + DTACK + interrupt vector). The