echo "Amiga Unix install script"
trap '  echo "Running interactive shell:"
       exec /bin/sh -i' 2
stty erase '^H' kill '^U' intr '^C' eof '^D' quit '^\'
stty iexten echoke echoe echoctl echoprt
TAPEn=/dev/rmt/4n
TAPE=/dev/rmt/4
OFFSET=128              # Number of blocks to leave at beginning of disk
MINROOT=66              # Minimum size of root filesystem in megabytes
MINSWAP=10              # Minimum size of swap area in megabytes
MINBOOT=2               # Minimum size of bootstrap partition in megabytes
BOOTSIZE=2              # Default bootstrap partition size
MINUNIX=`expr $MINROOT '+' $MINSWAP '+' $BOOTSIZE`
restart ()
       echo "\nPress return to restart the installation script: \c"
       read ask || exec /bin/sh -i
       exit 99
getdisksize ()
       DISKLEN=`/etc/ddsize $rDISK`
       echo "\nYour disk is `expr $DISKLEN '/' 2048` megabytes."
makebootable ()
       /etc/rdb -p $BOOTPART -M -B -C 2 -P 2 -F 0x554e4901 $DISK
       /etc/rdb -p $ROOTPART -m -F 0x554e4900 $DISK
       /etc/rdb -p $SWAPPART -m -F 0x72657376 $DISK
       if [ "$HAVE_AMIGADOS" = "y" ]
       then
               if [ "$HAVE13" = "y" ]
               then
                       /etc/rdb -p 4 -M -B -P 1 -R 2 -F 0x444f5301 $DISK
                       /etc/rdb -p 5 -M -B -P 0 -R 2 -F 0x444f5301 $DISK
                       /etc/rdb -p 6 -M -b -R 2 -F 0x444f5301 $DISK
               else
                       /etc/rdb -p 4 -M -B -P 1 -R 2 -F 0x444f5301 $DISK
                       /etc/rdb -p 5 -M -b -R 2 -F 0x444f5301 $DISK
               fi
readrdbinfo ()
       while [ "$ROOT_INFO" = "" ]
               echo "\nWhich partition is for the root filesystem? \c"
               read ROOTPART || exec /bin/sh -i
               case "$ROOTPART" in
                       [1-9] )
                               UPART=/dev/dsk/c${SCSI}d0s${ROOTPART}
                               ROOT_INFO=`/etc/rdb -p $ROOTPART $DISK`
                               if [ "$?" != "0" ]
                               then
                                       echo "\nNo such partition is defined."
                                       unset ROOT_INFO
                               fi
               esac
       done
       while [ "$SWAP_INFO" = "" ]
               echo "\nWhich partition is for the swap space? \c"
               read SWAPPART || exec /bin/sh -i
               case "$SWAPPART" in
                       [1-9] )
                               SPART=/dev/dsk/c${SCSI}d0s${SWAPPART}
                               SWAP_INFO=`/etc/rdb -p $SWAPPART $DISK`
                               if [ "$?" != "0" ]
                               then
                                       echo "\nNo such partition is defined."
                                       unset SWAP_INFO
                               fi
               esac
               if [ "$ROOTPART" = "$SWAPPART" ]
               then
                     echo "\nThe root and swap partitions cannot be the same."
                     unset SWAP_INFO
               fi
       done
       while [ "$BOOT_INFO" = "" ]
               echo "\nWhich partition is for the Unix bootstrap? \c"
               read BOOTPART || exec /bin/sh -i
               case "$BOOTPART" in
                       [1-9] )
                               BPART=/dev/dsk/c${SCSI}d0s${BOOTPART}
                               BOOT_INFO=`/etc/rdb -p $BOOTPART $DISK`
                               if [ "$?" != "0" ]
                               then
                                       echo "\nNo such partition is defined."
                                       unset BOOT_INFO
                               fi
               esac
               if [ "$ROOTPART" = "$BOOTPART" ] ||
                  [ "$SWAPPART" = "$BOOTPART" ]
               then
                     echo "\nThe boot partition must not be the same as root or swap."
                     unset BOOT_INFO
               fi
       done
       set $ROOT_INFO
       ROOTOFF=$2
       ROOTLEN=$3
       set $SWAP_INFO
       SWAPOFF=$2
       SWAPLEN=$3
       set $BOOT_INFO
       BOOTOFF=$2
       BOOTLEN=$3
       ROOTSIZE=`expr $ROOTLEN '/' 2048`
       SWAPSIZE=`expr $SWAPLEN '/' 2048`
       BOOTSIZE=`expr $BOOTLEN '/' 2048`
       if [ "$ROOTSIZE" -lt $MINROOT ]
       then
               echo "\nYour root filesystem is less than $MINROOT megabytes."
               echo "It is too small for Amiga Unix to install."
               restart
       makebootable
getsizes ()
       BOOTLEN=`expr $BOOTSIZE '*' 2048`
       REMAIN=`expr $DISKLEN '-' $OFFSET '-' $BOOTLEN`
       ROOTLEN=`expr $REMAIN '-' '(' $MINSWAP '*' 2048 ')'`
       ROOTSIZE=`expr $ROOTLEN '/' 2048`
       if [ $DISKLEN -lt 220000 ]
       then
               AM_DEF="n"
       else
               AM_DEF="y"
       while [ "$HAVE_AMIGADOS" = "" ]
               echo "\nDo you want to reserve space for AmigaDOS? [$AM_DEF] \c"
               read ask
               case $ask in
                       [yY]|[yY][eE][sS] )
                               HAVE_AMIGADOS="y"
                       ;;
                       [nN]|[nN][oO] )
                               HAVE_AMIGADOS="n"
                       ;;
                       "" )
                               HAVE_AMIGADOS="$AM_DEF"
                       ;;
               esac
       done
       if [ "$HAVE_AMIGADOS" = "y" ]
       then
               if [ $DISKLEN -gt 307200 ]
               then
                       AMIGASIZE=30
               else
                       AMIGASIZE=10
               fi
               MAXAMIGA=`expr $ROOTSIZE '-' $MINROOT`
               unset ANS
               while [ "$ANS" = "" ]
               do
                       echo "\nHow much space do you want to set aside for AmigaDOS? [$AMIGASIZE] \c"
                       read ask
                       case $ask in
                               "" )
                                       ANS="$AMIGASIZE"
                                       ;;
                               [0-9]* )
                                       if [ $ask -gt $MAXAMIGA ]
                                       then
       echo "The most space you can use for AmigaDOS and still have enough"
       echo "room left for Unix is $MAXAMIGA megabytes."
                                       else
                                               ANS="$ask"
                                       fi
                                       if [ $ANS -lt 7 ]
                                       then
       echo "You must set aside at least 7 megabytes for AmigaDOS."
                                               unset ANS
                                       fi
                                       ;;
                       esac
               done
               AMIGASIZE="$ANS"
               AMIGALEN=`expr $AMIGASIZE '*' 2048`
               REMAIN=`expr $REMAIN '-' $AMIGALEN`
           while [ "$HAVE13" = "" ]
           do
               echo "\nDo you want an AmigaDOS 1.3 partition? [$AM_DEF] \c"
               read ask
               case $ask in
               "")
                       HAVE13="$AM_DEF"
                       ;;
               [yY]|[yY][eE][sS] )
                       HAVE13="y"
                       ;;
               [nN]|[nN][oO] )
                       HAVE13="n"
                       ;;
               esac
           done
       if [ "$AMIGASIZE" -lt 10 ]
       then
               WB13=3840
               WB20=4480
       else
               WB13=4096
               WB20=12288
       if [ "$HAVE13" = "n" ]
       then
               WB13=0
       WBTOT=`expr $WB13 '+' $WB20`
       echo "\nYour boot partition is $BOOTSIZE megabytes.\n"
       ROOTLEN=`expr $REMAIN '-' '(' $MINSWAP '*' 2048 ')'`
       ROOTSIZE=`expr $ROOTLEN '/' 2048`
       unset ANS
       while [ "$ANS" = "" ]
               echo "Enter root filesystem size, in megabytes: [$ROOTSIZE] \c"
               read ask || exec /bin/sh -i
               case "$ask" in
               "")
                       ANS="$ROOTSIZE"
                       ;;
               [0-9]* )
                       if [ "$ask" -gt "$ROOTSIZE" ]
                       then
       echo "You must leave at least $MINSWAP megabytes free for swap space."
                       else
                               ANS="$ask"
                       fi
               esac
       done
       ROOTSIZE="$ANS"
       ROOTLEN=`expr $ROOTSIZE '*' 2048`
       REMAIN=`expr $REMAIN '-' $ROOTLEN`
       SWAPSIZE=`expr $REMAIN '/' 2048`
       SWAPLEN=`expr $SWAPSIZE '*' 2048`
       REMAIN=`expr $REMAIN '-' $SWAPLEN`
       echo "\nThe remaining $SWAPSIZE megabytes are assigned to swap space."
createrdb ()
       ROOTOFF=$OFFSET
       SWAPOFF=`expr $ROOTOFF '+' $ROOTLEN`
       BOOTOFF=`expr $SWAPOFF '+' $SWAPLEN`
       if [ "$HAVE_AMIGADOS" = "y" ]
       then
               AMIGAOFF=`expr $BOOTOFF '+' $BOOTLEN`
               AMIGAFOO=`expr $AMIGAOFF '+' $WB20`
               AMIGABAR=`expr $AMIGAFOO '+' $WB13`
               AMIGAREST=`expr $AMIGALEN '-' $WBTOT`
               if [ "$HAVE13" = "y" ]
               then
                       OTHER="WB_2.x $AMIGAOFF $WB20 \
                               WB_1.3 $AMIGAFOO $WB13 \
                               Work $AMIGABAR $AMIGAREST"
               else
                       OTHER="WB_2.x $AMIGAOFF $WB20 \
                               Work $AMIGABAR $AMIGAREST"
               fi
       ROOTPART=1
       SWAPPART=2
       BOOTPART=3
       UPART=/dev/dsk/c${SCSI}d0s1
       SPART=/dev/dsk/c${SCSI}d0s2
       BPART=/dev/dsk/c${SCSI}d0s3
       /etc/rdb -c -s 64 -L 2  $DISK Unix_Root $ROOTOFF $ROOTLEN \
                               Unix_Swap $SWAPOFF $SWAPLEN \
                               Unix_Boot $BOOTOFF $BOOTLEN \
                               $OTHER
       makebootable
       echo "\nPartition table created:\n"
       /etc/rdb -H $DISK ||
               echo "Could not create disk partition table."
               restart
#  Beginning of real code
umount /mnt > /dev/null 2>&1
read KERN OLD_BOOT MEMORY JUNK < /dev/machid ||
       echo "Can't determine which kernel you're running."
       restart
case $MEMORY in
       "00200000" )    KERNEL="A2500unix"
                       ;;
       "07000000" )    KERNEL="A3016unix"
                       ;;
       "07400000" )    KERNEL="A3008unix"
                       ;;
       "07800000" )    KERNEL="A3008unix"
                       ;;
       "07c00000" )    KERNEL="A3000unix"
                       ;;
               echo "unknown memory address from /dev/machid: $MEMORY"
               restart
esac
PID=`sh -c 'cat /dev/noise > /dev/null 2>&1 &
echo $!'`
DEVS=`/etc/atdevs`
kill $PID
if [ "$DEVS" = "" ]
then
       echo "\nNo hard disks are attached to this system."
       restart
echo "\nHard disks attached to this system:\n"
for i in $DEVS
       size=`/etc/ddsize /dev/rdsk/c${i}d0s0`
       echo "SCSI id $i                `expr $size '/' 2048` megabytes"
done
set -- $DEVS
if [ "$#" -gt 1 ]
then
       while [ "$SCSI" = "" ]
               echo "\nWhat is the SCSI id of the disk you want to install? \c"
               read ask || exec /bin/sh -i
               for i in $DEVS
               do
                       if [ "$ask" = "$i" ]
                       then
                               SCSI=$i
                               break
                       fi
               done
               if [ "$SCSI" = "" ]
               then
                       echo "Choose one of the following:  $DEVS"
               fi
       done
else
       SCSI=$DEVS
if [ "$OLD_BOOT" = "1" -a "$SCSI" != "0" ]
then
       echo "\nWARNING:  Unix cannot autoboot from a 2620/2630 ROM unless it"
       echo "            is installed on SCSI device 0."
DISK=/dev/dsk/c${SCSI}d0s0
rDISK=/dev/rdsk/c${SCSI}d0s0
/etc/rdb $DISK > /dev/null 2>&1
if [ "$?" = "0" ]
then
       echo "\nA partition table already exists on this disk:\n"
       /etc/rdb -H $DISK
       while [ "$USE_EXIST" = "" ]
               echo "\nDo you want to use this partition table? [y] \c"
               read ask || exec /bin/sh -i
               case $ask in
               [yY]|[yY][eE][sS] )
                       USE_EXIST="yes"
                       ;;
               [nN]|[nN][oO] )
                       USE_EXIST="no"
                       ;;
               "" )
                       USE_EXIST="yes"
               esac
       done
else
       USE_EXIST="no"
if [ "$USE_EXIST" = "yes" ]
then
       readrdbinfo
else
       getdisksize
       getsizes
       createrdb
set `swap -l`
if [ "$6" = "/dev/fakeswap" ]
then
       swap -a $SPART 0 $SWAPLEN
       swap -d /dev/fakeswap 0
until
       echo "\nInsert Unix installation tape and press return: \c"
       read nothing || exec /bin/sh -i
       if [ "$FIRST_TIME" = "" ]
       then
               echo "\nMaking filesystems.  This will take a few minutes.\n"
               /etc/mkfs $UPART $ROOTLEN 1 4 >/dev/null ||
                       {
                       echo "failure:  /etc/mkfs $UPART $ROOTLEN 1 4"
                       restart
               /etc/mount $UPART /mnt 0 s5 2>/dev/null ||
                       echo "failure:  /etc/mount $UPART /mnt 0 s5"
                       restart
               for i in 0 1 2 3 4 5 6 7 8 9
               do
                       for j in 0 1 2 3 4 5 6 7 8 9
                       do
                               > /mnt/lost+found/$i$j
                       done
               done
               rm /mnt/lost+found/*
               chmod 755 /mnt ||
                       echo "failure:  chmod 755 /mnt"
                       restart
               FIRST_TIME="done"
       echo "Reading tape.  This will take about 45 minutes."
       (cd /mnt && /bin/cpio -icdmuB < $TAPE)
       echo "Read from tape failed."
done
echo "Done reading tape."
#  Patch the kernel to boot on the appropriate partition, if necessary
#  480010
#      |^-- scsi device #
#      ^--- partition #
echo "rootdev ?W 4800${ROOTPART}${SCSI}
swapfile+18 ?W 2f633${SCSI}64
swapfile+1c ?W 30733${SWAPPART}00
swapfile+98 ?W 0t${SWAPLEN}" |
/mnt/usr/bin/adb - -w /mnt/stand/A2500unix > /dev/null ||
       echo "Installation A2500 kernel patch failed."
       restart
echo "rootdev ?W 4800${ROOTPART}${SCSI}
swapfile+18 ?W 2f633${SCSI}64
swapfile+1c ?W 30733${SWAPPART}00
swapfile+98 ?W 0t${SWAPLEN}" |
/mnt/usr/bin/adb - -w /mnt/stand/A3000unix > /dev/null ||
       echo "Installation A3000 kernel patch failed."
       restart
echo "rootdev ?W 4800${ROOTPART}${SCSI}
swapfile+18 ?W 2f633${SCSI}64
swapfile+1c ?W 30733${SWAPPART}00
swapfile+98 ?W 0t${SWAPLEN}" |
/mnt/usr/bin/adb - -w /mnt/stand/A3008unix > /dev/null ||
       echo "Installation A3008 kernel patch failed."
       restart
echo "rootdev ?W 4800${ROOTPART}${SCSI}
swapfile+18 ?W 2f633${SCSI}64
swapfile+1c ?W 30733${SWAPPART}00
swapfile+98 ?W 0t${SWAPLEN}" |
/mnt/usr/bin/adb - -w /mnt/stand/A3016unix > /dev/null ||
       echo "Installation A3016 kernel patch failed."
       restart
ln /mnt/stand/${KERNEL} /mnt/stand/unix
#  Make disk bootable by Unix for old 2620/2630 ROMs, if necessary
if [ "$OLD_BOOT" = "1" ]
then
echo "\nPatching disk for booting on 2620/2630 ROMs...\n"
echo "?m 0 0x200 0
0x1f0 ?W 0x556e6978
0x1f4 ?W 0t$ROOTOFF" |
/mnt/usr/bin/adb -w $DISK > /dev/null 2>&1
       ln /mnt/stand/unix /mnt/unix
else
       ln -s /stand/unix /mnt/unix
echo "# file-system-table format:
#       column 1:       special- block special device or resource name
#       column 2:       fsckdev- char special device for fsck
#       column 3:       mountp- mount point
#       column 4:       fstype- File system type
#       column 5:       fsckpass- number if to be checked automatically
#       column 6:       automnt-        yes/no for automatic mount
#       column 7:       mntopts- -o specific mount options
#       White-space separates columns.
#       Lines beginning with "#" are comments.  Empty lines are ignored.
#       a '-' in any field is a no-op.
/dev/dsk/c${SCSI}d0s${ROOTPART} /dev/rdsk/c${SCSI}d0s${ROOTPART}        /       s5      1       no      -
proc            proc                    /proc   proc    1       no      -
fd              fd                      /dev/fd fd      1       no      -
" > /mnt/etc/vfstab
cat /etc/coffboot /mnt/stand/unix > $BPART ||
       echo "Installation of boot partition failed."
       exit 99
sync
sync
/etc/umount $UPART
sleep 4
echo "Installation complete."
echo "Wait 10 seconds, remove floppy and tape, then reboot.\n"
sync
sync
exec /etc/uadmin 2 0                    # halt system.