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

69 lines
2.2 KiB
Python

#!/usr/bin/env python3
# probeModemPrompt.py - get to the "PRESS A OR O AND SET MODEM." prompt with the SwiftLink module
# resident, then find out why a typed key does or does not reach the game.
#
# The game records the last typed character in lastTypedKey ($9248) from the raster IRQ, and
# waitForAnswerOriginateKey ($0CBD) spins until it holds $C1 ('A') or $CF ('O'). The keyboard scan
# goes through the comm module's hook at $E012, so this also dumps that vector.
import os
import subprocess
import sys
import time
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from viceHarness import ViceSession, aciaArgs, readByte, SCRATCH
SHOTS = os.path.join(os.path.dirname(os.path.abspath(__file__)), "shots")
def main():
disk = os.path.abspath(sys.argv[1])
session = ViceSession(disk, f"{SCRATCH}/prompt.vice.log", aciaArgs(), label="prompt")
try:
session.connect()
session.bootPastLoader()
session.findWindow()
session.focus()
time.sleep(8)
session.mon("help")
# highlight COMPETE WITH MODEM OPPONENT and choose it
for _ in range(3):
session.enterMonitor()
row = readByte(session, 0x91D5)
session.sock.sendall(b"x\n")
session.recv(3)
if row == 0:
break
session.hold("KP_8", 250)
time.sleep(0.8)
print(f"row = {row}", flush=True)
session.hold("KP_0", 300)
time.sleep(25)
session.enterMonitor()
session.mon("m e000 e017")
session.mon("m 9248 9248")
session.mon("m 90e9 90ea")
session.mon("m 0b7d 0b7e")
session.mon("r")
session.sock.sendall(b"x\n")
session.recv(3)
for key in ("x", "a", "o", "A"):
session.hold(key, 500)
time.sleep(1)
session.enterMonitor()
print(f"--- after key {key!r}", flush=True)
session.mon("m 9248 9248")
session.mon("m 90e9 90ea")
session.mon("m e03b e041")
session.mon("m de00 de03")
session.sock.sendall(b"x\n")
session.recv(3)
session.shot(f"{SHOTS}/promptAfterKeys.png")
finally:
session.close()
main()