#!/bin/bash

#
#	GIER with $NDRUM drum(s), buffer
#
# help3 parameter:
# d1	100	The system will be loaded to this track and on before
#		moving takes place
# d3	0	d3 = 0 means the the drum will contain the free area,
#		d3 = 1 that it will be on buffer disc.
# d4	0	1024 * d52 + d4 is used as the number of blocks on the
# d52	0	buffer disc. Only significant if d3 = 1.
# d5	39	1024 * d46 + d5 is used as the first free block. This
# d46	0	may be changed by init help.
# d9	0	First track of final help. Should only be changed for
#		debugging purpose.
# d11	38	Parameter track.
# d16	294	First track of core image.
# d17	3	by-value for standard paper tape reader.
# d18	512	by-value for HP-button inhibit.
# d19	960	Track group for core image.
# d21	34	First track of catalog (catalog always in group 960).
# d22	1	No. of 320-track drums. Drum disc has d22 = 30.
# d23	4	No. of catalog tracks.
# d32	1	d32 = 0 designates that a special work area is used.
#		If d32 = 1 the free area is used for working.
# d33	0	First track and number of tracks in the special work
# d34	0	area (in group d19). Only significant if d32 = 0.
# d35	0	Running kind of aux. programs. d35=0 drum/disk
# d36	0	Aux. programs reserved. d36=1 reserved from free
# d41	1	d41 = 1 designates that code for treating buffer media
#		will be included. d41 = 0 otherwise.
# d43	17	Help 3 alarm output unit + typewriter input. Is used
#		for all alarm messages and HP-entry run number.
# d44	17	Standard output unit + typewriter input. Is used for
#		normal output from aux. programs and most of HP-entry
#		message.
# d46	0	See d5.
# d50	960	Image group during loading. May be redefined according
#		to d19 in the Help 3 system used for loading.
# d52	0	See d4.
# d53	400	Block length on the buffer disc.
# d54	1	Tape station to which tape programs will be moved.

# Size of system	Buffer		Start
# Main			13		0
# exit			1		13
# start			1		14
# run			1		15
# binin			2		16
# set, res, clear	6		18
# check ...		10		24
# catalog		4		34
# parameter track	1		38
# edit			18		39
# algol			4		57
# binout		5		61
# move			8		66
# slip			23		74
# print			20		97
# free			203		117

# ga4 parameters:
#
#
# e14=90   ; Depending on available drum, first track for reading by slip.
# e4=15    ;     10 _< e4  _< 17  , first core used by translator.
# e20=1022 ; 1005e4 _< e20 _< 1022, last   -    -   -      -
# e38=15   ;     10 _< e38 _< 200 , first core used by translated program.
# e37=1022 ;    800 _< e37 _< 1022, last   -    -   -      -         -
#          ;                       Note below: e37 = 1e37.
# e27=0    ;   0, arrays in core, e18 and e40 must also be 0.
#          ;   1,   -    -  buffer.
# e44=0    ;   0, translator medium is drum.
#          ;   1,     -        -    - a buffer medium.
# e18=0    ;   0, backing store is drum.
#          ; 400,    -      -   -  disc with block length 400.
#  	   ; 640,    -      -   -   -    -     -     -    640.
# e40=0    ; < 0, no tape units , SAMBA record   handling procedures are included.
#          ; = 0, -   -     -   ,   -     -          -        -       - not  -   .
# 	   ; > 0, e40 -     -   ,   -     - and tape -        -       -      -   .
# e69=4    ; 4 _< e69 _< 40 , SAMBA record segment length.

bootstrap_help3 ()
{
cat <<EOF
press mstop
press reg_r1
press clearall
press mstop
press mstart
press mstart
press reg_l
press clearall
#0-6, 8, 21, 24, 31-32, 35, 40.
press set0
press set1
press set2
press set3
press set4
press set5
press set6
press set8
press set21
press set24
press set31
press set32
press set35
press set40
press mstart
press mstop
press reg_r1
press clearall
press set9
press mstop
press mstart
press mstart
press reg_l
press clearall
#7, 20-22, 24-25, 28, 30-31, 34, 40 
press set7
press set20
press set21
press set22
press set24
press set25
press set28
press set30
press set31
press set34
press set40
press mstart
press mstop
press reg_r1
press clearall
press set8
press mstop
press mstart
press mstart
press reg_l
press clearall
#8-19, 21-22, 24, 29, 34
press set8
press set9
press set10
press set11
press set12
press set13
press set14
press set15
press set16
press set17
press set18
press set19
press set21
press set22
press set24
press set29
press set34
press mstart
press mstop
press reg_r1
press clearall
press mstop
press reg_r
press clearall
press reg_m
press clearall
press reg_by
press clearall
loadreader ../tapes/help3/basic track 0 20.08.67.flx
press start
waitinput
loadreader ../tapes/help3bin/basichelp3.flx
type 0
waitinput
EOF
}

load_help3 ()
{
  help3params="$1"
  perm() {
    local items="$1"
    local out="$2"
#   echo perm: $1 $2
    local i
    local sum
    sum=0
    if [ "$items" == "" ]
    then
      for (( i=0; i<${#out}; i++ ))
      do
	c=${out:i:1}
	if [ $BUFFER -eq 1 ]
	then
	  s=${buffersize[$c]}
	  sum=$((sum+s))
	  if [ $sum -eq $limit ]
	  then
	    found=1
	  fi
	else
	  s=${coresize[$c]}
	  sum=$((sum+s))
	  if [ $sum -eq $limit ]
	  then
	    found=1
	  fi
	fi
	if [ $found -eq 1 ]
	then
	  permletters=$out
	  return
	fi
      done
    fi
    for (( i=0; i<${#items}; i++ )) ; do
      perm "${items:0:i}${items:i+1}" "$out${items:i:1}"
      if [ $found -eq 1 ]
      then
	return
      fi
    done
  }
  declare -A fnames
  declare -A buffersize
  declare -A coresize
  letters=""
  while IFS=$'\t' read letter fname bt ct
  do
    letters=$letters${letter}
    fnames[$letter]="$fname"
    buffersize[$letter]=$bt
    coresize[$letter]=$ct
  done <<EOF
a	exit (2) 7.06.68.flx	1	1
b	start (3) 21.09.70.flx	1	1
c	run (2) 10.08.67.flx	1	1
d	binin (1) 22.07.67.flx	2	2
e	clear ... (10) 8.08.67.flx	6	5
f	check ... (12) 1.07.70.flx	10	9
g	edit (9) 8.07.70.flx	18	15
h	algol (2) 8.08.67.flx	4	4
i	binout, ... (2) 9.08.67.flx	5	5
j	move (5) 15.12.68.flx	8	3
k	slip (4) 14.01.69.flx	23	23
l	print ... (12) 23.01.69.flx	20	18
EOF
#for letter in "${!fnames[@]}"
#do
#  echo "$letter - ${coresize[$letter]} ${fnames[$letter]}"
#done

found=0
permletters=""
perm $letters
#echo "permletters: $permletters"

if [ $BUFFER -eq 1 ]
then
  cat <<EOF
loadreader ../tapes/help3/cattap (1) 16.07.67.flx
$(maketext "r<")
$(maketext "1,")
$(maketext "2,")
$(maketext "3,")
$(maketext "4,")
$(maketext "5,")
$(maketext "6,")
press mstop
press hp
waitinput
EOF
fi

cat <<EOF
loadreader ../tapes/help3/Main help (5) 8.08.68.flx
$(maketext "r<")
$(maketext "$help3params")
$(maketext "_l")
loadreader ../tapes/help3/inithelp (4) 13.01.69.flx
$(maketext "_l")
EOF
sum=0
for (( i=0; i<${#permletters}; i++ ))
do
  c=${permletters:i:1}
  echo "loadreader ../tapes/help3/${fnames[$c]}"
  maketext "_l"
  if [ $BUFFER -eq 1 ]
  then
    s=${buffersize[$c]}
  else
    s=${coresize[$c]}
  fi
  sum=$((sum+s))
  if [ $sum -eq $limit ]
  then
    if [ $BDEV -ge 1 ]
    then
      if [ $BDEV -eq 1 ]
      then
	maketext "d36=1"
      fi
      maketext "d35=$BDEV"
    else
      if [ $SKIPCAT -gt 0 ]
      then
	maketext "d1=${SKIPCAT}d1"
      else
	maketext "d36=1"
      fi
    fi
  fi
done
cat <<EOF
loadpunch makedrum${NDRUM}${BUFTEXT}help3.flx
press setka
$(maketext "_e")
$(maketext "_e10")
press mstop
press hp
waitinput
#show printer
#show plotter
#show nimbi
press clearka
show kb2
finishpunch
saveconfig drum${NDRUM}${BUFTEXT}.gier
hide kb2
EOF
}

load_ga4 ()
{
  ga4param="$1"
  firsttrack="$2"
  echo $ga4param | fgrep -q e40
  if [ $? -eq 0 ]
  then
    samba=1
    GA4=ga4samba
  else
    samba=0
    GA4=ga4
  fi

if [ $IMAGEGROUP -gt 960 ]
then
  maketext "slip<"
  maketext "vk$IMAGEGROUP"
  maketext "hsf2"
  maketext "_e10"
fi
cat <<EOF
loadpunch makedrum${NDRUM}${BUFTEXT}${GA4}log.flx
select 3 48
loadreader ../tapes/ga4/T1, L1 (26) 20.07.70.flx
$(maketext "r<")
$(maketext "e14=$firsttrack")
EOF
if [ ! -z "$ga4param" ]
then
  maketext "$ga4param"
fi
cat <<EOF
$(maketext "_l")
loadreader ../tapes/ga4/T2 (22) 13.01.69.flx
$(maketext "_l")
loadreader ../tapes/ga4/T3 (18) 3.10.68.flx
$(maketext "_l")
loadreader ../tapes/ga4/T4 (24) 14.04.70.flx
$(maketext "_l")
loadreader ../tapes/ga4/T5 (25) 14.04.70.flx
$(maketext "_l")
loadreader ../tapes/ga4/T6, L2 (20) 26.07.68.flx
$(maketext "_l")
loadreader ../tapes/ga4/T7, L3 (23) 20.01.69.flx
$(maketext "_l")
EOF
if [ $samba -eq 1 ]
then
cat <<EOF
loadreader ../tapes/ga4/T7, L3 - SAMBA.flx
$(maketext "_l")
$(maketext "_l")
EOF
fi
cat <<EOF
loadreader ../tapes/ga4/T8, L4 (19) 17.07.68.flx
press setka
loadpunch makedrum${NDRUM}${BUFTEXT}${GA4}.flx
select 3 48
$(maketext "_l")
press clearka
loadreader ../tapes/ga4/T9, L5, M1 () 12.08.67.flx
EOF
if [ $IMAGEGROUP -gt 960 ]
then
  maketext "slip<"
  maketext "vk$IMAGEGROUP"
  maketext "hsf2"
  maketext "_e10"
  maketext "print,_i_x15..20<"
# nobuf: 125 271 297
# buf:   137 284 311
#        
  maketext "r<"
  maketext "i=15"
  if [ $BUFFER -eq 0 ]
  then
    maketext "qq$((125+(IMAGEGROUP-960)*960)).39"
    maketext "qq$((271+(IMAGEGROUP-960)*960)).39"
    maketext "qq$((297+(IMAGEGROUP-960)*960)).39"
  else
    maketext "qq$((137+(IMAGEGROUP-960)*960)).39"
    maketext "qq$((284+(IMAGEGROUP-960)*960)).39"
    maketext "qq$((311+(IMAGEGROUP-960)*960)).39"
  fi
else
  maketext "r<"
fi
cat <<EOF
$(maketext "_l")
loadreader ../tapes/ga4/P1 (1) 16.08.67.flx
$(maketext "r<")
$(maketext "$((firsttrack+(IMAGEGROUP-960)*960))")
$(maketext "_l")
EOF
maketext "d35=$BDEV"
maketext "_l"
if [ $BDEV -le 1 ]
then
  if [ $NDRUM -gt 3 ]
  then
    maketext "_l"
    maketext "$FREE"
  else
    maketext "d36=1"
  fi
elif [ $BDEV -eq 2 ]
then
  maketext "1, 0"
elif [ $BDEV -eq 3 ]
then
  if [ $samba -eq 1 ]
  then
  maketext "6, 2, 0"
  else
  maketext "6, 1, 0"
  fi
fi
maketext "_l"
if [ $samba -eq 1 ]
then
maketext "_tsamba;"
else
maketext "_tga4;"
fi
maketext "_l"
if [ $BDEV -eq 1 ]
then
  maketext "600"
  maketext "_l"
fi
cat <<EOF
sleep 1
$(maketext "check,_a<")
sleep 1
show kb2
select 3 32
finishpunch
saveconfig drum${NDRUM}${BUFTEXT}${GA4}.gier
EOF
}

maketext ()
{
  local c
  local t
  t="$1"
  echo "# $1"
  uc=0
  echo -n "$1" | a2flx | od -t u1 -v -w1 >/tmp/maketext.tmp
  while read -r line
  do
    if [ ${#line} -gt 7 ]
    then
      c=${line:8}
      c=$((c))
      c1=$((c&0xe0))
      c2=$((c&0x0f))
      c=$((c1>>1 | c2))
      if [ $c -eq 58 ]
      then
	uc=0
      elif [ $c -eq 60 ]
      then
	uc=1
      fi
      echo TYPE $c
      echo "WAITINPUT"
    fi
  done </tmp/maketext.tmp
  if [ $uc -eq 1 ]
  then
    echo TYPE 58
    echo "WAITINPUT"
  fi
}

#for NDRUM in 1 3 180
for NDRUM in 3
do
  for BUFFER in 0 1
  do
    if [ $NDRUM -eq 3 -a $BUFFER -eq 1 ]
    then
      BDEVS=3
    else
      BDEVS=0
    fi
    for((BDEV=0;BDEV<=BDEVS;BDEV++))
    do
      HELP3PAR=""
      if [ $NDRUM -eq 1 ]
      then
	IMAGE=294
      else
	IMAGE=934
      fi
      FREE=$((103+BUFFER*14))
      if [ $BUFFER -eq 1 ]
      then
	limit=21
      else
	limit=23
      fi
      SKIPCAT=0
      IMAGEGROUP=960
      if [ $NDRUM -gt 3 ]
      then
	limit=1
	if [ $BUFFER -eq 1 ]
	then
	  IMAGEGROUP=961
#	  HELP3PAR=",d21=14,d23=24,d5=960,d32=0,d33=39,d34=895"
	  HELP3PAR=",d16=934,d19=$IMAGEGROUP,d21=14,d23=24,d32=0,d33=0,d34=960,d5=896,d46=1"
	  SKIPCAT=25
	  FREE=137
	else
	  IMAGEGROUP=961
#	  HELP3PAR=",d21=12,d23=26,d5=960,d32=0,d33=39,d34=895"
	  HELP3PAR=",d16=934,d19=$IMAGEGROUP,d21=12,d23=26,d32=0,d33=0,d34=960,d5=896,d46=1"
	  SKIPCAT=27
	  GA4PAR=""
	  GA4SAMBAPAR=""
	  FREE=125
	fi
      fi
      if [ $BUFFER -eq 1 ]
      then
        case $BDEV in
	0)
	  BUFTEXT=buf
	  GA4PAR=""
	  GA4SAMBAPAR=""
	  ;;
	1)
	  BUFTEXT=bufdisk
	  limit=1
	  FREE=39
	  HELP3PAR=",d3=1,d52=1,d4=1006,d46=0,d5=0,d53=600,d32=0,d33=39,d34=895,d21=14,d23=24"
	  GA4PAR=",e44=1,e18=600"
	  GA4SAMBAPAR="${GA4PAR},e40=6"
	  ;;
	2)
	  BUFTEXT=bufcarr
	  limit=1
	  FREE=39
	  HELP3PAR=",d21=14,d23=24,d32=0,d33=39,d34=895"
	  GA4PAR=",e44=1"
	  GA4SAMBAPAR="${GA4PAR},e40=6"
	  ;;
	3)
	  BUFTEXT=buftape
	  limit=1
	  FREE=39
	  HELP3PAR=",d54=6,d21=14,d23=24,d32=0,d33=39,d34=895"
	  GA4PAR=",e44=1"
	  GA4SAMBAPAR="${GA4PAR},e40=6"
	  ;;
	esac
      else
	BUFTEXT=nobuf
      fi
      DEMOFILE=makedrum${NDRUM}${BUFTEXT}.demo
      LOGFILE=makedrum${NDRUM}${BUFTEXT}.log

      if [ $BDEV -eq 1 ]
      then
        BDISK="1 600 2030"
      else
        BDISK="0 0 0"
      fi

      cat >$DEMOFILE <<EOF
init $NDRUM $BUFFER $BDISK
sound 0
hide kb1
hide kb2
hide printer
hide plotter
hide nimbi
EOF

      bootstrap_help3 >>$DEMOFILE
      echo text create drum${NDRUM}${BUFTEXT} >>$DEMOFILE
      load_help3 "d41=$BUFFER,d22=$NDRUM,d16=$IMAGE$HELP3PAR" >>$DEMOFILE
      load_ga4 "e27=$BUFFER$GA4PAR" $FREE >>$DEMOFILE
      load_ga4 "e27=$BUFFER$GA4SAMBAPAR" $FREE >>$DEMOFILE
      echo quit >>$DEMOFILE
      ../GIER $DEMOFILE > $LOGFILE 2>&1
#     mv gier.debug makedrum${NDRUM}${BUFTEXT}.debug
      flx2a <makedrum${NDRUM}${BUFTEXT}help3.flx >makedrum${NDRUM}${BUFTEXT}help3.asc
      flx2a <makedrum${NDRUM}${BUFTEXT}ga4.flx >makedrum${NDRUM}${BUFTEXT}ga4.asc
      ./cnames.pl <makedrum${NDRUM}${BUFTEXT}ga4.asc >>drum${NDRUM}${BUFTEXT}ga4.gier
      cat ctexts.txt >>drum${NDRUM}${BUFTEXT}ga4.gier
    done
  done
done
