Annotation of hatari/tools/atari-hd-image.sh, revision 1.1.1.1

1.1       root        1: #!/bin/sh
                      2: # script for creating a compatible DOS HD image for Hatari
                      3: # with a single FAT16 partition of given size
                      4: 
                      5: # defaults for disk attributes
                      6: diskfile=hd.img   # HD image filename
                      7: partname=DOS      # partition name
                      8: 
                      9: if [ $# -lt 1 ]; then
                     10:        name=${0##*/}
                     11:        echo
                     12:        echo "usage: $name <size> [filename] [partition name] [directory]"
                     13:        echo
                     14:        echo "Create an ACSI/IDE harddisk image for Hatari with a single Atari"
                     15:        echo "compatible DOS partition.  Arguments are (defaults in parenthesis):"
                     16:        echo "- size: harddisk image size in megabytes, 8-256"
                     17:        echo "- filename: name for the harddisk image ($diskfile)"
                     18:        echo "- partition name: name for that single partition ($partname)"
                     19:        echo "- directory: directory for initial content copied to the image"
                     20:        echo
                     21:        echo "For example:"
                     22:        echo "- 16MB '$diskfile' HD image:"
                     23:        echo "  $name 16"
                     24:        echo "-  8MB image with 'TEST' partition having files from content/:"
                     25:        echo "  $name 8 8mb-disk.img TEST content/"
                     26:        echo
                     27:        exit 1
                     28: fi
                     29: 
                     30: # sfdisk/mkdosfs reside in /sbin
                     31: PATH=/sbin:$PATH
                     32: export PATH
                     33: 
                     34: # check tools
                     35: if [ -z $(which sfdisk) ] || [ -z $(which mkdosfs) ]; then
                     36:        echo "ERROR: either sfdisk or mkdosfs missing!"
                     37:        exit 1
                     38: fi
                     39: 
                     40: # check disk size
                     41: if [ $1 -lt 5 ]; then
                     42:        echo "ERROR: disk size needs to be at least 5 (MB) to work properly."
                     43:        exit 1
                     44: fi
                     45: if [ $1 -gt 256 ]; then
                     46:        echo "ERROR: EmuTOS supports only partitions up to 256 (MB)."
                     47:        exit 1
                     48: fi
                     49: # disk geometry
                     50: cylinders=$((4*$1))    # 16*32*512 is 1/4MB
                     51: diskheads=16
                     52: tracksectors=32                # same as used by mkdosfs
                     53: sectorsize=512
                     54: partsize=$(($cylinders*$diskheads*$tracksectors*$sectorsize))
                     55: 
                     56: # counts in sectors with correct disk geometry
                     57: sfdisk="sfdisk -uS -C $cylinders -H $diskheads -S $tracksectors"
                     58: 
                     59: # check optional arguments
                     60: if [ \! -z $2 ]; then
                     61:        diskfile=$2
                     62: fi
                     63: if [ \! -z $3 ]; then
                     64:        partname=$3
                     65: fi
                     66: if [ \! -z $4 ]; then
                     67:        if [ -z $(which mcopy) ]; then
                     68:                echo "ERROR: mcopy (from Mtools) missing!"
                     69:                exit 1
                     70:        fi
                     71:        contentdir=$4
                     72: fi
                     73: 
                     74: # don't overwrite files by accident
                     75: if [ -f $diskfile ]; then
                     76:        echo "ERROR: given harddisk image already exits. Give another name or remove it:"
                     77:        echo "  rm $diskfile"
                     78:        exit 1
                     79: fi
                     80: 
                     81: # temporary files
                     82: tmppart=$diskfile.part
                     83: 
                     84: # script exit/error handling
                     85: exit_cleanup ()
                     86: {
                     87:        echo
                     88:        if [ $? -eq 0 ]; then
                     89:                echo "$step) Cleaning up..."
                     90:        else
                     91:                echo
                     92:                echo "ERROR, cleaning up..."
                     93:                echo "rm -f $diskfile"
                     94:                rm -f $diskfile
                     95:        fi
                     96:        echo "rm -f $tmppart"
                     97:        rm -f $tmppart
                     98:        echo "Done."
                     99: }
                    100: trap exit_cleanup EXIT
                    101: 
                    102: echo
                    103: step=1
                    104: echo "$step) Creating $1MB sparse disk image..."
                    105: echo "dd if=/dev/zero of=$diskfile bs=1 count=0 seek=$((512+partsize))"
                    106: dd if=/dev/zero of=$diskfile bs=$((512+partsize)) count=1
                    107: 
                    108: echo
                    109: step=$(($step+1))
                    110: echo "$step) Creating DOS Master Boot Record partition table..."
                    111: echo "Add DOS MBR signature needed by sfdisk:"
                    112: echo -e "\0125\0252" | dd of=$diskfile bs=1 seek=510 count=2
                    113: 
                    114: echo "Add partition table to MBR with single FAT16 partition:"
                    115: clusters=$(($partsize/1024))
                    116: if [ $clusters -le 32765 ]; then
                    117:        fatbits=16
                    118:        parttype="0x4"
                    119: else
                    120:        fatbits=16
                    121:        parttype="0x6"
                    122: fi
                    123: echo "Using FAT$fatbits partition type $parttype"
                    124: echo "$sfdisk --no-reread $diskfile: ,,$parttype,*"
                    125: $sfdisk --no-reread $diskfile << EOF
                    126: ,,$parttype,*
                    127: EOF
                    128: if [ $? -ne 0 ]; then
                    129:        exit 2
                    130: fi
                    131: 
                    132: echo
                    133: step=$(($step+1))
                    134: echo "$step) Creating Atari TOS compatible DOS partition..."
                    135: sectors=$($sfdisk -l $diskfile|awk '/\*/{print $5}')
                    136: if [ -z "$sectors" ] || [ $sectors -eq 0 ]; then
                    137:        echo "ERROR: couldn't get partition size information."
                    138:        exit 2
                    139: fi
                    140: # mkdosfs keeps the sector count below 32765 when -A is used by increasing
                    141: # the logical sector size (this is for TOS compatibility, -A guarantees
                    142: # also 2 sectors / cluster and Atari serial number etc).  Mtools barfs
                    143: # if partition size doesn't divide evenly with its track size.  Determine
                    144: # suitable cluster count & corresponding track size and align (decrease)
                    145: # the file system sector count accordingly.
                    146: tracksize=32
                    147: clustertmp=$((sectors/2))
                    148: echo "Sectors: $sectors, sectors/track: $tracksize, clusters: $clustertmp"
                    149: while [ $clustertmp -gt 32765 ]; do
                    150:        clustertmp=$((clustertmp/2))
                    151:        tracksize=$(($tracksize*2))
                    152:        echo "Doubling sector size as >32765 clusters -> $clustertmp clusters"
                    153: done
                    154: origsectors=$sectors
                    155: sectors=$(($sectors/$tracksize))
                    156: sectors=$(($sectors*$tracksize))
                    157: kilobytes=$(($sectors/2))
                    158: if [ $sectors -ne $origsectors ]; then
                    159:        echo "Align sector count with clusters/sectors/track: $origsectors -> $sectors ($kilobytes kB)"
                    160: fi
                    161: echo "mkdosfs -A -F $fatbits -n $partname -C $tmppart $kilobytes"
                    162: mkdosfs -A -n $partname -C $tmppart $kilobytes
                    163: 
                    164: if [ \! -z $contentdir ]; then
                    165:        echo
                    166:        step=$(($step+1))
                    167:        # copy contents of given directory to the new partition
                    168:        echo "$step) Copying the initial content to the partition..."
                    169:        echo "MTOOLS_NO_VFAT=1 mcopy -i $tmppart -spmv $contentdir/* ::"
                    170:        MTOOLS_NO_VFAT=1 mcopy -i $tmppart -spmv $contentdir/* ::
                    171:        if [ $? -ne 0 ]; then
                    172:                echo "ERROR: failed."
                    173:                exit 2
                    174:        fi
                    175: fi
                    176: 
                    177: echo
                    178: step=$(($step+1))
                    179: # copy the partition into disk
                    180: echo "$step) Copying the partition to disk image..."
                    181: start=$($sfdisk -l $diskfile|awk '/\*/{print $3}')
                    182: if [ -z "$sectors" ] || [ $sectors -eq 0 ]; then
                    183:        echo "ERROR: couldn't get partition start information."
                    184:        exit 2
                    185: fi
                    186: echo "dd if=$tmppart of=$diskfile bs=512 seek=$start count=$sectors"
                    187: dd if=$tmppart of=$diskfile bs=512 seek=$start count=$sectors
                    188: 
                    189: step=$(($step+1))
                    190: # cleanup is done by exit_cleanup() trap

unix.superglobalmegacorp.com

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