mirror of
https://github.com/RasppleII/a2cloud.git
synced 2024-12-30 03:29:34 +00:00
55c53b9c10
As noted, Ivan has agreed to allow these scripts to be relicensed under CC0. We have one file under LGPL (a unit file we lifted wholesake from systemd) and the ADTPro wrapper which I'm pretty sure Ivan wrote, but if he didn't we need to fix its license to be the same as ADTPro. Either way, to the best of my knowledge, this resolves the question of how things are licensed explicitly. (Closes #21)
731 lines
24 KiB
Bash
Executable File
731 lines
24 KiB
Bash
Executable File
#! /bin/bash
|
|
# vim: set tabstop=4 shiftwidth=4 noexpandtab filetype=sh:
|
|
|
|
# gsport-setup - a2cloud script to download/configure assets for GSPort
|
|
#
|
|
# To the extent possible under law, T. Joseph Carter and Ivan Drucker have
|
|
# waived all copyright and related or neighboring rights to the a2cloud
|
|
# scripts themselves. Software used or installed by these scripts is subject
|
|
# to other licenses. This work is published from the United States.
|
|
|
|
# to do: replace Spectrum Deluxe (2.5.3) with Spectrum Gold (2.5.4)
|
|
|
|
# from system_ident
|
|
if [[ -z $ras2_os || -z $ras2_arch ]]; then
|
|
ras2_os="unknown"
|
|
if hash lsb_release 2>/dev/null; then
|
|
if [[ -f /usr/bin/raspi-config ]]; then
|
|
ras2_os="rpi-$(lsb_release -cs)"
|
|
else
|
|
case "$(lsb_release -is)" in
|
|
Debian)
|
|
ras2_os="debian-$(lsb_release -cs)"
|
|
;;
|
|
*)
|
|
printf "\nUnknown OS with lsb_release\n"
|
|
lsb_release -a
|
|
;;
|
|
esac
|
|
fi
|
|
else
|
|
uname_s="$(uname -s)"
|
|
case "$uname_s" in
|
|
Darwin)
|
|
ras2_os="$uname_s"
|
|
;;
|
|
*)
|
|
printf "\nUnknown OS with uname -s\n$uname_s\n"
|
|
;;
|
|
esac
|
|
fi
|
|
ras2_arch="$(uname -m)"
|
|
export ras2_os ras2_arch
|
|
fi
|
|
|
|
|
|
readcharHex () {
|
|
# read one character from file & convert to corresponding hex value
|
|
# arg1: filename
|
|
# arg2: (optional) offset (# of bytes to skip before reading)
|
|
# out: two-digit hex value from 00-FF
|
|
# exit: 8=extraneous arg, 11=missing arg1,
|
|
# 21=invalid arg1, 22=invalid arg2
|
|
[[ $1 ]] || return 11
|
|
[[ $3 ]] && return 8
|
|
[[ -f $1 ]] || return 21
|
|
[[ $2 ]] && { [[ ( $(printf %d "$2" 2> /dev/null) == $2 ) \
|
|
&& ( $2 -ge 0 ) ]] || return 22; }
|
|
# args are valid
|
|
charX="$(dd if="$1" bs=1 skip=$(($2)) \
|
|
count=1 2> /dev/null; echo -n X)"
|
|
[[ ${#charX} -gt 1 ]] || { echo -n "00"; return 0; }
|
|
printf %02X $(echo -n "${charX:0:1}" | od -t u1 | \
|
|
head -1 | sed 's/[0\ ]*//' | tr -d ' \n') | tr [A-Z] [a-z]
|
|
}
|
|
|
|
readchars () {
|
|
# read one or more characters from a file
|
|
# arg1: filename
|
|
# arg2: (optional) offset (# of bytes to skip before reading)
|
|
# arg3: (optional) # of chars to read (default is until end of file)
|
|
# out: sequence of characters
|
|
# exit: 8=extraneous arg, 11=missing arg1,
|
|
# 21=invalid arg1, 22=invalid arg2, 23=invalid arg3
|
|
[[ $1 ]] || return 11
|
|
[[ $4 ]] && return 8
|
|
[[ -f $1 ]] || return 21
|
|
[[ $2 ]] && { [[ ( $(printf %d "$2" 2> /dev/null) == $2 ) \
|
|
&& ( $2 -ge 0 ) ]] || return 22; }
|
|
[[ $3 ]] && { [[ ( $(printf %d "$3" 2> /dev/null) == $3 ) \
|
|
&& ( $3 -ge 0 ) ]] || return 23; }
|
|
# args are valid
|
|
dd if="$1" bs=1 skip=$(($2)) $([[ $3 ]] && echo -n "count=$3") \
|
|
2> /dev/null
|
|
}
|
|
|
|
writecharsHex () {
|
|
# write corresponding characters of hex values into file
|
|
# arg1: filename
|
|
# arg2: offset (# of bytes to skip before writing)
|
|
# arg3: string of two-digit hexadecimal numbers from 00-FF, period delimited (not checked!)
|
|
# out: nothing
|
|
# exit: 8=extraneous arg, 11=missing arg1, 12=missing arg2,
|
|
# 13=missing arg3, 22=invalid arg2, 23=invalid arg3
|
|
[[ $1 ]] || return 11; [[ $2 ]] || return 12; [[ $3 ]] || return 13
|
|
[[ $4 ]] && return 8
|
|
[[ ( $(printf %d "$2" 2> /dev/null) == $2 ) \
|
|
&& ( $2 -ge 0 ) ]] || return 22
|
|
p=0
|
|
offset=$2
|
|
len=${#3}
|
|
while (( p < len )); do
|
|
outByte=${3:$p:2}
|
|
[[ $(printf %02X "0x$outByte" 2> /dev/null) == \
|
|
$(echo -n "$outByte" | tr [a-z] [A-Z]) ]] || return 23
|
|
# args are valid
|
|
echo -n -e "\x$outByte" | \
|
|
dd of="$1" bs=1 seek=$offset conv=notrunc 2> /dev/null
|
|
(( p += 3 ))
|
|
(( offset++ ))
|
|
done
|
|
}
|
|
|
|
|
|
### start
|
|
|
|
a2cScriptURL="https://raw.githubusercontent.com/RasppleII/a2cloud/master"
|
|
a2cBinaryURL="http://blocksfree.com/downloads"
|
|
|
|
[[ $A2CLOUD_NO_EXTERNAL ]] && useExternalURL=
|
|
|
|
debianVersion=$(cat /etc/debian_version 2> /dev/null)
|
|
isRpi=
|
|
isDebian=
|
|
arch=
|
|
if [[ -f /usr/bin/raspi-config ]]; then
|
|
isRpi=1
|
|
arch='rpi'
|
|
me="Pi"
|
|
fullme="Raspberry Pi"
|
|
elif lsb_release -a 2> /dev/null | grep -q 'Distributor ID:.Debian' && [[ $(cut -d . -f 1 <<< $debianVersion) -ge "7" ]]; then
|
|
isDebian=1
|
|
uname_m="$(uname -m)"
|
|
if [[ $uname_m == "i686" ]]; then
|
|
arch='debian_x86'
|
|
elif [[ $uname_m == "x86_64" ]]; then
|
|
arch='debian_x64'
|
|
fi
|
|
me="computer"
|
|
fullme="computer"
|
|
fi
|
|
|
|
debianName=
|
|
if [[ $debianVersion ]]; then
|
|
debianMajor=$(cut -d . -f 1 <<< $debianVersion)
|
|
if [[ $debianMajor == "8" ]]; then
|
|
debianName="jessie"
|
|
elif [[ $debianMajor == "7" ]]; then
|
|
debianName="wheezy"
|
|
else
|
|
debianName="unknown"
|
|
fi
|
|
fi
|
|
|
|
isSystemd=
|
|
isSysVInit=
|
|
# If you really want something else, *you* maintain it!
|
|
if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
|
|
isSystemd=1
|
|
elif [[ -f /etc/inittab ]]; then
|
|
isSysVInit=1
|
|
fi
|
|
|
|
emulatorName="GSport"
|
|
emulatorStart="gsport"
|
|
emulatorSetup="gsport-setup"
|
|
romFileName="ROM"
|
|
configFileName="config.txt"
|
|
|
|
imagesDir="/usr/local/share/gsdisks"
|
|
gsosHD="gsoshd.hdv"
|
|
gsosHDvolName="GSOS.HD"
|
|
tempDir="/tmp/gs"
|
|
|
|
rom=ROM3
|
|
slot6=
|
|
autoAnswerYes=
|
|
noDisks=
|
|
gisk=
|
|
installDisks=
|
|
kegs=
|
|
|
|
acmdOK=
|
|
if hash acmd 2> /dev/null; then
|
|
acmdOK=1
|
|
fi
|
|
|
|
while { [[ $1 ]] || (( (0 + $gisk + $noDisks + $installDisks + 0) > 1 )); }; do
|
|
arg=$(tr -d '-' <<< ${1,,})
|
|
if [[ $arg == "6" ]]; then
|
|
slot6=1
|
|
shift
|
|
elif [[ $arg == "rom1" ]]; then
|
|
rom=ROM1
|
|
shift
|
|
elif [[ $arg == "rom3" ]]; then
|
|
rom=ROM3
|
|
shift
|
|
elif [[ $arg == "n" ]]; then
|
|
noDisks=1
|
|
shift
|
|
elif [[ $arg == "g" ]]; then
|
|
gisk=1
|
|
shift
|
|
elif [[ $arg == "i" ]]; then
|
|
installDisks=1
|
|
shift
|
|
elif [[ $arg == "y" ]]; then
|
|
autoAnswerYes=1
|
|
shift
|
|
else
|
|
echo "Usage: $emulatorSetup [rom1|rom3] [-6] [-y [-g|-i|-n]]"
|
|
echo "rom1: use GS ROM 01"
|
|
echo "rom3: use GS ROM 3"
|
|
echo "-6: put blank disks in slot 6"
|
|
echo "-y: auto-answer yes (no prompting)"
|
|
echo "-i: use GS/OS and Spectrum installer disk images (use with -y)"
|
|
echo "-g: use GSport Internet Starter Kit disk image (use with -y)"
|
|
echo "-n: don't provide any disk images (use with -y)"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo
|
|
if [[ ! -f /usr/local/lib/$romFileName ]]; then
|
|
echo "$emulatorName needs to be set up. This may take several minutes."
|
|
if [[ ! $autoAnswerYes ]]; then
|
|
echo -n "Do you want to set up $emulatorName now? ";
|
|
read
|
|
if [[ ${REPLY:0:1} != "Y" && ${REPLY:0:1} != "y" ]]; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
echo "Ok, let's go!"
|
|
echo
|
|
fi
|
|
|
|
if [[ ! $autoAnswerYes ]]; then
|
|
noDisks=
|
|
gisk=
|
|
while true; do
|
|
option1=0
|
|
option2=0
|
|
echo
|
|
echo "Do you want to:"
|
|
echo
|
|
if [[ $acmdOK ]]; then
|
|
[[ $kegs ]] && andSpectrum= || andSpectrum="and Spectrum "
|
|
echo "1) install GS/OS ${andSpectrum}from the installer disk images"
|
|
option1=1
|
|
fi
|
|
if [[ ! $kegs ]]; then
|
|
echo "2) use the premade GSport Internet Starter Kit hard drive image"
|
|
option2=2
|
|
fi
|
|
echo "3) prepare $emulatorName for use but don't provide any disk images"
|
|
echo "4) do nothing and quit"
|
|
echo
|
|
echo -n "Your choice: "
|
|
read
|
|
noDisks=
|
|
if [[ ${REPLY} == "4" ]]; then
|
|
[[ $0 == "-bash" ]] && return 1 || exit 1
|
|
elif [[ ${REPLY} == "3" ]]; then
|
|
noDisks=1; break
|
|
elif [[ ${REPLY} == $option2 ]]; then
|
|
gisk=1; break
|
|
elif [[ ${REPLY} == $option1 ]]; then
|
|
gisk=; break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
sudo mkdir -p "$imagesDir"
|
|
sudo chmod ugo+rw "$imagesDir"
|
|
mkdir -p "$tempDir"
|
|
cd "$tempDir"
|
|
|
|
echo "Updating package lists..."
|
|
sudo apt-get -y update > /dev/null
|
|
|
|
# http://wakaba.c3.cx/s/apps/unarchiver.html
|
|
if ! hash unar 2> /dev/null; then
|
|
|
|
### ArchiveTools: Install unar package
|
|
echo "A2CLOUD: Installing The Unarchiver..."
|
|
|
|
# jessie and later: Just use the unar package
|
|
if [[ $debianMajor -ge 8 ]]; then
|
|
sudo apt-get -y install unar
|
|
sudo apt-get clean
|
|
fi
|
|
|
|
# If all else fails, compile from source.
|
|
|
|
if ! hash unar 2> /dev/null; then
|
|
# Dependencies: build-deps for unar
|
|
sudo apt-get -y install build-essential libgnustep-base-dev libz-dev libbz2-dev libssl-dev libicu-dev unzip
|
|
sudo apt-get clean
|
|
|
|
rm -rf $tempDir/unar &> /dev/null
|
|
mkdir $tempDir/unar
|
|
cd $tempDir/unar
|
|
if [[ $useExternalURL ]]; then
|
|
wget -O unar-1.8.1.zip https://github.com/incbee/Unarchiver/archive/unar-1.8.1.zip
|
|
unzip -o unar-1.8.1.zip &> /dev/null
|
|
fi
|
|
if [ ! -d *Unarchiver*/XADMaster ]; then # need single bracket for glob
|
|
wget -O unar-1.8.1.zip "${a2cBinaryURL}/source/unar-1.8.1.zip"
|
|
unzip -o unar-1.8.1.zip &> /dev/null
|
|
fi
|
|
cd *Unarchiver*/XADMaster
|
|
make -f Makefile.linux
|
|
sudo mv lsar unar /usr/local/bin
|
|
cd ../Extra
|
|
sudo mkdir -p /usr/local/man/man1
|
|
sudo mv lsar.1 unar.1 /usr/local/man/man1
|
|
cd
|
|
rm -rf $tempDir/unar
|
|
fi
|
|
sudo mandb &> /dev/null
|
|
fi
|
|
else
|
|
echo "A2CLOUD: The Unarchiver has already been installed."
|
|
fi
|
|
cd $tempDir
|
|
|
|
echo "A2CLOUD: Setting up mkpo command..."
|
|
sudo wget -qO /usr/local/bin/mkpo ${a2cScriptURL}/setup/mkpo.txt
|
|
sudo chmod ugo+x /usr/local/bin/mkpo
|
|
|
|
if ! hash nulib2 2> /dev/null; then
|
|
|
|
echo "A2CLOUD: Installing nulib2..."
|
|
|
|
cd $tempDir
|
|
if [[ $downloadBinaries ]]; then
|
|
### ArchiveTools: Install nulib2 binaries
|
|
wget -q "${a2cBinaryURL}/picopkg/nulib2-${ras2_os}_${ras2_arch}.tgz"
|
|
if [[ -f "nulib2-${ras2_os}_${ras2_arch}.tgz" ]]; then
|
|
sudo tar Pzxf "nulib2-${ras2_os}_${ras2_arch}.tgz"
|
|
fi
|
|
fi
|
|
|
|
if ! hash nulib2 2> /dev/null; then
|
|
### ArchiveTools: Install nulib2 from source
|
|
sudo apt-get -y install build-essential
|
|
sudo apt-get -y install zlib1g-dev
|
|
sudo apt-get -y clean
|
|
|
|
# install nulib2
|
|
rm -rf nulib &> /dev/null
|
|
mkdir -p nulib
|
|
cd nulib
|
|
wget -qO nulib.tgz http://web.archive.org/web/20131031160750/http://www.nulib.com/downloads/nulibdist.tar.gz
|
|
tar zxf nulib.tgz
|
|
cd nufxlib*
|
|
./configure
|
|
make
|
|
sudo make install
|
|
cd ../nulib2*
|
|
./configure
|
|
make
|
|
sudo make install
|
|
cd $tempDir
|
|
rm -rf nulib
|
|
fi
|
|
else
|
|
echo "A2CLOUD: nulib2 is already installed."
|
|
fi
|
|
cd $tempDir
|
|
|
|
if ! hash sciibin 2> /dev/null; then
|
|
### ArchiveTools: Install undoit (sciibin, etc.)
|
|
echo "A2CLOUD: Installing sciibin, unblu, unbit, unexec, usq..."
|
|
|
|
sudo apt-get -y install build-essential
|
|
sudo apt-get -y clean
|
|
rm -rf undoit &> /dev/null
|
|
mkdir -p undoit
|
|
cd undoit
|
|
wget -q http://web.archive.org/web/20110619163030/http://fadden.com/dl-apple2/undoit.zip
|
|
unzip undoit.zip
|
|
make
|
|
sudo mv sciibin unbit unblu unexec usq /usr/local/bin
|
|
cd $tempDir
|
|
rm -rf undoit
|
|
else
|
|
echo "A2CLOUD: sciibin, unblu, unbit, unexec, usq are already installed."
|
|
fi
|
|
cd $tempDir
|
|
|
|
if [[ ! -f $imagesDir/ROM1 ]]; then
|
|
echo "Getting GS ROM 01..."
|
|
wget -qO ROM1.zip http://web.archive.org/web/20130216031247/http://www.whatisthe2gs.apple2.org.za/files/rom1.zip
|
|
unzip ROM1.zip &> /dev/null
|
|
mv APPLE2GS.ROM $imagesDir/ROM1
|
|
chmod ugo-w $imagesDir/ROM1
|
|
fi
|
|
|
|
if [[ ! -f $imagesDir/ROM3 ]]; then
|
|
echo "Getting GS ROM 3..."
|
|
wget -qO ROM3.zip http://web.archive.org/web/20130216031247/http://www.whatisthe2gs.apple2.org.za/files/rom3.zip
|
|
unzip ROM3.zip &> /dev/null
|
|
mv APPLE2GS.ROM2 $imagesDir/ROM3
|
|
chmod ugo-w $imagesDir/ROM3
|
|
fi
|
|
|
|
if [[ ! -f /usr/local/lib/$romFileName || $arg ]]; then
|
|
echo "Setting $emulatorName to use $rom..."
|
|
echo " (to change, use '$emulatorSetup rom1' or '$emulatorSetup rom3')"
|
|
sudo rm /usr/local/lib/$romFileName &> /dev/null
|
|
sudo ln -s $imagesDir/$rom /usr/local/lib/$romFileName &> /dev/null
|
|
sudo ln -s $romFileName /usr/local/lib/ROM &> /dev/null
|
|
fi
|
|
|
|
if [[ $slot6 ]]; then
|
|
echo "Putting blank disks in slot 6..."
|
|
sudo sed -i 's@^s6d1.*$@s6d1 = $imagesDir/slot6drive1.po@' /usr/local/lib/$configFileName
|
|
sudo sed -i 's@^s6d2.*$@s6d2 = $imagesDir/slot6drive2.po@' /usr/local/lib/$configFileName
|
|
if [[ ! -f $imagesDir/slot6drive1.po || ! -f $imagesDir/slot6drive2.po ]]; then
|
|
wget -qO- "${a2BinaryURL}/gsport/slot6.tgz" | sudo tar Pzx 2> /dev/null
|
|
fi
|
|
fi
|
|
|
|
# set AppleTalk to turbo (works more reliably than Normal)
|
|
echo "Setting AppleTalk to turbo..."
|
|
if ! grep -q 'g_appletalk_turbo' /usr/local/lib/$configFileName; then
|
|
if grep -q 'bram1\[00\]' /usr/local/lib/$configFileName; then
|
|
sudo sed -i 's/^\(bram1\[00\]\)/g_appletalk_turbo = 1\n\n\1/' /usr/local/lib/$configFileName
|
|
else
|
|
echo -e '\ng_appletalk_turbo = 1' | sudo tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
fi
|
|
sudo sed -i 's/g_appletalk_turbo = 0/g_appletalk_turbo = 1/' /usr/local/lib/$configFileName
|
|
|
|
# enable Uthernet
|
|
echo "Enabling Uthernet card emulation..."
|
|
if ! grep -q 'g_ethernet[^_]' /usr/local/lib/$configFileName; then
|
|
if grep -q 'bram1\[00\]' /usr/local/lib/$configFileName; then
|
|
sudo sed -i 's/^\(bram1\[00\]\)/g_ethernet = 1\n\n\1/' /usr/local/lib/$configFileName
|
|
else
|
|
echo -e '\ng_ethernet = 1' | sudo tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
fi
|
|
sudo sed -i 's/g_ethernet = 0/g_ethernet = 1/' /usr/local/lib/$configFileName
|
|
|
|
# GISK
|
|
if [[ $gisk ]]; then
|
|
echo "Getting GSport Internet Starter Kit..."
|
|
wget -O $tempDir/GSport_Internet_Starter_Kit.zip http://sourceforge.net/projects/gsport/files/Emulator%20Software%20Images/GSport_Internet_Starter_Kit.zip
|
|
unzip -d $tempDir $tempDir/GSport_Internet_Starter_Kit.zip "GSport Internet Starter Kit/GSport Internet Starter Kit.2mg"
|
|
sudo mv "$tempDir/GSport Internet Starter Kit/GSport Internet Starter Kit.2mg" $imagesDir
|
|
rm -r $tempDir/GSport*
|
|
if [[ $(grep ^s7d1 /usr/local/lib/$configFileName) ]]; then
|
|
sudo sed -i "s:^s7d1.*$:s7d1 = $imagesDir/GSport Internet Starter Kit.2mg:" /usr/local/lib/$configFileName
|
|
else
|
|
echo "s7d1 = $imagesDir/GSport Internet Starter Kit.2mg" | tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
noDisks=1
|
|
fi
|
|
if [[ $noDisks ]]; then
|
|
echo
|
|
echo
|
|
echo "Setup complete. You can now start $emulatorName."
|
|
echo
|
|
if [[ ! $autoAnswerYes ]]; then
|
|
echo -n "Press return to continue..."
|
|
read
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# non-GISK; get installer disks
|
|
if [[ ! -f $imagesDir/INSTALL.HDV ]] \
|
|
|| [[ ! -f $imagesDir/SYSTEM.DISK.HDV ]] \
|
|
|| [[ ! -f $imagesDir/SYSTEMTOOLS1.HDV ]] \
|
|
|| [[ ! -f $imagesDir/SYSTEMTOOLS2.HDV ]] \
|
|
|| [[ ! -f $imagesDir/FONTS.HDV ]] \
|
|
|| [[ ! -f $imagesDir/SYNTHLAB.HDV ]] \
|
|
|| [[ ! -f $imagesDir/"$gsosHD" ]] \
|
|
|| [[ ! $kegs && ! -f $imagesDir/spectrum.hdv ]]; then
|
|
|
|
REPLY="y"
|
|
if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
|
|
|
|
echo
|
|
activeDisk=0
|
|
for diskname in Install System.Disk SystemTools1 SystemTools2 Fonts synthLAB; do
|
|
(( activeDisk++ ))
|
|
outfile="$imagesDir/$(tr [:lower:] [:upper:] <<< $diskname).HDV"
|
|
if [[ ! -f "$outfile" ]]; then
|
|
echo "Getting GS/OS disk ${activeDisk} of 6: $diskname"
|
|
wget -qO "Disk_${activeDisk}_of_7-$diskname.sea.bin" "http://archive.org/download/download.info.apple.com.2012.11/download.info.apple.com.2012.11.zip/download.info.apple.com%2FApple_Support_Area%2FApple_Software_Updates%2FEnglish-North_American%2FApple_II%2FApple_IIGS_System_6.0.1%2FDisk_${activeDisk}_of_7-$diskname.sea.bin"
|
|
unar -k skip "Disk_${activeDisk}_of_7-$diskname.sea.bin" &> /dev/null
|
|
truncate -s 819284 "Disk ${activeDisk} of 7-${diskname}.sea"
|
|
dd if="Disk ${activeDisk} of 7-${diskname}.sea" of=${outfile} bs=84 skip=1 &> /dev/null
|
|
chmod ugo-w "$outfile"
|
|
if [[ $activeDisk -eq 1 ]]; then
|
|
if [[ $(grep ^s5d1 /usr/local/lib/$configFileName) ]]; then
|
|
sudo sed -i "s:^s5d1.*$:s5d1 = $imagesDir/INSTALL.HDV:" /usr/local/lib/$configFileName
|
|
else
|
|
echo "s5d1 = $imagesDir/INSTALL.HDV" | tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
else
|
|
if [[ $(grep ^s7d$activeDisk /usr/local/lib/$configFileName) ]]; then
|
|
sudo sed -i "s:^s7d$activeDisk.*$:s7d$activeDisk = $outfile:" /usr/local/lib/$configFileName
|
|
else
|
|
echo "s7d$activeDisk = $outfile" | tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
fi
|
|
else
|
|
echo "GS/OS disk ${activeDisk} of 6: $diskname has already been downloaded."
|
|
fi
|
|
done
|
|
rm *.sea* &> /dev/null
|
|
|
|
if [[ ! -f $imagesDir/"$gsosHD" ]]; then
|
|
echo "Creating 32 MB blank image at $imagesDir/$gsosHD..."
|
|
if [[ -f /usr/local/bin/acmd ]]; then
|
|
# if acmd exists, make a ProDOS disk with GS-ShrinkIt and Teach
|
|
|
|
if [[ ! -f /usr/local/adtpro/lib/AppleCommander/AppleCommander-1.3.5.13id-ac.jar ]]; then
|
|
echo "Installing AppleCommander-1.3.5.13id..."
|
|
sudo mkdir -p /usr/local/adtpro/lib/AppleCommander
|
|
wget -qO /usr/local/adtpro/lib/AppleCommander/AppleCommander-1.3.5.13id-ac.jar http://downloads.sourceforge.net/project/applecommander/AppleCommander%20-%20Interim/testcase/AppleCommander-1.3.5.13id-ac.jar
|
|
rm /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar &> /dev/null
|
|
ln -s AppleCommander-1.3.5.13id-ac.jar /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar
|
|
fi
|
|
|
|
echo "Copying ProDOS..."
|
|
acmd -g "$imagesDir/INSTALL.HDV" PRODOS "PRODOS#ff0000"
|
|
wget -qO- ${a2cBinaryURL}/gsport/splash/${emulatorName}SPLASH.SYS | dd of="PRODOS#ff0000" conv=notrunc &> /dev/null
|
|
echo "Copying Teach..."
|
|
cppo -uc -e $imagesDir/SYSTEMTOOLS2.HDV /SYSTEMTOOLS2/TEACH . &> /dev/null
|
|
echo "Downloading GS-ShrinkIt..."
|
|
wget -qO- http://web.archive.org/web/20131031160750/http://nulib.com/library/gshk11.sea | nulib2 -x -e - GSHK &> /dev/null
|
|
echo 1
|
|
nulib2 -a -e $gsosHD.shk "PRODOS#"* "GSHK#"* "TEACH#"* &> /dev/null
|
|
echo 2
|
|
acmd -convert $gsosHD.shk $imagesDir/"$gsosHD" 65535
|
|
echo 3
|
|
rm "PRODOS#"* "GSHK#"* "TEACH#"* $gsosHD.shk &> /dev/null
|
|
|
|
acmd -n $imagesDir/"$gsosHD" $gsosHDvolName
|
|
dd bs=512 count=1 conv=notrunc if="$imagesDir/INSTALL.HDV" of="$imagesDir/$gsosHD" 2> /dev/null
|
|
sudo chmod ugo+rw $imagesDir/"$gsosHD"
|
|
fi
|
|
echo 4
|
|
if [[ $(grep ^s7d1 /usr/local/lib/$configFileName) ]]; then
|
|
sudo sed -i "s:^s7d1.*$:s7d1 = $imagesDir/$gsosHD:" /usr/local/lib/$configFileName
|
|
else
|
|
echo "s7d1 = $imagesDir/$gsosHD" | tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
fi
|
|
|
|
if [[ $(grep ^g_limit_speed /usr/local/lib/$configFileName) ]]; then
|
|
sudo sed -i "s:^g_limit_speed.*$:g_limit_speed = 0:" /usr/local/lib/$configFileName
|
|
else
|
|
echo "g_limit_speed = 0" | tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
|
|
if [[ -f /usr/local/bin/acmd && ! $(acmd -ls $imagesDir/$gsosHD | grep 'GSHK') ]]; then
|
|
echo
|
|
echo "Downloading GS-ShrinkIt..."
|
|
wget -qO- http://web.archive.org/web/20131031160750/http://nulib.com/library/gshk11.sea | acmd -p $imagesDir/$gsosHD GS.SHRINKIT.SEA S16
|
|
fi
|
|
|
|
|
|
# Spectrum starts here
|
|
|
|
if [[ ! $kegs ]]; then
|
|
|
|
mkdir -p $tempDir/spectrum
|
|
cd $tempDir/spectrum
|
|
|
|
imageName="$tempDir/spectrum/spectrum.dmg"
|
|
hfsName="$tempDir/spectrum/spectrumH.dmg"
|
|
ullName="$tempDir/spectrum/uthernet.bxy"
|
|
|
|
if [[ ! -f /usr/bin/hcopy || ! -f /usr/bin/macsave ]]; then
|
|
echo "Installing HFS utilities..."
|
|
sudo apt-get -y install hfsutils macutils &> /dev/null
|
|
else
|
|
echo "HFS utilities are already installed."
|
|
fi
|
|
|
|
if [[ ! -f /usr/local/adtpro/lib/AppleCommander/AppleCommander-1.3.5.13id-ac.jar ]]; then
|
|
echo "Installing AppleCommander..."
|
|
sudo mkdir -p /usr/local/adtpro/lib/AppleCommander
|
|
wget -qO /usr/local/adtpro/lib/AppleCommander/AppleCommander-1.3.5.13id-ac.jar http://downloads.sourceforge.net/project/applecommander/AppleCommander%20-%20Interim/testcase/AppleCommander-1.3.5.13id-ac.jar
|
|
rm /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar &> /dev/null
|
|
ln -s AppleCommander-1.3.5.13id-ac.jar /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar
|
|
fi
|
|
|
|
if [[ ! -f "$imageName" ]]; then
|
|
echo "Downloading Spectrum Deluxe..."
|
|
wget -qO spectrum.dmg http://www.wannop.info/speccie/software/spectrum_2.5.3_deluxe.dmg
|
|
else
|
|
echo "Spectrum Deluxe has already been downloaded."
|
|
fi
|
|
|
|
mkdir -p mnt
|
|
mkdir -p extract
|
|
mkdir -p shkstage
|
|
cp "$imageName" "$hfsName"
|
|
sudo mount -r -t hfs "$imageName" mnt
|
|
hmount "$hfsName"
|
|
|
|
IFS=''
|
|
cd $tempDir/spectrum/mnt
|
|
find Spectrum.2.5.3 -type d | while read thisDirPath; do
|
|
mkdir -p $tempDir/spectrum/shkstage/"$thisDirPath"
|
|
hcd
|
|
IFS='/'
|
|
for thisDir in $thisDirPath; do
|
|
hcd $thisDir
|
|
done
|
|
echo " Copying: $(hpwd)"
|
|
IFS=''
|
|
cd $tempDir/spectrum/extract
|
|
hls -1 | while read thisFile; do
|
|
hcopy -m "$thisFile" - 2> /dev/null | macsave -f 2> /dev/null
|
|
if [[ -f "$thisFile".info ]]; then
|
|
if [[ $(readcharHex "$thisFile".info 65) == "70" ]]; then
|
|
fileType=$(readcharHex "$thisFile".info 66)
|
|
auxType=$(readcharHex "$thisFile".info 67)$(readcharHex "$thisFile".info 68)
|
|
else
|
|
auxType="0000"
|
|
fMac=$(readchars "$thisFile".info 65 4)
|
|
if [[ "$fMac" == "PS16" ]]; then
|
|
fileType="b3";
|
|
elif [[ "$fMac" == "PSYS" ]]; then
|
|
fileType="ff";
|
|
elif [[ "$fMac" == "BINA" ]]; then
|
|
fileType="00";
|
|
elif [[ "$fMac" == "TEXT" ]]; then
|
|
fileType="04";
|
|
elif [[ "$fMac" == "MIDI" ]]; then
|
|
fileType="D7";
|
|
elif [[ "$fMac" == "AIFF" || "$fMac" == "AIFC" ]]; then
|
|
fileType="D8";
|
|
elif [[ "$fMac" == "dImg" ]]; then
|
|
fileType="E0";
|
|
else
|
|
echo "WARNING: unknown file type '$fMac' found for file $thisFile"
|
|
fi
|
|
fi
|
|
[[ -f "$thisFile".rsrc ]] && mv "$thisFile".rsrc $tempDir/spectrum/shkstage/"$thisDirPath"/"${thisFile}#${fileType}${auxType}r"
|
|
[[ -f "$thisFile".data ]] && mv "$thisFile".data $tempDir/spectrum/shkstage/"$thisDirPath"/"${thisFile}#${fileType}${auxType}"
|
|
rm "$thisFile".info 2> /dev/null
|
|
fi
|
|
done
|
|
cd $tempDir/spectrum/mnt
|
|
done
|
|
|
|
cd $tempDir/spectrum/shkstage/Spectrum*
|
|
humount
|
|
sudo umount $tempDir/spectrum/mnt
|
|
|
|
mkdir -p Marinetti/Uthernet
|
|
cp SAFE2.Archive/Link.Layers/"Uthernet#bc4083" Marinetti/Uthernet
|
|
echo -n "After installing Marinetti, put Uthernet in the TCPIP folder of your System folder, and restart GS/OS. Then open Control Panels, choose TCP/IP, and choose Setup Connection. Choose Uthernet for the link layer. Under Primary Domain Name Server, enter 8.8.8.8, then click Configure and select Slot 3 and DHCP. Then click Save." > Marinetti/Uthernet/"Uthernet.README#040000"
|
|
|
|
echo "Making archive for conversion to disk image..."
|
|
rm $tempDir/spectrum/spectrum.shk 2> /dev/null
|
|
nulib2 -a -r -0 -e $tempDir/spectrum/spectrum.shk * &> /dev/null
|
|
echo "Converting archive to disk image..."
|
|
acmd -convert $tempDir/spectrum/spectrum.shk $imagesDir/spectrum.hdv 20480
|
|
acmd -n $imagesDir/spectrum.hdv SPECTRUM.DELUXE
|
|
|
|
if [[ $(grep ^s7d7 /usr/local/lib/$configFileName) ]]; then
|
|
sudo sed -i "s:^s7d7.*$:s7d7 = $imagesDir/spectrum.hdv:" /usr/local/lib/$configFileName
|
|
else
|
|
echo "s7d7 = $imagesDir/spectrum.hdv" | tee -a /usr/local/lib/$configFileName > /dev/null
|
|
fi
|
|
|
|
cd $tempDir
|
|
|
|
rm -rf $tempDir/spectrum/extract $tempDir/spectrum/shkstage $tempDir/spectrum/spectrum.shk $tempDir/spectrum/mnt &> /dev/null
|
|
fi
|
|
# Spectrum ends here
|
|
fi
|
|
fi
|
|
|
|
cd
|
|
rm -r "$tempDir"
|
|
|
|
echo
|
|
echo
|
|
if [[ -f "$imagesDir/$gsosHD" ]]; then
|
|
echo
|
|
echo "You can now start $emulatorName."
|
|
echo "When the installer boots, you can click Easy Update or Customize"
|
|
echo "to install GS/OS, if you downloaded the installer disks aobve."
|
|
else
|
|
# if no acmd, create unformatted disk
|
|
# requires that the disk first be formatted with Advanced Disk Utility
|
|
dd bs=512 count=65535 if=/dev/zero of=$imagesDir/"$gsosHD" 2> /dev/null
|
|
writecharsHex $imagesDir/"$gsosHD" 0 "00.4C.00.C5.00"
|
|
echo
|
|
echo "You can now start $emulatorName."
|
|
echo
|
|
echo "If you downloaded the installer disks above:"
|
|
echo "When the installer boots, quit it, change to the SystemTools1 disk,"
|
|
echo "run Advanced Disk Utility, click Disk until a hard drive icon appears"
|
|
echo "that says Uninitialized, and initialize it. Then quit Advanced Disk"
|
|
echo "Utility, change to the Install Disk, and run Installer. When it loads,"
|
|
echo "click Easy Update or Customize to install GS/OS."
|
|
echo
|
|
fi
|
|
echo "When it's done, reboot."
|
|
echo "(Use Shut Down, ctrl-F12, or ctrl-solidapple-equals.)"
|
|
if [[ -f "$imagesDir/spectrum.hdv" ]]; then
|
|
echo
|
|
echo "Then on the Spectrum disk, optionally install:"
|
|
echo "Marinetti (plus update): TCP/IP driver for GS/OS"
|
|
echo "Uthernet: Ethernet driver for Marinetti"
|
|
echo "Spectrum: serial and telnet communications"
|
|
echo "SAFE: FTP client"
|
|
echo "SNAP: Usenet newsgroups (NNTP) client"
|
|
echo "SAM2: Email (POP) client"
|
|
fi
|
|
echo
|
|
echo "After installing, press F4 and choose 'Disk Configuration' to"
|
|
echo "eject all disks other than slot 7 drive 1."
|
|
echo
|
|
if [[ ! $autoAnswerYes ]]; then
|
|
echo -n "Press return to continue..."
|
|
read
|
|
fi
|