mirror of
https://github.com/RasppleII/a2cloud.git
synced 2024-12-21 06:29:57 +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)
89 lines
2.7 KiB
Bash
Executable File
89 lines
2.7 KiB
Bash
Executable File
#! /bin/bash
|
|
# vim: set tabstop=4 shiftwidth=4 noexpandtab filetype=sh:
|
|
|
|
# dopo - Swap sectors on Apple II disk image between DOS and ProDOS ordering
|
|
#
|
|
# 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.
|
|
|
|
# follows gzip syntax -- acts in place if filename provided, outputs to
|
|
# stdout with -c, accepts stdin and outputs to stdout if filename is - or absent
|
|
|
|
# output to stdout?
|
|
if [[ "$1" == "-c" ]]; then
|
|
shift;
|
|
stdout=1;
|
|
else
|
|
stdout=
|
|
fi
|
|
|
|
# use stdin?
|
|
if [[ ! $1 || "$1" == "-" ]]; then
|
|
stdin=1
|
|
stdout=1
|
|
elif [[ $1 && ! -f "$1" ]]; then
|
|
echo "usage: dopo [-c] [-|140KdiskImageFilename] 1>&2";
|
|
exit 1;
|
|
else
|
|
stdin=
|
|
fi
|
|
|
|
if [[ ! $stdout ]]; then
|
|
#get filename extension, in lowercase
|
|
f="$(tr [:upper:] [:lower:] <<< ${1##*.})";
|
|
|
|
#if it's dsk/do/po, get name without extension
|
|
[[ "$f" == "dsk" || "$f" == "do" || "$f" == "po" ]] && of="${1%.*}" || of="$1";
|
|
|
|
#if name had .po extension, append .dsk to outfile name, otherwise append .po
|
|
[[ "$f" == "po" ]] && of="$of.dsk" || of="$of.po"
|
|
|
|
# set outfile param for dd
|
|
ofile="$of"
|
|
else
|
|
ofile="/tmp/$$.dopo_out"
|
|
fi
|
|
|
|
if [[ ! $stdin ]]; then
|
|
# set infile param for dd
|
|
ifile="$1"
|
|
elif [[ -t 0 ]]; then
|
|
echo "usage: dopo [-c] [-|140KdiskImageFilename]" 1>&2; exit 1;
|
|
else
|
|
ifile="/tmp/$$.dopo_in"
|
|
cat > "$ifile"
|
|
fi
|
|
|
|
# verify file is 140K by successfully reading 140K'th byte, and failing to read the one past
|
|
[[ $(dd if="$ifile" of=/dev/null bs=1 skip=143359 2>&1 | tail -1 | cut -d ' ' -f 1) -ne 1 || $(dd if="$ifile" of=/dev/null bs=1 skip=143360 2>&1 | tail -1 | cut -d ' ' -f 1) -ne 0 ]] && badInput=1 || badInput=
|
|
|
|
if [[ $badInput ]]; then
|
|
if [[ ! $stdin ]]; then
|
|
echo -n "$1 doesn't appear to be a 140K image. Continue? " 1>&2;
|
|
read
|
|
[[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]] || exit 1;
|
|
else
|
|
echo "warning: Input file doesn't appear to be a 140K image." 1>&2
|
|
echo " Output file is likely to be useless." 1>&2
|
|
fi
|
|
fi
|
|
|
|
# for each track
|
|
for t in {0..34}; do
|
|
# read each sector in the right sequence to make (or unmake)
|
|
# valid ProDOS blocks (sector pairs)
|
|
for s in 0 14 13 12 11 10 9 8 7 6 5 4 3 2 1 15; do
|
|
# copy the sector from the old file to the new one
|
|
dd if="$ifile" of="$ofile" bs=256 count=1 skip=$(( t*16 + s )) seek=$(( t*16 + (s==0 || s==15 ? s : 15-s) )) 2> /dev/null
|
|
done
|
|
done
|
|
|
|
# remove the old one
|
|
[[ ! $stdin && ! $stdout ]] && rm "$1" &> /dev/null
|
|
|
|
# dump to stdout if -c or stdin used
|
|
[[ $stdout ]] && { cat $ofile; rm $ofile &> /dev/null; }
|
|
[[ $stdin ]] && rm $ifile &> /dev/null;
|