mirror of
https://git.k-space.ee/arti/vt1200.git
synced 2026-10-31 12:05:05 +02:00
Root cause of the missing THRA write (HOST PORT test): the level-1 host-port
test's transmit is ISR-driven, and the DUART interrupt was never wired to the
CPU. The firmware installs RAM trampolines in the fixed vector table (INT1
vector 0xffffffc0 -> stub at bit 0x0f60 = JA 0x3FA92F40, which calls the DUART
ISR L3FA78D90 with (2, 0x270860, 0x6400000)). Counters: INTENB reaches 0x0006
(INT1|INT2) at the test, so interrupts are enabled.
vt1200.cpp: wire m_duart1/m_duart2 irq_cb() to CPU external interrupt 1/2
(duart1_irq_w/duart2_irq_w), gated on VT1200_DUART. Result: THRA writes go
from 0 to 20 per run; the test's SRA-overrun and RHRA-pattern checks now pass.
MAME tree (mc68681.cpp/.h), two datasheet-backed corrections with revert notes:
1. TxRDY was asserted mid-character ("not until the end of start bit time");
the datasheet asserts it at the THR->TSR transfer. Corrected.
2. The overrun error was latched when the overrunning character *completed*
(rx_fifo_push); the datasheet latches it "upon receipt of the start bit of
the new (overrunning) character". Corrected via duart_channel::rx_w().
This clears every check in the RXCHECK sub-test (flags 1 -> 0).
Acceptance is NOT met: cap.lua still prints 'LEVEL1/2 ERROR -> HOST PORT - 15'.
The next failure is the preceding L3FA71BC0 (DUART baud/timer) sub-test
returning 6; its flag-set sites were breakpointed and never fired. Regression
holds (no VT1200_* env -> PC=3FDCE400 samples=199). Details, numbers and the
datasheet audit: harness/mame/DUART_REPORT.md sections FINAL FINDINGS / UPDATE.
41 lines
1.2 KiB
Lua
41 lines
1.2 KiB
Lua
-- hp_probe.lua -- breakpoints on the level-1 host-port test's decision points.
|
|
--
|
|
-- HP_FRAMES=700 <mame> vt1200 ... -autoboot_script harness/mame/hp_probe.lua
|
|
-- Output goes to debug.log (debugger console), not stdout.
|
|
|
|
local machine = manager.machine
|
|
local cpu = machine.devices[':maincpu']
|
|
local dbg = machine.debugger
|
|
|
|
if not dbg then print("ERROR: no debugger"); machine:exit(); return end
|
|
|
|
local function bp(addr, msg)
|
|
dbg:command(string.format('bpset %s,,{ printf "%s pc=%%08X a7=%%08X a9=%%08X a11=%%08X a13=%%08X\\n", pc, a7, a9, a11, a13 ; g }', addr, msg))
|
|
end
|
|
|
|
bp("3fa6e4b0", "ENTER-L3FA6E4B0")
|
|
bp("3fa753d0", "ENTER-RXCHECK")
|
|
bp("3fa767e0", "ENTER-XMITPASS")
|
|
bp("3fa76890", "XMIT-SKIPCHK")
|
|
bp("3fa761e0", "SRA-CHECK")
|
|
bp("3fa76390", "RHRA-CMP")
|
|
bp("3fa76300", "PATTERN")
|
|
bp("3fa76320", "MASK")
|
|
bp("3fa75bb0", "MR1-WRITE")
|
|
bp("3fa75cd0", "MR2-WRITE")
|
|
bp("3fa75dd0", "RXCHECK-COUNT")
|
|
bp("3fa75d70", "RXCHECK-CRA5")
|
|
bp("3fa76a40", "XMIT-SET-AA")
|
|
bp("3fa772d0", "XMIT-SET-COUNT4")
|
|
|
|
print("probe armed")
|
|
local n = 0
|
|
local maxframes = tonumber(os.getenv("HP_FRAMES") or "700")
|
|
emu.register_frame_done(function()
|
|
n = n + 1
|
|
if n >= maxframes then print("done " .. n); machine:exit() end
|
|
end, "vt1200-hp-probe")
|
|
|
|
dbg.visible_cpu = cpu
|
|
dbg.execution_state = 'run'
|