GIER/GIER til stregen
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:
- x aksen er tid, i sekunder
- første y akse er kanalnumre, 0-959. Læs kanal plottes med grønt kryds og skriv kanal med rødt kryds.
- 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:
Og for real lig med 1:
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:
- 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.
- Passage 2 læser 274-296 og skriver 297-319 (igen 23 kanaler).
- Passage 3 læser 297-319 og skriver 274-308 (35 kanaler).
- Passage 4 kører baglæns. Der læses fra 308 ned til 274 og skrives fra 319 ned til 285.
- Passage 5 læser 285-319 og skriver 274-308.
- Passage 6 læser 274-308 og skriver først 309-319 og derefter 274-297
- Passage 7 læser først 309-319 og derefter 274-297 og skriver først 298-319 og derefter 274-286
- Passage 8.1: Kanalerne på tromlen flyttes til de laveste kanalnumre. Det skal ske uden at ødelægge kanaler der ikke er flyttet endnu:
- Læs 298-303
- Læs 274-279
- Skriv 274-279
- Læs 280-285
- Skriv 296-301
- Læs 304-309
- Skriv 302-307
- Læs 310-315
- Skriv 280-285
- Læs 316-319
- Skriv 286-295
- 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.
- Passage 8.3: Den genererede kode opdeles i kanaler à 40 ord. Passagen kører baglæns. Læser 307-274, skriver 318-283
- 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å:
- kanal 0 strimmel
- binær strimmel med generel version af HELP3
- 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!