Annotation of hatari/tools/hatari-prg-args.sh, revision 1.1

1.1     ! root        1: #!/bin/sh
        !             2: #
        !             3: # script to set first Atari program args when it starts
        !             4: #
        !             5: # this is achieved by chaining breakpoints from Hatari
        !             6: # startup to program startup.
        !             7: 
        !             8: # path to (2015) hatari version which debugger provides "basepage" variable
        !             9: hatari=hatari
        !            10: 
        !            11: # where temporary debugger scripts will be stored
        !            12: dir=/tmp/hatari-debugger.tmp
        !            13: 
        !            14: usage ()
        !            15: {
        !            16:        name=${0##*/}
        !            17:        echo "usage: $name [Hatari args] -- <Atari program> <program args>"
        !            18:        echo
        !            19:        echo "Script for running Hatari so that it autostarts given Atari program"
        !            20:        echo "and inserts given arguments to program (to its basepage, with builtin"
        !            21:        echo "Hatari debugger facilities)."
        !            22:        echo
        !            23:        echo "If arguments have same (host) path prefix as given Atari program,"
        !            24:        echo "those prefixes are replaced with 'C:\', Unix path separators ('/')"
        !            25:        echo "are replaced with Atari ones ('\\') and whole filename upper-cased."
        !            26:        echo
        !            27:        echo "Other arguments are passed unmodified."
        !            28:        echo
        !            29:        echo "Example:"
        !            30:        echo "  $name -m -- atari/sidplay.ttp atari/sids/test.sid"
        !            31:        echo
        !            32:        echo "ERROR: $1!"
        !            33:        exit 1
        !            34: }
        !            35: 
        !            36: # --------- argument parsing --------
        !            37: 
        !            38: # generic argument checking
        !            39: if [ $# -lt 3 ]; then
        !            40:        usage "not enough arguments"
        !            41: fi
        !            42: echo " $* " | grep -q ' -- '
        !            43: if [ $? -ne 0 ]; then
        !            44:        usage "Separator missing for Hatari -- Atari options"
        !            45: fi
        !            46: 
        !            47: # collect/remove hatari arguments
        !            48: for arg in $*; do
        !            49:        shift
        !            50:        if [ $arg = '--' ]; then
        !            51:                break
        !            52:        fi
        !            53:        hatari="$hatari $arg"
        !            54: done
        !            55: 
        !            56: # check atari program
        !            57: prg=$1
        !            58: shift
        !            59: if [ \! -f $prg ]; then
        !            60:        usage "given Atari program doesn't exist"
        !            61: fi
        !            62: 
        !            63: # builtin shell echo can be broken, so that it interprets backlashes by default,
        !            64: # i.e. concatenating '\' path separator with dirname 't', produces TAB, not '\t'...
        !            65: # -> use separate echo binary
        !            66: echo=$(which echo)
        !            67: 
        !            68: # temporary dir
        !            69: mkdir -p $dir
        !            70: 
        !            71: # collect/convert atari program arguments
        !            72: args=$dir/args
        !            73: rm -f $args
        !            74: touch $args
        !            75: prefix=""
        !            76: drive="C:\\"
        !            77: path="${prg%/*}/"
        !            78: for arg in $*; do
        !            79:        if [ "${arg#$path}" != "$arg" ]; then
        !            80:                # file path needing conversion
        !            81:                if [ \! -f $arg ]; then
        !            82:                        usage "given file name '$arg' doesn't exits"
        !            83:                fi
        !            84:                # prefix with separator & drive letter & remove host path,
        !            85:                # upper-case, convert path separators
        !            86:                $echo -n "${prefix}${drive}${arg#$path}" | tr a-z A-Z | tr '/' '\\' >> $args
        !            87:        else
        !            88:                $echo -n "${prefix}$arg" >> $args
        !            89:        fi
        !            90:        prefix=" "
        !            91:        shift
        !            92: done
        !            93: 
        !            94: # calculate command line lenght and append zero just in case
        !            95: cmdlen=$(wc -c $args | awk '{print $1}')
        !            96: echo -n "\0" >> $args
        !            97: if [ $cmdlen -gt 126 ]; then
        !            98:        usage "command line is too long, $cmdlen chars (basepage limit is 126)"
        !            99: fi
        !           100: 
        !           101: # --------- debugger scripts --------
        !           102: 
        !           103: # until desktop is up and TOS opens (autostart) INF file,
        !           104: # it's not possible to set program breakpoints (0x3D = Fopen())
        !           105: cat > $dir/fopen.ini << EOF
        !           106: b GemdosOpcode = 0x3D :once :quiet :trace :file $dir/start.ini
        !           107: EOF
        !           108: 
        !           109: # real work can be done when program starts,
        !           110: # i.e. PC is at TEXT section beginning
        !           111: cat > $dir/start.ini << EOF
        !           112: b pc = text :once :trace :quiet :file $dir/basepage.ini
        !           113: EOF
        !           114: 
        !           115: # add command line args args to program basepage 
        !           116: cat > $dir/basepage.ini << EOF
        !           117: setopt dec
        !           118: w "basepage+0x80" $cmdlen
        !           119: l $args "basepage+0x81"
        !           120: info basepage
        !           121: EOF
        !           122: 
        !           123: # --------- ready, run ----------
        !           124: 
        !           125: # show args & debugger scripts
        !           126: head $dir/*
        !           127: 
        !           128: # run Hatari
        !           129: echo $hatari --parse $dir/fopen.ini $prg
        !           130: $hatari --parse $dir/fopen.ini $prg
        !           131: 
        !           132: # cleanup
        !           133: rm -r $dir

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.