forked from arti/vt1200
harness: capture the firmware console; it reports LEVEL1/2 VIDEO MEMORY error 22 and restarts
This commit is contained in:
1 parent
fe978dee18
commit
ccd03b8879
3 files changed
+120
-1
No files matched your search
@@ -0,0 +1,46 @@
|
||||
-- Capture the firmware's own console output.
|
||||
--
|
||||
-- The firmware prints through the routine at bit 0x3FDE00C0. Every call site
|
||||
-- follows the same shape:
|
||||
-- movi <message pointer>, a9
|
||||
-- move a9, *a14+, 1
|
||||
-- calla 0x3fde00c0
|
||||
-- so at the ENTRY instruction a9 still holds the message pointer. Breaking
|
||||
-- there and logging a9 gives us the firmware's console transcript -- which is
|
||||
-- how we learn which self-test is failing without being able to see the screen.
|
||||
--
|
||||
-- CAP_OUT=<file> CAP_MAX=<n> <mame> vt1200 ... -autoboot_script harness/mame/cap.lua
|
||||
|
||||
local machine = manager.machine
|
||||
local cpu = machine.devices[':maincpu']
|
||||
local dbg = machine.debugger
|
||||
|
||||
if not dbg then
|
||||
print("ERROR: debugger not enabled; pass -debug")
|
||||
machine:exit()
|
||||
return
|
||||
end
|
||||
|
||||
local out = os.getenv("CAP_OUT") or "/home/arti/code/k-space/vt1200/harness/mame/console.txt"
|
||||
local maxframes = tonumber(os.getenv("CAP_MAX") or "900")
|
||||
|
||||
-- Pointers are BIT addresses; the image is byte-based at 0x07E40000, so a
|
||||
-- pointer P maps to file offset (P >> 3) - 0x07E40000.
|
||||
local PROG_BASE_BIT = 0x3F200000
|
||||
|
||||
dbg:command('bpset 3fde00c0,,{ printf "PRINT pc=%08X a9=%08X\\n", pc, a9 ; g }')
|
||||
print("printer breakpoint armed at 3fde00c0")
|
||||
|
||||
-- Also catch the error-report table entries, which are where a failing test
|
||||
-- lands. Log the call target so we see which report fires.
|
||||
local n = 0
|
||||
emu.register_frame_done(function()
|
||||
n = n + 1
|
||||
if n >= maxframes then
|
||||
print("done (" .. n .. " frames)")
|
||||
machine:exit()
|
||||
end
|
||||
end, "vt1200-cap")
|
||||
|
||||
dbg.visible_cpu = cpu
|
||||
dbg.execution_state = 'run'
|
||||
Reference in new issue
Block a user