feat(xie): a client-chosen XIE image is displayed on the VT1200

The XIE path now runs end to end: XieCreateImage -> XieCreatePhoto ->
XiePutTile -> XieExport(photomap -> depth-1 pixmap) -> XCopyArea(pixmap ->
window), and the client's tile appears on screen at the client's own window
position, pixel-exact.

TWO FAULTS BEHIND THE LONG DEAD END

1. Device model (harness/mame/vt1200.cpp, opt-in VT1200_ACCEL=1).  The
   accelerator's output port 0x5600200 returns the pixel stream the firmware
   pushed into the FIFO -- the firmware then stores it into the drawable itself
   (file 0x125528: MOVE *B6,*B1 ; ADDK 0x10,B1).  The FIFO read pointer was
   never reset between transfers, so consecutive exports read stale words and
   the same fill produced 759 then 516 set pixels.  Reset m_fifo_in/out on the
   data-register write; the export is now deterministic.

2. Measurement, not the device.
   - dwt/screenshot.py without --real reads 1024x1024 at a 128-byte row stride,
     but the VR319 default programs 1280x1024 at a 2048-bit (256-byte) pitch.
     That is the "shifted" picture; --real is the correct read.
   - The earlier "0 differing bytes over 128 KiB" VRAM comparison stepped peek
     by 1024 *bit* addresses, so it scanned rows 0..63 only -- never the window
     at rows 200..263.  Over the real raster the white/black diff is 576 bytes
     spanning exactly those rows.
   - New instrument: decclient does a server-side XGetImage readback of the
     pixmap and window and counts set pixels.  That separated "the server never
     drew it" from "the framebuffer view is wrong".

EVIDENCE (reproduced twice, the second time from a fresh machine)

  no export vs 0xFF : 4096 / 4096 pixels differ
  no export vs 0x00 :    0 / 4096   (the window background is black)
  0xFF      vs 0x00 : 4096 / 4096
  0xAA      vs 0x0F : 2048 / 4096   (the two stripe phases)

Tile byte 0xAA reproduces as 1-pixel vertical stripes, 0x0F as 4-pixel, with
no shear -- so the placement is right and the pixels are the client's.

Contents: xie/ holds DEC XIE 2.3 headers, 84 man pages and complete
client+server source; a libXie.a and decclient built from DEC's own code; the
XIE probes; and evidence/ with every measurement, including explicit
retractions of the earlier wrong readings (VRAM_IDENTICAL_FOR_BOTH_FILLS and
friends).  xie/evidence/XIE_IMAGE_DISPLAYED.md is the report; frames are in
xie/evidence/png/.

The accelerator model stays opt-in: it answers the status poll and relays the
pixel stream, but performs no compositing, so it is a stand-in and the verified
default configuration is unchanged (a no-env run still parks in the level-0
diagnostics menu at PC=3FDCE400).
This commit is contained in:
arti committed 2026-11-01 23:22:25 +02:00
1 parent 437c92e6ea
commit d8d54bb990
1035 files changed
+385859 -1

No files matched your search

+98 -1
View File
@@ -642,6 +642,13 @@ static const u32 BOARD_BASE[4] = { VT1200_WIN0, VT1200_WIN1, VT1200_WIN2, VT1200
// 160-byte / 80-word pitch MAME computed from HEBLNK/HSBLNK/HTOTAL the text is
// sheared and unreadable. See RENDER_REPORT.md.
static const u32 VRAM_BASE_BITS = 0x04000000; // where the framebuffer lives
// The image accelerator ("scalution") register block, at bit 0x05600000. The
// firmware's DDX render path (file 0x122D94) drives it and polls 0x5600010 bit 1
// for "initialisation done", timing out with
// "ERROR: timeout occurred on initialization of scalution"
// and returning BadValue otherwise. Before this was modelled the whole range
// fell inside the VRAM window above, so the poll read pixel data forever.
static const u32 ACCEL_BASE_BITS = 0x05600000;
static const int VMEM_PITCH_BITS = 1024; // 0x40 words = 128 bytes
static const int VMEM_HEIGHT = 1024; // rows in the framebuffer
@@ -866,6 +873,18 @@ private:
void unmapped_w(offs_t off, u16 data);
void log_unmapped(const char *kind, u32 addr, const char *pc);
// Image accelerator ("scalution") minimum model. Registers observed:
// +0x00 control, +0x10 status (bit 1 = initialised/done),
// +0x20 timing, +0x30 control, +0x80 command/data FIFO, +0x100 control.
u16 m_accel[0x100]{};
bool m_accel_rdy = false; // 0x5600010 bit 0 handshake
bool m_accel_done = false; // set once the FIFO has consumed data
u16 m_fifo[0x2000]{}; // pixels pushed into the accelerator
u32 m_fifo_in = 0, m_fifo_out = 0; // reset by a data-register write
u32 m_accel_cnt = 0; // words pushed in the current burst
u16 accel_r(offs_t off);
void accel_w(offs_t off, u16 data);
// VT1200_IRQLOG=<path>: log DUART1's IRQ assertions (ISR/SRA at the
// moment of the interrupt).
FILE *m_irqlog = nullptr;
@@ -1107,6 +1126,66 @@ void vt1200_state::unmapped_w(offs_t off, u16 data)
log_unmapped("W", (u32)off, pc);
}
// ---------------------------------------------------------------------------
// Image accelerator ("scalution") minimum model.
//
// The firmware's DDX render path drives this block and waits for bit 1 of the
// status register to come up, printing
// "ERROR: timeout occurred on initialization of scalution"
// and returning XIE BadValue if it never does. With the block unmapped (it
// used to fall inside the VRAM window) the poll could never succeed, so XIE
// export could never complete. Reporting the ready bit lets the firmware's own
// render path proceed; the pixel engine itself is still not modelled.
// ---------------------------------------------------------------------------
u16 vt1200_state::accel_r(offs_t off)
{
if (getenv("VT1200_ACCEL_LOG"))
logerror("accel: r %03X\n", (unsigned)off);
// NOTE: the address map hands us (address - base) >> 4, so the registers
// seen at +0x00/+0x10/+0x20/+0x30/+0x80/+0x100 arrive as 0/1/2/3/8/0x10.
// 0x5600200 is the engine's OUTPUT port: the firmware reads it and writes
// each word to the drawable itself (file 0x125528: MOVE *B6,*B1 ;
// ADDK 0x10,B1). So it must return the pixels that were pushed into the
// FIFO, not a status word.
if ((off & 0xff) == 0x20) {
if (m_fifo_out < m_fifo_in) return m_fifo[m_fifo_out++ & 0x1fff];
return 0x0000;
}
if ((off & 0xff) == 0x01)
// 0x5600010: bit 1 = initialised (DDX setup poll, file 0x122E54),
// bit 2 = transfer complete, bit 9 = done (file 0x1253FC/0x125448),
// bit 0 = DATA READY -- a handshake, not a constant: file 0x1254F2 takes
// the transfer path while it is set and the transfer loop at 0x125568
// re-enters forever if it never clears.
return 0x0002 | (m_accel_rdy ? 0x0001 : 0x0000)
| (m_accel_done ? (0x0200 | 0x0004) : 0x0000);
{
u16 v = m_accel[off & 0xff];
// The transfer loop also tests bit 9 ("done") of whichever control
// register the caller passed in B3; report done on the control cluster.
if (m_accel_done) v |= 0x0200; // "done" on the control registers
return v;
}
}
void vt1200_state::accel_w(offs_t off, u16 data)
{
m_accel[off & 0xff] = data;
// Data-request handshake: a FIFO command (0x5600080) raises "data ready";
// the first write to the FIFO data register (0x5600050) consumes it.
// Handshake, taken from file 0x12538C: the host writes the data register
// (0x5600050), then streams the source pixels into the FIFO (0x5600080) in
// bursts of 0x7FE words, then sets bit 0 of 0x5600030.
if ((off & 0xff) == 0x05) { m_accel_rdy = true; m_accel_done = false; m_accel_cnt = 0;
m_fifo_in = m_fifo_out = 0; } // data register write starts a new transfer
else if ((off & 0xff) == 0x08) {
m_fifo[m_fifo_in++ & 0x1fff] = data;
if (++m_accel_cnt >= 0x7fe) { m_accel_rdy = false; m_accel_done = true; m_accel_cnt = 0; }
}
if (getenv("VT1200_ACCEL_LOG"))
logerror("accel: w %03X = %04X\n", (unsigned)off, data);
}
void vt1200_state::program_map(address_map &map)
{
// Catch-all for anything we do not model -- registered FIRST so every region
@@ -1124,7 +1203,25 @@ void vt1200_state::program_map(address_map &map)
// 0x04000000..0x040D7FF0 == bytes 0x800000..0x81AFFE (~110 KB, about one
// 1280x1024 1bpp framebuffer). Mapping it is what lets the level-1 VIDEO
// MEMORY test's walking-bit read-back pass, so it is unconditional now.
map(VRAM_BASE_BITS, 0x1fffffff).ram().share("vram");
// Image accelerator ("scalution") register block. OPT-IN via VT1200_ACCEL
// so the verified default configuration stays exactly as it was.
//
// What the model does (XIE_IMAGE_DISPLAYED.md in xie/evidence/): it answers
// the status poll, accepts the pixel stream the firmware pushes into the
// FIFO, and returns those words on the output port, which the FIRMWARE then
// stores into the drawable itself (file 0x125528: MOVE *B6,*B1). With it the
// XIE path runs end to end and a client-chosen image appears on screen.
//
// What it does NOT do: it is not a real accelerator. It performs no
// compositing or scaling, and the destination is the caller's pointer, not a
// register -- so this is a stand-in for the device, not a model of it.
if (getenv("VT1200_ACCEL")) {
map(ACCEL_BASE_BITS, ACCEL_BASE_BITS + 0xfff).rw(FUNC(vt1200_state::accel_r), FUNC(vt1200_state::accel_w));
map(VRAM_BASE_BITS, ACCEL_BASE_BITS - 1).ram().share("vram");
map(ACCEL_BASE_BITS + 0x1000, 0x1fffffff).ram();
} else {
map(VRAM_BASE_BITS, 0x1fffffff).ram().share("vram");
}
// Main RAM: 4 MiB (1 MiB onboard + 3 x 1 MiB SIMMs on the real machine).
// The TMS34010 is bit-addressed, so 4 MiB of bytes == 0x2000000 address
+8
View File
@@ -0,0 +1,8 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("wpset 05600000,400,rw,1,{ printf \"ACC pc=%08X adr=%08X val=%08X\n\", pc, wpaddr, wpdata ; g }")
print("XIE-ACC armed (0x5600000..0x56001FF)")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "acc")
+9
View File
@@ -0,0 +1,9 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600000,400,rw,1,{ printf \"ACC pc=%08X adr=%08X val=%08X\n\", pc, wpaddr, wpdata ; g }")
print("XIE-ACC2 armed (poke + 0x5600000..0x56001FF)")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "acc2")
+5
View File
@@ -0,0 +1,5 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600080,10,w,1,{ printf \"CMD %04X\n\", wpdata ; g }")
dbg:command("wpset 05600050,10,w,1,{ printf \"DAT %04X\n\", wpdata ; g }")
print("XIE-ACC3 armed")
+5
View File
@@ -0,0 +1,5 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600000,1000,w,1,{ printf \"ACCW %04X %04X\n\", wpaddr, wpdata ; g }")
dbg:command("wpset 05600000,1000,r,1,{ printf \"ACCR %04X\n\", wpaddr ; g }")
print("XIE-ACC4 armed")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600000,1000,w,1,{ printf \"ACCW pc=%08X %04X %04X\n\", pc, wpaddr, wpdata ; g }")
print("XIE-ACC5 armed")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600000,200,rw,1,{ printf \"ACC %08X %04X %08X\n\", wpaddr, wpdata, pc ; g }")
print("XIE-ACCT armed")
+9
View File
@@ -0,0 +1,9 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3FB29D70,,{ printf \"ARGS a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X a7=%08X\n\", a0, a1, a2, a3, a4, a7 ; g }")
print("XIE-ARGS armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "args")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F5565D0,,{ printf \"ACBA a11=%08X b8=%02X b12=%02X\\n\", a11, b@(a11+0x40), b@(a11+0x60) ; g }")
dbg:command("bpset 3F5565F0,,{ printf \"ACBE a7=%08X\\n\", a7 ; g }")
dbg:command("bpset 3F556620,,{ printf \"ACC4 a7=%08X\\n\", a7 ; g }")
dbg:command("bpset 3F556650,,{ printf \"ACCA a7=%08X\\n\", a7 ; g }")
dbg:command("bpset 3F556680,,{ printf \"ACD0 a7=%08X\\n\", a7 ; g }")
dbg:command("bpset 3F5566A0,,{ printf \"ACD4_BADMATCH\\n\" ; g }")
dbg:command("bpset 3F5569A0,,{ printf \"OKPATH_6AD34\\n\" ; g }")
print("XIE-ARM2 armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "arm2")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55E5D0,,{ printf \"ACBA a11=%08X b8=%02X b12=%02X\n\", a11, b@(a11+0x40), b@(a11+0x60) ; g }")
dbg:command("bpset 3F55E5F0,,{ printf \"ACBE a7=%08X\n\", a7 ; g }")
dbg:command("bpset 3F55E620,,{ printf \"ACC4 a7=%08X\n\", a7 ; g }")
dbg:command("bpset 3F55E650,,{ printf \"ACCA a7=%08X (req byte13)\n\", a7 ; g }")
dbg:command("bpset 3F55E680,,{ printf \"ACD0 a7=%08X\n\", a7 ; g }")
dbg:command("bpset 3F55E6A0,,{ printf \"ACD4_BADMATCH\n\" ; g }")
print("XIE-ARMCHK armed 7 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "armchk")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D560,,{ printf \"STORE src120=%08X\n\", d@(a7+0x120) ; g }")
dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X\n\", a11, d@(a11) ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F55DF10,,{ printf \"LK_SUCCESS_6BBE2\n\" ; g }")
print("XIE-B36 armed 6 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "b36")
+28
View File
@@ -0,0 +1,28 @@
-- byte8 watch + PROVABLE stack control
local frames = 0
local lastwp, lastaddr = "", 0
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
local idstore = 0x3F200000 + 0x67B04*8
dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore))
print("XIE-B8S armed 1 breakpoint")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp6.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local p = tonumber(txt)
if p and p ~= 0 and p ~= lastaddr then
lastaddr = p
local sp = cpu.state["SP"].value
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8 pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", p + 8*8))
-- stack control: 256 bits just below SP, written by the next push
dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL pc=%%08X\\n\", pc ; g }", sp - 0x100))
print(string.format("XIE-B8S installed: byte8 %08X ; stack ctrl at %08X (sp=%08X)", p + 8*8, sp - 0x100, sp))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "b8s")
+27
View File
@@ -0,0 +1,27 @@
-- byte8 watches on TWO objects + stack positive control
local frames = 0
local lastwp = ""
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", 0x3F200000 + 0x67B04*8))
print("XIE-B8T armed 1 breakpoint")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp7.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local a, b = txt:match("(%d+),(%d+)")
if a and b then
local pa, pb = tonumber(a), tonumber(b)
local sp = cpu.state["SP"].value
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8A pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pa + 8*8))
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8B pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pb + 8*8))
dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL pc=%%08X\\n\", pc ; g }", sp - 0x100))
print(string.format("XIE-B8T installed: A byte8 %08X, B byte8 %08X, stack %08X", pa+8*8, pb+8*8, sp-0x100))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "b8t")
+27
View File
@@ -0,0 +1,27 @@
-- byte8 write watch + positive-control watch on VRAM (generated addresses)
local frames = 0
local lastwp, lastaddr = "", 0
local dbg = manager.machine.debugger
local idstore = 0x3F200000 + 0x67B04*8
local s19ret = 0x3F200000 + 0x6A7B4*8
dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore))
dbg:command(string.format("bpset %08X,,{ printf \"CTRL_S19RET a8=%%08X\\n\", a8 ; g }", s19ret))
print("XIE-B8V armed 2 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp4.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local p = tonumber(txt)
if p and p ~= 0 and p ~= lastaddr then
lastaddr = p
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8 pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", p + 8*8))
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"VCTRL\\n\" ; g }", 0x04000000))
print(string.format("XIE-B8V installed: byte8 at %08X + VRAM control", p + 8*8))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "b8v")
+25
View File
@@ -0,0 +1,25 @@
-- byte8 write watch + WIDE VRAM control (1 KB) to validate the mechanism
local frames = 0
local lastwp, lastaddr = "", 0
local dbg = manager.machine.debugger
local idstore = 0x3F200000 + 0x67B04*8
dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore))
print("XIE-B8W armed 1 breakpoint")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp5.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local p = tonumber(txt)
if p and p ~= 0 and p ~= lastaddr then
lastaddr = p
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8 pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", p + 8*8))
dbg:command("wpset 04000000,2000,w,1,{ printf \"VCTRL pc=%08X\\n\", pc ; g }")
print(string.format("XIE-B8W installed: byte8 %08X + VRAM 1KB control", p + 8*8))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "b8w")
+12
View File
@@ -0,0 +1,12 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }")
dbg:command("bpset 3F55DF10,,{ printf \"LK_SUCCESS\n\" ; g }")
print("XIE-CHAIN armed 5 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "chain")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2DD1B0,,{ printf \"after 7F67F38 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD250,,{ printf \"after 7E75EA8 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD330,,{ printf \"after 7EA45FE a8=%08X a11=%08X\n\", a8, a11 ; g }")
dbg:command("bpset 3F2DD3F0,,{ printf \"after 7E7FE96 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD410,,{ printf \"after store a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DDE00,,{ printf \"RET a8=%08X\n\", a8 ; g }")
print("XIE-CLN armed 6")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "cln")
+17
View File
@@ -0,0 +1,17 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2DCF90,,{ printf \"r9F2 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD000,,{ printf \"rA00 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD0C0,,{ printf \"rA18 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD150,,{ printf \"rA2A a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD180,,{ printf \"ERRCHAIN_1BA30\n\" ; g }")
dbg:command("bpset 3F2DD530,,{ printf \"ERR_1BAA6\n\" ; g }")
dbg:command("bpset 3F2DD630,,{ printf \"ERR_1BAC6\n\" ; g }")
dbg:command("bpset 3F2DDCB0,,{ printf \"ERR_1BB96\n\" ; g }")
dbg:command("bpset 3F2DDE00,,{ printf \"DRIVER_RET a8=%08X\n\", a8 ; g }")
print("XIE-CMP armed 10")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "cmp")
+5
View File
@@ -0,0 +1,5 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600020,10,w,1,{ printf \"R20 %04X %08X\n\", wpdata, pc ; g }")
dbg:command("wpset 05600030,10,w,1,{ printf \"R30 %04X %08X\n\", wpdata, pc ; g }")
print("XIE-CTL armed")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3FE114E0,,{ printf \"H229C a0=%08X a1=%08X a8=%08X\n\", a0, a1, a8 ; g }")
dbg:command("bpset 3FE0F590,,{ printf \"H1EB2 a0=%08X a1=%08X a8=%08X\n\", a0, a1, a8 ; g }")
dbg:command("bpset 3FE0FAF0,,{ printf \"H1F5E a0=%08X a1=%08X\n\", a0, a1 ; g }")
dbg:command("bpset 3FE11080,,{ printf \"H2210 a0=%08X a1=%08X\n\", a0, a1 ; g }")
dbg:command("bpset 3F2D9EF0,,{ printf \"after 229C#1 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA030,,{ printf \"after 1EB2#2 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA130,,{ printf \"after 2210 a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA220,,{ printf \"after 2210 b a8=%08X\n\", a8 ; g }")
print("XIE-CVT armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "cvt")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F3AF870,,{ printf \"DDX class=%d\n\", b@(a11+0x630) ; g }")
dbg:command("bpset 3F3AF950,,{ printf \"DDX f610=%08X (BadValue if 0)\n\", d@(a9+0x610) ; g }")
dbg:command("bpset 3F3AF790,,{ printf \"DDX_BADVALUE_class\n\" ; g }")
dbg:command("bpset 3F3AF980,,{ printf \"DDX_BADVALUE_610zero\n\" ; g }")
dbg:command("bpset 3F3AFB10,,{ printf \"DDX_continue_after_610\n\" ; g }")
dbg:command("bpset 3F3B8A60,,{ printf \"DDX_RET a8=%08X\n\", a8 ; g }")
print("XIE-DDX armed 6")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "ddx")
+17
View File
@@ -0,0 +1,17 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY\n\" ; g }")
dbg:command("bpset 3F55C1F0,,{ printf \"H_83E ddobj=%08X b1=%02X a8=%08X\n\", a11, b@(a11+0x8), a8 ; g }")
dbg:command("bpset 3F55B270,,{ printf \"H_64E_disp1\n\" ; g }")
dbg:command("bpset 3F55B3A0,,{ printf \"H_674 cnt=%08X\n\", d@(a13+0x1f0) ; g }")
dbg:command("bpset 3F55B420,,{ printf \"H_684 d8=%08X\n\", d@(a9+0xd8) ; g }")
dbg:command("bpset 3F55B440,,{ printf \"H_688\n\" ; g }")
dbg:command("bpset 3F55B500,,{ printf \"H_6A0_call_7EAC356\n\" ; g }")
dbg:command("bpset 3F55B750,,{ printf \"H_6EA_call_7E80008\n\" ; g }")
dbg:command("bpset 3F55BF40,,{ printf \"H_7E8_disp4\n\" ; g }")
dbg:command("bpset 3F55C260,,{ printf \"H_84C_default\n\" ; g }")
print("XIE-DISP armed 10")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "disp")
+18
View File
@@ -0,0 +1,18 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY\n\" ; g }")
dbg:command("bpset 3F55C1F0,,{ printf \"H_83E ddobj=%08X b1=%02X a8=%08X\n\", a11, b@(a11+0x8), a8 ; g }")
dbg:command("bpset 3F55B270,,{ printf \"H_64E_disp1\n\" ; g }")
dbg:command("bpset 3F55B3A0,,{ printf \"H_674 cnt=%08X\n\", d@(a13+0x1f0) ; g }")
dbg:command("bpset 3F55B420,,{ printf \"H_684 d8=%08X\n\", d@(a9+0xd8) ; g }")
dbg:command("bpset 3F55B440,,{ printf \"H_688\n\" ; g }")
dbg:command("bpset 3F55B500,,{ printf \"H_6A0_call_7EAC356\n\" ; g }")
dbg:command("bpset 3F55B750,,{ printf \"H_6EA_call_7E80008\n\" ; g }")
dbg:command("bpset 3F55BF40,,{ printf \"H_7E8_disp4\n\" ; g }")
dbg:command("bpset 3F55C260,,{ printf \"H_84C_default\n\" ; g }")
print("XIE-DISP2 armed 11")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "disp2")
+9
View File
@@ -0,0 +1,9 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3FB2A940,,{ printf \"DST b1=%08X b2=%08X a6=%08X\n\", b1, b2, a6 ; g }")
print("XIE-DST armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "dst")
+24
View File
@@ -0,0 +1,24 @@
local frames = 0
local last = ""
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
print("XIE-EB4 armed")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/eb4.txt", "r")
if f then
local t = f:read("*l"); f:close()
if t and t ~= last then
last = t
local e = tonumber(t)
if e and e ~= 0 then
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"EB4WRITE pc=%%08X val=%%08X\n\", pc, wpdata ; g }", e + 0x20))
local sp = cpu.state["SP"].value
dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", (sp - 0x100) & 0x3FFFFFFF))
print(string.format("XIE-EB4 watching %08X (+ctrl)", e + 0x20))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "eb4")
+10
View File
@@ -0,0 +1,10 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1 a5=%08X tgt=%08X\\n\", a5, a5+0x58 ; g }")
dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2 a5=%08X tgt=%08X\\n\", a5, a5+0x58 ; g }")
print("XIE-ELEM armed 3")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "elem")
+26
View File
@@ -0,0 +1,26 @@
local frames = 0
local lastwp = ""
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
print("XIE-ELW armed 1 breakpoint")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp8.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local a, b = txt:match("(%d+),(%d+)")
if a and b then
local pa, pb = tonumber(a), tonumber(b)
dbg:command(string.format("wpset %08X,800,w,1,{ printf \"ELW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pa))
dbg:command(string.format("wpset %08X,20,w,1,{ printf \"BANDW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pb))
local sp = cpu.state["SP"].value
dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", (sp - 0x100) & 0x3FFFFFFF))
print(string.format("XIE-ELW installed elem=%08X(+800) bandslot=%08X ctrl=%08X", pa, pb, sp))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "elw")
+27
View File
@@ -0,0 +1,27 @@
local frames = 0
local lastwp = ""
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }")
dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\n\" ; g }")
dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\n\" ; g }")
print("XIE-ELW2 armed 4")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp9.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local a, b = txt:match("(%d+),(%d+)")
if a and b then
local pa, pb = tonumber(a), tonumber(b)
dbg:command(string.format("wpset %08X,800,w,1,{ printf \"ELW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pa))
dbg:command(string.format("wpset %08X,20,w,1,{ printf \"BANDW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pb))
print(string.format("XIE-ELW2 installed elem=%08X bandslot=%08X", pa, pb))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "elw2")
+17
View File
@@ -0,0 +1,17 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F516BF0,,{ printf \"EX_LK ret=%08X obj=%08X\n\", a8, d@(a13+0x20) ; g }")
dbg:command("bpset 3F516C70,,{ printf \"EX_F5 obj=%08X f5=%08X\n\", a11, d@(a11+0x28) ; g }")
dbg:command("bpset 3F516DE0,,{ printf \"EX_CK1 req=%08X obj=%08X\n\", d@(a9+0x80), d@(a11+0x80) ; g }")
dbg:command("bpset 3F516FC0,,{ printf \"EX_CK2 req=%08X obj=%08X\n\", d@(a9+0xa0), d@(a11+0xa0) ; g }")
dbg:command("bpset 3F517180,,{ printf \"EX_CK3 c0=%08X e0=%08X\n\", d@(a9+0xc0), d@(a9+0xe0) ; g }")
dbg:command("bpset 3F516CA0,,{ printf \"EX_BADMATCH\n\" ; g }")
dbg:command("bpset 3F516E50,,{ printf \"EX_BADVALUE_1\n\" ; g }")
dbg:command("bpset 3F517030,,{ printf \"EX_BADVALUE_2\n\" ; g }")
dbg:command("bpset 3F5171F0,,{ printf \"EX_BADVALUE_3\n\" ; g }")
print("XIE-EX1 armed 10")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "ex1")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F517EE0,,{ printf \"EX2_CALL_7EA47B6\n\" ; g }")
dbg:command("bpset 3F517F10,,{ printf \"EX2_RET a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F517F40,,{ printf \"EX2_JREQ a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F5184D0,,{ printf \"RD_RET a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F518750,,{ printf \"EPI_RET a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F517DE0,,{ printf \"EXIT_62FBC\n\" ; g }")
print("XIE-EX2 armed 7")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "ex2")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F518150,,{ printf \"ALLOC ret=%08X\n\", a8 ; g }")
dbg:command("bpset 3F518190,,{ printf \"BADALLOC_path\n\" ; g }")
dbg:command("bpset 3F518390,,{ printf \"SETUP_before_render\n\" ; g }")
dbg:command("bpset 3F5184C0,,{ printf \"CALL_RD\n\" ; g }")
dbg:command("bpset 3F5184F0,,{ printf \"AFTER_RD a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F518740,,{ printf \"OK_EXIT\n\" ; g }")
dbg:command("bpset 3F518750,,{ printf \"EPI a8=%08X\n\", a8 ; g }")
print("XIE-EX3 armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "ex3")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2DC420,,{ printf \"J884 b9=%02X (JREQ=error if 0)\n\", b@(d@(0xa6000)+0x48) ; g }")
dbg:command("bpset 3F2DC440,,{ printf \"CONT_1B888\n\" ; g }")
dbg:command("bpset 3F2DCF90,,{ printf \"J9F2 (JR 1BA30) a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DD180,,{ printf \"ERR_1BA30\n\" ; g }")
dbg:command("bpset 3F2DD340,,{ printf \"ERR_1BA68 MOVK2 (reports BadValue)\n\" ; g }")
dbg:command("bpset 3F2DDE00,,{ printf \"DRIVER_RET a8=%08X\n\", a8 ; g }")
print("XIE-EXBR armed 6")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "exbr")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\n\" ; g }")
dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\n\" ; g }")
dbg:command("bpset 3F2DA350,,{ printf \"TYPE3\n\" ; g }")
dbg:command("bpset 3F2DA7A0,,{ printf \"TYPE4\n\" ; g }")
dbg:command("bpset 3F2DAC10,,{ printf \"TYPE5\n\" ; g }")
dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
print("XIE-EXEC armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "exec")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F516BF0,,{ printf \"EX_LK ret=%08X obj=%08X\n\", a8, d@(a13+0x20) ; g }")
dbg:command("bpset 3F516C70,,{ printf \"EX_F5 obj=%08X f5=%08X\n\", a11, d@(a11+0x28) ; g }")
dbg:command("bpset 3F516DE0,,{ printf \"EX_CK1 req80=%08X obj80=%08X\n\", d@(a9+0x80), d@(a11+0x80) ; g }")
dbg:command("bpset 3F516FC0,,{ printf \"EX_CK2 req_a0=%08X obj_a0=%08X\n\", d@(a9+0xa0), d@(a11+0xa0) ; g }")
dbg:command("bpset 3F517180,,{ printf \"EX_CK3 req_c0=%08X req_e0=%08X\n\", d@(a9+0xc0), d@(a9+0xe0) ; g }")
dbg:command("bpset 3F516CA0,,{ printf \"EX_BADMATCH_path\n\" ; g }")
dbg:command("bpset 3F516E50,,{ printf \"EX_BADVALUE_1\n\" ; g }")
print("XIE-EXP armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "exp")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F5177C0,,{ printf \"EX_EF8 f80=%08X fA0=%08X fC0=%08X a11=%08X\n\", d@(a13+0x80), d@(a13+0xa0), d@(a13+0xc0), a11 ; g }")
dbg:command("bpset 3F5177D0,,{ printf \"EX_EFA objA0=%08X\n\", d@(a11+0xa0) ; g }")
dbg:command("bpset 3F517870,,{ printf \"EX_F0E a7=%08X a5=%08X\n\", a7, a5 ; g }")
dbg:command("bpset 3F517890,,{ printf \"EX_F12 a5=%08X (JRLE if <=0)\n\", a5 ; g }")
dbg:command("bpset 3F5178C0,,{ printf \"EX_REJECT_BADVALUE\n\" ; g }")
dbg:command("bpset 3F517A00,,{ printf \"EX_CONTINUE_TO_RENDER\n\" ; g }")
print("XIE-EXT armed 7")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "ext")
+8
View File
@@ -0,0 +1,8 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; printf \"FORCED elem.b4=0 (was %02X) rp=%08X\n\", 0, d@(0xa6000) ; g }")
print("XIE-FIX armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "fix")
+12
View File
@@ -0,0 +1,12 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; printf \"FORCED b4=0 rp=%08X\n\", d@(0xa6000) ; g }")
dbg:command("bpset 3F3AF950,,{ printf \"CHK_610 val=%08X\n\", d@(a9+0x610) ; g }")
dbg:command("bpset 3F3AF980,,{ printf \"ERR_SRCBASE_NULL\n\" ; g }")
dbg:command("bpset 3F3AF790,,{ printf \"ERR_COMPRESSION\n\" ; g }")
dbg:command("bpset 3F3AFB10,,{ printf \"PAST_610_OK\n\" ; g }")
print("XIE-FIX2 armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "fix2")
+10
View File
@@ -0,0 +1,10 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3F3B8E10,,{ printf \"E_TMPUDP path\n\" ; g }")
dbg:command("bpset 3F3B8A60,,{ printf \"DDX_RET a8=%08X\n\", a8 ; g }")
print("XIE-FIX3 armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "fix3")
+12
View File
@@ -0,0 +1,12 @@
-- minimal probe: only the three addresses needed for the BadMatch gate question
local cpu = manager.machine.devices[":maincpu"]
local dbg = manager.machine.debugger
local frames = 0
dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 0x3F55D7C0,,{ printf \"E8MAIN\n\" ; g }")
dbg:command("bpset 0x3F55CE20,,{ printf \"CLASS1\n\" ; g }")
print("XIE-GATE-ONLY armed 3 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "gate-only")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D560,,{ printf \"STORE src120=%08X\n\", d@(a7+0x120) ; g }")
dbg:command("bpset 3F55D750,,{ printf \"EA a11=%08X star11=%08X argA0=%08X arg40=%08X\n\", a11, d@(a11), d@(a13+0xffa0), d@(a13+0xff40) ; g }")
dbg:command("bpset 3F55D790,,{ printf \"F2 a7=%08X star7=%08X\n\", a7, d@(a7) ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }")
print("XIE-GATEOP armed 6 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "gateop")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55B200,,{ printf \"HANDOFF_ENTRY\\n\" ; g }")
dbg:command("bpset 3F55B420,,{ printf \"H_684 a9=%08X\\n\", a9 ; g }")
dbg:command("bpset 3F55B440,,{ printf \"H_688 guard a9=%08X\\n\", a9 ; g }")
dbg:command("bpset 3F55B750,,{ printf \"H_6EA dd_call\\n\" ; g }")
dbg:command("bpset 3F55C260,,{ printf \"H_84C_NOOP\\n\" ; g }")
dbg:command("bpset 3F55C6B0,,{ printf \"H_8D6 clear28\\n\" ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }")
print("XIE-HANDOFF armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "handoff")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2D9EF0,,{ printf \"R_1EB2a a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA030,,{ printf \"R_1EB2b a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA130,,{ printf \"R_2210a a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA1F0,,{ printf \"R_1F5Eb a8=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2DA220,,{ printf \"R_2210b a8=%08X (block end)\n\", a8 ; g }")
dbg:command("bpset 3F2DA240,,{ printf \"BLK_EXIT_to_1B842\n\" ; g }")
dbg:command("bpset 3F2DC210,,{ printf \"TAIL_1B842 a8=%08X\n\", a8 ; g }")
print("XIE-HLP armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "hlp")
+10
View File
@@ -0,0 +1,10 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\\n\", a7, a11 ; g }")
dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\\n\", a11, d@(a11+0x610) ; g }")
print("XIE-IMPORT armed 3")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "import")
+9
View File
@@ -0,0 +1,9 @@
-- minimal probe: ONE breakpoint (ID store), so nothing can be silently dropped.
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
print("XIE-MIN armed 1 breakpoint")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min")
+10
View File
@@ -0,0 +1,10 @@
-- minimal probe #2: ID store + the 0x6B966 gate CMP. Two breakpoints only.
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
print("XIE-MIN2 armed 2 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min2")
+12
View File
@@ -0,0 +1,12 @@
-- minimal probe #3: three breakpoints - ID store, class dispatch, gate CMP
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F55D460,,{ printf \"CLASSDISP a11=%08X cls=%02X\n\", a11, b@(a11+0x20) ; g }")
dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 0x3F55CD70,,{ printf \"LOOKUP_NULL\n\" ; g }")
print("XIE-MIN3 armed 4 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min3")
+18
View File
@@ -0,0 +1,18 @@
-- bisect file 0x6BA1E..0x6BAC4 on the arm path (10 breakpoints)
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"A_REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F55D0F0,,{ printf \"B_6BA1E cls2entry arg1=%08X\n\", d@(a13+0xffc0) ; g }")
dbg:command("bpset 0x3F55D120,,{ printf \"C_6BA24 copy_byte40_out\n\" ; g }")
dbg:command("bpset 0x3F55D190,,{ printf \"D_6BA32 byte40_zero_check\n\" ; g }")
dbg:command("bpset 0x3F55D1F0,,{ printf \"E_6BA3E err_0E_byte40\n\" ; g }")
dbg:command("bpset 0x3F55D330,,{ printf \"F_6BA66 err_0E_other\n\" ; g }")
dbg:command("bpset 0x3F55D510,,{ printf \"G_6BAA2 merge\n\" ; g }")
dbg:command("bpset 0x3F55D560,,{ printf \"H_6BAAC store_5a8\n\" ; g }")
dbg:command("bpset 0x3F55D5C0,,{ printf \"I_6BAB8 outcell_test a7=%08X\n\", d@(a13+0xff20) ; g }")
dbg:command("bpset 0x3F55D620,,{ printf \"J_6BAC4 err_0A\n\" ; g }")
print("XIE-MIN4 armed 10 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min4")
+16
View File
@@ -0,0 +1,16 @@
-- resolve the 0x6BAAC..0x6BAB8 contradiction (8 breakpoints)
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F55D560,,{ printf \"H_STORE dst=%08X src=%08X\n\", d@(a13+0xff80), a7 ; g }")
dbg:command("bpset 0x3F55D590,,{ printf \"K_6BAB2 arg6=%08X\n\", d@(a13+0xff20) ; g }")
dbg:command("bpset 0x3F55D5B0,,{ printf \"L_6BAB6 a7=%08X\n\", a7 ; g }")
dbg:command("bpset 0x3F55D5C0,,{ printf \"M_6BAB8 a11=%08X outcell=%08X\n\", a11, d@(a11) ; g }")
dbg:command("bpset 0x3F55D5E0,,{ printf \"N_6BABC_jrlt_taken\n\" ; g }")
dbg:command("bpset 0x3F55D750,,{ printf \"O_6BAEA_okpath\n\" ; g }")
dbg:command("bpset 0x3F55DF10,,{ printf \"P_6BBE2_success\n\" ; g }")
print("XIE-MIN5 armed 8 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min5")
+14
View File
@@ -0,0 +1,14 @@
-- slot 20 body: the four MOVK 0x8 sites (6 breakpoints)
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F55E690,,{ printf \"S1_6ABD2_movk8\n\" ; g }")
dbg:command("bpset 0x3F55E2E0,,{ printf \"S2_6AC5C_movk8\n\" ; g }")
dbg:command("bpset 0x3F55E4B0,,{ printf \"S3_6AC96_movk8\n\" ; g }")
dbg:command("bpset 0x3F55E6A0,,{ printf \"S4_6ACD4_movk8\n\" ; g }")
dbg:command("bpset 0x3F555EE0,,{ printf \"ERR_EXIT_6AFDC\n\" ; g }")
print("XIE-MIN6 armed 6 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min6")
+14
View File
@@ -0,0 +1,14 @@
-- baseline + DD dispatcher probe (6 breakpoints)
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F400040,,{ printf \"D_ENTRY_0x40008 a0=%08X a1=%08X\n\", d@(a13+0xffe0), d@(a13+0xffc0) ; g }")
dbg:command("bpset 0x3F400430,,{ printf \"D_CALL_worker\n\" ; g }")
dbg:command("bpset 0x3F55DF10,,{ printf \"LK_SUCCESS_6BBE2\n\" ; g }")
dbg:command("bpset 0x3F555EE0,,{ printf \"S20_ERR_EXIT_6AFDC\n\" ; g }")
dbg:command("bpset 0x3F200000,,{ printf \"\" ; g }")
print("XIE-MIN7 armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min7")
+12
View File
@@ -0,0 +1,12 @@
-- DD dispatcher probe only (4 breakpoints, no junk)
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F55DF10,,{ printf \"B_LK_SUCCESS_6BBE2\n\" ; g }")
dbg:command("bpset 0x3F400040,,{ printf \"C_DD_ENTRY\n\" ; g }")
dbg:command("bpset 0x3F400430,,{ printf \"D_DD_WORKER\n\" ; g }")
print("XIE-MIN8 armed 4 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min8")
+16
View File
@@ -0,0 +1,16 @@
-- generated: bit = 0x3F200000 + file*8
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 0x3F53D820,,{ printf \"IDSTORE\\n\" ; g }")
dbg:command("bpset 0x3F555C10,,{ printf \"JREQ_6AB82\\n\" ; g }")
dbg:command("bpset 0x3F555E90,,{ printf \"E8_1_6ABD2\\n\" ; g }")
dbg:command("bpset 0x3F5561A0,,{ printf \"TGT_6AC34\\n\" ; g }")
dbg:command("bpset 0x3F5562E0,,{ printf \"E8_2_6AC5C\\n\" ; g }")
dbg:command("bpset 0x3F5564B0,,{ printf \"E8_3_6AC96\\n\" ; g }")
dbg:command("bpset 0x3F5566A0,,{ printf \"E8_4_6ACD4\\n\" ; g }")
dbg:command("bpset 0x3F557EE0,,{ printf \"EXIT_6AFDC\\n\" ; g }")
print("XIE-MIN9 armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "min9")
+16
View File
@@ -0,0 +1,16 @@
-- out-cell test instrumentation + stack positive control
local frames = 0
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
local sp = cpu.state["SP"].value
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D510,,{ printf \"T_MERGE\n\" ; g }")
dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X a13f80=%08X a13ffa0=%08X\n\", a11, d@(a11), d@(a13+0xff80), d@(a13+0xffa0) ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }")
dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", sp - 0x100))
print("XIE-OUTCEL armed 5 breakpoints + stack control at " .. string.format("%08X", sp-0x100))
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "outcell")
+19
View File
@@ -0,0 +1,19 @@
-- watch writes to the out-cell (caller frame local 0) + stack control
local frames = 0
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X\n\", a11, d@(a11) ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }")
dbg:command("wpset 00415720,8,w,1,{ printf \"OUTWRITE pc=%08X val=%08X\n\", pc, wpdata ; g }")
print("XIE-OUTW armed: 4 breakpoints + out-cell write watch at 00415720")
emu.register_frame_done(function()
frames = frames + 1
local sp = cpu.state["SP"].value
if frames == 600 then
dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", sp - 0x100))
print(string.format("stack control installed at %08X (sp=%08X)", sp - 0x100, sp))
end
if frames >= 2000000 then machine:exit() end
end, "outw")
+12
View File
@@ -0,0 +1,12 @@
local cpu = manager.machine.devices[":maincpu"]
local n = 0
local last = 0
print("XIE-PC sampler armed")
emu.register_periodic(function()
n = n + 1
local pc = cpu.state["PC"].value
if n % 40 == 0 and pc ~= last then
last = pc
print(string.format("PCSAMPLE %08X", pc & 0xFFFFFFFF))
end
end)
+14
View File
@@ -0,0 +1,14 @@
local cpu = manager.machine.devices[":maincpu"]
local dbg = manager.machine.debugger
local n = 0
local last = 0
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
print("XIE-PCFIX armed (poke + sampler)")
emu.register_periodic(function()
n = n + 1
local pc = cpu.state["PC"].value
if n % 40 == 0 and pc ~= last then
last = pc
print(string.format("PCSAMPLE %08X", pc & 0xFFFFFFFF))
end
end)
+12
View File
@@ -0,0 +1,12 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3F3B0210,,{ printf \"REJECT_0x36042 (dstdataptr/img_buff/scalution)\n\" ; g }")
dbg:command("bpset 3F3B17B0,,{ printf \"REJECT_0x362F6\n\" ; g }")
dbg:command("bpset 3F3B1990,,{ printf \"REJECT_0x36332\n\" ; g }")
dbg:command("bpset 3F3B8A60,,{ printf \"DDX_RET a8=%08X\n\", a8 ; g }")
print("XIE-PG armed 5")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "pg")
+22
View File
@@ -0,0 +1,22 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3F3B05D0,,{ printf \"r60BA a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B06F0,,{ printf \"r60DE a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B11F0,,{ printf \"r623E a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B12B0,,{ printf \"r6256 a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B1370,,{ printf \"r626E a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B1430,,{ printf \"r6286 a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B21E0,,{ printf \"r643C a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B2300,,{ printf \"r6460 a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B2560,,{ printf \"r64AC a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B2700,,{ printf \"r64E0 a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B5BD0,,{ printf \"r6B7A a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B6610,,{ printf \"r6CC2 a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B6670,,{ printf \"r6CCE a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F3B67A0,,{ printf \"r6CF4 a8=%08X\\n\", a8 ; g }")
print("XIE-PG2 armed 15")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "pg2")
+12
View File
@@ -0,0 +1,12 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2DC420,,{ printf \"J884 rp=%08X b9=%02X (JREQ if 0)\n\", d@(0xa6000), b@(d@(0xa6000)+0x48) ; g }")
dbg:command("bpset 3F2DC440,,{ printf \"CONT_1B888 (flag non-zero)\n\" ; g }")
dbg:command("bpset 3F2DD180,,{ printf \"ERRCHAIN_1BA30 (flag was zero)\n\" ; g }")
dbg:command("bpset 3F2DDE00,,{ printf \"DRIVER_RET a8=%08X\n\", a8 ; g }")
print("XIE_R48 armed 5")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "r48")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2D8A90,,{ printf \"RD_ENTRY\n\" ; g }")
dbg:command("bpset 3F2D8BC0,,{ printf \"RD_ENAB flag=%08X\n\", d@(0xa6220) ; g }")
dbg:command("bpset 3F2D8C50,,{ printf \"RD_ALLOC rp=%08X\n\", a8 ; g }")
dbg:command("bpset 3F2D8D20,,{ printf \"RD_BADALLOC\n\" ; g }")
dbg:command("bpset 3F2D91C0,,{ printf \"RD_SRCBASE a5=%08X e28=%08X\n\", a5, d@(a5+0x28) ; g }")
dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }")
print("XIE-RD armed 7")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "rd")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 05600200,10,r,1,{ printf \"R200 pc=%08X val=%04X\n\", pc, wpdata ; g }")
print("XIE-R200 armed")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F5565F0,,{ printf \"REGS pc=%08X a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X a5=%08X a6=%08X a7=%08X a8=%08X a9=%08X a10=%08X a11=%08X a13=%08X a14=%08X sp=%08X\\n\", pc, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a13, a14, sp ; g }")
dbg:command("bpset 3F5565F0,,{ printf \"L20=%08X LCO=%08X\\n\", d@(a13+0x20), d@(a13+0xc0) ; g }")
dbg:command("bpset 3F556610,,{ printf \"REGS pc=%08X a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X a5=%08X a6=%08X a7=%08X a8=%08X a9=%08X a10=%08X a11=%08X a13=%08X a14=%08X sp=%08X\\n\", pc, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a13, a14, sp ; g }")
dbg:command("bpset 3F5566A0,,{ printf \"ACD4_BAD\\n\" ; g }")
dbg:command("bpset 3F5569A0,,{ printf \"OKPATH\\n\" ; g }")
print("XIE-REGS armed 6")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "regs")
+178
View File
@@ -0,0 +1,178 @@
-- xie_resource.lua -- trace XIE requests and dump the created resource.
--
-- Breakpoint 1: inside XieProc after A9 = client->requestBuffer.
-- Breakpoint 2: 0x6CAC8, just after the create helper has A9 = new resource.
--
-- Run with -debuglog (printf output is discarded otherwise):
-- VT1200_SKIP_LEVEL1=1 XIE_FRAMES=2000000 \
-- /home/arti/code/k-space/mame0289/vt1200 vt1200 ... -debug -debugger none \
-- -debuglog -autoboot_script harness/mame/xie_resource.lua
local function hex(v, w) return string.format("%0" .. (w or 8) .. "X", v) end
local machine = manager.machine
local cpu = machine.devices[':maincpu']
local dbg = machine.debugger
if not dbg then print("XIE ERROR: no debugger"); machine:exit(); return end
local FRAMES = tonumber(os.getenv("XIE_FRAMES") or "2000000")
local WPFILE = "/tmp/opencode/xie_wp.txt"
local lastwp = ""
local last_elem = 0
local WORDS = tonumber(os.getenv("XIE_WORDS") or "16")
local TRACE = 0x3F525D40 -- XieProc interior, a9 = request buffer
local CREATE = 0x3F565640 -- 0x6CAC8: a9 = new resource pointer
local args = {}
for i = 0, WORDS - 1 do args[#args + 1] = string.format("w@(a9+%d)", i * 16) end
local fmt = "XIEHIT buf=%08X"
for i = 0, WORDS - 1 do fmt = fmt .. " %04X" end
fmt = fmt .. "\\n"
dbg:command("bpset " .. hex(TRACE) .. ",,{ printf \"" .. fmt .. "\", a9, " ..
table.concat(args, ", ") .. " ; g }")
dbg:command("bpset " .. hex(CREATE) ..
",,{ printf \"RES a9=%08X id=%08X class=%02X b8=%02X b36=%02X b40=%08X b44=%08X\\n\", " ..
"a9, d@(a9), b@(a9+32), b@(a9+64), b@(a9+288), d@(a9+320), d@(a9+352) ; g }")
local LOOK = 0x3F55D1C0 -- 0x6BA38: a7 = resource
local bytes = {}
for k = 0, 15 do bytes[#bytes+1] = string.format("b@(a7+%d)", k*32) end
local bfmt = string.rep(" %02X", 16)
dbg:command("bpset " .. hex(LOOK) ..
",,{ printf \"LOOK a7=%08X id=%08X cls=%02X b36=%02X b40=%08X" .. bfmt .. "\\n\", " ..
"a7, d@(a7), b@(a7+32), b@(a7+288), d@(a7+320), " .. table.concat(bytes, ", ") .. " ; g }")
-- Debug-only nudge: when a class-2 resource reaches the lookup, make it class 3
-- so PUT_TILE's hard-coded class check passes. Proves the rest of the pixel path.
-- Debug-only: skip the class-compare failure branch (0x6BAF6 -> 0x6BBCE).
local BAND = 0x3F555C40 -- 0x6AB88: a11 = band record, a9 = slot20 request
dbg:command("bpset " .. hex(BAND) ..
",,{ printf \"BAND a11=%08X f1=%02X f2=%02X f4=%08X f8=%08X f12=%08X f16=%08X\\n\", " ..
"a11, b@(a11+8), b@(a11+16), d@(a11+32), d@(a11+64), d@(a11+96), d@(a11+128) ; g }")
dbg:command("bpset 0x3F400430,,{ printf \"DDCALL a11=%08X type=%02X idx=%08X\\n\", a11, b@(a13+0xffa0), d@(a13+0x20) ; g }")
dbg:command("bpset 0x3F400040,,{ printf \"DE entry a0=%08X a1=%08X type=%02X idx=%08X\\n\", d@(a13+0xffe0), d@(a13+0xffc0), b@(a13+0xffa0), d@(a13+0x20) ; g }")
dbg:command("bpset 0x3F4000F0,,{ printf \"DE chk1 ret=%08X\\n\", a8 ; g }")
dbg:command("bpset 0x3F400210,,{ printf \"DE chk2 ret=%08X\\n\", a8 ; g }")
dbg:command("bpset 0x3F55B440,,{ printf \"HANDOFF a9=%08X\\n\", a9 ; g }")
dbg:command("bpset 0x3F55B750,,{ printf \"DEARG a9=%08X a11=%08X\\n\", a9, a11 ; g }")
dbg:command("bpset 0x3F553B70,,{ printf \"S19ENTRY\\n\" ; g }")
dbg:command("bpset 0x3F55B440,,{ printf \"H688 a9=%08X\\n\", a9 ; g }")
dbg:command("bpset 0x3F400040,,{ printf \"DEENTRY\\n\" ; g }")
dbg:command("bpset 0x3F553DA0,,{ printf \"S19LOOK a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 0x3F554D10,,{ printf \"S19HANDOFF\\n\" ; g }")
dbg:command("bpset 0x3F52DE80,,{ printf \"S43OBJ a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 0x3F52E230,,{ printf \"S43ID a5=%08X req8=%08X\\n\", a5, d@(a9+0x40) ; g }")
dbg:command("bpset 0x3F566070,,{ printf \"RESPTR a7=%08X a9=%08X\\n\", a7, a9 ; g }")
dbg:command("bpset 0x3F2D8A90,,{ printf \"EXPORTENTRY\\n\" ; g }")
dbg:command("bpset 0x3F2D8BC0,,{ printf \"EXPORTFLAG f=%02X\\n\", b@(0xA6220) ; g }")
dbg:command("bpset 0x3F2DC0D0,,{ printf \"EXPORTSKIPPED\\n\" ; g }")
dbg:command("bpset 0x3F2DF610,,{ printf \"ELTYPE i=%d t=%02X\n\", d@(a13+0x180), b@(a9+0x58) ; g }")
dbg:command("bpset 0x3F2DF530,,{ printf \"BADFUNC i=%d\n\", d@(a13+0x180) ; g }")
dbg:command("bpset 0x3F2DF400,,{ printf \"PIPE_T1\n\" ; g }")
dbg:command("bpset 0x3F2DEA80,,{ printf \"PIPE_T2\n\" ; g }")
dbg:command("bpset 0x3F2DE990,,{ printf \"PIPE_T3\n\" ; g }")
dbg:command("bpset 0x3F2DE3A0,,{ printf \"PIPE_T4\n\" ; g }")
dbg:command("bpset 0x3F2DF850,,{ printf \"PIPE_LOOPEND i=%d\n\", d@(a13+0x180) ; g }")
dbg:command("bpset 0x3F2D91A0,,{ printf \"EX_BAND a5=%08X elem@d8=%08X\n\", a5, d@(a5+0xd8) ; g }")
dbg:command("bpset 0x3F2D91C0,,{ printf \"EX_ELEM a5=%08X f28=%08X\n\", a5, d@(a5+0x28) ; g }")
dbg:command("bpset 0x3F2DD410,,{ printf \"EX_TIMING\n\" ; g }")
dbg:command("bpset 0x3F55D950,,{ printf \"PUTCHK n=%d obj=%08X b8=%02X b12=%02X\n\", d@(a13+0xff20), a11, b@(a11+0x40), b@(a11+0x60) ; g }")
dbg:command("bpset 0x3F55DA50,,{ printf \"PUT_BADMATCH_byte12 n=%d\n\", d@(a13+0xff20) ; g }")
dbg:command("bpset 0x3F55DF10,,{ printf \"PUT_OK_byte8 n=%d\n\", d@(a13+0xff20) ; g }")
dbg:command("bpset 0x3F2D91A0,,{ printf \"BANDFIELDS 48=%08X 80=%08X a0=%08X 160=%08X d8=%08X\n\", d@(a5+0x48), d@(a5+0x80), d@(a5+0xa0), d@(a5+0x160), d@(a5+0xd8) ; g }")
dbg:command("bpset 0x3F2D94B0,,{ printf \"RP 5a8=%08X 5d0=%08X 5f0=%08X 610=%08X 6f8=%08X 718=%08X 738=%08X 758=%08X\n\", d@(a11+0x5a8), d@(a11+0x5d0), d@(a11+0x5f0), d@(a11+0x610), d@(a11+0x6f8), d@(a11+0x718), d@(a11+0x738), d@(a11+0x758) ; g }")
dbg:command("bpset 0x3F54BFF0,,{ printf \"TRAMP minor=%02X target=%08X req=%08X\n\", b@(a10+0x8), d@(a11), a10 ; g }")
dbg:command("bpset 0x3F54C000,,{ printf \"TRAMPCALL target=%08X\n\", a11 ; g }")
dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 0x3F53D9A0,,{ printf \"REGISTER id=%08X\n\", d@(a9+0x40) ; g }")
-- empirical argument/return map of the slot-19 lookup helper (file 0x66FA0)
dbg:command("bpset 0x3F537DA0,,{ printf \"LKARGS a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X\n\", d@(a13+0xffe0), d@(a13+0xffc0), d@(a13+0xffa0), d@(a13+0xff80), d@(a13+0xff60) ; g }")
dbg:command("bpset 0x3F537E70,,{ printf \"LKCALLED a8=%08X\n\", a8 ; g }")
dbg:command("bpset 0x3F537E90,,{ printf \"LKDISPATCH a8=%08X\n\", a8 ; g }")
dbg:command("bpset 0x3F55D630,,{ printf \"ERR_0A_badaccess\n\" ; g }")
dbg:command("bpset 0x3F55DA60,,{ printf \"ERR_08_badmatch\n\" ; g }")
dbg:command("bpset 0x3F55CD70,,{ printf \"ERR_0E_lookup0\n\" ; g }")
dbg:command("bpset 0x3F55D2C0,,{ printf \"ERR_0E_byte40_nonzero\n\" ; g }")
dbg:command("bpset 0x3F55D400,,{ printf \"ERR_0E_other\n\" ; g }")
dbg:command("bpset 0x3F55D530,,{ printf \"ERR_0E_other2\n\" ; g }")
dbg:command("bpset 0x3F2FD2F0,,{ printf \"EB -10=%08X -0c=%08X -8=%08X -4=%08X sp=%08X +4=%08X +8=%08X +c=%08X\n\", d@(sp-0x10), d@(sp-0xc), d@(sp-8), d@(sp-4), d@(sp), d@(sp+4), d@(sp+8), d@(sp+0xc) ; g }")
dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X obj=%08X objb0=%02X\n\", a7, a11, d@(a13+0xffa0), b@(d@(a13+0xffa0)) ; g }")
dbg:command("bpset 0x3F55D460,,{ printf \"OBJDISP a11=%08X b0=%02X b4=%02X b8=%02X b12=%02X b16=%02X\n\", a11, b@(a11), b@(a11+0x20), b@(a11+0x40), b@(a11+0x60), b@(a11+0x80) ; g }")
dbg:command("bpset 0x3F55D7B0,,{ printf \"GATEPASS\n\" ; g }")
dbg:command("bpset 0x3F55DA50,,{ printf \"E8_select12\n\" ; g }")
dbg:command("bpset 0x3F55DC30,,{ printf \"E8_maskcheck\n\" ; g }")
dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE2 a7=%08X a11=%08X\n\", a7, a11 ; g }")
dbg:command("bpset 0x3F55D7C0,,{ printf \"E8_MAIN_0BAF8\n\" ; g }")
dbg:command("bpset 0x3F55CE20,,{ printf \"CLASS1_PATH\n\" ; g }")
dbg:command("bpset 0x3F55D440,,{ printf \"SELECTOR_DISPATCH\n\" ; g }")
local frames = 0
emu.register_frame_done(function()
frames = frames + 1
if frames % 1000 == 0 then
print(string.format("XIE: frame %d pc=%s", frames, hex(cpu.state['PC'].value)))
end
local f = io.open(WPFILE, "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local r = tonumber(txt)
if r then
local sp = cpu.spaces['program']
local band = sp:read_u32(r + 36*8)
local p44 = sp:read_u32(r + 44*8)
local b30 = sp:read_u32(band + 48*8)
local elem = 0
if p44 ~= 0 then elem = sp:read_u32(p44 + 0xd8) end
if elem ~= 0 and elem ~= last_elem then
last_elem = elem
dbg:command(string.format("wpset %08X,32,w,1,{ printf \"WPELEM addr=%08X data=%08X\\n\", wpaddr, wpdata ; g }", elem + 0x28))
print(string.format("XIE: elem=%08X wpset elem+0x28", elem))
end
print(string.format("XIE: watch res=%08X band=%08X p44=%08X b30=%08X", r, band, p44, b30))
local function wp(a, label)
if a and a ~= 0 then
dbg:command(string.format("wpset %08X,64,w,1,{ printf \"WPHIT %s addr=%%08X data=%%08X\\n\", wpaddr, wpdata ; g }", a, label))
end
end
wp(r, "res"); wp(band, "band"); wp(p44, "p44"); wp(b30, "b30")
end
end
end
if frames >= FRAMES then machine:exit() end
end, "vt1200-xie-resource")
dbg.visible_cpu = cpu
dbg.execution_state = 'run'
+12
View File
@@ -0,0 +1,12 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F3CFAC0,,{ printf \"RP20 rp=%08X byte4=%02X -> forcing 1\n\", d@(0xa6000), b@(d@(0xa6000)+0x20) ; w@(d@(0xa6000)+0x20)=1 ; g }")
dbg:command("bpset 3F3CFAF0,,{ printf \"RP20_STILL_ZERO\n\" ; g }")
dbg:command("bpset 3F3CFB20,,{ printf \"RP20_OK_CONTINUE\n\" ; g }")
dbg:command("bpset 3F2DC290,,{ printf \"AFTER_FINALIZE a8=%08X\n\", a8 ; g }")
print("XIE-RP20 armed 5")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "rp20")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F553D70,,{ printf \"S19CALL\\n\" ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F55CB30,,{ printf \"CALLEE_ENTRY\\n\" ; g }")
dbg:command("bpset 3F55D0F0,,{ printf \"CALLEE_C2\\n\" ; g }")
dbg:command("bpset 3F55D460,,{ printf \"CALLEE_DISP cls=%%02X\\n\", b@(a11+0x20) ; g }")
dbg:command("bpset 3F55CCE0,,{ printf \"CALLEE_NULL_0E\\n\" ; g }")
print("XIE-S19 armed 7")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s19")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55DE70,,{ printf \"SEL_DISP fmt=%%02X\\n\", b@(a13+0xff40) ; g }")
dbg:command("bpset 3F55DA50,,{ printf \"MASK_A_8\\n\" ; g }")
dbg:command("bpset 3F55DC30,,{ printf \"MASK_B_8\\n\" ; g }")
dbg:command("bpset 3F55D620,,{ printf \"ERR_0A\\n\" ; g }")
dbg:command("bpset 3F55DF10,,{ printf \"OK_PATH\\n\" ; g }")
print("XIE-S19B armed 6")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s19b")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F553DF0,,{ printf \"S19_7BE\\n\" ; g }")
dbg:command("bpset 3F554280,,{ printf \"S19_850\\n\" ; g }")
dbg:command("bpset 3F554D10,,{ printf \"S19_9A2_handoff_call\\n\" ; g }")
dbg:command("bpset 3F555210,,{ printf \"S19_A42\\n\" ; g }")
dbg:command("bpset 3F555250,,{ printf \"S19_ERR_EXIT\\n\" ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }")
print("XIE-S19P armed 7")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s19p")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F554250,,{ printf \"S19_C0 c0=%%08X c0s=%%d\\n\", d@(a13+0xc0), d@(a13+0xc0) ; g }")
dbg:command("bpset 3F554290,,{ printf \"S19_852 a7=%%08X a5=%%08X\\n\", a7, a5 ; g }")
dbg:command("bpset 3F5543E0,,{ printf \"S19_87C_mainpath\\n\" ; g }")
dbg:command("bpset 3F554D10,,{ printf \"S19_9A2_HANDOFF\\n\" ; g }")
dbg:command("bpset 3F555250,,{ printf \"S19_EXIT a8=%%08X\\n\", a8 ; g }")
print("XIE-S19Q armed 6")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s19q")
+17
View File
@@ -0,0 +1,17 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\\n\", a7, a11 ; g }")
dbg:command("bpset 3F554460,,{ printf \"S88C word5=%08X\\n\", d@(a9+0xc0) ; g }")
dbg:command("bpset 3F5544B0,,{ printf \"S896\\n\" ; g }")
dbg:command("bpset 3F5544D0,,{ printf \"S89A bit0test\\n\" ; g }")
dbg:command("bpset 3F554520,,{ printf \"S8A4_importloop\\n\" ; g }")
dbg:command("bpset 3F554D10,,{ printf \"S9A2_HANDOFF_CALL\\n\" ; g }")
dbg:command("bpset 3F555140,,{ printf \"SAA28_skip_exit\\n\" ; g }")
dbg:command("bpset 3F555080,,{ printf \"SAA10_other\\n\" ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }")
print("XIE-S19R armed 10")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s19r")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F5544B0,,{ printf \"S896 plane_mask=%08X\n\", d@(a9+0xc0) ; g }")
dbg:command("bpset 3F554500,,{ printf \"S8A0 bit0test\n\" ; g }")
dbg:command("bpset 3F554520,,{ printf \"S8A4_import_loop\n\" ; g }")
dbg:command("bpset 3F554C70,,{ printf \"S98E_ELEM28_STORE val=%08X\n\", d@(a13+0x120) ; g }")
dbg:command("bpset 3F554D10,,{ printf \"S9A2_handoff_call\n\" ; g }")
dbg:command("bpset 3F555140,,{ printf \"SAA28_skip_exit\n\" ; g }")
dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY\n\" ; g }")
print("XIE-S19X armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s19x")
+13
View File
@@ -0,0 +1,13 @@
-- log slot-43 double comparison operands (generated addresses)
local frames = 0
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
local cmp1 = 0x3F200000 + 0x658B8*8
local cmp2 = 0x3F200000 + 0x656B0*8
dbg:command(string.format("bpset %08X,,{ printf \"CMP900 a0=%%08X a1=%%08X\n\", d@(a13+0x0), d@(a13+0x20) ; g }", cmp1))
dbg:command(string.format("bpset %08X,,{ printf \"CMP740 a0=%%08X a1=%%08X\n\", d@(a13+0x0), d@(a13+0x20) ; g }", cmp2))
print("XIE-S43 armed 2 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s43")
+12
View File
@@ -0,0 +1,12 @@
-- slot 43: log the lookup return and the two id words
local frames = 0
local dbg = manager.machine.debugger
local after = 0x3F200000 + 0x65646*8
local idstore = 0x3F200000 + 0x67B04*8
dbg:command(string.format("bpset %08X,,{ printf \"S43AFTERLOOKUP a8=%%08X w0=%%08X w1=%%08X\n\", a8, d@(a9+0x20), d@(a9+0x40) ; g }", after))
dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\n\", d@(a9+0x40), a11 ; g }", idstore))
print("XIE-S43B armed 2 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s43b")
+20
View File
@@ -0,0 +1,20 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command(string.format("bpset 3F52B230,,{ printf \"LOOKUP_OK\\n\" ; g }"))
dbg:command(string.format("bpset 3F52B530,,{ printf \"P_A\\n\" ; g }"))
dbg:command(string.format("bpset 3F52B700,,{ printf \"P_B\\n\" ; g }"))
dbg:command(string.format("bpset 3F52BB50,,{ printf \"P_C\\n\" ; g }"))
dbg:command(string.format("bpset 3F52BDC0,,{ printf \"P_D\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C1C0,,{ printf \"P_E\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C280,,{ printf \"P_F\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C3D0,,{ printf \"P_G\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C4A0,,{ printf \"P_H\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C600,,{ printf \"BAD_1\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C650,,{ printf \"OK_1\\n\" ; g }"))
dbg:command(string.format("bpset 3F52CC60,,{ printf \"BAD_2\\n\" ; g }"))
dbg:command(string.format("bpset 3F52CC50,,{ printf \"P_I\\n\" ; g }"))
print("XIE-S43C armed 13")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s43c")
+16
View File
@@ -0,0 +1,16 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command(string.format("bpset 3F52B230,,{ printf \"S43_LOOKUP\\n\" ; g }"))
dbg:command(string.format("bpset 3F52D1D0,,{ printf \"S43_TAIL_A\\n\" ; g }"))
dbg:command(string.format("bpset 3F52DBC0,,{ printf \"S43_TAIL_B\\n\" ; g }"))
dbg:command(string.format("bpset 3F52DE80,,{ printf \"S43_SET3\\n\" ; g }"))
dbg:command(string.format("bpset 3F52DE90,,{ printf \"S43_STORE3\\n\" ; g }"))
dbg:command(string.format("bpset 3F52DFC0,,{ printf \"S43_RENDER\\n\" ; g }"))
dbg:command(string.format("bpset 3F52E4F0,,{ printf \"S43_EXIT0\\n\" ; g }"))
dbg:command(string.format("bpset 3F52C600,,{ printf \"S43_BAD1\\n\" ; g }"))
dbg:command(string.format("bpset 3F52CC60,,{ printf \"S43_BAD2\\n\" ; g }"))
print("XIE-S43D armed 9")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s43d")
+16
View File
@@ -0,0 +1,16 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F52DFF0,,{ printf \"T_RENDER_RET a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F52E010,,{ printf \"T_JREQ\\n\" ; g }")
dbg:command("bpset 3F52E030,,{ printf \"T_FREE\\n\" ; g }")
dbg:command("bpset 3F52E230,,{ printf \"T_MERGE\\n\" ; g }")
dbg:command("bpset 3F52E3D0,,{ printf \"T_PREC88\\n\" ; g }")
dbg:command("bpset 3F52E470,,{ printf \"T_RET88 a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F52E490,,{ printf \"T_PREC98\\n\" ; g }")
dbg:command("bpset 3F52E4F0,,{ printf \"T_EXIT0\\n\" ; g }")
dbg:command("bpset 3F52B230,,{ printf \"T_LOOKUP_OK\\n\" ; g }")
print("XIE-S43E armed 9")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s43e")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F52DFD0,,{ printf \"S44_RENDER_CALL\\n\" ; g }")
dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\\n\" ; g }")
dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\\n\" ; g }")
dbg:command("bpset 3F2D9C50,,{ printf \"TYPE3\\n\" ; g }")
dbg:command("bpset 3F2DA0D0,,{ printf \"TYPE4\\n\" ; g }")
dbg:command("bpset 3F2DBB10,,{ printf \"TYPE5\\n\" ; g }")
print("XIE-S44 armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s44")
+14
View File
@@ -0,0 +1,14 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F52FAA0,,{ printf \"S44_RENDER\\n\" ; g }")
dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\\n\" ; g }")
dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\\n\" ; g }")
dbg:command("bpset 3F2DA350,,{ printf \"TYPE3\\n\" ; g }")
dbg:command("bpset 3F2DA7A0,,{ printf \"TYPE4\\n\" ; g }")
dbg:command("bpset 3F2DAC10,,{ printf \"TYPE5\\n\" ; g }")
print("XIE-S44B armed 7")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s44b")
+11
View File
@@ -0,0 +1,11 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F52EDB0,,{ printf \"S44_CREATE_RET a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F52EF30,,{ printf \"S44_ERRPATH\\n\" ; g }")
dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\\n\" ; g }")
print("XIE-S44C armed 4")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "s44c")
+11
View File
@@ -0,0 +1,11 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3FB172A0,,{ printf \"POLL status=%04X\n\", d@(0x5600010) ; g }")
dbg:command("bpset 3FB173D0,,{ printf \"SCALUTION_TIMEOUT\n\" ; g }")
dbg:command("bpset 3FB17470,,{ printf \"SCALUTION_READY -> continue\n\" ; g }")
print("XIE-SCL armed 4")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "scl")
+11
View File
@@ -0,0 +1,11 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3FB172D0,,{ printf \"CPU_READ a9=%04X (bit1=%d)\n\", a9, (a9>>1)&1 ; g }")
dbg:command("bpset 3FB173D0,,{ printf \"TIMEOUT\n\" ; g }")
dbg:command("bpset 3FB17470,,{ printf \"READY\n\" ; g }")
print("XIE-SCL2 armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "scl2")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\\n\", a7, a11 ; g }")
dbg:command("bpset 3F55DE70,,{ printf \"SELD selector=%08X\\n\", d@(a13+0xff40) ; g }")
dbg:command("bpset 3F55D980,,{ printf \"SELA_CMP a7=%08X a11=%08X\\n\", a7, a11 ; g }")
dbg:command("bpset 3F55DA50,,{ printf \"SELA_BAD8\\n\" ; g }")
dbg:command("bpset 3F55DC10,,{ printf \"SELB_CMP a7=%08X a11=%08X\\n\", a7, a11 ; g }")
dbg:command("bpset 3F55DC30,,{ printf \"SELB_BAD8\\n\" ; g }")
dbg:command("bpset 3F55DF10,,{ printf \"OK_6BBE2\\n\" ; g }")
print("XIE-SEL armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "sel")
+10
View File
@@ -0,0 +1,10 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F2D91C0,,{ printf \"SRCBASE_ST a5=%08X elem28=%08X rp=%08X\n\", a5, d@(a5+0x28), a11 ; g }")
dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }")
print("XIE-SRC armed 3")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "src")
+9
View File
@@ -0,0 +1,9 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3FB2A950,,{ printf \"ST b1=%08X mem=%04X\n\", b1, d@(b1) ; g }")
print("XIE-ST armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "st")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 004FE780,200,w,1,{ printf \"STG %08X %04X\n\", wpaddr, wpdata ; g }")
print("XIE-STG armed (0x4FE780..0x4FE97F)")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 004FE780,400,w,1,{ printf \"SW %08X %04X %08X\n\", wpaddr, wpdata, pc ; g }")
print("XIE-STG2 armed")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 004FE780,1000,w,1,{ printf \"SW %08X %04X %08X\n\", wpaddr, wpdata, pc ; g }")
print("XIE-STG3 armed (0x4FE780..0x4FE97F, 512 bytes)")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 004FE780,200,r,1,{ printf \"SR %08X pc=%08X\n\", wpaddr, pc ; g }")
print("XIE-STGR armed (reads of the staging buffer)")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 004FE780,800,rw,1,{ printf \"S%c %08X %04X %08X\n\", (wpaddr>0 and 0 or 0), wpaddr, wpdata, pc ; g }")
print("XIE-STGRW armed")
+11
View File
@@ -0,0 +1,11 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55D560,,{ printf \"STORE a7=%08X src120=%08X a11=%08X dst120=%08X argA0=%08X arg80=%08X\n\", a7, d@(a7+0x120), a11, d@(a11+0x120), d@(a13+0xffa0), d@(a13+0xff80) ; g }")
dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X\n\", a11, d@(a11) ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }")
print("XIE-STORE armed 4 breakpoints")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "store")
+80
View File
@@ -0,0 +1,80 @@
-- xie_trace.lua -- capture XIE 2.3 request buffers as they reach the server.
--
-- The breakpoint sits INSIDE XieProc, immediately after it loads
-- A9 = client->requestBuffer (0x64BA2) and before it reads stuff->opcode,
-- i.e. at Ghidra 0x64BA8 = bit 0x3F525D40. At that point A9 is the request
-- buffer pointer, so the whole request can be read with w@ (16-bit words, which
-- is the CPU's native access width on this bit-addressed space).
--
-- M=/home/arti/code/k-space/mame0289/vt1200
-- XIE_FRAMES=1500 $M vt1200 -rompath harness/mame/roms -video none -sound none \
-- -nothrottle -debug -debugger none \
-- -autoboot_script harness/mame/xie_trace.lua -autoboot_delay 0
--
-- Env:
-- XIE_FRAMES frame budget (default 1500)
-- XIE_WORDS request words dumped per hit (default 8 = 16 bytes)
-- XIE_JIT if set, jump to this bit address at XIE_AT (debugger entry)
-- XIE_AT frame at which XIE_JIT is taken (default 400)
local function hex(v, w) return string.format("%0" .. (w or 8) .. "X", v) end
local machine = manager.machine
local cpu = machine.devices[':maincpu']
local dbg = machine.debugger
if not dbg then
print("XIE ERROR: debugger not enabled; pass -debug")
machine:exit()
return
end
local FRAMES = tonumber(os.getenv("XIE_FRAMES") or "1500")
local WORDS = tonumber(os.getenv("XIE_WORDS") or "8")
local JIT = os.getenv("XIE_JIT")
local AT = tonumber(os.getenv("XIE_AT") or "400")
local IDLE = 0x3FDCE400 -- level-0 diagnostics menu idle loop
-- XieProc interior: A9 = request buffer. XIE_TRACE overrides it, which is only
-- useful as a control: point it at a hot PC (e.g. the menu idle 3FDCE400) and
-- confirm the breakpoint+printf machinery actually fires.
local TRACE = tonumber(os.getenv("XIE_TRACE") or "0x3F525D40")
-- XieProc entry (count only)
local ENTRY = 0x3F525CC0
local action
if WORDS == 0 then
-- control mode: prove the breakpoint fires at all
action = '{ printf "XIEHIT pc=%08X\\n", pc ; g }'
else
local args = {}
for i = 0, WORDS - 1 do
args[#args + 1] = string.format("w@(a9+%d)", i * 16)
end
local fmt = "XIEHIT buf=%08X"
for i = 0, WORDS - 1 do fmt = fmt .. " %04X" end
fmt = fmt .. "\\n"
action = string.format('{ printf "%s", a9, %s ; g }', fmt, table.concat(args, ", "))
end
dbg:command("bpset " .. hex(TRACE) .. ",," .. action)
print("XIE: breakpoint at " .. hex(TRACE) .. " -> " .. action)
if JIT then
dbg:command("bpset " .. hex(IDLE) .. ",,{ pc = " .. JIT .. " ; g }")
print("XIE: entry jump armed at " .. hex(IDLE) .. " -> " .. JIT)
end
local frames = 0
emu.register_frame_done(function()
frames = frames + 1
if frames % 100 == 0 then
print(string.format("XIE: frame %d pc=%s", frames, hex(cpu.state['PC'].value)))
end
if frames >= FRAMES then
print("XIE: done at frame " .. frames)
machine:exit()
end
end, "vt1200-xie-trace")
dbg.visible_cpu = cpu
dbg.execution_state = 'run'
+17
View File
@@ -0,0 +1,17 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"CTRL_REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F553DA0,,{ printf \"CTRL_S19RET a8=%08X\\n\", a8 ; g }")
dbg:command("bpset 3F55CB30,,{ printf \"T_ENTRY\\n\" ; g }")
dbg:command("bpset 3F55D460,,{ printf \"T_DISP\\n\" ; g }")
dbg:command("bpset 3F55D0F0,,{ printf \"T_C2 arg1=%%08X\\n\", d@(a13+0xffc0) ; g }")
dbg:command("bpset 3F55D110,,{ printf \"T_J1\\n\" ; g }")
dbg:command("bpset 3F55D120,,{ printf \"T_B24_copyout\\n\" ; g }")
dbg:command("bpset 3F55D190,,{ printf \"T_B32_zerochk\\n\" ; g }")
dbg:command("bpset 3F55D510,,{ printf \"T_MERGE\\n\" ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%%08X a11=%%08X\\n\", a7, a11 ; g }")
print("XIE-VAL armed 10")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "val")
+5
View File
@@ -0,0 +1,5 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 04000000,40000,w,1,{ printf \"VRW %08X %04X\n\", wpaddr, wpdata ; g }")
print("XIE-VW armed (VRAM writes 0x04000000..0x0403FFFF)")
emu.register_frame_done(function() end, "vw")
+4
View File
@@ -0,0 +1,4 @@
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("wpset 04000000,100000,w,1,{ printf \"VW %08X %04X pc=%08X\n\", wpaddr, wpdata, pc ; g }")
print("XIE-VWR armed")
+9
View File
@@ -0,0 +1,9 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ printf \"W256 a5=%08X val=%02X rp=%08X\n\", a5, b@(a5+0x20), d@(0xa6000) ; g }")
dbg:command("bpset 3F3AF870,,{ printf \"RD198 rp=%08X b198=%02X\n\", d@(a6000), b@(d@(a6000)+0x630) ; g }")
print("XIE-W198 armed 2")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "w198")
+24
View File
@@ -0,0 +1,24 @@
-- watch a caller-supplied bit address for writes (generated addresses)
local frames = 0
local lastwp, lastaddr = "", 0
local dbg = manager.machine.debugger
local idstore = 0x3F200000 + 0x67B04*8
dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore))
print("XIE-WATCH6 armed")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp3.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local a = tonumber(txt)
if a and a ~= 0 and a ~= lastaddr then
lastaddr = a
print(string.format("XIE-WATCH6 installing at %08X", a))
dbg:command(string.format("wpset %08X,32,w,1,{ printf \"WSRC pc=%%08X addr=%%08X val=%%08X\\n\", pc, wpaddr, wpdata ; g }", a))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "watch6")
+26
View File
@@ -0,0 +1,26 @@
-- capture rp at export, then watch rp+0x610 (generated addresses)
local frames = 0
local lastwp, lastaddr = "", 0
local dbg = manager.machine.debugger
local idstore = 0x3F200000 + 0x67B04*8
local rppt = 0x3F200000 + 0x1B296*8
dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore))
dbg:command(string.format("bpset %08X,,{ printf \"RPPTR a11=%%08X 610=%%08X\\n\", a11, d@(a11+0x610) ; g }", rppt))
print("XIE-WATCH7 armed")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp3.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local a = tonumber(txt)
if a and a ~= 0 and a ~= lastaddr then
lastaddr = a
print(string.format("XIE-WATCH7 installing at %08X", a))
dbg:command(string.format("wpset %08X,32,w,1,{ printf \"WSRC pc=%%08X addr=%%08X val=%%08X\\n\", pc, wpaddr, wpdata ; g }", a))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "watch7")
+13
View File
@@ -0,0 +1,13 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY obj=%08X obj_b8=%02X bandarg=%08X\n\", d@(a13+0xffe0), b@(d@(a13+0xffe0)+0x40), d@(a13+0xffa0) ; g }")
dbg:command("bpset 3F55B420,,{ printf \"H_64E_path\n\" ; g }")
dbg:command("bpset 3F55BBF0,,{ printf \"H_75E_path\n\" ; g }")
dbg:command("bpset 3F55C260,,{ printf \"H_84C_default_return\n\" ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
print("XIE-WHO armed 5")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "who")
+15
View File
@@ -0,0 +1,15 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }")
dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY obj=%08X obj_b8=%02X bandarg=%08X\n\", d@(a13+0xffe0), b@(d@(a13+0xffe0)+0x40), d@(a13+0xffa0) ; g }")
dbg:command("bpset 3F55C1D0,,{ printf \"H_DISP obj=%08X b8=%02X\n\", a11, a8 ; g }")
dbg:command("bpset 3F55B270,,{ printf \"H_64E_byte8_1_path\n\" ; g }")
dbg:command("bpset 3F55BAF0,,{ printf \"H_75E_byte8_3_path\n\" ; g }")
dbg:command("bpset 3F55BF40,,{ printf \"H_7E8_byte8_4_path\n\" ; g }")
dbg:command("bpset 3F55C260,,{ printf \"H_84C_default\n\" ; g }")
dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }")
print("XIE-WHO2 armed 8")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "who2")
+27
View File
@@ -0,0 +1,27 @@
-- watch every writer of the created resource's byte8 (generated addresses)
local frames = 0
local lastwp, lastptr = "", 0
local dbg = manager.machine.debugger
local cpu = manager.machine.devices[":maincpu"]
local idstore = 0x3F200000 + 0x67B04*8
dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore))
print("XIE-WPB8 armed 1 breakpoint")
emu.register_frame_done(function()
frames = frames + 1
local f = io.open("/tmp/opencode/xie_wp2.txt", "r")
if f then
local txt = f:read("*l"); f:close()
if txt and txt ~= lastwp then
lastwp = txt
local p = tonumber(txt)
if p and p ~= 0 and p ~= lastptr then
lastptr = p
local sp = cpu.spaces['program']
local b8 = sp:read_u8(p + 8*8)
print(string.format("XIE-WPB8 installing at %08X (byte8 now %d)", p + 8*8, b8))
dbg:command(string.format("wpset %08X,8,w,1,{ printf \"WPB8 pc=%%08X addr=%%08X val=%%08X\\n\", pc, wpaddr, wpdata ; g }", p + 8*8))
end
end
end
if frames >= 2000000 then machine:exit() end
end, "wpb8")
+10
View File
@@ -0,0 +1,10 @@
local frames = 0
local dbg = manager.machine.debugger
dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }")
dbg:command("bpset 3FB29FD0,,{ printf \"XFER a0(src)=%08X a7=%08X a5=%08X a6=%08X b3=%08X b4=%08X b5=%08X b6=%08X\n\", a0, a7, a5, a6, b3, b4, b5, b6 ; g }")
dbg:command("bpset 3FB2A0B0,,{ printf \"COPY a0=%08X a5=%08X\n\", a0, a5 ; g }")
print("XIE-XFER armed")
emu.register_frame_done(function()
frames = frames + 1
if frames >= 2000000 then machine:exit() end
end, "xfer")
Loaded 100 of 1035 files, more files were not shown because too many files have changed in this diff. Show more