mirror of
https://github.com/Wiimpathy/HatariWii.git
synced 2024-11-22 17:59:14 +01:00
160 lines
3.5 KiB
Bash
160 lines
3.5 KiB
Bash
|
#!/bin/sh
|
||
|
# Script for converting .ZIP archives to Atari .ST disk images
|
||
|
# (for the Hatari emulator).
|
||
|
|
||
|
# tools are present?
|
||
|
if [ -z "$(which unzip)" ]; then
|
||
|
echo "ERROR: 'unzip' missing."
|
||
|
exit 2
|
||
|
fi
|
||
|
if [ -z "$(which mformat)" ] || [ -z "$(which mcopy)" ]; then
|
||
|
echo "ERROR: 'mformat' or 'mcopy' (from 'mtools' package) missing."
|
||
|
exit 2
|
||
|
fi
|
||
|
|
||
|
usage ()
|
||
|
{
|
||
|
name=${0##*/}
|
||
|
echo "Convert a .zip archive file to a .st disk image."
|
||
|
echo
|
||
|
echo "Single intermediate directories in the zip"
|
||
|
echo "file are skipped."
|
||
|
echo
|
||
|
echo "Usage:"
|
||
|
echo " $name srcname.zip [destname.st]"
|
||
|
echo
|
||
|
echo "Example:"
|
||
|
echo " for zip in *.zip; do $name \$zip; done"
|
||
|
echo
|
||
|
if [ \! -z "$1" ]; then
|
||
|
echo "ERROR: $1!"
|
||
|
fi
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
# one ZIPFILE given?
|
||
|
if [ $# -lt 1 ] || [ -z "$1" ] || [ $# -gt 2 ]; then
|
||
|
usage "wrong number of argument(s)"
|
||
|
fi
|
||
|
|
||
|
ZIPFILE=$1
|
||
|
STFILE=$2
|
||
|
|
||
|
if [ \! -f "$ZIPFILE" ]; then
|
||
|
usage "given zipfile $ZIPFILE is missing"
|
||
|
fi
|
||
|
|
||
|
if [ -z "$STFILE" ]; then
|
||
|
# if no STFILE path given, save it to current dir (remove path)
|
||
|
# and use the ZIPFILE name with the extension removed.
|
||
|
# (done with POSIX shell parameter expansion)
|
||
|
BASENAME=${ZIPFILE##*/}
|
||
|
BASENAME=${BASENAME%.zip}
|
||
|
BASENAME=${BASENAME%.ZIP}
|
||
|
STFILE=$BASENAME.st
|
||
|
fi
|
||
|
if [ -f "$STFILE" ]; then
|
||
|
echo "ERROR: ST file '$STFILE' already exists, remove it first. Aborting..."
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
step=0
|
||
|
TEMPDIR=`mktemp -d` || exit 2
|
||
|
echo "Converting" $ZIPFILE "->" $TEMPDIR "->" $STFILE
|
||
|
|
||
|
# script exit/error handling
|
||
|
exit_cleanup ()
|
||
|
{
|
||
|
if [ $? -eq 0 ]; then
|
||
|
echo "$step) Cleaning up temporary files..."
|
||
|
else
|
||
|
echo
|
||
|
echo "ERROR, cleaning up..."
|
||
|
fi
|
||
|
echo "rm -rv $TEMPDIR"
|
||
|
rm -rv $TEMPDIR
|
||
|
echo "Done."
|
||
|
}
|
||
|
trap exit_cleanup EXIT
|
||
|
|
||
|
echo
|
||
|
step=$(($step+1))
|
||
|
echo "$step) Unzipping..."
|
||
|
echo "unzip $ZIPFILE -d $TEMPDIR"
|
||
|
unzip "$ZIPFILE" -d "$TEMPDIR" || exit 2
|
||
|
|
||
|
# .zip files created with STZip sometimes have wrong access rights...
|
||
|
echo "chmod -R u+rw $TEMPDIR/*"
|
||
|
chmod -R u+rw $TEMPDIR/*
|
||
|
|
||
|
echo
|
||
|
step=$(($step+1))
|
||
|
echo "$step) Checking/skipping intermediate directories..."
|
||
|
ZIPDIR=$TEMPDIR
|
||
|
while true; do
|
||
|
count=$(ls $ZIPDIR|wc -l)
|
||
|
if [ $count -ne 1 ]; then
|
||
|
if [ $count -eq 0 ]; then
|
||
|
echo "ERROR: zip content is empty!"
|
||
|
exit 1
|
||
|
fi
|
||
|
# more than one dir/file
|
||
|
break
|
||
|
fi
|
||
|
dir=$(ls $ZIPDIR)
|
||
|
if [ \! -d "$ZIPDIR/$dir" ]; then
|
||
|
# not dir
|
||
|
break
|
||
|
fi
|
||
|
if [ -z "$(echo $dir|grep -v -i '^auto$')" ]; then
|
||
|
# don't skip AUTO dir
|
||
|
break
|
||
|
fi
|
||
|
echo "- $dir"
|
||
|
ZIPDIR=$ZIPDIR/$dir
|
||
|
done
|
||
|
|
||
|
# size of reserved sectors, FATs & root dir + zip content size
|
||
|
size=$((24 + $(du -ks $ZIPDIR|awk '{print $1}')))
|
||
|
|
||
|
# find a suitable disk size supported by mformat and Atari ST
|
||
|
disksize=0
|
||
|
for i in 360 400 720 800 1440 2880; do
|
||
|
if [ $i -gt $size ]; then
|
||
|
disksize=$i
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
if [ $disksize -gt 0 ]; then
|
||
|
echo
|
||
|
step=$(($step+1))
|
||
|
echo "$step) Creating $disksize KB disk image..."
|
||
|
echo "dd if=/dev/zero of=$STFILE bs=1024 count=$disksize"
|
||
|
dd if=/dev/zero of="$STFILE" bs=1024 count=$disksize
|
||
|
|
||
|
echo
|
||
|
step=$(($step+1))
|
||
|
echo "$step) Formating disk image..."
|
||
|
case $disksize in
|
||
|
360) format="-t 80 -h 1 -n 9" ;;
|
||
|
400) format="-t 80 -h 1 -n 10" ;;
|
||
|
800) format="-t 80 -h 2 -n 10" ;;
|
||
|
*) format="-f $disksize" ;;
|
||
|
esac
|
||
|
echo "mformat -a $format -i $STFILE ::"
|
||
|
mformat -a $format -i "$STFILE" ::
|
||
|
|
||
|
echo
|
||
|
step=$(($step+1))
|
||
|
echo "$step) Copying data to disk image..."
|
||
|
echo "MTOOLS_NO_VFAT=1 mcopy -i $STFILE -spmv $ZIPDIR/* ::"
|
||
|
MTOOLS_NO_VFAT=1 mcopy -i "$STFILE" -spmv $ZIPDIR/* ::
|
||
|
else
|
||
|
echo "ERROR: zip contents don't fit to a floppy image ($size > 2880 KB)."
|
||
|
fi
|
||
|
|
||
|
echo
|
||
|
step=$(($step+1))
|
||
|
# do cleanup in exit handler
|