Files
SDD 9902722165 harness: wire DUART IRQ to the TMS34010 (host-port test transmit); fix two DUART timing deviations
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.
2026-10-16 12:07:27 +03:00

51 lines
1.5 KiB
Lua

-- hp_trace.lua -- dynamic trace of the level-1 HOST PORT test.
--
-- Polls (per frame, via the address map so device side effects apply):
-- INTENB/INTPEND (CPU I/O regs)
-- DUART1 ISR (window 0x06400000 + reg 5 -> program space 0x06400050)
-- DUART1 SRA (reg 1 -> 0x06400010)
-- DUART1 CRA read? no (write-only-ish); MR1A read ok (reg 0 -> 0x06400000)
-- DO NOT read reg 3 (RHRA) -- it pops the FIFO.
--
-- Also breaks at key PCs and logs registers.
--
-- HP_FRAMES=900 <mame> vt1200 ... -autoboot_script harness/mame/hp_trace.lua
local machine = manager.machine
local cpu = machine.devices[':maincpu']
local dbg = machine.debugger
local prog = cpu.spaces['program']
if not dbg then print("ERROR: no debugger"); machine:exit(); return end
local rd = function(a) return prog:read_u16(a) end
local maxframes = tonumber(os.getenv("HP_FRAMES") or "900")
local n = 0
-- Frame polling: report changes and every 25 frames a compact snapshot.
local last = {}
local keys = {
INTENB = 0xc0000110,
INTPEND = 0xc0000120,
D1_ISR = 0x06400050, -- reg 5
D1_SRA = 0x06400010, -- reg 1
D1_MR1 = 0x06400000, -- reg 0
}
emu.register_frame_done(function()
n = n + 1
for name, addr in pairs(keys) do
local v = rd(addr)
if last[name] ~= v then
print(string.format("f%4d %s CHANGED -> %04X", n, name, v))
last[name] = v
end
end
if n >= maxframes then
print("done (" .. n .. " frames)")
machine:exit()
end
end, "vt1200-hp")
dbg.visible_cpu = cpu
dbg.execution_state = 'run'