74 lines
3.4 KiB
Bash
Executable file
74 lines
3.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# make-agi-iigs-disk.sh - Build the 2MB ProDOS data volume that holds the
|
|
# IIgs AGI interpreter plus one AGI v2 game's resources. run-iigs.sh mounts
|
|
# it as the CFFA2 card's second partition (-hard2); GS/OS boots from the
|
|
# first partition and auto-mounts this one.
|
|
#
|
|
# A single 800KB 3.5" floppy can't hold the ~240KB AGI binary plus KQ3's
|
|
# ~644KB of required resources (878KB total), and MAME's IIgs 3.5 drive is
|
|
# 800K-GCR-only (it rejects a 1.44MB image). A CFFA2 hard-disk partition
|
|
# has no such cap, so the whole payload lands on one 2MB ProDOS volume.
|
|
#
|
|
# Usage: scripts/make-agi-iigs-disk.sh <output.2mg> [game-name]
|
|
# game-name : subdirectory under examples/agi/gamedata/ (default kq3)
|
|
# Requires: toolchains/env.sh sourced (LLVM816_ROOT), built build/iigs/bin/AGI.
|
|
set -euo pipefail
|
|
|
|
repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
: "${LLVM816_ROOT:?make-agi-iigs-disk.sh: source toolchains/env.sh first}"
|
|
CADIUS="${CADIUS:-$LLVM816_ROOT/tools/cadius/cadius}"
|
|
BINDIR="${BINDIR:-$repo/build/iigs/bin}"
|
|
|
|
out=${1:?usage: make-agi-iigs-disk.sh <output.2mg> [game]}
|
|
game=${2:-kq3}
|
|
gamedata=$repo/examples/agi/gamedata/$game
|
|
agiBin=$BINDIR/AGI
|
|
VOL=AGI
|
|
|
|
# The AGI volume name and the game files use uppercase ProDOS names. AGI
|
|
# fopen()s LOGDIR / VOL.x etc. from its launch directory; GS/OS sets the
|
|
# prefix to the volume it launched from, and ProDOS lookups are
|
|
# case-insensitive, so the uppercase names match the lowercase fopen paths.
|
|
[ -x "$CADIUS" ] || { echo "make-agi-iigs-disk.sh: cadius not found at $CADIUS" >&2; exit 2; }
|
|
[ -f "$agiBin" ] || { echo "make-agi-iigs-disk.sh: $agiBin not built (make -f make/iigs.mk $agiBin)" >&2; exit 1; }
|
|
[ -d "$gamedata" ] || { echo "make-agi-iigs-disk.sh: $gamedata is not an AGI v2 game directory" >&2; exit 1; }
|
|
[ -f "$gamedata/LOGDIR" ] || { echo "make-agi-iigs-disk.sh: $gamedata has no LOGDIR -- not AGI v2" >&2; exit 1; }
|
|
|
|
work=$(mktemp -d -t agi-iigs-disk.XXXXXX)
|
|
trap 'rm -rf "$work"' EXIT
|
|
|
|
rm -f "$out"
|
|
"$CADIUS" CREATEVOLUME "$out" "$VOL" 2048KB >/dev/null
|
|
|
|
# AGI interpreter as a ProDOS type $B3 (S16 / GS-OS application). It stays
|
|
# at the volume root so Finder lists and launches it.
|
|
cp "$agiBin" "$work/AGI#B30000"
|
|
"$CADIUS" ADDFILE "$out" "/$VOL" "$work/AGI#B30000" >/dev/null
|
|
|
|
# Game resources live under DATA/ -- JoeyLib forces every data-file open
|
|
# through that prefix (jlDataOpen), so they must sit in /VOL/DATA. GS/OS
|
|
# sets prefix 0 to the launch volume, so AGI's "DATA/LOGDIR" resolves here.
|
|
"$CADIUS" CREATEFOLDER "$out" "/$VOL/DATA" >/dev/null
|
|
|
|
# Game resources as plain ProDOS BIN ($06). Only the subset AGI v2 reads
|
|
# (the four DIR indexes, the VOL.x archives, OBJECT, WORDS.TOK) is copied;
|
|
# Sierra's original binary / OVL drivers are left behind.
|
|
added=0
|
|
for f in LOGDIR PICDIR VIEWDIR SNDDIR OBJECT WORDS.TOK; do
|
|
if [ -f "$gamedata/$f" ]; then
|
|
cp "$gamedata/$f" "$work/${f}#060000"
|
|
"$CADIUS" ADDFILE "$out" "/$VOL/DATA" "$work/${f}#060000" >/dev/null
|
|
added=$((added + 1))
|
|
fi
|
|
done
|
|
for f in "$gamedata"/VOL.*; do
|
|
[ -f "$f" ] || continue
|
|
b=$(basename "$f")
|
|
cp "$f" "$work/${b}#060000"
|
|
"$CADIUS" ADDFILE "$out" "/$VOL/DATA" "$work/${b}#060000" >/dev/null
|
|
added=$((added + 1))
|
|
done
|
|
|
|
free=$("$CADIUS" CATALOG "$out" 2>/dev/null | grep -oE 'Free : [0-9]+' | grep -oE '[0-9]+' | head -1)
|
|
echo "agi-iigs-disk: $out (volume /$VOL, game $game)"
|
|
echo " AGI + $added resource files, $free blocks free"
|