Annotation of hatari/tools/atari-hd-image.sh, revision 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.