modemwars/swiftlink/probeFire.py
2026-08-23 02:09:40 -05:00

44 lines
1.5 KiB
Python

#!/usr/bin/env python3
# probeFire.py - find the key VICE's numpad joystick uses for the fire button, by watching the
# zero-page copies the raster IRQ makes of joystick port 2: zp_5D = direction, zp_5F/zp_61 = fire.
import os
import re
import sys
import time
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from viceHarness import ViceSession, aciaArgs, SCRATCH
def dump(session, addr, count):
out = session.mon(f"m {addr:04x} {addr+count-1:04x}")
m = re.search(r"C:%04x\s+((?:[0-9a-f]{2}[ ]*)+)" % addr, out)
return m.group(1).split() if m else []
def main():
disk = os.path.abspath(sys.argv[1])
session = ViceSession(disk, f"{SCRATCH}/probefire.vice.log", aciaArgs(), label="fire")
try:
session.connect()
session.bootPastLoader()
session.findWindow()
session.focus()
time.sleep(8)
for key in ("KP_0", "KP_5", "KP_Insert", "Return", "space", "KP_Enter", "Control_R"):
import subprocess
subprocess.run(["xdotool", "keydown", key], env=session.env, check=False)
time.sleep(0.5)
session.enterMonitor()
zp = dump(session, 0x005D, 6)
row = dump(session, 0x91D5, 1)
session.sock.sendall(b"x\n")
session.recv(3)
subprocess.run(["xdotool", "keyup", key], env=session.env, check=False)
print(f"KEY {key}: zp5D..62 = {zp} row={row}", flush=True)
time.sleep(0.5)
finally:
session.close()
main()