44 lines
1.5 KiB
Python
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()
|