#!/usr/bin/env bash # Run a 65816 binary inside MAME's apple2gs simulation. # # Usage: # runInMame.sh # Read one 16-bit value at addr, compare to expected. # runInMame.sh --check = [= ...] # Read multiple 16-bit values, all must match. # # Addresses can be 24-bit (e.g., "0x025000" for bank 2 offset $5000). # Expected values are 4-hex (no 0x prefix). # # Code loads at $00:1000 in bank 0 RAM. Code can switch DBR to bank # 2+ for safe data writes (bank 0 zero page is scribbled by IIgs ROM # during execution). # # Exit 0 if all reads match, 1 otherwise. set -euo pipefail source "$(dirname "$0")/common.sh" BIN="$1" shift SECS=3 # Build address list as Lua table entries. LUA_CHECKS="" EXPECT_LIST=() ADDR_LIST=() if [ "$1" = "--check" ]; then shift for pair in "$@"; do ADDR="${pair%=*}" EXP="${pair#*=}" ADDR_LIST+=("$ADDR") EXPECT_LIST+=("$EXP") LUA_CHECKS="$LUA_CHECKS print(string.format('MAME-READ addr=0x%06x val=0x%04x', $ADDR, mem:read_u16($ADDR)))"$'\n' done else ADDR="$1" EXP="$2" ADDR_LIST+=("$ADDR") EXPECT_LIST+=("$EXP") LUA_CHECKS="print(string.format('MAME-READ addr=0x%06x val=0x%04x', $ADDR, mem:read_u16($ADDR)))" fi [ -f "$BIN" ] || die "binary not found: $BIN" LUA_PATH=$(mktemp --suffix=.lua) trap 'rm -f "$LUA_PATH"' EXIT cat > "$LUA_PATH" <&1 | grep "^MAME-") echo "$OUT" # Parse all val=... and compare to expected list. mapfile -t GOT_LIST < <(printf '%s\n' "$OUT" | grep -oE 'val=0x[0-9a-f]+' | sed 's/val=0x//') ok=1 for i in "${!EXPECT_LIST[@]}"; do if [ "${GOT_LIST[$i]:-}" != "${EXPECT_LIST[$i]}" ]; then warn "MAME mismatch at ${ADDR_LIST[$i]}: got 0x${GOT_LIST[$i]:-MISSING} expected 0x${EXPECT_LIST[$i]}" ok=0 fi done if [ $ok -eq 1 ]; then log "MAME OK: ${#EXPECT_LIST[@]} reads matched" exit 0 fi exit 1