GIER/GIER til stregen

Fra DDHFwiki
Spring til navigation Spring til søgning

Jeg har prøvet at udfordre GIER maskinen ved at oversætte store ALGOL programmer der fylder hele maskinen op.

Det er et simpelt program jeg har brugt:

begin
   integer i;
   i:=1+2+3+4+5+6+ ... n;
   writecr;
   write integer(|<p|>,i)
end;

Vi laver en binær søgning til at bestemme det højeste n der giver et program der kan oversættes.

Jeg bruger et bash script til at teste det af på simulatoren.

Scriptet laver inputstrimlen med ALGOL programmet samt en fil der bruges til demo systemet i simulatoren.

Demosystemet gør, at strimlen lægges automatisk i læseren, der tastes r< på skrivemaskinen og at udskriften fra oversættelsen sendes til en fil via punch'en.

Hvis oversættelsen går godt, skriver oversætteren ok på skrivemaskinen. Går det galt kommer der en fejludskrift. Vi er interesseret i at se hvor langt oversættelsen er nået, så vi slår passage informationsmeddelelserne til ved at kalde oversætteren med i. Der kan se således ud:

n: 6350
begin
1.  192  1023
2.  192     3     3
3.  239     1
4.  239     7     2
5.  239
6. line   5  program too big

Tallet før punktummet er passagenummeret. Det første tal derefter er antallet af tromlekanaler output fra passagen fylder. Tromlen er hér løbet fuld i passage 6. Hvis vi bestemmer det største tal, n, som den GIER konfiguration kan oversætte er vi interesseret i hvilken passage oversættelsen stopper i for n+1.

testit ()
{
  local n=$1
  local tape=/tmp/big.asc
  local demo=findbig.demo
  echo "algol,_i<" >$tape
  echo "n: $n" >>$tape
  echo "_b_e_g_i_n" >>$tape
  echo "_i_n_t_e_g_e_r i;" >>$tape
  echo -n "i:=" >>$tape
  for((i=1; i<=n; i++))
  do
    if [ $i -eq 1 ]
    then
      echo -n "1" >>$tape
    else
      echo -n "+$i" >>$tape
    fi
  done
  echo ";" >>$tape
  echo "writecr;" >>$tape
  echo "writeinteger(|<p|>,i)" >>$tape
  echo "_e_n_d;" >>$tape
  echo "t<" >>$tape
  echo "LOADPUNCH /tmp/bigout.flx" >$demo
  echo "LOADREADER $tape" >>$demo
  echo "WAITINPUT" >>$demo
# r
  echo "TYPE 41" >>$demo
  echo "WAITINPUT" >>$demo
# <
  echo "TYPE 17" >>$demo
  echo "WAITINPUT" >>$demo
  echo "FINISHPUNCH" >>$demo
  echo "QUIT" >>$demo
  ../GIER $demo
  flx2a </tmp/bigout.flx|fgrep -q ok
  result=$?
}

Variablen result sættes til nul hvis strengen "ok" optræder i udskriften fra oversættelsen.

Inden testit funktionen kan startes gør vi en konfigurationsfil (default.gier) parat til simulatoren. Vi prøver en masse forskellige konfigurationer af, med én eller flere tromler, med eller uden buffer og bufferenheder (disk, tape, karrussel).

for config in help3demo big1 buffertape disc1 drumtjek drumtjekga4 drum3bufga4 drum3nobufga4 aarhus drum1bufcarr aarhus2
do
  lo=100
  hi=100000
  lastok=0
  declare -A failpass
  while [ $(expr $hi - $lo) -ne 1 ]
  do
    mid=$(expr $lo + '(' $hi - $lo ')' / 2)
    echo $lo $mid $hi
    cp ../configs/$config.gier default.gier
#         select(16) goes to punch, too:
    echo "Select3	00000030" >>default.gier
    echo "kb1_visible	00000000" >>default.gier
    echo "kb2_visible	00000000" >>default.gier
    testit $mid
    flx2a </tmp/bigout.flx

Ikke alt kan styres vha. demo mode, så vi må bruge nogle tricks: Vi får brug for at dirigere skrivemaskine output til perforatoren for at få fejlmeddelelserne ud af maskinen. Det sker ved at appende en linie til konfigurationsfilen:

    echo "Select3	00000030" >>default.gier

Dette svarer til følgende:

while løkken er den binære søgning. Variablen $mid indeholder det n, som skal testes nu. Efter kaldet af testit udskrives perforatorstrimlen til loggen. Nu kommer resten af koden:

    if [ $result -eq 0 ]
    then
      echo $mid ok
      lastok=$mid
      lo=$mid
    else
      echo $mid bad
      hi=$mid
      lastpass=0
      flx2a </tmp/bigout.flx >/tmp/bigout.asc
#     Find nummeret på fejlende passage:
      while read l
      do
        c1=${l:0:1}
        c2=${l:1:1}
        if [ "$c2" == "." ]
        then
          lastpass=$c1
        fi
      done </tmp/bigout.asc
      echo lastpass: $lastpass
#     Gem passagenummer i hash'et failpass
      failpass[$mid]=$lastpass
    fi
  done
  echo Resultat: config: $config lastok: $lastok failpass: ${failpass[$((lastok+1))]}
done

I den endelige version af scriptet prøver vi nogle flere ting af:

Variablen real kan have værdierne 0, 1 eller 2. Det giver følgende ALGOL programmer:

0:    i:=1+2+3+4+5+ ...;

1:    i:=1.0+2+3+4+5+ ...;

2:    i:=1.0+2.0+3.0+4.0+5.0+ ...;

Variablen transient kan have værdierne 0 eller 1. Hvis den er 1 vælges transient oversættelse. Det kræver indlæsning af flere strimler, meget bekvemt styret af demo-filen.

Variablen diskmode: 0 eller 1. Hvis den er 1 kaldes ALGOL oversætteren med parameteren d.

I scriptet gentages testit med $lastok som parameter. Denne gang er debug udskrift slået til og denne analyseres og gnuplot kaldes der laver et plot med følgende information:

  1. x aksen er tid, i sekunder
  2. første y akse er kanalnumre, 0-959. Læs kanal plottes med grønt kryds og skriv kanal med rødt kryds.
  3. anden y akse er strimmellæsehastigheden vist med blåt kryds, i tegn/sek. Den måles ved at tælle antallet af LY ordre per 1/10 sekund og gange det med 10.

Elapstiden bestemmes ud fra clocktælleren i debug filen.

Logfilen fra scriptet køres igennem følgende perl script:

#!/usr/bin/perl

open IN,$ARGV[0] or die;

print "{| cellspacing=\"0\" border=\"1\"\n";
print "!Config\n";
print "!Real\n";
print "!Transient\n";
print "!Disk\n";
print "!Elapsed\n";
print "!n\n";
print "!failpass\n";

while($l=<IN>)
{
  chomp($l);
  if($l =~ /^Result: real: (\d) transient: (\d) config: (.*?) _d: (\d) elapsed: (.*?) lastok: (.*?) lastpass: (.*?) failpass: (.*?)$/)
  {
    $real = $1;
    $transient = $2;
    $config = $3;
    $disk = $4;
    $elapsed = $5;
    $n = $6;
    $lastpass = $7;
    $failpass = $8;
    die if($lastpass != $failpass);
    print "|-\n";
    print "|$config\n";
    print "|style=\"text-align:center;\" |$real\n";
    print "|style=\"text-align:center;\" |$transient\n";
    print "|style=\"text-align:center;\" |$disk\n";
    print "|style=\"text-align:right;\" |".sprintf("%.0f",$elapsed)."\n";
    print "|style=\"text-align:right;\" |$n\n";
    print "|style=\"text-align:center;\" |$failpass\n";
  }
}
print "|}\n";

Output fra perl pipes til:

xclip -selection c

Og pastes ind i wiki'en hér:

Config Real Transient Disk Elapsed n failpass
help3demo 0 0 0 691 10596 8
help3demo 1 0 0 514 9914 6
help3demo 2 0 0 536 10063 1
help3demo 0 0 1 340 5780 4
help3demo 1 0 1 224 4954 6
help3demo 2 0 1 251 5112 1
help3demo 0 1 0 691 10396 8
help3demo 1 1 0 508 9709 6
help3demo 2 1 0 531 9866 1
help3demo 0 1 1 338 5647 4
help3demo 1 1 1 225 4840 6
help3demo 2 1 1 251 4997 1
big1 0 0 0 1223 22096 8
big1 1 0 0 881 20452 6
big1 2 0 0 900 19283 1
big1 0 0 1 663 11914 3
big1 1 0 1 432 10212 6
big1 2 0 1 474 10323 1
big1 0 1 0 1226 21921 8
big1 1 1 0 872 20246 6
big1 2 1 0 903 19103 1
big1 0 1 1 668 11807 4
big1 1 1 1 434 10120 6
big1 2 1 1 482 10243 1
buffertape 0 0 0 429 6696 8
buffertape 1 0 0 321 6349 6
buffertape 2 0 0 333 6506 1
buffertape 0 0 1 214 3700 4
buffertape 1 0 1 139 3172 6
buffertape 2 0 1 162 3329 1
buffertape 0 1 0 430 6496 8
buffertape 1 1 0 326 6143 6
buffertape 2 1 0 333 6300 1
buffertape 0 1 1 221 3567 4
buffertape 1 1 1 148 3057 6
buffertape 2 1 1 169 3215 1
disc1 0 0 0 1062 15796 8
disc1 1 0 0 798 14669 6
disc1 2 0 0 817 14223 1
disc1 0 0 1 495 8554 3
disc1 1 0 1 324 7332 6
disc1 2 0 1 363 7489 1
disc1 0 1 0 1053 15596 8
disc1 1 1 0 802 14463 6
disc1 2 1 0 824 14043 1
disc1 0 1 1 494 8420 4
disc1 1 1 1 325 7217 6
disc1 2 1 1 360 7375 1
drumtjek 0 1 0 287 4971 8
drumtjek 1 1 0 214 4749 6
drumtjek 2 1 0 243 4906 1
drumtjek 0 1 1 171 2767 4
drumtjek 1 1 1 118 2372 6
drumtjek 2 1 1 137 2529 1
drumtjekga4 0 0 0 62 921 8
drumtjekga4 1 0 0 56 1046 6
drumtjekga4 2 0 0 67 1203 1
drumtjekga4 0 0 1 47 607 4
drumtjekga4 1 0 1 35 520 6
drumtjekga4 2 0 1 41 607 4
drumtjekga4 0 1 0 58 696 8
drumtjekga4 1 1 0 55 840 6
drumtjekga4 2 1 0 65 980 4
drumtjekga4 0 1 1 47 474 3
drumtjekga4 1 1 1 38 406 6
drumtjekga4 2 1 1 43 473 6
drum3bufga4 0 0 0 914 16496 8
drum3bufga4 1 0 0 652 15309 6
drum3bufga4 2 0 0 691 14783 1
drum3bufga4 0 0 1 499 8927 4
drum3bufga4 1 0 1 330 7652 6
drum3bufga4 2 0 1 375 7809 1
drum3bufga4 0 1 0 909 16296 8
drum3bufga4 1 1 0 650 15103 6
drum3bufga4 2 1 0 689 14603 1
drum3bufga4 0 1 1 500 8794 3
drum3bufga4 1 1 1 328 7537 6
drum3bufga4 2 1 1 367 7695 1
drum3nobufga4 0 0 0 1130 16921 8
drum3nobufga4 1 0 0 865 15674 6
drum3nobufga4 2 0 0 868 15103 1
drum3nobufga4 0 0 1 528 9140 4
drum3nobufga4 1 0 1 346 7834 6
drum3nobufga4 2 0 1 384 7992 1
drum3nobufga4 0 1 0 1129 16696 8
drum3nobufga4 1 1 0 847 15469 6
drum3nobufga4 2 1 0 863 14923 1
drum3nobufga4 0 1 1 528 9007 4
drum3nobufga4 1 1 1 347 7720 6
drum3nobufga4 2 1 1 384 7877 1
aarhus 0 0 0 329 5946 8
aarhus 1 0 0 239 5663 6
aarhus 2 0 0 270 5820 1
aarhus 0 0 1 187 3300 4
aarhus 1 0 1 123 2829 6
aarhus 2 0 1 144 2986 1
aarhus 0 1 0 328 5746 8
aarhus 1 1 0 243 5457 6
aarhus 2 1 0 273 5615 1
aarhus 0 1 1 193 3167 4
aarhus 1 1 1 134 2714 6
aarhus 2 1 1 151 2872 1
drum1bufcarr 0 0 0 437 6771 8
drum1bufcarr 1 0 0 325 6417 6
drum1bufcarr 2 0 0 336 6575 1
drum1bufcarr 0 0 1 216 3727 4
drum1bufcarr 1 0 1 141 3194 6
drum1bufcarr 2 0 1 161 3352 1
drum1bufcarr 0 1 0 434 6571 8
drum1bufcarr 1 1 0 329 6212 6
drum1bufcarr 2 1 0 340 6369 1
drum1bufcarr 0 1 1 223 3620 4
drum1bufcarr 1 1 1 150 3103 6
drum1bufcarr 2 1 1 171 3260 1
aarhus2 0 0 0 1293 23271 8
aarhus2 1 0 0 914 21503 6
aarhus2 2 0 0 943 20203 1
aarhus2 0 0 1 696 12527 4
aarhus2 1 0 1 449 10737 6
aarhus2 2 0 1 495 10783 1
aarhus2 0 1 0 1290 23071 8
aarhus2 1 1 0 919 21297 6
aarhus2 2 1 0 970 20023 1
aarhus2 0 1 1 701 12420 4
aarhus2 1 1 1 457 10646 6
aarhus2 2 1 1 504 10703 1

Bemærk at konfigurationen drumtjek (svarer til vores kørende GIER) ikke indeholder ALGOL oversætter, derfor er der kun data for transient oversættelse.

Hvad gør parameteren real godt for?

Jo, lad os se på nogle plots.

Jeg har valgt konfigurationen drumtjekga4 som svarer til vores fysiske GIER, hvor ALGOL oversætteren er indlæst på tromlen (kanal 103 t.o.m. 273). Der er 46 kanaler ledige til oversættelsen og det færdige program.

For real lig med 0 har vi:

Som PDF fil

Og for real lig med 1:

Som PDF fil

PDF fil med alle plots

Lad os se tabellen igen:

Config Real Transient Disk Elapsed n failpass
drumtjekga4 0 0 0 62 921 8
drumtjekga4 1 0 0 56 1046 6

Information fra oversættelsen:

n: 921
begin
1.   23  1023  
2.   23     3     3     
3.   35     1     
4.   35     7     2     
5.   35    
6.   35     5     5     
7.   35     5     
8.   37    46     0   274   
ok

Vi kan følge passagerne for real=0:

  1. Passage 1 læser fra strimmel (blå krydser) og skriver fra kanal 274 til og med 296. Det er 23 kanaler, svarende til det første tal efter "1." i udskriften fra oversættelsen.
  2. Passage 2 læser 274-296 og skriver 297-319 (igen 23 kanaler).
  3. Passage 3 læser 297-319 og skriver 274-308 (35 kanaler).
  4. Passage 4 kører baglæns. Der læses fra 308 ned til 274 og skrives fra 319 ned til 285.
  5. Passage 5 læser 285-319 og skriver 274-308.
  6. Passage 6 læser 274-308 og skriver først 309-319 og derefter 274-297
  7. Passage 7 læser først 309-319 og derefter 274-297 og skriver først 298-319 og derefter 274-286
  8. Passage 8.1: Kanalerne på tromlen flyttes til de laveste kanalnumre. Det skal ske uden at ødelægge kanaler der ikke er flyttet endnu:
    1. Læs 298-303
    2. Læs 274-279
    3. Skriv 274-279
    4. Læs 280-285
    5. Skriv 296-301
    6. Læs 304-309
    7. Skriv 302-307
    8. Læs 310-315
    9. Skriv 280-285
    10. Læs 316-319
    11. Skriv 286-295
  9. Passage 8.2: Kaldte standardprocedurer tilføjes. Hér er der kun tale om én, write integer, som fylder én kanal og lægges i kanal 319.
  10. Passage 8.3: Den genererede kode opdeles i kanaler à 40 ord. Passagen kører baglæns. Læser 307-274, skriver 318-283
  11. Passage 8.4: Running System tilføjes programmet, kanal 274-282

Hele det frie areal på tromlen er nu fyldt med program, fra kanal 274 til og med 319. Det passer fint med at failpass=8, altså øger vi n med én er der ikke plads til det færdige program.

Lad os se hvad der sker for real=1. For real=0 indeholdt programmet

i:=1+2+3+4+5+...;

og for real=1:

i:=1.0+2+3+4+5+...;

Nu bliver n=1046, vi ser udskriften fra oversætteren:

n: 1046
begin
1.   27  1023  
2.   26     3     3     
3.   40     1     
4.   40     7     2     
5.   40    
6.   46     5     5     
7.    1     5     
8.    1    10     0   310   
ok

Se passage 7: Koden skrumper fra 46 kanaler til at fylde bare én kanal.

Forklaringen er, at GIER ALGOL oversætteren indeholder kode til at evaluere udtryk med de 4 regningsarter med konstanter, men kun hvis de er af typen real. Udtryk af typen integer evalueres ikke, derfor sker der ingen reduktion for real=0. Nu er det pludselig passage 6 der bliver flaskehalsen.

I GIER ALGOL II og III var det mere simpelt. Alle beregninger blev lavet som real (med passende koder for afrunding, hvis resultatet skulle bruges som integer).

Resultat af tilsvarende tests på GIER ALGOL II og III:

Config Real Elapsed n failpass
hjælpga2 0 169 3780 4
hjælpga2 1 169 3780 4
hjælpga2 2 175 3399 1
ga3src3 0 798 21620 4
ga3src3 1 798 21620 4
ga3src3 2 714 17603 1
hjælpga3 0 138 3594 4
hjælpga3 1 138 3594 4
hjælpga3 2 137 3238 1

Vi har ikke nogen transiente versioner af de gamle ALGOL oversættere.

Konfigurationer

De forskellige konfigurationer er lavet ved at et bash script laver en lang strimmel bestående af kanal 0, en universel HELP3 som kan køre på alle GIER maskiner efterfulgt at kildeteksterne til HELP3 som bygger en version til den pågældende maskine. Kildeteksten indledes med parametre der definerer maskinen. Parameterne er beskrevet i A Manual of HELP 3 fra side 17.

Den genererede strimmel kan indlæses i en tom GIER med de tre ordre i celle 0-2 som beskrevet på side 24 sammesteds.

Scriptene ligger i folderen tapes/help3 i simulatoren.

Hér følger en kort beskrivelse af konfigurationerne.

help3demo

En maskine med buffer og en disk, der erstatter tromlen. Denne konfiguration er ikke lavet vha. et script, men ved at følge beskrivelsen i GIER tutorialen.

Work arealet er på 434 kanaler.

big1

Scriptet hedder dobig1.com

Systemet har 3 tromler, buffer og buffer disk, 6 båndstationer og karrusel. Free er placeret på bufferdisken.

Work starter på kanal 39 og fylder 895 kanaler. Work kan kun være på tromlen eller en disk, der erstatter tromlen.

De fleste HELP3 programmer og ALGOL oversætter er på bufferdisken.

buffertape

Systemet har én tromle, buffer med båndstationer. De fleste af HELP3 programmerne og ALGOL oversætteren ligger på båndstation nr. 6.

disc1

Disk, der erstatter tromlen. Ingen buffer.

drumtjek

Den konfiguration vi bruger på den kørende GIER. Ingen buffer. Ingen ALGOL oversætter - man kan bruge den transiente oversætter. Free er på 217 kanaler.

drumtjekga4

Som drumtjek, men med indlæst ALGOL oversætter. Free er på 46 kanaler.

drum3bufga4

Tre tromler og buffer.

drum3nobufga4

Tre tromler, ingen buffer.

aarhus

Kopi af Århus GIER, modtaget fra Claus Hilberg. Én tromle, buffer med disk og båndstationer.

Bemærk at denne maskine er modificeret så HP knappen gemmer celle 0-39 på kanal 1 i stedet for kanal 38.

drum1bufcarr

En tromle, buffer med karrussel. HELP3 programmer på karrussellens spole 0, GA4 på spole 1.

big3

Konfiguration der ikke virker :-)

aarhus2

Inspireret af Århus GIER'en har jeg lavet en version hvor HP knappen gemmer celle 0-39 på kanal 959.

Maskinen har tre tromler, buffer og disk på bufferen.

Work starter på kanal 18 og fylder 941 kanaler, overlappende image.

big4ga4

Det er en maskine med disk i stedet for tromle og buffer med disk på.

Disken i stedet for tromlen er opdelt i 10 grupper à 960 kanaler. Kanal 0, kataloget, exit programmet og kernen af help3 er i gruppe 0 og gruppe 1 består udelukkende af work på 960 kanaler, overlappende med image. image og work skal være i samme gruppe. Indlæsning af ga4 gav nogle problemer når image ikke ligger i gruppe 0. Fx på et tidspunkt havde jeg en fungerende oversætter der kunne fint oversætte testprogrammet hér - men man kunne ikke køre programmet fordi alle kanalerne med standardprocedurerne var læst fra den forkerte diskgruppe.

Tabellen bliver:

Config Real Transient Disk Elapsed n failpass
big4ga4 0 0 0 1648 23746 8
big4ga4 1 0 0 1213 21937 6
big4ga4 2 0 0 1182 20583 1
big4ga4 0 0 1 729 12794 3
big4ga4 1 0 1 474 10966 6
big4ga4 2 0 1 516 10983 1
big4ga4 0 1 0 1642 23546 8
big4ga4 1 1 0 1196 21732 6
big4ga4 2 1 0 1203 20403 1
big4ga4 0 1 1 738 12660 4
big4ga4 1 1 1 484 10852 6
big4ga4 2 1 1 524 10883 1

Jeg vil lave en ny distribution 20211228. Scriptene omtalt på denne side ligger i folderen big.

Skabning af GIER HELP3 konfigurationer

I folderen tapes/help3 findes nogle scripts til at lave færdige konfigurationer af HELP3 systemet på en GIER.

Ideen er, at man laver én strimmel med det hele på:

  1. kanal 0 strimmel
  2. binær strimmel med generel version af HELP3
  3. kildetekst til at bygge HELP3 med de rigtige parametre

Vi kigger på hvordan en sådan strimmel laves:

Først sætter vi kildeteksten sammen. Vi starter med:

flx2a <"Main help (5) 8.08.68.flx" | tac | sed '0,/_s/{//d;}' | tac | \
       sed -e '/_iredefine/{ N; s/_s/d3=0,d16=934,d19=969,d21=14,d22=30,d23=24,d32=0,d33=0,d34=960,d41=1/g }' >BUILDbig5.asc

flx2a programmet laver flexowriter filen "Main help (5) 8.08.68.flx" om til ASCII.

Kombinationen

| tac | sed '0,/_s/{//d;}' | tac |

bliver brugt mange gange. tac programmet (cat skrevet bagfra) vender filen om så sidste linie skrives ud først. Kaldet af sed fjerner den første (dvs. den sidste før tac) linie med s. Når kildetekst strimlerne indlæses normalt afsluttes de hver med:

s

som får assembleren til at stoppe indlæsning fra strimmel og gå videre med indlæsning fra skrivemaskine. Det er så meningen at operatøren lægger den næste strimmel i læseren og skriver:

l

på skrivemaskinen og indlæsningen fortsætter. Vi vil lave en strimmel som indlæses ud i ét, derfor fjernes s.

Det næste er:

sed -e '/_iredefine/{ N; s/_s/d3=0,d16=934,d19=969,d21=14,d22=30,d23=24,d32=0,d33=0,d34=960,d41=1/g }'

Sed leder efter teksten iredefine og erstatter s i næste linie med:

d3=0,d16=934,d19=969,d21=14,d22=30,d23=24,d32=0,d33=0,d34=960,d41=1

Det er de parametre der bestemmer HELP3 konfigurationen. De er beskrevet på side 17 og frem i A Manual of HELP3.

  • d3=0: Free er på tromlen (i modsætning på en bufferdisk)
  • d16=934: Image starter på kanal 934
  • d19=969: Image og work ligger i gruppe 9 på disken
  • d21=14: Kataloget starter i kanal 14
  • d22=30: Tromlen er erstattet af en disk, som svarer til 30 tromler
  • d23=24: Kataloget fylder 24 kanaler
  • d32=0: Der benyttes separat work
  • d33=0: work starter i kanal 0 (i gruppe 9)
  • d34=960: og fylder 960 kanaler
  • d41=1: Inkludér kode til at håndtere buffer enheder (fx magnetbånd)

Så appender vi resten af HELP3 og hjælpeprogrammerne. Det første hjælpeprogram, exit, placeres på en fast kanal 13, resten tages fra det frie areal. Linien "d36=1" gør at de efterfølgende programmer gemmes i free.

flx2a <"inithelp (4) 13.01.69.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"exit (2) 7.06.68.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
echo "d36=1,d35=0" >>BUILDbig5.asc
flx2a <"binin (1) 22.07.67.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"binout, ... (2) 9.08.67.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"start (3) 21.09.70.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"algol (2) 8.08.67.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"check ... (12) 1.07.70.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"clear ... (10) 8.08.67.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"run (2) 10.08.67.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"edit (9) 8.07.70.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"move (5) 15.12.68.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"slip (4) 14.01.69.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
flx2a <"print ... (12) 23.01.69.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDbig5.asc
echo "_e10" >>BUILDbig5.asc

Til sidst laver vi den færdige strimmel:

Den starter med kanal 0 og den generelle version af help3:

cat "basic track 0 20.08.67.flx" ../help3bin/basichelp3.flx > BUILDbig5.flx

Så laver vi kildetekstfilen til flexowriterkode og appender:

sed 's/#061#...//g' BUILDbig5.asc |sed 's/#061.//g'|a2flx >> BUILDbig5.flx

Kaldet af sed fjerner checksumkoderne fra filerne. Checksum er lavet med tegnet 61 (skrevet som #061) efterfulgt af en checksum. Checksummerne passer ikke længere når vi har rettet i filerne.

Strimlen kan nu indlæses i simulatoren. Vælg File, New. Vælg 1 Disc og Create Buffer.

På en rigtig GIER vil man nu lægge ordre ind i de tre første celler, nulstille R, M, by og r1 registrene og trykke normal start. På simulatoren er det mere simpelt, den "tomme" maskine er født med ordrene i de tre celler og alle registre er nulstillet. Man skal bare lægge strimmelfilen i læseren og trykke normal start. Skrivning på kanalerne 0 og 1-31 må ikke være spærret.

Efter indlæsning af kanal 0 skriver GIER:

SUM

og resten af den binære version af HELP3 indlæses ved et tryk på mellemrumstasten. GIER skriver:

 0    0.0.0  e0

Datoen er ikke sat endnu, derfor 0.0.0. Resten af strimlen indlæses nu med:

r<

GIER lister navnene på de enkelte strimler efterhånden som de indlæses. Til sidst skrives:

p0    2.6.67  e354

Vi kan sætte datoen med:

start,30.12.21<

Kanal 0 kan nu skrivebeskyttes, men ikke kanal 1-31 da kataloget ligger på nogle af disse kanaler.

Gem konfigurationen!

Skabning af GIER ALGOL 4 konfigurationer

På samme måde er der i folderen tapes/ga4 scripts der laver en strimmel med kildetekst til GIER ALGOL 4.

Den GIER ALGOL 4 version der passer til ovenstående HELP3 version var ikke helt nem at lave.

Vi starter med et lille program som sætter disk gruppe registret til gruppe 9 (969). Hvis man ikke gør dette får man fejl senere i indlæsningen:

echo "slip<" >BUILDga4drumdisk969.asc
echo "vk969" >>BUILDga4drumdisk969.asc
echo "hsf2" >>BUILDga4drumdisk969.asc
echo "_e10" >>BUILDga4drumdisk969.asc

Første del af oversætteren tilføjes nu med de rigtige parametre:

flx2a <"T1, L1 (26) 20.07.70.flx" | tac | sed '0,/_s/{//d;}' | tac | sed -e '/_i redefine/{ N; s/_s/e14=50,e27=1/g }' >>BUILDga4drumdisk969.asc
  • e14=50: Indlæsning starter i kanal 50
  • e27=1: Arrays lægges i buffer

Jeg havde en sjov oplevelse med e14 parameteren. Indlæsningen sker jo til gruppe 9 som er helt tom, så man burde kunne starte i kanal 0 i den gruppe (den rigtige kanal 0 ligger i gruppe 0 (960)). Men det går galt, slip genererer forkert kode. Det samme sker for alle e14 mindre end 5. Den forkerte kode består af kode hvor slip ikke har indsat variable der er brugt før de er defineret.

Så følger resten af strimlerne:

flx2a <"T2 (22) 13.01.69.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc
flx2a <"T3 (18) 3.10.68.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc
flx2a <"T4 (24) 14.04.70.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc
flx2a <"T5 (25) 14.04.70.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc
flx2a <"T6, L2 (20) 26.07.68.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc
flx2a <"T7, L3 (23) 20.01.69.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc
flx2a <"T8, L4 (19) 17.07.68.flx" >>BUILDga4drumdisk969.asc

Nu kommer der noget der er specielt fordi image ikke ligger i gruppe 0:

echo "print,_i_x15..17<" >>BUILDga4drumdisk969.asc
echo "slip<" >>BUILDga4drumdisk969.asc
echo "i=15" >>BUILDga4drumdisk969.asc
# 50
echo "qq8690.39" >>BUILDga4drumdisk969.asc
# 148
echo "qq8837.39" >>BUILDga4drumdisk969.asc
# 175
echo "qq8864.39" >>BUILDga4drumdisk969.asc
echo "_h" >>BUILDga4drumdisk969.asc
echo "print,_i_x15..17<" >>BUILDga4drumdisk969.asc

Den første linie udskriver indholdet af celle 15-17 som heltal. Vi skal nu lægge 9*960 til de tre tal med et nyt kald af slip. Derefter skrives de rettede celler ud med et nyt kald af print.

Den sidste strimmel med oversætteren tilføjes:

flx2a <"T9, L5, M1 () 12.08.67.flx" | tac | sed '0,/_s/{//d;}' | tac >>BUILDga4drumdisk969.asc

Til sidst tilføjes strimlen med P1 som er en del af HELP3:

flx2a <"P1 (1) 16.08.67.flx" | sed -e '/_itype: actual/{ N; s/_s/8690/g }' \
       | sed -e '/_itype: d35/{ N; s/_s/d35=0/g }' \
       | sed -e '/_iif reserved/{ N; s/_s/d36=1/g }' \
       | sed -e '/_itype: _tname/{ N; s/_s/_tga4;/g }' >>BUILDga4drumdisk969.asc

Der er også lavet nogle rettelser. Den første er adressen på hvor oversætteren er indlæst (50+9*960), d35=0 betyder at vi får oversætteren gemt på tromle/tromledisk, d36=1 at den bliver reserveret fra det frie areal og til sidst navngivet med standardnavnet: ga4.

Vi slutter af med at fjerne checksummer:

sed 's/#061#...//g' BUILDga4drumdisk969.asc |sed 's/#061.//g'|a2flx > BUILDga4drumdisk969.flx

Strimlen indlæses med r<. Indlæsningen stopper og man fortsætter ved at skrive r<. Til sidst står der:

type:  tname of translator;

og med rødt en linie med datoen.

Udskriv kataloget med:

list,a<

og man ser oversætteren til sidst:

0,  173, 137,  p r i s 0.0.0.0
    ga4,  10.199.199.0

Den fylder 173 kanaler, startende i kanal 137.

Gem konfigurationen!