|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 49152 (0xc000)
Types: TextFile
Names: »open4tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »open4tx «
\f
; jz.fgs 1984.03.05 algol 6, open and close page ...1...
;b. h100 block with fp-names
b. g1, i12 ; block for tail parts
w.
s. c12, e12 ; slang segment
w.
b. j20 ; block for first segment open
w.
k=0
h.
c1: c2 , c3 ; rel last point , rel last abs word
j1: 13 , 0 ; rs last used
j2: 30 , 0 ; rs saved stackref
j3: 4 , 0 ; rs take expr
j4: 16 , 0 ; rs base of segment table
j5: 36 , j15 ; rs parent message
j6: 8 , 0 ; end addr ex
j7: 21 , 0 ; general alarm
j9: 60 , 0 ; rs last of segment table
j13: 85 , 0 ; rs current activity no
j12: 1<11+3, 0 ; ref to fourth segment (array for docname)
c2=k-2-c1
c3=k-2-c1
w.
e4:i4: 0,0, s3, s4 ; external list
j18=64 ; slang constant, buflength error in zonestate
b. a20, b19, d4 ; block for local names in open
w.
b1: h6 ; share descriptor length
b2: 0 ; saved return
b3: 0, 0 ; save zone, name addr
b4: 1<18 ; test end of paper
b6: <:<10>z.state :> ; zone state error
b7: <:<10>kind:> ; kind error
b12: 7<13+0, <:mount :>,0 ; parent message, no wait
b13: 8<13+0, <:wait for :>; parent message, no wait
b14: 12<13+0, <:load :> ; parent message, no wait
b15: 2.11111 ; mask for kind
b16: <:<10>segment:> ; text for segment alarm
\f
; jz.fgs 1981.06.02 algol 6, open and close page ...2...
i0:
e0: rl. w2 (j1.) ; entry open: get last used;
ds. w3 (j2.) ; save stackref;
rl w1 x2+8 ; zoneaddr:=first formal.2;
rl w0 x1+h2+6 ; zonestate:=stat(zone);
se w0 4 ; if zonestate<>after decl then
jl. d1. ; goto zonestate error;
ld w0 -100 ;
ds w0 x1+h1+10 ; name table addr := 0
ds w0 x1+h1+6 ; second part(process name):=empty;
rs w0 x2+6 ; first:=0;
dl w1 x2+16 ; start checking:
la. w0 b15. ; isolate kind
se w0 24 ; if string variable
sn w0 28 ; or long variable
jl. a6. ; then goto string
se w0 4 ; if long procedure
sn w0 12 ; or expression
jl. a0. ; then goto take
rl. w3 (j12.) ; ref to fourth segm
se w0 8 ; if not string expression
jl w3x3+e5 ; then goto third segm, array in doc
a0: dl w1 x2+16 ; take:
so w0 16 ; pointer:=take formal(name);
jl. w3 (j3.) ; save stackref;
ds. w3 (j2.) ;
al w3 a4;=a0-a7
hs. w3 b11. ; continue:=take
a6: dl w0 x1 ; string:
sl w0 0 ; text:=double(pointer);
jl. a1. ; if text=point then
hs. w3 b10. ; begin
bz w3 6 ;
ls w3 1 ; w3:=segm*2 + segm table base;
wa. w3 (j4.) ;
rl. w0 (j9.) ; if segment tab addr
sh w0 x3-2 ; >= last of segtable
jl. d4. ; then goto segment alarm
rl w3 x3 ;
rl w0 x3 ; load first word on text segment;
b10=k+1 ;
al w1 x3+0 ; w1:=text addr;
al w3 a9;=a6-a7
hs. w3 b11. ; continue:=string;
dl w0 x1 ; w3-0:=string portion;
am -8 ; text addr:=text addr-8
; comment texts on drum are stored backwards
; end;
\f
; fgs 1988.03.01 algol6, open and close page ...3...
a1: al w1 x1+4 ; text addr:= text addr+4 ; comment
; text protions in longs are stored forward
rx w1 x2+6 ; swop text addr, first;
am (x2+8) ;
ds w0 x1+h1+4 ; process name(first):=string portion;
sz w0 127 ;
se w1 0 ; if last char<>empty and first=0 then
jl. a8. ; begin
al w1 4 ; first:=4; w1:=text addr;
rx w1 x2+6 ;
b11=k+1 ; goto take or string (continue)
a7: jl. a6. ; comment the address here is changed
; by take and string = point; end
a8: al w3 a6-a7 ;
hs. w3 b11. ; continue:=string;
e1: ; return from segm 3 after array param
a2: dl w1 x2+12 ;
so w0 16 ;
jl. w3 (j3.) ; get modekind addr;
ds. w3 (j2.) ; save stackref;
bz w3 x1-1 ;
bz w0 x1 ; w3:=mode:=byte(modekind addr-1);
ds w0 x2+12 ; w0:=kind:=byte(modekind addr);
so w0 1 ; if kind odd or
sl w0 21 ; greater than 20 then
jl. d2. ; goto kind error;
\f
; fgs 1988.03.01 algol 6, open and close page ...4...
rl w1 x2+8 ; w1:=zone addr;
rl w3 x2+12 ; w3:=kind;
al w0 -1<11 ;
wa w0 x2+10 ; mode(zone):=1<11+mode;
hs w0 x1+h1+0 ; kind(zone):=kind;
hs w3 x1+h1+1 ;
se w3 20 ; zone.state :=
sn w3 18 ; if zone.kind = mt
am 8 ; or zone.kind = imc then
al w0 0 ; not positioned <*or not connected*>
rs w0 x1+h2+6 ; else
; after open;
dl w1 x2+20 ;
so w0 16 ;
jl. w3 (j3.) ; get giveupmask;
ds. w3 (j2.) ; save stackref;
rl w0 x1 ; w0:=give up mask;
rl w1 x2+8 ; w1:=zone addr;
rs w0 x1+h2+0 ; giveupmask(zone):=giveupmask;
rl w0 x1+h0+8 ;
ws w0 x1+h0+6 ;
al w3 0 ; no of shares:=w0:=
wd. w0 b1. ; (last share-first share)//
ba. w0 1 ; share descr length + 1;
rl w3 x2+12 ; w3:=kind;
se w3 4 ; share unit :=
sn w3 6 ; w1 :=
am 510 ; if kind=bs then 512 else 2;
al w3 2 ;
rx w3 2 ; w3:=zone addr;
rs w1 x2+6 ;
wm w1 0 ; w0-1:=no.of shares*share unit;
rl w0 x3+h0+2 ; sharelength:=w0:=
ws w0 x3+h0+0 ; (last buf-base buf)//
al w3 0 ;
b9=k+1 ; constant 2 ;
wd w0 2 ; (no of shares*shareunit)*
wm w0 x2+6 ; shareunit;
rl w1 x2+8 ; w1 := zone address;
rl w3 x1+h2+6 ; w3 := state add
al w3 x3+j18 ; buflength errror;
sn w0 0 ; if sharelength = 0 then
rs w3 x1+h2+6 ; zone.state := w3;
\f
; fgs 1983.12.07 algol 8, open and close page ...5...
bs. w0 b9. ; sharelength:=sharelength-2;
rs w0 x2+6 ;
rl w3 x1+h0+6 ; w3:=share:=first share;
rl w0 x1+h0+0 ; w0:=addr:=base buf-1;
bs. w0 1 ;
a3: ba. w0 b9. ; next share:
rs w0 x3+2 ; first shared(share):=w0:=
rs w0 x3+8 ; first addr mess(share):=addr:=addr+2;
wa w0 x2+6 ;
rs w0 x3+4 ; last shared(share):=w0:=
rs w0 x3+10 ; last addr message(share):=addr:=addr+sharel.;
rx w0 x2+10 ; swop addr, mode;
rs w0 x3+7 ; mode of message(share):=mode; op:=0;
rx w0 x2+10 ; swop mode, addr;
al w3 x3+h6 ; share:=w3:=share+shdescr length;
sh w3 (x1+h0+8) ; if share<=last share then goto next share;
jl. a3. ;
\f
; jz.fgs 1983.12.07 algol 6, open and close page ...6...
al w0 1 ;
rs w0 x1+h2+4 ; partial word:=1;
rl w3 x1+h0+6 ; w3:=first share;
wa w0 x3+4 ;
rs w0 x1+h3+2 ; last byte:=last shared(first share)+1;
ld w0 -100 ;
ds w0 x1+h1+14 ; filecount:=blockcount:=
rs w0 x1+h1+16 ; segmentcount:=
rs w0 x1+h3+4 ; recordlength:=0;
rl w2 x2+12 ; w2:=kind; w1=zone.
al w3 x1+h1+2 ; w3:=name addr;
jd 1<11+6 ; initialise process;
se w2 10 ;
sn w2 16 ; if kind=tr or cr then
jl. a10. ; goto wait reader;
sn w2 18 ; if kind<>mt
se w0 3 ; or process exists then
jl. (j6.) ; goto end addr expr;
al w2 x1 ; w2:=zone;
al. w1 b12. ;
rl. w3 (j5.) ; parent message(<:mount:>);
j15=k+1 ;
jl w3 x3+j16 ;
jl. (j6.) ; goto end addr expr;
a10: al w2 x1 ; wait reader: w2:=zone;
ds. w3 b3.+2 ; save zone, name addr;
sn w0 0 ; if initialised then
jl. a5. ; goto clean reader;
se w0 1 ; if not reserved by another then
jl. (j6.) ; goto end addr expr;
al. w1 b13. ;
rl. w3 (j5.) ; parent message(<:wait for:>);
j16=k+1 ;
jl w3 x3+j17 ;
a11: rl. w3 (j12.) ; rep:
jl w3 x3+e9 ; wait a second; w3:=name addr;
rl. w3 b3.+2 ;
jd 1<11+6 ; initialise process;
sn w0 1 ; if reserved by another then
jl. a11. ; goto rep;
a5: jl. w2 a12. ; clean reader: read a block;
jd 1<11+26 ; get event;
so. w0 (b4.) ; if not end of paper then
jl. a5. ; goto clean reader;
jd 1<11+6 ; initialise process (lowercase)
al. w1 b14. ;
rl. w2 b3. ; w2:=zone;
rl. w3 (j5.) ; parent message(<:load:>);
j17=k+1 ;
jl w3 x3+0 ;
a13: rl. w3 (j12.) ; rep:
jl w3 x3+e9 ; wait a second; w3:=name addr;
rl. w3 b3.+2 ;
jl. w2 a12. ; read a block;
rl w1 x2+10 ; w1:=bytes transferred;
se w1 0 ; if something read then
jl. (j6.) ; goto end addr expr;
jd 1<11+26 ; get event;
jl. a13. ; goto rep;
\f
; jz.fgs 1983.12.07 algol 6 open and close page ...7...
a12: rs. w2 b2. ; read a block: save return, w3=name addr;
rl w1 x3-h1+h0+4; w1:=first share;
al w0 3 ; operation:=read;
hs w0 x1+6 ; first addr initialised in open.
al w1 x1+6 ; w1:=mess addr;
rl. w2 (j13.) ; w2 := current activity no;
jd 1<11+16 ; send message;
rs w2 x1-6 ; share state:=buf addr;
al w2 0 ; w2:=start event queue;
a14: rl w0 x2+8 ; rep: w0:=expected status word;
sn w2 (x1-6) ; if event=share state then
jl. a15. ; goto check answer;
jd 1<11+24 ; wait event;
jl. a14. ; goto rep;
a15: rl w1 x2+4 ; check answer:
se w1 1 ; if -, normal answer then
jl. (j6.) ; goto end addr expression;
jl. (b2.) ; return;
d1: al. w0 b6. ; zone state alarm:
rl w1 x1+h2+6 ;
jl. w3 (j7.) ; general alarm(<:z.state:>,state);
d2: bz w1 x2+13 ; kind error:
al. w0 b7. ; general alarm(<:kind:>,kind);
jl. w3 (j7.) ;
d4: al. w0 b16. ; segment alarm:
al w1 x3 ; goto general alarm
jl. w3 (j7.) ; (<:segment:>, attempted no);
a4=a0-a7
a9=a6-a7 ;
m.open
i.
e.;end block for open
j20: c. j20-506
m. code on segment 1 too long
z.
c. 502-j20
0,r.(:504-j20:)>1 ; fill with zeroes
z.
<:open <0><0><0>:> ; alarm text segment 1
m.segment 1
i.
e.;end block for segment 1
\f
; jz.fgs 1988.11.21 algol 6, open and close page ...8...
b. j20, d4 ; block for segment 2
w.
k=0
h.
c4: c5 , c6 ; rel last point, rel last absword
j1: 30 , 0 ; rs saved stackref
j2: 4 , 0 ; rs take expr
j3: 8 , 0 ; rs end addr ex
j4: 13 , 0 ; rs last used
j6: 36 , j8 ; parent message
j7: 21 , 0 ; general alarm
j14: 85 , 0 ; rs current activity no
j13:101 , 0 ; rs latest answer
c6=k-2-c4
j10: 1<11, j19 ; point in term zone
j11: 33 , 0 ; point in rs check
j12: 35 , 0 ; point in outblock
c5=k-2-c4
w.
j15: -1-64 ; mask for removal of buflength error from zonestate
j16: -1-32 ; - - - - inout - -
j17=32 ; slang constant, inout bit in zonestate
b. a20, b5 ; block for internal procedure term zone
w.
i5: rl. w2 (j4.) ; external entry termzone: w2 := last used;
ds. w3 (j1.) ; save w2, w3;
jl. j19. ; goto continue;
c0: rl. w1 j10. ; internal entry term zone:
jl. (j2.) ; stack return point;
; i.e. take expression continue next
j19: dl. w3 (j1.) ; w2:=saved sref;
rl w1 x2+8 ; w1:=zone addr;
al w0 0 ;
rs w0 x2+6 ; share start:=0;
rl w3 x1+h2+6 ; state := zone.state except
la. w3 j15. ; buflength error bit;
se w3 j17+9 ; if state = after inoutrec then
jl. a11. ; state := if zone = inputzone
se w1 (x1+h2+2) ; or zone = expelled outzone then
sn w1 (x1+h2+4) ; after inrec
am -1 ; else
al w3 6 ; after outrec;
a11: se w3 j17 ; if state = after openinout
sn w3 j17+8 ; or state = after openinout on magtape then
al w3 x3-j17 ; state := state - inout bit;
sh w3 8 ;
sh w3 -1 ;
jl. a4. ; if state>8 or state<0 then alarm;
bz. w3 x3+b0. ;
a0: jl. x3 ; switch to action(zone state);
a1: rl w3 x1+h2+4 ; terminate partial word: after write
sn w3 1 ; if partial word=empty then
jl. a2. ; goto terminate block;
ns w3 0 ; normalise partial word and
ls w3 2 ; remove 2 first bits;
al w0 2 ;
wa w0 x1+h3+0 ;
rs w0 x1+h3+0 ; recordbase:=recordbase+2;
rs w3 (0) ; word(record base):=characters(partial word);
al w3 1 ; zone.partial word :=
rs w3 x1+h2+4 ; empty;
al w3 0 ; zone.record length :=
rs w3 x1+h3+4 ; 0;
a2: rl w3 x1+h0+4 ; terminate block: after outrec, swoprec
al w3 x3+h6 ; w3:=share:=used share+descr length;
sh w3 (x1+h0+8) ; if share>last share then
jl. a13. ;
rl w3 x1+h0+6 ; w3:=share:=first share;
a13: rl w2 x3 ; w2:=share state;
bz w0 x3+6 ; w0:=operation;
sn w0 3 ; if share pending and
sh w2 1 ; opr(share)=input then
jl. a3. ; begin comment only after swoprec.
al. w1 (j13.) ; prepares for call of outblock, which
jd 1<11+18; must not check the input operation;
al w0 0 ; wait answer(share);
rs w0 x3 ; state(share)=free end;
\f
; fgs 1988.12.01 algol 6 open and close page ...10...
a3: dl. w3 (j1.) ; restore stackref;
rl w1 x2+8 ; w1:=zoneaddr;
rl w0 x1+h3+0 ;
wa w0 x1+h3+4 ; w0:=last:=recordbase+recordlength;
rl w3 x1+h0+4 ; w3:=used share;
sh w0 (x3+2) ; if last <= used share.first shared then
jl. a5. ; goto count share; <*block is empty*>
bs. w0 1 ; last := last - 1;
bz w2 x1+h1+1 ; w0=last. w2:=kind;
sl w2 4 ; if kind = area process
sl w2 8 ; or kind = disc process then
jl. a8. ; begin
ws w0 x3+2 ; w0:=last-first shared+512;
ba. w0 b2. ;
ls w0 -9 ; w0:=last:=w0//512*512 + first shared - 2;
ls w0 9 ;
bs. w0 b3. ;
wa w0 x3+2 ; end;
a8: rs w0 x3+10 ; last addr message:=last;
ld w1 28 ; w0:=zone addr shift 4;
dl. w3 (j1.) ; w2:=saved sref;
rl. w1 j12. ;
jl. w3 (j2.) ; outblock(used share);
ds. w3 (j1.) ; restore saved stackref;
rl w1 x2+8 ; restore zone addr;
a5: rl w3 x1+h0+4 ; count share:
al w3 x3+h6 ; used share:=w3:=used share+share descr length;
sh w3 (x1+h0+8) ;
jl. a14. ; if used share>last share then
rl w3 x1+h0+6 ; used share:=first share;
a14: rs w3 x1+h0+4 ;
a6: rl w3 x1+h0+4 ; terminate zone: after all legal states
rl w0 x2+6 ; w0:=share start;
se w0 0 ; if share start=0 then
jl. a15. ;
rs w3 x2+6 ; share start:=used share
jl. a16. ; else
a15: sn w0 x3 ; if share start=used share then
jl. a9. ; goto zone stopped;
a16: bz w0 x3+6 ; w0:=operation;
sn w0 3 ; if operation<>input then
jl. a7. ; begin positioning checked to allow empty
al w0 x1 ; output file on magtape;
ls w0 4 ; w0:=zone addr shift 4;
rl. w1 j11. ;
jl. w3 (j2.) ; check(used share);
ds. w3 (j1.) ; restore saved stackref, zone addr;
rl w1 x2+8 ; goto count share;
jl. a5. ; end;
\f
;jz.fgs 1984.04.27 algol 6 open and close page ...11...
a7: rl w2 x3 ; w2:=share state;
al. w1 (j13.) ;
sl w2 2 ; if share pending then
jd 1<11+18 ; w0:=wait answer(used share);
dl. w3 (j1.) ; restore stackref;
rl w1 x2+8 ; restore zone addr;
al w0 0 ;
rs w0 (x1+h0+4) ; state(used share):=0;
jl. a5. ; goto count share;
a9: rl w3 x1+h0+6 ; zone stopped:
rs w3 x1+h0+4 ; w3:=used share:=first share;
bz w0 x1+h1+1 ; w0:=kind;
se w0 18 ; if kind<>mag tape then
jl. a12. ; goto exit;
zl w0 x1+h1+0 ; w0 := zone.mode;
sz w0 1 ; if w0 odd then
jl. a12. ; goto exit;
rl w2 x1+h2+6 ; w2:=zone state;
se w2 3 ; if zone state = after write
sn w2 6 ; or after outrec then
jl. a10. ; goto out mark;
se w2 j17+9 ; if state <> after inoutrec then
jl. a12. ; goto exit;
se w1 (x1+h2+2) ; if zone = input zone
sn w1 (x1+h2+4) ; or zone = expelled zone then
jl. a12. ; goto exit;
a10: al w0 10 ; out mark: w3=used share.
hs w0 x3+6 ; operation:=output mark;
rx w3 2 ; w3:=zone; w1:=share;
al w3 x3+h1+2 ; w3:=name addr;
al w1 x1+6 ; w1:=message addr;
rl. w2 (j14.) ; w2 := current activity no;
jd 1<11+16 ; w2:=send message(w1,w3);
sn w2 0 ; if buffer claim exceeded then
jd 1<11+18 ; provoke interrupt cause 6;
rs w2 x1-6 ; share state:=buf addr;
dl. w3 (j1.) ; w2:=saved sref;
rl w0 x2+8 ;
ls w0 4 ; w0:=zone shift 4;
rl. w1 j11. ;
jl. w3 (j2.) ; check used share;
rl w1 x2+8 ; w1 := zone;
a12: al w0 1 ; partial word :=
rs w0 x1+h2+4 ; empty;
jl. (j3.) ; goto end address expression;
d4: ;
a4: rl w1 x1+h2+6 ; state alarm: w1 := zone.state;
al. w0 b1. ;
jl. w3 (j7.) ; general alarm(<:z.state:>,state);
b1: <:<10>z.state :> ;
b3 = k+1 ;
b2: 512<12+2 ;
h.
b0: a6-a0,a6-a0,a6-a0,a1-a0,a4-a0,a6-a0,a2-a0,a2-a0,a6-a0;actions
; setpos read repch write decl inrec outrec swop openmt
m.term zone
i.
e.;end of block for term zone
\f
; jz.fgs 1988.08.12 algol 6 open and close page ...12...
b. a3, b5 ; block for close
w.
i6:
e6: rl. w2 (j4.) ; entry close: stackref:=last used;
ds. w3 (j1.) ; save stackref;
rl w1 x2+8 ;
rl w3 x1+h2+6 ; state := zone.state except
la. w3 j15. ; buflength error bit;
sn w3 j17 ; if state = after openinout
jl. d4. ; or state = after openinout on mt
se w3 j17+8 ; or state = after inoutrec then
sn w3 j17+9 ; goto state alarm;
jl. d4. ;
la. w3 j16. ; state := state except inout bit;
sh w3 8 ; if state <= 8 and
sh w3 -1 ; state >= 0 and
jl. a3. ; state <> 4 then
se w3 4 ; goto term zone;
jl. w3 c0. ;
a3: dl w1 x2+12 ;
so w0 16 ;
jl. w3 (j2.) ; get release;
ds. w3 (j1.) ; save stackref;
bz w0 x1 ; w0:=release code;
rl w1 x2+8 ; w1:=zone addr;
so w0 1 ; if release then
jl. a0. ; begin
rs w0 x2+12 ; save release code;
bz w0 x1+h1+1 ; w0:=process kind;
al w3 x1+h1+2 ; w3:=name addr;
jd 1<11+10 ; release process;
sn w0 4 ; if kind=bs then
jd 1<11+64 ; w0:=remove process; w0<6.
se w0 18 ; if kind=mt then
jl. a0. ; begin
rl w0 x2+12 ; w0:=release code;
al. w1 b2. ; w1:=suspend tape;
sn w0 1 ; if release code = false add 1 then
al. w1 b3. ; w1:=release tape;
al w0 x2 ; save sref in w0;
rl w2 x2+8 ; w2:=zone addr;
rl. w3 (j6.) ;
j8=k+1 ; call parent message(w1,w2);
jl w3 x3+0 ;
al w1 x2 ; w1 := zone addr;
rl w2 0 ; w2 := saved sref;
ds. w3 (j1.) ; save sref, w3;
; end;
; end;
\f
; fgs 1983.12.07 algol 8, open and close page ...13...
a0: al w0 4 ;
rs w0 x1+h2+6 ; zone state:=after declare;
rl w0 x1+h0+0 ;
rs w0 x1+h3+0 ; recordbase:=base buf;
rl w3 x1+h0+2 ;
rs w3 x1+h3+2 ; last byte:=last buf;
ws w3 0 ;
rs w3 x1+h3+4 ; record length:=last buf-base buf;
ba. w0 1 ; w0:=fs:=base buf+1;
rl w3 x1+h0+8 ;
rs w3 x2+6 ; work 6 := last share;
rl w3 x1+h0+2 ;
al w3 x3-1 ; w3:=ls:=last buf-1;
a1: rl w1 x1+h0+4 ; rep: w1:=used share;
rs w0 x1+2 ; first shared:=fs;
rs w3 x1+4 ; last shared:=ls;
rs w0 x1+22 ; top transferred:=fs;
sl w1 (x2+6) ; if w1<last share then
jl. a2. ; begin
al w1 x1+h6 ; w1:=w1+share descr length;
rx w3 x2+8 ; w3:=zone addr;
rs w1 x3+h0+4 ; used share:=w1;
al w1 x3 ; w1:=zone addr;
rx w3 x2+8 ; w3:=ls;
jl. a1. ; goto rep;
; end;
a2: rl w1 x2+8 ;
rl w0 x1+h0+6 ; w1:=zone addr;
rs w0 x1+h0+4 ; used share:=first share;
jl. (j3.) ; end addr expr;
b2: 10<13, <:suspend :> ; parent function: suspend tape
b3: 11<13, <:release :> ; parent function: release tape
m.close
i.
e.;end of block for close
\f
; fgs 1983.12.07 algol 8, open and close page ...14...
w.
j20: c.j20-506
m. code on segment 2 too long
z.
c. 502-j20
0,r.252-j20>1 ; fill with zeroes
z.
<:close/term<0><0>:> ; alarm text segment 2
m.segment 2
i.
e.;end of block for segment2
\f
; jz.fgs 1984.03.05 algol 8, setposition page ...15...
b. j20 ; block for segment 3
w.
k=0
h.
c7: c8 , c9 ; rel last point , rel last absword
j1: 30 , 0 ; rs saved stackref
j2: 4 , 0 ; rs take expr
j3: 8 , 0 ; rs end addr ex
j4: 13 , 0 ; rs last used
j5: 6 , 0 ; rs end reg ex
j6: 36 , j19 ; rs parent message
j8: 29 , 0 ; rs param alarm
j13: 85 , 0 ; rs current activity no
j7: 1<11o. (:-1:), 0; abs entry term zone
c9=j7-c7 ,c8=j7-c7
w.
j15: -1-64 ; mask for removal of buflength error from zonestate
j17=32 ; slang constant, inout bit in zonestate
j18=64 ; - - , buflength error - -
\f
; fgs 1988.03.01 algol 8, setposition page ...16...
b. a20 , b6 ; block for local names in setposition
w.
i7:
e7: rl. w2 (j4.) ; entry setposition: stackref:=last used;
ds. w3 (j1.) ; save stackref;
rl. w3 (j7.) ;
jl w3 x3+c0 ; term zone;
dl w1 x2+12 ;
so w0 16 ;
jl. w3 (j2.) ; get file;
ds. w3 (j1.) ; save stackref;
rl w0 x1 ; w0:=file;
rl w1 x2+8 ; w1:=zone addr;
zl w3 x1+h1+1 ;
se w3 20 ; if zone.kind <> imc then
rs w0 x1+h1+12 ; filecount:=file;
dl w1 x2+16 ;
so w0 16 ;
jl. w3 (j2.) ; get block;
ds. w3 (j1.) ; save stackref;
rl w0 x1 ; w0:=block;
rl w1 x2+8 ; w1:=zone addr;
zl w3 x1+h1+1 ;
sn w3 20 ; if zone.kind <> imc then
jl. a0. ; begin
rs w0 x1+h1+14 ; blockcount:=
rs w0 x1+h1+16 ; segmentcount:=block;
a0: ; end;
al w0 -1 ;
am (x1+h0+6); w0:=record base:= -1+
wa w0 2 ; first shared(first share);
rs w0 x1+h3+0 ;
al w0 0 ;
rs w0 x1+h3+4 ; recordlength:=0;
rl w3 x1+h0+6 ; w3:=first share;
rl w0 x3+4 ;
ba. w0 1 ;
rs w0 x1+h3+2 ; w0:=last byte:=last shared(first share)+1;
a2: rl w0 x3+4 ; for share:=first share step share decr length
rs w0 x3+10 ; until last share do
al w3 x3+h6 ; w0:=last addr.message:=last shared;
sh w3 (x1+h0+8) ;
jl. a2. ;
bz w0 x1+h1+1 ;
se w0 18 ; w0:=kind;
jl. a1. ; if kind.zone<>mt then goto out;
\f
; fgs 1984.03.05 algol 6, setposition page ...17...
a3: al w3 x1+h1+2 ; initialise: w3:=name addr;
jd 1<11+6 ; initialise process;
sh w0 1 ; if ok or reserved by another then
jl. a4. ; goto start position;
al w2 x1 ; mount tape: w2:=zone;
al. w1 b0. ; w1:=mess addr;
rl. w3 (j6.) ;
j19=k+1 ; parent message(w1,w2,mount and wait);
jl w3 x3+0 ;
rl w0 x2+h1+2 ; w0:=first word of doc name;
se w0 0 ; if name empty then
jl. a15. ; begin
dl w1 x3+2 ;
ds w1 x2+h1+4 ; copy name from end of answer to
dl w1 x3+6 ; doc name in zone
ds w1 x2+h1+8 ; end;
a15: al w1 x2 ; w1:=zone addr;
jl. a3. ; goto initialise;
a4: ; start position:
c. h57<3 ; if monitor 3 then
al w0 14 ; set mode: w0 := set mode;
z. ; else
c. h57<2
al w0 0 ; sense: w0:=sense;
z.
jl. w3 a10. ; send message and wait;
dl. w3 (j1.) ; w2:=saved sref;
dl w0 x1+h1+14 ; w3:=file count; w0:=block count;
sh w3 -1 ; if filecount<0 then
jl. a6. ; goto unwind;
sh w0 -1 ; if blockcount<0 then
jl. w3 (j8.) ; param alarm;
c. h57<3 ; if monitor 3 then
ds. w0 b2. ; store file and block in message;
am 1 ; moveop := position; skip next;
a6: al w0 5 ; unwind: moveop := unwind;
rs. w0 b6. ; store operation in message
al w0 8 ; operation:=move
hs. w0 b1. ;
am (x1+h0+4) ;
hs w0 6 ; operation in share:=move;
al w3 x1+h1+2 ; w3:=address(name_in_zone);
al. w1 b1. ;
jl. a16. ; goto send message;
z. ; end monitor 3 else
\f
; rc 07.03.72 algol6, setposition page ...18...
c. h57<2
rl. w3 b2. ; w3:=file in answer;
sn w3 (x1+h1+12); if file in answer=filecount then
jl. a7. ; goto blockpositioning;
sh w3 -1 ; if file in answer undefined then
jl. a13. ; goto rewind;
sh w3 (x1+h1+12) ; if file in answer< filecount then
jl. a5. ; goto upfile;
a12: ls w3 -1 ; spool back:
sl w3 (x1+h1+12) ; if file in answer//2>=filecount then
a13: am 2 ; rewind;
am 2 ; else backfile;
a5: am -5 ; upfile;
a6: al w0 5 ; unwind;comment the move oper is now ok;
jl. a9. ; goto send move;
a7: rl. w0 b3. ; blockpositioning: w0:=block in answer;
sn w0 (x1+h1+14) ; if block in answer=blockcount then
jl. a1. ; goto set result;
sh w0 -1 ; if block in answer undefined then
jl. a12. ; goto spool back;
sh w0 (x1+h1+14) ; if block in answer<blockcount then
jl. a8. ; goto upblock;
ls w0 -1 ;
sl w0 (x1+h1+14) ; if block in answer//2>=blockcount then
jl. a12. ; goto spool back;
am 2 ; backblock;
a8: al w0 1 ; upblock;comment the move oper is now ok;
a9: rl w3 x1+h0+4 ; send move:
rs w0 x3+8 ; store moveop in message;
al w0 8 ; op:=move;
z. ; end monitor 2;
\f
;jz.fgs 1988.03.01 algol 8, setposition page ...19...
a10: rs. w3 b4. ; send message: save return;
rl w3 x1+h0+4 ;
hs w0 x3+6 ; store op in message(used share);
al w3 x3+6 ;
al w1 x1+h1+2 ;
rx w3 2 ;
a16: rl. w2 (j13.) ; w2 := current activity no;
jd 1<11+16; send message(message(used share),mt name );
sn w2 0 ; if no buffers then
jd 1<11+18; provoke interrupt cause 6;
sn w0 8 ; if operation=move then
jl. a11. ; goto after move;
al. w1 b1. ; sense operation only:
jd 1<11+18; wait answer(result,answer addr);
dl. w3 (j1.) ; restore stackref;
rl w1 x2+8 ; restore zone addr;
jl. (b4.) ; return;
c. h57<2 ; if monitor 2 then
a11: rs w2 x1-6 ; after move: state(used share):=pending;
dl. w3 (j1.) ; restore stackref;
am -1 ; result:=message pending; skip;
z. ; else
c.h57<3 ; if monitor 3 then
; after move:
a11: rs w2 (x3+h0+4-h1-2); share state:=buf address;
dl. w3 (j1.) ; restore stackref;
am -1 ; result:=message pending
z.
a1: al w1 0 ; set result: reg:=message not pending;
rl w3 x2+8 ;
zl w2 x3+h1+1 ;
rl w0 x3+h2+6 ; if zone.kind = imc and
sn w2 20 ; zone.state = not connected then
se w0 8 ; state := 8
am -8 ; else
al w2 8 ; state := 0;
sz w0 j18 ; if zonestate contains buflength error bit then
al w2 x2+j18 ; state := state add buflength error bit;
sz w0 j17 ; if zonestate contains inout bit then
al w2 x2+j17 ; state := state add inout bit;
rs w2 x3+h2+6 ; zone.state := state;
al w0 0 ;
jl. w3 (j5.) ; end reg ex;
b0: 7<13+1,<:mount :> ; parent message: mount and wait (4 words)
0 ;
b1: 0 ; answer address: message address : (move operation)
b6: 0 , 0 ;
b2: 0 ; file in answer
b3: 0 ; block in answer
0 , 0 , 0;
b4: 0 ; saved return
m.setposition
i.
e.;end of block for setposition
\f
; fgs 1988.11.07 algol 6, get position page ...20...
b. a10, b2 ; block for local mames in get position
w.
i8:
e8: rl. w2 (j4.) ; entry get position: stackref:=last used;
ds. w3 (j1.) ; save stackref;
dl w1 x2+12 ;
so w0 16 ;
jl. w3 (j2.) ; take file; w1:=file addr;
ds. w3 (j1.) ; save stackref;
rl w3 x2+8 ; w3:=zone addr;
zl w0 x3+h1+1 ;
sn w0 20 ; if zone.kind <> imc then
jl. a0. ; begin
rl w0 x3+h1+12 ;
rs w0 x1 ; file:=w0:=filecount;
a0: ; end;
al w0 0 ;
rs w0 x2+10 ; p:=0;
rl w1 x3+h2+6 ; state := zone.state except
la. w1 j15. ; buflength error bit;
se w1 j17+9 ; if state = after inoutrec then
jl. a10. ; state := if zone <> input zone then
se w3 (x3+h2+2) ; after outrec
am 1 ; else
al w1 5 ; after inrec;
a10: se w1 j17 ; if state = after openinout
sn w1 j17+8 ; or state = after openinout on magtape then
al w1 x1-j17 ; state := state - inout bit;
sl w1 0 ; if unautorisised zonestate
sl w1 9 ; then
jl. a1. ; goto set block;
bz w0 x3+h1+1 ;
sn w0 18 ; if zonekind=mt then
jl. a8. ; goto magtape;
sl w0 4 ; if kind <> area process and
sl w0 8 ; kind <> disc process then
jl. a1. ; goto set block;
am b2 ;
a8: bl. w1 x1+b0. ; magtape:
a9: jl. x1 ; switch to action(kind,state);
\f
; fgs 1988.03.01 algol 8, get position page ...21...
a2: al w0 -1 ; after mag tape input:
rs w0 x2+10 ; p:=-1;
jl. a1. ; goto set block;
a3: ; after mag tape output:
am (x3+h0+6) ;
bl w1 6 ; if operation(first share)
se w1 5 ; <> output
jl. a1. ; then goto set block;
a4: rx w0 x2+10 ; after bs input:
rl w1 x3+h0+6 ; swop p, kind; w1:=first share;
a7: rx w3 x1 ; rep: swop zone addr, share state;
sl w3 2 ;
ba. w0 1 ; if share pending then p:=p+1;
rx w3 x1 ; swop share state, zone addr;
al w1 x1+h6 ; w1:=next share;
sh w1 (x3+h0+8) ; if w1<=last share then
jl. a7. ; goto rep;
rx w0 x2+10 ; swop kind, p;
sl w0 4 ; if kind = mt then
sl w0 8 ; goto set block;
jl. a1. ;
rl w1 x3+h0+6 ; w1:=first share;
al w0 2 ;
wa w0 x1+4 ; w0:=last shared - first shared + 2;
ws w0 x1+2 ;
ls w0 -9 ; segm:=(last shared - first shared + 2 )//512;
rl w1 x2+10 ; comment this refers to first share;
ac w1 x1+1 ;
wm w1 0 ;
rs w1 x2+10 ; p:=-(p+1)*segm;
a5:
a6: am 2 ; bs other: w0:=p:=p+segment count; skip;
a1: rl w0 x3+h1+14 ; set block: w0:=p:=p+block count;
wa w0 x2+10 ;
rs w0 x2+10 ;
dl w1 x2+16 ;
so w0 16 ; take block;
jl. w3 (j2.) ; save stackref;
ds. w3 (j1.) ;
rl w0 x2+10 ;
zl w3 x3+h1+1 ;
se w3 20 ; if zone.kind <> imc then
rs w0 x1 ; block:=p;
jl. (j3.) ; end addr ex;
h.
b0: a1-a9,a2-a9,a2-a9,a3-a9,a1-a9,a2-a9,a3-a9,a1-a9,a1-a9; magtape
b1: a5-a9,a4-a9,a4-a9,a5-a9,a5-a9,a4-a9,a5-a9,a6-a9,a5-a9; drisc
w.; setpos read repch write decl inrec outrec swop openmt
b2=b1-b0
m.getposition
i.
e.;end of block for getposition
\f
; jz.fgs 1981.06.02 algol 8, setstate, getstate page ...22...
b. a0 ; begin block for setstate, getstate
w.
i10: rl. w2 (j4.) ; entry setstate: sref := last used;
ds. w3 (j1.) ; save sref, w3;
dl w1 x2+12 ;
so w0 16 ;
jl. w3 (j2.) ; take addr (param2);
ds. w3 (j1.) ;
rl w3 x1 ;
am (x2+8) ;
rs w3 h2+6 ; zonestate := param2;
jl. (j5.) ; return;
i11: rl. w2 (j4.) ; entry getstate: sref := last used;
ds. w3 (j1.) ; save sref, w3;
dl w1 x2+12 ;
so w0 16 ;
jl. w3 (j2.) ; take address (param2);
ds. w3 (j1.) ;
am (x2+8) ;
rl w3 h2+6 ;
rs w3 x1 ; param2 := zonestate;
jl. (j5.) ; return;
m.setstate, getstate
i.
e. ; end block for setstate, getstate
\f
; jz.fgs 1981.06.02 open docname is array page ...23...
;
; moved to a new segment four
;
w.
j20: c.j20-506
m. code on segment 3 too long
z.
c. 502-j20
0,r.252-j20>1 ; fill with zeroes
z.
<:pos/state<0><0><0>:> ; alarmtext segment 3
m.segment 3
i.
e.;end of block for segment 3
\f
; jz.fgs 1988.08.12 algol 8, open (docname is array) page ...24...
b. j100 ; begin block for segment 4
w.
k=0
h.
c10 : c11, c12 ; rel last point, rel last absword
j4 : 4, 0 ; rs entry 4 : take expression
j5 : 6, 0 ; rs entry 6 : end register expression
j13 : 13, 0 ; rs entry 13 : last used
j29 : 29, 0 ; rs entry 29 : param alarm
j30 : 30, 0 ; rs entry 30 : saved sref, w3
j54 : 54, 0 ; rs entry 54 : field alarm
j1 : 1<11o.(:-3:), 0 ; ref to first segment
j2 : 1<11o.(:-2:), 0 ; ref to sec. segment
c12 = j2 - c10 ; rel of last absword
c11 = j2 - c10 ; rel of last point
j17 = 32 ; slang constant, inout bit in zonestate
j18 = 64 ; - , buflength error bit in zonestate
j15 : -1-64 ; - , mask for removal of buflength err bit
\f
; fgs 1987.08.27 algol 8, stop zone page ...25...
b. a2 ; block for local names in stop zone
w.
i12:
e12: rl. w2 (j13.) ; entry stop zone: sref := lastused;
ds. w3 (j30.) ; save sref, w3;
dl w1 x2+12 ; w0w1 := formal (mark);
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; save sref, w3;
zl w1 x1 ; w1 := value (mark);
ac w1 x1+1 ;
ls w1 23 ; w1.most significant bit = -,mark;
rl w3 x2+8 ; get zone;
zl w0 x3+h1+0 ; zone.mode :=
ls w0 -1 ; zone.mode
ld w1 +1 ; add
hs w0 x3+h1+0 ; -,mark;
rl. w3 (j2.) ; w3 := absword (stop zone);
jl w3 x3+c0 ; goto term zone;
rl w3 x2+8 ; get zone;
zl w0 x3+h1+0 ; zone.mode :=
ls w0 -1 ; zone.mode shift (-1)
ls w0 1 ; shift 1;
hs w0 x3+h1+0 ;
al w0 -1 ;
am (x3+h0+6) ; zone.record base :=
wa w0 +2 ; zone.first share.first shared -
rs w0 x3+h3+0 ; 1;
al w0 0 ; zone.rec length :=
rs w0 x3+h3+4 ; 0;
rl w1 x3+h0+6 ; share := zone.first share;
rl w0 x1+4 ; zone.last byte :=
so w0 1 ; share.last shared +
ea. w0 1 ; if even then
rs w0 x3+h3+2 ; 1 else 0;
a0: rl w0 x1+4 ; repeat
rs w0 x1+10 ; share.operation.last address :=
al w1 x1+h6 ; share.last shared;
sh w1 (x3+h0+8) ; share := share + share descr length;
jl. a0. ; until share > zone.last share;
al w0 0 ; newstate := 0;
zl w1 x3+h1+1 ;
se w1 18 ; if zone.kind = magtape then
jl. a2. ; begin
rl w1 x3+h2+6 ; state := zone.state except
la. w1 j15. ; buflength error bit;
se w1 j17+9 ; if state = after inoutrec then
jl. a1. ; state := if zone = inputzone then
sn w3 (x3+h2+2) ; after inrec
am -1 ; else
al w1 6 ; after outrec;
a1: se w1 j17 ; if state = after openinout
sn w1 j17+8 ; or state = after openinout on magtape then
al w1 x1-j17 ; state := state - inout bit;
sl w1 1 ; if state = 1 <*after read char*>
sl w1 3 ; or state = 2 <*after repeatchar*>
sn w1 5 ; or state = 5 <*after inrec *> then
al w0 8 ; newstate := 8; <*open and not pos on mt*>
a2: rl w1 x3+h2+6 ; end;
rx w1 0 ; swop (w0, w1);
sz w0 j18 ; if zone.state contains buflength err bit then
al w1 x1+j18 ; newstate := newstate add buflength err bit;
sz w0 j17 ; if zone.state contains inout bit then
al w1 x1+j17 ; newstate := newstate add inout bit;
rs w1 x3+h2+6 ; zone.state := newstate;
al w0 0 ; result :=
sz w1 1<3 ; if newstate = unpositioned mt then
am 1 ; false
al w1 -1 ; else
; true;
jl. (j5.) ; goto end reg expression;
m.stop zone
i.
e. ; end block for local names in stop zone
\f
; fgs 1984.03.05 algol 8, open (docname is array) page ...26...
b. a6 ; begin block for docname is array
w.
e5: rl. w2 (j13.) ; entry docname is array: sref := last used;
ds. w3 (j30.) ; save sref, w3;
al w1 2.11111 ; if kind(param)>zone
la w1 x2+14 ; or
sh w1 23 ; kind(param)<boolean array
sh w1 16 ; then
jl. w3 (j29.) ; goto rs29, param alarm;
rl w3 x2+16 ;
rl w1 x3 ;
rs. w1 a3. ; save array base;
ba w3 x2+14 ; w3:=dope;
al w1 1 ; if 1<=lower index-k then
sh w1 (x3) ; goto
jl. a5. ; lower field alarm;
rl w1 x3-2 ;
wa. w1 a3. ;
rs. w1 a4. ; save base+upper index
rl w1 x2+8 ; w1:=zone descr addr;
rl. w3 a3. ; w3:=array base;
rs. w2 a3. ; save stack pointer;
al w2 2 ; count:=2;
a1: rl w0 x3+2 ; loop:
am x2 ; move array
rs w0 x1+h1 ; to
sz w0 255 ; zonedescriptor
jl. 4 ; until
jl. a2. ; word ends with zero
al w3 x3+2 ; or
sl. w3 (a4.) ; upper index
jl. a6. ; passed;
al w2 x2+2 ; count:=count+2;
sh w2 8 ; max 4 words are moved;
jl. a1. ; goto loop;
a2: rl. w2 a3. ; exit: restore stack pointer;
rl. w3 (j1.) ; ref to first segm.
jl w3 x3+e1 ; goto first segm, after doc param
a3: 0 ; array base, stack pointer
a4: 0 ; base array+ upper index
a6: am x2 ; upper field alarm: field := count + 2;
a5: al w1 2 ; lower field alarm: field := 2;
jl. w3 (j54.) ; goto field alarm;
m.open docname is array
i.
e. ; end block for docname is array
\f
; fgs 1984.03.05 algol 8, open (wait a second) page ...27...
b. b2 ; begin block wait a second
w.
b0: 0 ; saved return
b1: <:clock:>, 0, 0, 0 ; name of clock, name table address
0, 1 ; message to clock
b2: 0, r.8 ; answer area
e9: rs. w3 b0. ; wait a second: save return
al. w1 b2.-4 ;
al. w3 b1. ;
jd 1<11 +16 ; send message(<:clock:>)
al. w1 b2. ;
jd 1<11 +18 ; wait answer
jl. (b0.) ; return
e. ; end block wait a second
\f
; jz.fgs 1984.03.05 algol 8, open, segm 4 page ...28...
w.
j100: c.j100-506
m.code on segment 4 too long
z.
c.502-j100
0, r.252-j100>1 ; fill segment with zeroes
z.
<:open/stop<0>:> ; alarm text segment 4
m.segment 4
i.
e. ; end block for segment 4
m.slang segment
i.
e.;end of block for slang segment
\f
; jz.fgs 1988.03.01 algol 8, open close set-get position-state page ...29...
;tail parts
h.
g0: 0 , 4 ; tail open:size
0 , r.8 ; name
2048 , i0 ; entry
w. 1<18+19<12+41<6+19 ; spec1
8<18 ; spec2
h. 4 , i4 ; kind, ext list
4 , 0 ; code segments
2048 , 4 ; tail termzone:other tail
0 , r.8 ; name
2049 , i5 ; entry
w. 15<18 ; spec1 : illegal type proc
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments
2048 , 4 ; tail stopzone:other tail
0 , r.8 ; name
2051 , i12 ; entry
w. 2<18+18<12+8<6 ; spec1 boolean proc (zone, boolean addr)
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments, owns
2048 , 4 ; tail close:other tail
0 , r.8 ; name
2049 , i6 ; entry
w. 1<18+18<12+8<6 ; spec1
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments
2048 , 4 ; tail setposition:other tail
0 , r.8 ; name
2050 , i7 ; entry
w. 2<18+19<12+19<6+8 ; spec1
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments
2048 , 4 ; tail getposition:other tail
0 , r.8 ; name
2050 , i8 ; entry
w. 1<18+19<12+19<6+8 ; spec1
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments
2048 , 4 ; tail setstate:other tail
0 , r.8 ; name
2050 , i10 ; entry
w. 1<18+19<12+8<6 ; spec1
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments, owns
g1: ; last tail:
2048 , 4 ; tail getstate:other tail
0 , r.8 ; name
2050 , i11 ; entry
w. 1<18+19<12+8<6 ; spec1
0 ; spec2
h. 4 , 0 ; kind
4 , 0 ; code segments, owns
m.rc 1988.12.01 open termzone stopzone close,
m. setposition getposition setstate getstate
i.
\f
▶EOF◀