From 9d912ae08400f6921b51a1616507bc59e27513f3 Mon Sep 17 00:00:00 2001 From: SDD Date: Fri, 16 Oct 2026 13:09:45 +0300 Subject: [PATCH] harness: l1patch.lua -- runtime level-1 host-port patch + test-map probe Runtime region-writes (on-disk ROM untouched) applied after the level-0 ROM checksum: three known failing checks: 3FA73980 CA04->C004, 3FA76060 CB04->C004, 3FA760F0 CB04->C004 (skip the c6/c0/c1 flag stores) VT1200_L1PATCH_EXTRA adds the second-round checks 3FA761F0 / 3FA763A0 (the retry loop reaches c3/c2 once c0/c1 stop short-circuiting) VT1200_L1PATCH_VERDICT optionally forces L3FA6E4B0's return (3FA71B60 4D28 move a9,a8 -> 5708 clr a8) With the five branch patches the HOST PORT test's caller returns 0 and no 'HOST PORT - 15' is printed, but level 1 does not complete: the CPU stays in the DUART ISR chain (INT1 0x0F60 -> 3FA92F40 -> L3FA78D90 -> 3FA78xxx-3FA7Bxxx) for >19000 frames with no error. l1p_pie_frame1500.png is a frame dump of the self-test circle/pie -- the renderer draws curves, fills and blits correctly. --- harness/mame/l1p_pie_frame1500.png | Bin 0 -> 24757 bytes harness/mame/l1patch.lua | 94 +++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 harness/mame/l1p_pie_frame1500.png create mode 100644 harness/mame/l1patch.lua diff --git a/harness/mame/l1p_pie_frame1500.png b/harness/mame/l1p_pie_frame1500.png new file mode 100644 index 0000000000000000000000000000000000000000..269bb7930494e319350034d050923793eab93181 GIT binary patch literal 24757 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 literal 0 HcmV?d00001 diff --git a/harness/mame/l1patch.lua b/harness/mame/l1patch.lua new file mode 100644 index 0000000..fffbc21 --- /dev/null +++ b/harness/mame/l1patch.lua @@ -0,0 +1,94 @@ +-- l1patch.lua -- runtime ROM patch for the level-1 HOST PORT test, plus a +-- console capture, so level 1 can run past it and report the rest of the tests. +-- +-- Mechanism: manager.machine.memory.regions[':maincpu']:write_u16() writes into +-- the host-side region buffer (bypasses the read-only CPU mapping). The +-- on-disk ROM is never touched. Applied after the level-0 ROM checksum. +-- +-- VT1200_L1PATCH=1 enable the patch +-- VT1200_L1PATCH_AT= frame to apply at (default 50) +-- VT1200_L1PATCH_EXTRA=1 also patch the two extra L3FA753D0 checks +-- VT1200_L1PATCH_VERDICT=1 also force L3FA6E4B0's return to 0 +-- VT1200_L1PATCH_MAX= exit frame (default 3000) + +local machine = manager.machine +local cpu = machine.devices[':maincpu'] +local dbg = machine.debugger +local mem = machine.memory +if not dbg then print("ERROR: no debugger"); machine:exit(); return end + +local ROM_BIT_BASE = 0x3F200000 +local region = mem.regions[':maincpu'] +local function bitoff(a) return (a - ROM_BIT_BASE) >> 3 end + +local enabled = (os.getenv("VT1200_L1PATCH") ~= nil) +local at = tonumber(os.getenv("VT1200_L1PATCH_AT") or "50") +local maxframes = tonumber(os.getenv("VT1200_L1PATCH_MAX") or "3000") + +-- c0/c1 (and c6) are the report's three known failing checks; c2/c3 are the +-- second-round checks the retry loop reaches once c0/c1 stop short-circuiting. +local patches = { + { 0x3FA73980, 0xCA04, 0xC004, "L3FA71BC0 flag c6 (SRA parity) -> skip store" }, + { 0x3FA76060, 0xCB04, 0xC004, "L3FA753D0 flag c0 (OVR) -> skip store" }, + { 0x3FA760F0, 0xCB04, 0xC004, "L3FA753D0 flag c1 (FFULL) -> skip store" }, +} +if os.getenv("VT1200_L1PATCH_EXTRA") then + patches[#patches + 1] = { 0x3FA761F0, 0xCA04, 0xC004, "L3FA753D0 flag c3 (direct SRA read) -> skip store" } + patches[#patches + 1] = { 0x3FA763A0, 0xCA04, 0xC004, "L3FA753D0 flag c2 (framing) -> skip store" } +end +if os.getenv("VT1200_L1PATCH_VERDICT") then + patches[#patches + 1] = { 0x3FA71B60, 0x4D28, 0x5708, "L3FA6E4B0 verdict: move a9,a8 -> clr a8 (force return 0)" } +end + +local function apply_patches() + if not region then print("L1PATCH ERROR: no region"); return end + print(string.format("L1PATCH applying %d patches", #patches)) + for _, p in ipairs(patches) do + local off = bitoff(p[1]) + local before = region:read_u16(off) + if before ~= p[2] then + print(string.format("L1PATCH ERROR %08X: expected %04X found %04X", p[1], p[2], before)) + else + region:write_u16(off, p[3]) + print(string.format("L1PATCH %08X off=%#010x %04X -> %04X (cpu reads %04X) %s", + p[1], off, p[2], p[3], cpu.spaces['program']:read_u16(p[1]), p[4])) + end + end +end + +-- console printer: a9 = message pointer (resolved offline) +dbg:command('bpset 3fde00c0,,{ printf "PRINT pc=%08X a9=%08X a11=%08X\\n", pc, a9, a11 ; g }') +-- host-port caller return (level-1 generic tester verdict) +dbg:command('bpset 3fa84fe0,,{ printf "HOSTPORT-RET a8=%08X\\n", a8 ; g }') + +if enabled and at == 0 then apply_patches() end +local pc = cpu.state['PC'] +local n = 0 +local hist, first, last = {}, {}, 0 +emu.register_frame_done(function() + n = n + 1 + if enabled and n == at then apply_patches() end + if os.getenv("VT1200_L1PATCH_TRACE") and n == tonumber(os.getenv("VT1200_L1PATCH_TRACE_AT") or "1") then + dbg:command('trace ' .. os.getenv("VT1200_L1PATCH_TRACE")) + end + if os.getenv("VT1200_L1PATCH_TRACE") and n == (tonumber(os.getenv("VT1200_L1PATCH_TRACE_AT") or "1") + 1) then + dbg:command('trace off') + end + local v = pc.value + hist[v] = (hist[v] or 0) + 1 + if not first[v] then first[v] = n end + last = v + if n >= maxframes then + print(string.format("--- frames=%d last PC=%08X ---", n, last)) + local list = {} + for k, c in pairs(hist) do list[#list + 1] = { k, c } end + table.sort(list, function(a, b) return a[2] > b[2] end) + for i = 1, math.min(12, #list) do + print(string.format(" PC=%08X samples=%d first_frame=%d", list[i][1], list[i][2], first[list[i][1]])) + end + machine:exit() + end +end, "vt1200-l1patch") + +dbg.visible_cpu = cpu +dbg.execution_state = 'run'