|
|
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: 212736 (0x33f00)
Types: TextFile
Names: »xp4tx«
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦d0ba63ea6⟧ »file3 «
└─⟦467add7f6⟧
└─⟦this⟧ »xp4tx«
\f
; rc 88.04.24 file processor, permanent, page ...1...
b. h99 w. ; special block for fpnames
b. c43, j131 ; begin global block
m.file processor 88.04.24 system 3
m.
m.fp text 1 88.04.24
; slang structure:
;
; b. h99 ; global block with fpnames
; b. c43, j131 ; block with c- and j-names
;
; s. k=0 ; permanent fp, resident io
; e. ; drum segments 0,1,2
;
; s. k=h13, e48 ; simple check
; e. ; segment 3
;
; s. k=h13, e48 ; connect input
; e. ; segment 4
;
; s. k=h13, e48 ; connect output
; e. ; segment 5, 6
;
; s. k=h13, e48 ; stack medium
; e. ; segment 7
;
; s. k=h13, e48 ; unstack medium
; e. ; segment 8
;
; s. k=h13, e48 ; magtape check
; e. ; segment 9
;
; s. k=h13, e48 ; terminate zone
; e. ; segment 10
;
; transient parts:
;
; s. k=h55, e48 ; initialize fp
; e. ; segment 11, 12
;
; s. k=h55, e48 ; command assembly
; e. ; segment 13, 14
;
; s. k=h55, e48 ; load program
; e. ; segment 15
;
; s. k=h55, e48 ; end program and device status
; e. ; segment 16, 17
;
; b. g1 ; block for old fpnames
; e. ; and insertproc
;
; e. ; end c- and j-names
; e. ; end global block
;
\f
; fgs 1988.04.24 file processor, permanent, page ...2...
; resident file processor
s. k=0 ; begin permanent
w. ; and resident parts:
; when created and started by the parent process the file
; processor is entered at the second word with:
;
; w0 = description address (prim input)
; w1 = irrelevant
; w2 = description address (prim output)
; w3 = own process description address
; ex = 0
; ic = second word of own process
h12: 1536 ; fp base: on drum size of first bin segment
; during execution first address of process;
h10: ds. w1 h17. ; ia: saved w0; upstart:
ds. w3 h16. ; saved w1; save registers;
dl w3 x3+70 ; saved w2; user interval:=
ds. w3 h58. ; saved w3; initial catbase;
jl. h60. ; saved ex; goto init fp;
am 0 ; saved ic; dummy, one saved;
12 ; saved cause;
h76=16 ; number of bytes i reg dump area
jl. 2, r.(:h10+h76-k+2:)>1;
jl. c40. ; goto break;
c39: rl. w0 h10.+12 ; write cause:
jl. w3 c36. ;
32<12 + 1 ; writeinteger(out,cause);
rl. w0 h10.+10 ;
jl. w3 c36. ; writeinteger(out,instr. count);
1<23+32<12+1 ;
h65: jl. w3 h39. ; end fp: outend(out, nl);
jl. w3 h95. ; close up;
jl. w3 h67. ; parent message(<:break:>);
jl. h60. ; if the answer should arrive
; then goto init;
; at start: repeat the message to the parent;
c33: ds. w3 c11. ; restore io segment: save(w2,return);
jl. h70. ; call and enter io segment;
c27=h10+8 ; used by stack; saved bad
c30=h10+4 ; device name
\f
; rc 17.08.72 file processor, permanent, page ...3...
; fp stderror:
h68: al w2 x3 ; fp stderror:
al w1 x1+c25 ; w2 := status; w1 := name addr;
; fp end program:
h7: jl. w3 c33. ; fp end program:
ds. w2 c20. ; restore io segment;
sz w2 -4 ; save end conditions;
jl. 4 ; if not device error then
jl. c34. ; goto test modebits;
dl w0 x1+2 ; save document name:
ds. w0 c30. ;
dl w0 x1+6 ;
ds. w0 c27. ; move name of bad device to perm. fp;
c34: dl. w3 h51. ; test modebits:
sz w3 1<4 ; if -,ok and error
sn w2 0 ; or pause
sz w3 1<3 ; then
jl. h65. ; goto end fp;
jl. h63. ; call and enter end program segment;
; load and enter program
h18: ; w1=zone ; load and enter:
jl. w3 h22. ; inblock (prog zone);
al. w1 h12. ; w1:= fp base address;
dl. w3 c12. ; w2,w3:=current pointers;
am. (c13.) ; goto transient base +
jl. h55. ; relative entry.prog zone;
; fp variables in permanent part:
h83: 0 ; users bits in check
h9: 0 ; last of commands
h8: 0 ; current command pointer
c12: 0 ; w1 end prog; or: cur parameter
c20: 0 ; w2 end prog; or:
h51: 0 ; fp mode bits (ok initialized to false);
h50: 0, r.4 ; current name chain
h15: 0 ; process descr addr prim output
h16: 0 ; own process descr addr
0 ; h17-2 ; process descr addr prim input
h17: 0 ; parent descr addr
c8: 0 ; tries.
\f
; rc 86.08.27 file processor, permanent, page ...3a...
b. a3,b2
w.
; dummy notes
h96: 0 ; prim inout errors;
;close up - as it should be:
am c41 ; zone:=curr in;
al. w1 c43. ; zone:=curr out;
h95: bz w2 x1+c42 ; char:=
se w2 4 ; if kind = bs
sn w2 18 ; or kind = mt
am 25 ; then em
al w2 0 ; else null;
jl. h34. ; goto close up
; fp break
c40: jl. w3 c33. ; break: restore io-segment;
rl. w1 h10.+10 ; test breakpoint: w1 := break address + 2;
sh w1 100 ; if address <= 100
jl. b2. ; goto write break (break 10);
bl w0 x1-2 ; w0 := instruction part;
rl. w2 h10.+12 ; if cause = 0 then
sn w2 0 ; begin
bl w2 x1-1 ; w2 := address part;
sh w2 -1 ; if address part >= 0 or
h. se w0, ks ; instruction <> ks then
w. jl. b2. ; goto write break; end;
al. w0 a0. ; outtext(<:<10>*breakpoint<0>:>);
am -2 ;
jl. w3 h31. ;
al w0 x2 ; outinteger ( address part);
jl. w3 h32. ;
1<23 ; layout;
\f
; fgs 1988.05.19 file processor, permanent, page ...3b...
al w2 -2 ; for w2 := 0 step 2 until 10 do
b0: al. w0 a2. ; begin
jl. w3 h31. ; writecr;
al w2 x2+2 ;
sl w2 12 ;
jl. b1. ;
al. w0 x2+a3. ; outtext( case w2 of
jl. w3 h31. ; (<:w0:>, <:w1:>, <:w2:>,
rl. w0 x2+h10. ; <:w3:>, <:ex:>, <:ic:>));
jl. w3 h32. ; outinteger ( register contents);
1<23+32<12+10 ;
ac. w0 h12. ; w0:= process relative
wa. w0 x2+h10. ; register contents;
jl. w3 h32. ; outinteger ( w0);
1<23+32<12+10 ;
jl. b0. ; end;
b1: rs. w2 h10.+12 ; cause := 12;
dl. w1 h10.+2 ; restore registers;
dl. w3 h10.+6 ;
xl. h10.+9 ;
jl. (h10.+10) ; return;
b2: al. w0 c32. ; write break:
jl. w3 c35. ; outtext(<:<10>***break:>);
jl. c39. ; goto write cause;
a0: <:<10>*breakpoint<0>:>
a2: <:<10>:> ;
a3: <:w0:>, <:w1:>, <:w2:>
<:w3:>, <:ex:>, <:ic:>
0 ; saved initial
h58: 0 ; catbase = user base
2 ; file processor package version
h52: 4<12 + 0 ; file processor package release < 12 + subrelease
h53 = 18 ; no of halfwords in available area in front of zone buffers
; space used by notes - now partly used by breakpoint routine
e.
\f
; fgs 1988.05.19 file processor, permanent, page ...4...
; current program, zone descriptor
h19: ; part 0:
h0: 0 ; h0+0 base process area
0 ; h0+2 last byte process area
h80 ; h0+4 used share
h80 ; h0+6 first share
h80 ; h0+8 last share
; part 1:
h1: 1<23+4 ; h1+0 1<11+mode, kind
0, r.4 ; h1+2 document name
0 ; h1+10 name table address
0 ; h1+12 file count
0 ; h1+14 block count
0 ; h1+16 segment count
; part 2:
h2: 0 ; h2+0 give up mask
h92: h68 ; h2+2 give up action
0 ; h2+4 not used
0 ; h2+6 used by terminate zone
h19=k ; part 3:
h3: 0 ; h3+0 base of present program block
0 ; h3+2 last byte of program block
0 ; h3+4 length of program block
c13: 0 ; h3+6 relative entry to program block
; part 4:
h4: 0 ; h4+0 used by terminate zone
0 ; h4+2 used by terminate zone
0 ; h4+4 used by terminate zone
h5=k-h0 ; zone descriptor length
h0=h0-h3 , h1=h1-h3 ; redefine relatives so that
h2=h2-h3 , h4=h4-h3 ; part 3 starts at the zone descr addr.
h3=0 , c25=h1+2 ;
; current program, share descriptor (always single buffered)
h80: 0 ; s+0 state (buf addr)
0 ; s+2 first shared
0 ; s+4 last shared
3<12+0 ; s+6 message
0, r.7 ;
0 ; s+22 bytes transferred
h6=k-h80 ; share descr length
\f
; rc 1.7.69 file processor, permanent, page ...5...
; current input, zone descriptor
h20: ; part 0:
0 ; h0+0 base buffer area
0 ; h0+2 last byte of buffer
81 ; h0+4 used share
81 ; h0+6 first share
81 ; h0+8 last share
; part 1:
1<23+8 ; h1+0 1<11+mode, kind
<:console:> ,0 ; h1+2 document name
0 ; h1+10 name table address
0 ; h1+12 file count
0 ; h1+14 block count
0 ; h1+16 segment count
; part 2:
1 ; h2+0 give up mask+ i-bit
h93: h68 ; h2+2 give up action
1<16 ; h2+4 partial word
0 ; h2+6 free parameter
h20=k ; part 3:
0 ; h3+0 record base
0 ; h3+2 last record byte
0 ; h3+4 record length
0, r.4 ; free parameters
; current output, zone descriptor
h21: ; part 0:
0 ; h0+0 base buffer area
0 ; h0+2 last byte of buffer
82 ; h0+4 used share
82 ; h0+6 first share
82 ; h0+8 last share
; part 1:
1<23+8 ; h1+0 1<11+mode, kind
c31: <:console:> ,0 ; h1+2 document name
0 ; h1+10 name table address
0 ; h1+12 file count
0 ; h1+14 block count
0 ; h1+16 segment count
; part 2:
0 ; h2+0 give up mask
h94: h68 ; h2+2 give up action
1<0 ; h2+4 partial word
0 ; h2+6 free parameter
h21=k ; part 3:
0 ; h3+0 record base
0 ; h3+2 last record byte
0 ; h3+4 record length
0, r.4 ; free parameters
; the share descriptors for current input and for current output
; may be placed anywhere. at present they are placed in the re-
; sident part of fp.
\f
; rc 25.05.72 file processor, permanent, page ...6...
; working cells for fp routines:
c0: 0 ; w0 ; save w0 block io
c1: 0 ; w1 ; zone block io
c5: 0 ; w2 ; share block io
c6: 0 ; w3 ; link block io
h84= c6 ;
c2: 0 ; w2 ; share block io
c3: 0 ; w3 ; return block io
c4: 0 ; w0 ; swap fpsegmentation
c7: 0 ; w1 ; swap - -
c9: 0 ; w2 ; swap - -
c11: 0 ; w3 ; swap - -
c14: 0 ; digit string start:
c21: 0 ; w0 ; save w0 resident
c16: 0 ; w1 ; save w1 resident
c23: 0 ; w2 ; save w2 resident
c17: 0 ; w3 ; save w3 resident
c29: 0 , c29=c29+1 ; digitstring end (max 12 pos)
c19: 0 ; w2 ; save w2 outtext/integer/check all
c18: 0 ; w3 ; save w3 - - -
c15: 0 ; w2 ; link innermost level
;used by connect in (reader):
h37: <:clock:>,0,0,0 ; process name, name table address
0, 1 ; message to clock (delay 1 second)
h66: ; answer area for block io:
c10: 0 ; status word
c22: 0 ; number of bytes transferred
c24: 0 ; number of characters transferred
c26: 0 ; file number
c28: 0 ; block number
0, r.3 ; rest of answer
h54: 1<23+0 ; file descriptor: mode,kind
<:documentname:> ; document name (8 bytes);
0 ; name table address
0 ; file
0 ; block
0<12-0 ; content, entry
0 ; length
h99= (:h12+512-k:)/2 ; remaining words on segment
c. -1-h99 m.length error on fp segment 0
m.remove the free parameters in prog zone
z. ;
c. h99-1 ; if remaining bytes > 0
w. 0, r.h99 ; then fill up to 512 bytes
z. ;
c41=h20-h21 ; cf page 3a
c42=h1+1
c43=h21
m.fp permanent 88.05.19
\f
; base of swap segments:
h13=k ; swap base
w. 512 ; not used ; entry at second word
dl. w1 c7. ; restore (w0,w1);
dl. w3 c11. ; restore (w2,w3);
jl x3 ; return;
\f
; rc 16.6.70 file processor, block io, page ...1...
; procedures inblock, outblock, and wait and free.
; registers in call at return
; w0 unchanged
; w1 zone descriptor zone descriptor
; inblock: outblock:
; w2 unchanged
; wait and free:
; w2 share descriptor share descriptor
; w3 link link
b. e48 ; begin
w. e0=k ; io block driver:
; inblock
al. w1 h20. ; (-2): zone:=cur in;
h22: ds. w1 c1. ; inblock: save (w0,zone);
ds. w3 c3. ; save (w2,link);
rl w2 x1+h0+4 ; share:=used share.zone;
e12: al w0 3 ; rep block in: operation:=input;
jl. w3 e10. ; start transport (zone,share);
jl. e6. ; if pending then goto wait in;
jl. e12. ; free: goto rep block in;
; outblock
al. w1 h21. ; (-2): zone:=cur out;
h23: ds. w1 c1. ; outblock: save (w0,zone);
ds. w3 c3. ; save (w2,link);
rl w2 x1+h0+4 ; share:=used share.zone;
e13: al w0 5 ; rep block out: operation:=output;
jl. w3 e10. ; start transport (zone,share);
; if pending then
am e3 ; wait out: return:=rep block out
e7: am e2 ; wait exit: or return:=exit
e6: al. w3 e4. ; wait in: or return:=adjust last;
al w0 0 ; tries:= 0;
rs. w0 c8. ; counts parity errors;
jl. w0 e11. ; wait transport (zone,share,return);
e4: bs. w0 1 ; adjust last:
rs w0 x1+h3+2 ; last byte:= top transferred-1;
e5: dl. w1 c1. ; exit: restore (w0,zone);
dl. w3 c3. ; restore (w2,link);
jl x3 ; goto link;
e3=e13-e5 ; define wait out
e2= e5-e4 ; define wait exit
; wait and free
am h20-h21 ; (-4): zone:=cur in or
al. w1 h21. ; (-2): zone:=cur out;
h48: ds. w1 c1. ; wait and free: save (w0,zone);
ds. w3 c3. ; save (share,link);
; h48 + 4 is entered by terminate zone, to prevent against
; saving registers.
jl. e7. ; goto wait exit;
; states of shares
; = 0 free share
; = 1 transport completed and checked
; > 1 pending transport
; < 0 running child process
\f
; rc 19.05.72 file processor, block io, page ...2...
; start transport
e10: ds. w3 c6. ; start transport:
am (x2+0) ; save (share,link);
se w2 x2+0 ; if share not free then
jl x3 ; no transport: goto link;
hs w0 x2+6 ;
rl w0 x2+2 ; op.message:=operation;
rs w0 x2+8 ; first addr.message:=first shared;
rl w0 x1+h1+16 ;
rs w0 x2+12 ; only significant for backing store:
rl w3 x2+10 ; begin
ws w3 x2+8 ; segment no.:=segment count;
al w3 x3+2 ; segment count:=segment count +
ls w3 -9 ; (last addr-first addr+2)/512;
wa w3 0 ; end;
rs w3 x1+h1+16 ;
al w3 x1+h1+2 ; w3:=name address;
al w1 x2+6 ; w1:=message address;
jd 1<11+16 ; send message(w3,w1,buf);
sn w2 0 ; if buf claim exceeded then
jd 1<11+18 ; provoke interrupt cause 6;
rs w2 x1-6 ; share state:=buf;
al w1 x3-h1-2 ; restore(zone,share,link);
dl. w3 c6. ;
al w2 x2+h6 ; share:=share+share descr length;
sh w2 (x1+h0+8) ; if share>last share then
jl x3+2 ; share:=first share;
rl w2 x1+h0+6 ; transport started:
jl x3+2 ; goto link+2;
; wait transport
e11: ds. w3 c6. ; wait transport
h87: rs w2 x1+h0+4 ; save(share,link);
dl w0 x2+4 ; used share:=share;
al w3 x3-1 ; record base:=first shared-1;
ba. w0 1 ; last byte:=last shared+1;
ds w0 x1+h3+2 ;
al w2 0 ; share state:=free;
rx. w2 (c5.) ; if share was pending
sl w2 2 ; then goto wait for it;
jl. e18. ;
h36: dl. w2 c5. ; return from check: reg irrel.
rl w0 x2+22 ; w1:=zone; w2:=share;
jl. (c6.) ; w0:=top trsf; goto saved link;
e18: al. w1 c10. ; wait for it:
jd 1<11+18 ; w2=buf addr, c10 answer area.
al w3 1 ; wait answer (buf,answer,result);
ls w3 (0) ; status:= 1 shift result;
al w0 0 ; if normal answer (result=1) then
dl. w2 c5. ; status:=status or status word.answer
se w3 1<1 ; else
ds. w0 c22. ; bytes transferred:=0;
lo. w3 c10. ;
\f
; fgs 86.12.12 file processor, block io, page ...3...
bz w0 x2+6 ; generate common bits:
sz w0 1 ; w0:= if operation=io
am 6 ; then first addr in message
rl w0 x2+2 ; else first shared;
wa. w0 c22. ; top transferred :=
rs w0 x2+22 ; w0 + bytes transferred;
sh w0 (x2+10) ; if top transferred <= last address
bz w0 x2+6 ; then w0:=operation else w0:=nonsense;
bz w2 x1+h1+1 ; w2:=process kind;
sn w2 6 ; if kind = disc then
al w2 4 ; kind := area;
am. (c22.) ; if (bytes transferred=0
sn w1 x1 ; and kind = bs)
se w2 4 ; or
sn w0 5 ; w0 = output then
al w3 x3+1<8 ; add stop bit;
bz. w2 x2+e21. ; index:=device table(proc kind);
se w2 0 ; if index <> 0 then
jl. e20. ; goto determine action;
dl. w1 c24. ; magnetic tape status bits:
ld w2 -23 ;
se w0 0 ; if bytes transferred > 0 then
wd w2 0 ; begin
se w1 0 ; if number of characters * 2
al w3 x3+1<7 ; modulo bytes transferred <> 0
rl. w2 c1. ; then status:=status+word defect bit;
se w0 0 ; incr:=1;
al w1 1 ; end
al w0 0 ; else incr:=0;
aa w1 x2+h1+14 ;
rs w1 x2+h1+14 ; block count:= block count + incr;
sn. w0 (c26.) ; if file count <> file.answer
se. w1 (c28.) ; or block count <> block.answer
al w3 x3+1<6 ; then status:=status+position bit;
ld w2 24 ; index:=0 again;
e20: sz w3 2.111100 ; determine action:
la. w3 e20. ; remove superfluous status bits;
rs. w3 c10. ; answer(0):=final status word;
la w3 x1+h2+0 ; users bits:=status and give up mask;
rs. w3 h83. ; remaining:=status - users bits;
lx. w3 c10. ; if remaining and hard (index)
sz. w3 (x2+e24.) ; is not zero then goto give up;
jl. e26. ; if remaining and special (index)
sz. w3 (x2+e25.) ; is not zero then goto spec action;
jl. e27. ;
h86=k
e19: rl. w3 h83. ; normal action:
sn w3 0 ; if users bits=0
jl. h36. ; then goto return from check;
am -1 ; give up bit:=false;
h88=k ;
e26: al w3 +1 ; give up: give up bit:=true;
lo. w3 c10. ; w3:=status or give up bit;
la. w3 e28. ; leave only official bits;
dl. w2 c5. ; w1,w2:=zone,share;
al. w0 c10. ; w0:=answer address;
jl (x1+h2+2) ; goto give up action.zone;
e27: bz w2 x1+h1+1 ; spec action:
bz. w2 x2+e22. ; c9:= special action number;
ds. w3 c11. ; depending on process kind.
se w2 10 ; if spec action <> 10 then
jl. h71. ; call and enter simple check else
jl. h77. ; call and enter magtape check;
\f
; fgs 1982.12.12 file processor, block io, page ...4...
; device table containing mask index and special action no.
h. ; bytes
e21=k , e22=k+1 ;
16 , 6 ; ip ; special actions:
16 , 0 ; clock ; 0: give up
4 , 2 ; area ; 2: area process action
4 , 2 ; disc ; 4: end of medium
8 , 6 ; tw ; 6: timer error
12 , 4 ; tr ; 8: char output
16 , 8 ; tp ; 10: mag tape errors
16 , 8 ; lp
12 , 4 ; cr
0 , 10 ; mt
16 , 8 ; pl
; mask table specifying hard and special errors depending
; on the index selected via the process kind
w.
e24: 8.1107 7031 ; 0: magtape (mt)
e25: 8.2620 0744 ;
8.7277 7331 ; 4: area/disc process (size)
8.0500 0444 ;
8.2757 7375 ; 8: typewriters (tw)
8.1000 0400 ;
8.1614 7775 ; 12: readers (tr, cr)
8.0100 0000 ;
8.3677 7375 ; 16: char oriented output (ip, clock, tp, lp, pl)
8.0100 0400 ;
e28: 8.7777 4777 ; official bits.
; treatment of status bits for different indices.
; bit error hard:* spec:/
; 0 4 8 12 16
;
; 0 local *
; 1 parity / * * *
; 2 timer * * / * *
;
; 3 overrun / / * * *
; 4 block l. / * * * *
; 5 end doc. * / * / /
;
; 6 load p. * * *
; 7 tape mark / * *
; 8 ring * * * *
;
; 9 mode err. * * * * *
; 10 read err. * * * *
; 11 card rej. * * * *
;
;
; 12 sum err. * * * * *
; 13 * * * * *
; 14 * * * * *
;
; 15 stop / / / * /
; 16 defect / * * * *
; 17 position / * * * *
;
; 18 non-exist / / * * *
; 19 disconn. * * * * *
; 20 unintell. * * * * *
;
; 21 rejected / / * * *
; 22 normal
; 23 give up * * * * *
;
; 0 4 8 12 16
e. ; end block io;
\f
\f
; rc 5.6.70 file processor, character io, page ...1...
; input/output on character level
; procedures inchar, outchar, outend, close up.
; registers in call at return
; w0 unchanged
; w1 zone descriptor zone descriptor
; w2 out: character in: character
; w3 link link
; after output the contents of register w2 is undefined.
b. e48 ; begin
w. ; character io:
; inchar:
al. w1 h20. ; (-2): zone:= current input zone;
h25: rx w3 x1+h2+4 ; inchar:
al w2 0 ; w2:= front char.partial word;
ld w3 8 ; partial word:= partial word shift 8;
sn w3 0 ; if partial word=0 then
jl. e1. ; no more: goto inword;
rx w3 x1+h2+4 ; return;
jl x3 ;
e1: rl w3 x1+h3 ; inword:
al w3 x3+2 ; record base := record base + 2;
rs w3 x1+h3 ; test empty:
e2: sl w3 (x1+h3+2) ; if record base >= last byte then
jl. e6. ; goto next block;
rl w3 x3+2 ; partial word :=
al w2 0 ; record(record base+2);
ld w3 8 ; char := partial word (bit 0 - 7);
al w3 x3+1 ; partial word := partial word
rx w3 x1+h2+4 ; shift 8 + empty bit;
jl x3 ; return;
e6: jl. w3 h22. ; next block:
rl w3 x1+h3 ; inblock;
jl. e2. ; goto test empty;
; outchar:
al. w1 h21. ; (-2): zone:= current output zone;
h26: rx w3 x1+h2+4 ; outchar:
sz. w3 (e3.) ; if last in partial word
jl. e4. ; then goto outword;
ls w3 8 ; partial word:= character
lo w3 4 ; + partial word shift 8;
rx w3 x1+h2+4 ; return;
jl x3 ;
e4: ls w3 8 ; outword: partial word:=
lo w2 6 ; partial word shift 8 + character;
rl w3 x1+h3 ;
al w3 x3+2 ;
rs w3 x1+h3 ; record base := record base + 2;
rs w2 x3 ; record(record base) := partial word;
al w2 1 ;
rx w2 x1+h2+4 ; partial word := 1<0; (empty)
rx w2 6 ; restore return;
sl w2 (x1+h3+2) ; if record base >= last byte then
jl. h23. ; goto outblock;
jl x3 ; return;
\f
; rc 88.04.24 file processor, character io, page ...2...
e3: 1<16 ; mask for last in partial;
; special entries:
; in all cases a jump to the word just before the official entry
; will select one of the current zones as the zone parameter in
; w1. the procedure outend is often used in connection with
; the null and with the nl character; therefore special entries
; (-6 and -4) are provided for those. current output zone is
; always selected when using the special entries -6 and -4.
; outend:
h59: am -10 ; (-6): char:= null
h39: al w2 +10 ; (-4): char:= nl
al. w1 h21. ; (-2): zone:= current output zone;
h33: rs. w2 c2. ; outend:
bz w2 x1+h1+1 ; if kind <> terminal/console and
se w2 8 ; kind <> punch and
sn w2 12 ; kind <> printer and
jl. e8. ; kind <> internal process
se w2 14 ; then goto outchar;
sn w2 0 ;
jl. e8. ; goto adjust partial;
rl. w2 c2. ;
jl. w0 h26. ;
; close up:
c37: al w2 10 ; (-4): char:=nl;
c38: al. w1 h21. ; (-2): zone:= current output zone;
h34: rs. w2 c2. ; close up:
e8: rx w3 x1+h2+4 ; adjust partial word:
ld w3 8 ; partial word:= character +
lo. w3 c2. ; partial word shift 8;
so w2 2.1 ; left justify (partial word);
ld w3 8 ;
so w2 2.1 ;
ld w3 8 ;
e9: al w2 1 ; adjust message:
wa w2 x1+h3+0 ; rec base:= rec base+1;
rs w3 x2+0 ; word (rec base):= partial word;
bz w3 x1+h1+1 ; last addr.used share:=
se w3 4 ; if kind=bs
sn w3 18 ; or kind=mt
am (x1+h0+4) ; then last.shared
rl w2 4 ; else
rl w3 x1+h0+4 ; record base;
rs w2 x3+10 ;
rl w2 x3+4 ; w2:=last shared;
jl. w3 h23. ;
am (x1+h0+4) ;
rs w2 10 ; last addr.old used share :=
al w3 1 ; last shared;
rx w3 x1+h2+4 ; partial word := 1<0; (empty)
jl x3 ; return;
\f
; rc 15.6.70 file processor, character io, page ...3...
; procedures outtext, outinteger;
; registers in call at return
; w0 text addr or value destroyed
; w1 zone descriptor zone descriptor
; w2 unchanged
; w3 link link
; outtext
c35: al. w1 h21. ; (-2): zone:= current output;
h31: ds. w3 c18. ; outtext: save registers;
e11: rl w3 (0) ; get text word:
ba. w0 1 ; partial word := word(text addr);
ba. w0 1 ;
rs. w3 c14. ; text addr:= text addr+2;
jl. w3 e12. ; next char;
jl. w3 e12. ; next char;
al. w3 e11. ; next char;
e12: al w2 0 ; goto get text word;
rx. w3 c14. ; next char:
ld w3 8 ; w2:= front char of partial;
rx. w3 c14. ; partial:= partial shift 8;
sz w2 255 ; if not text end
jl. w0 h26. ; then goto outchar;
dl. w3 c18. ; restore registers;
jl x3 ; return;
; outinteger
; converts a 24 bits integer to a textstring which is output
; to the zone given in the call. the conversion is controlled
; by a layout given in the word following the call (skipped
; at return).
; layout format:
; sign<23 + fill<12 + positions
; if the sign is 1 then the value is considered a signed
; integer otherwise it is treated as having no sign.
; the fill character replaces leading zeroes.
; positions determines the number of characters output (except
; for alarm printing). the maximum value of positions is 12.
c36: al. w1 h21. ; (-2): zone:= current output;
h32: ds. w1 c1. ; outinteger:
ds. w3 c18. ; save registers;
rl w3 x3 ; unpack layout:
hs. w3 e13. ; positions := second byte(layout);
as w3 -12 ;
hs. w3 e22. ; sign := layout < 0;
la. w3 e21. ;
hs. w3 e14. ; fill := bits(1,11,first byte(layout));
la w3 0 ; if layout < 0
sh w3 -1 ; and number < 0 then
ac w0 (0) ; number := -number;
al w1 -1 ; i := -1;
e15: al w3 0 ; convert:
wd. w0 e20. ; digit := number mod 10;
al w3 x3+48 ; number := number//10;
jl. w2 e16. ; put in string(digit+iso digit base);
se w0 0 ; if number <> 0 then
jl. e15. ; goto convert;
\f
; rc 26.03.73 file processor, character io, page ...4...
al. w2 e23. ; set return(end number);
e22 = k + 1 ; sign ;
sl w0 0 ; if layout <= 0 then
jl. e17. ; goto test print sign;
e13 = k + 1 ; positions ; end number:
e23: sh w0 x1+12 ; while -1 < positions do
jl. e18. ; fill up string(fill character);
al. w0 x1+c19. ;
rl. w1 c1. ; restore(w1: zone descr addr);
e19: ba. w0 1 ; move string to zone:
bz w2 (0) ; for i := i+1 while
jl. w3 h26. ; i < string top do
se. w0 c29. ; outchar(zone, string(i));
jl. e19. ;
dl. w3 c18. ; restore registers;
jl x3+2 ; return with skip of layout;
; w0 = 0 at entry here:
e17: al w3 45 ; test print sign:
sh. w0 (c1.-2) ; char := <:-:>;
; if saved number >= 0 then
e14 = k + 1 ; fill char ; fill up string:
e18: al w3 32 ; char := fill;
e16: hs. w3 x1+c19. ; put in string:
al w1 x1-1 ; string(i) := char; i := i-1;
jl x2 ; return;
e20: 10 ; constant: 10
e21: -1-1<11 ; mask for unpack layout
m.fp io system 88.08.09
e. ; end character input/output;
\f
\f
; fgs 1986.12.12 file processor, resident, page ...1...
; fp segmentation and fp messages
h40: <:xp:>, 0, r.4; fix; name of fp area process
h44: <:s:> , 0, r.4;init; name of parent process
h42: 3<12+0 ; input message: operation
h47: 0, 0 ; first, last address
h41: 0 ; segment number
h49: 5<12+0 ; output message: operation
0, 0 ; first, last address
h45: 2<12+0<5+1; finis message:
<:finis :>, 0 ; to parent
h46: 2<13+0<5+1 ; break (pause) message
<:break :>, 0 ; to parent
c32: <:<10>***break<32><0>:> ; jfr. permanent, page ...2...
h85 :;0, r.4 ; dummy name, m(8:14), replaced by instructions
sn w0 0 ; check create area process:
jl. h69. ; if result = 0 then goto send for segment;
jl. h14. ; goto finis message;
; am 0 ; dummy instruction to balance none saved;
h43: 0, r.8 ; answer area lowest level
h64: am 0 ; hard error =
h63: am 1 ; end program:
h62: am 2 ; load:
h61: am 2 ; commands:
h60: am 1 ; init:
h78: am 1 ; terminate:
h77: am 1 ; magtape check:
h75: am 1 ; unstack:
h74: am 2 ; stack:
h73: am 1 ; connect output:
h72: am 1 ; connect input:
h71: am 2 ; simple check:
h70: al w3 1 ; io segment:
h99= (:h70-h60+6:)/2 ; swap:= segment number < 12;
ds. w1 c7. ; save (w0,w1);
sl w3 h99 ; base:= if swap then base swap
am h56; =h55-h13 ; else base transient;
al. w1 h13.+0 ; first address.mess:= base;
sl w3 h99 ; last address.mess :=
am 512 ; first addr + (if swap
al w2 x1+510 ; then 510 else 1022);
rs. w3 h41. ; set segment number (entry point);
ds. w2 h42.+4 ;
h69: al. w1 h42. ; send for segment:
al. w3 h40. ; message (<:fp:>, mess, result);
jl. w2 h11. ; if dummy answer then
se w0 1 ; goto clear name table address
jl. h38. ; and create area process (<:fp:>);
sl w0 (x1+2) ; if halfs transferred = 0 then
jl. h69. ; goto send for segment;
am. (h47.) ; enter at second word
jl +2 ; at called segment;
\f
; rc 1981.08.06 file processor, resident, page 2
; procedure parent message(message, name);
; registers call return
; w0 not used unchanged
; w1 addr of message unchanged
; w2 addr of doc name unchanged
; w3 link unchanged
; the procedure sends the following message to the parent:
; m(0 :6 ) : message
; m(8 :14) : doc name
b. g24
w.
g0: 0, r.8 ; message to parent
h35: ds. w1 g1. ; parent message:
ds. w3 g2. ; save(w0,w1,w2,w3);
dl w0 x1+2 ;
ds. w0 g0.+2 ; move message to m(0:4)
dl w0 x1+6 ;
ds. w0 g0.+6 ;
dl w0 x2+2 ;
ds. w0 g0.+10 ; move name to m(0:14)
dl w0 x2+6 ;
ds. w0 g0.+14 ;
al. w1 g0. ;
al. w3 h44. ;
jl. w2 h11. ; message(parent,message,result);
dl. w1 g1. ;
dl. w3 g2. ; restore(w0,w1,w2,w3);
jl x3 ; return;
0 ; saved w0
g1: 0 ; saved w1
0 ; saved w2
g2: 0 ; saved w3
h67:
g4: am h46-h45 ; pause: mess := break;
h14: al. w1 h45. ; finis: mess := finis;
al. w2 h40. ; w2 := addr of docname (<:fp:>) ;
jl. h35. ; goto parent message;
h11: rs. w2 c15. ; message: save link;
g7: jd 1<11+16 ; send the message (proc,mess);
se w2 0 ; if buf<> 0 then goto wait for it;
jl. g5. ; no buffer:
g6: jd 1<11+24 ; wait event (buf);
se w0 1 ; if not answer then
jl. g6. ; goto no buffer;
jd 1<11+26 ; get event(buf);
jl. g7. ; goto message;
g5: al. w1 h43. ; wait for it:
jd 1<11+18 ; wait answer (buf,answer,result);
jl. (c15.) ; return;
e. ; end;
\f
; rc 1981.08.06 file processor, resident, page ...3...
h38: al w0 0 ; clear name table address:
rs. w0 h40.+8 ; clear name table adrdress;
jd 1<11+52 ; create area process (<:fp:>);
jl. h85. ; goto check result create area process;
; procedure check all (zone);
; registers in call at return
; w0 destroyed
; w1 zone descriptor zone descriptor
; w2 used share descriptor
; w3 link destroyed
b. g24 ; begin
w. am 5 ; (-2): op:= output or
h89: al w0 0 ; check all: op:= any operation;
hs. w0 g0. ; share:= used share.zone;
rl w2 x1+h0+4 ; save (share);
ds. w3 c18. ; save (link);
g1: bz w0 x2+6 ; check share:
rl w3 x2 ; if share is pending
sl w3 2 ; with message
g0=k+1, so w0 ; if operation.share=op
jl. g2. ; then begin
jl. w3 h24. ; wait and ready;
g2: al w2 x2+h6 ; share:= share+share descr length;
sh w2 (x1+h0+8) ; if share>last share
jl. 4 ; then share:=first share;
rl w2 x1+h0+6 ; if share<>saved used share
se. w2 (c18.-2) ; then goto check share;
jl. g1. ; return;
jl. (c18.) ;
e. ; end check all;
; procedures stack, unstack (zone,chain);
; registers in call at return
; w0 unchanged
; w1 zone descriptor zone descriptor
; w2 chain address chain address
; w3 link link
; stack
al. w2 h50. ; (-4): chain:= current chain;
al. w1 h20. ; (-2): zone:= current input;
h29: ds. w1 c16. ; stack medium:
ds. w3 c17. ; save registers;
rl w2 x1+h0+4 ; save (used share.zone);
rs. w2 c18.-2 ; save (record base.zone);
dl w3 x1+h3+2 ; save (last byte.zone);
ds. w3 c27. ; comment: must be restored later;
jl. w3 h89. ; check all (zone, any operation);
jl. h74. ; call and enter stack segment;
; unstack
al. w2 h50. ; (-4): chain:= current chain;
al. w1 h20. ; (-2): zone:= current input;
h30: ds. w3 c11. ; unstack medium: save registers;
jl. h75. ; call and enter unstack segment;
\f
; rc 5.6.1970 file processor, resident, page ...3a...
; procedure wait and ready(zone,share);
; registers in call at return
; w0 not used unchanged
; w1 zone descr addr unchanged
; w2 share descr addr unchanged
; w3 link link
b. b1 ; begin block: wait and ready
w. ;
0; saved w3
b0: 0; saved w0
0; saved record base
b1: 0; saved last byte
am h20-h21 ; (-4) zone := current input else
al. w1 h21. ; (-2) zone := current output;
h24: ds. w0 b0. ; wait and ready:
dl w0 x1+h3+2 ; save(w0,w3);
ds. w0 b1. ; save(record base,last byte);
jl. w3 h48. ; wait and free;
al w0 1 ;
rs w0 x2 ; share state := 1; (ready)
dl. w0 b1. ;
ds w0 x1+h3+2 ; restore(record base,last byte);
dl. w0 b0. ; restore(w0,w3);
jl x3 ; return;
e. ; end block wait and ready
\f
; rc 11.04.72 file processor, resident, page ...4...
; procedures connect input, connect output (zone, file);
; registers in call at return
; w0 result
; w1 zone descriptor zone descriptor
; w2 file descriptor file descriptor
; w3 link link
; connect input
al. w1 h20. ; (-2): zone:= current input;
h27: ds. w3 c11. ; connect input:
jl. h72. ; call and enter conn. input segm;
; connect output
al. w1 h21. ; (-2): zone:= current output;
h28: ds. w3 c11. ; connect output:
jl. h73. ; call and enter conn. output segm;
; procedure terminate zone (zone);
; registers in call at return
; w0 tape mark unchanged
; w1 zone descriptor zone descriptor
; w2 unchanged
; w3 link link
am h20-h21 ; (-4): zone:= current input
al. w1 h21.+0 ; (-2): zone:= current output;
h79: ds. w1 c16. ; terminate zone:
ds. w3 c17. ; save registers;
jl. h78. ; call and enter terminate zone segm;
; current zones: share descriptors.
h90=1 ; number of shares in:
h81: 0, r.h90*h6/2 ; current input share descriptors
h91=1 ; number of shares in:
h82: 0, r.h91*h6/2 ; current output share descriptors
; the number of shares in the program zone is allways 1
; end of resident file processor
h55= h12+3*512 ; base of programs and of fp transient.
h56= h55-h13 ; base difference: transient - swap.
b. g1 ; begin
g1= (:h12+3*512-k:)/2 ; fill up to 1536 bytes
c. -g1 m.length error on fp segment 2
z. ; zero fill:
w. 0, r.g1 ;
e. ; end fill up;
\f
; rc 1981.08.06 file processor, resident, page ...5...
; transmit h-names to global block
j0 = h0 ; zone descriptor: buffer area
j1 = h1 ; - - process
j2 = h2 ; - - status
j3 = h3 ; - - record
j4 = h4 ; - - free
j5 = h5 ; - - length
j6 = h6 ; share descriptor length
j7 = h7 ; end program: w1=name addr, w2=ok
j8 = h8 ; current command pointer
j9 = h9 ; last of commands
j10=h10 ; interrupt address: break=h10+h76
j11=h11 ; message sender: w1=mess,w2=link,w3=name
j12=h12 ; file processor base: at present first word
j13=h13 ; swap segment base: at present h12+512
j14=h14 ; send finis message: w2=link, h14-2: pause mess
j15=h15 ; primary output description address
j16=h16 ; own process description address
j17=h17 ; parent process description address
j18=h18 ; load and enter block from program zone w1=zone
j19=h19 ; current program zone descriptor
j20=h20 ; current input zone descriptor
j21=h21 ; current output zone descriptor
j22=h22 ; inblock: w1=zone,w3=link
j23=h23 ; outblock: w1=zone,w3=link
j24=h24 ; wait and ready: w1=zone, as h89
j25=h25 ; inchar: w1=zone,w2=char,w3=link
j26=h26 ; outchar: w1=zone,w2=char,w3=link
j27=h27 ; connect input: w1=zone,w2=file,w3=link,w0=result
j28=h28 ; connect output: w1=zone,w2=file,w3=link,w0=result
j29=h29 ; stack: w1=zone,w2=chain,w3=link
j30=h30 ; unstack: w1=zone,w2=chain,w3=link
j31=h31 ; outtext: w1=zone,w0=text,w3=link
j32=h32 ; outinteger: w1=zone,w0=value,w3=link
j33=h33 ; outend: w1=zone,w2=char,w3=link
j34=h34 ; close up: w1=zone,w2=char,w3=link
j35=h35 ; parent message: w0,w1=text,w3=link
j36=h36 ; return to check: registers irrelevant
j37=h37 ; clock message , used by connect in
j38=h38 ; dummy entry, overtaken by fp segmentation
j39=h39 ; outend a new line on cur output: w3=link
j40=h40 ; name address of fp area process
j41=h41 ; segment number (in mess h42)
j42=h42 ; input message (4 words) used by fp swap machinery
j43=h43 ; answer area (8 words)
j44=h44 ; name address of fp parent process
j45=h45 ; finis message (1 word )
j46=h46 ; pause message (1 word )
j47=h47 ; first address (in mess h42)
j48=h48 ; wait and free: w1=zone,w2=share,w3=link
j49=h49 ; output message(3 words)
\f
; fgs 1982.12.09 file processor, resident, page ...6...
; transmitting h-names to global block:
j50=h50 ; current name chain address
j51=h51 ; fp mode bits
j52=h52 ; file processor version, release and subrelease
j53=h53 ; length of available area in front of zone buffer areas
j54=h54 ; working tail for file connection
j55=h55 ; base of called programs: at present h12+1536
j56=h56 ; used internally by fp (transient base - swap base)
j57=-1-1<20; fp-version = system 3
j58=h58 ; initial catbase
j59=h59 ; outend a null char on cur output, w3=link
j60=h60 ; init fp
j61=h61 ; read commands
j62=h62 ; load program
j63=h63 ; end program
j64=h64 ; hard errors on devices
j65=h65 ; special break program entry (fp internal use)
j66=h66 ; answer area for io package
j67=h67 ; parent message (***break ): w3=link
j68=h68 ; fp stderror entry: w1=zone,w3=status
j69=h69 ; fp internal use: send for fp-segment
j70=h70 ; io segment
j71=h71 ; simple check
j72=h72 ; connect input
j73=h73 ; connect output
j74=h74 ; stack
j75=h75 ; unstack
j76=h76 ; size of regdump area after interupt
j77=h77 ; magtape check
j78=h78 ; terminate zone
j79=h79 ; terminate zone: w1=zone,w3=link
j80=h80 ; current program: share descriptor
j81=h81 ; current input: first share descriptor
j82=h82 ; current output: first share descriptor
j83=h83 ; users bits
j84=h84 ; io link
j85=h85 ; empty text in parent message, overtaken by check create area process
j86=h86 ; block io: normal action, regs irr
j87=h87 ; block io: wait transport, w1=zone,w2=share
j88=h88 ; block io: give up action, regs irr
j89=h89 ; check all: w1=zone,w3=link, h89-2: output
j90=h90 ; number of shares in current input
j91=h91 ; number of shares in current output
j92=h92 ; give up action in current program zone
j93=h93 ; - - - - - - - in current input zone
j94=h94 ; - - - - - - - in current output zone
j95=h95 ; close up - as it should be
j96=h96 ; count of fp syntax errors
j97= 97 ; init catalog selection
j98= 98 ; maybe testoutput
j99=h99 ; common temporary assignments
\f
; rc 86.08.28 file processor, resident, page ...7...
; c-hames are transmitted to global block tru j-names:
; j <100+index> = c <index>
j100= c0 ; w0 block io
j101= c1 ; w1 block io
j102= c2 ; w2 block io
j103= c3 ; w3 block io
j104= c4 ; w0 swap
j105= c5 ; w2 start/wait
j106= c6 ; w3 start/wait
j107= c7 ; w1 swap
j108= c8 ; tries, saved device name
j109= c9 ; w2 swap
j110=c10 ; answer area block io
j111=c11 ; return address swap
j112=c12 ; current parameter
j113=c13 ; relative program entry point
j114=c14 ; digitstring start
j115=c15 ; return address inner most level
j116=c16 ; w1 resident
j117=c17 ; w3 resident
j118=c18 ; link outtext/outinteger
j119=c19 ; w2 outtext/outinteger
j120=c20 ; w2 end program
j121=c21 ; w0 resident
j122=c22 ; number of bytes transferred
j123=c23 ; w2 resident
j124=c24 ; number of characters transferred
j125=c25 ; fp internal use
j126=c26 ; file count
j127=c27 ; used by stack and end program
j128=c28 ; block count
j129=c29 ; digitstring end
j130=c30 ; used by end program
j131=c31 ; device name current output
m.fp resident 86.12.12
i. ; maybe names
e. ; end perament and resident fp
h99=0 ; end translation:= false;
c.h99-1 m.only resident fp was translated
e.,z. ;
\f
; fgs 1982.12.09 file processor, resident, page ...8...
; reassign h-names in global block
h0= j0-j12, h1= j1-j12, h2= j2-j12, h3= j3-j12,
h4= j4-j12, h5= j5-j12, h6= j6-j12, h7= j7-j12,
h8= j8-j12, h9= j9-j12, h10= j10-j12, h11= j11-j12,
h12= j12-j12, h13= j13-j12, h14= j14-j12, h15= j15-j12,
h16= j16-j12, h17= j17-j12, h18= j18-j12, h19= j19-j12,
h20= j20-j12, h21= j21-j12, h22= j22-j12, h23= j23-j12,
h24= j24-j12, h25= j25-j12, h26= j26-j12, h27= j27-j12,
h28= j28-j12, h29= j29-j12, h30= j30-j12, h31= j31-j12,
h32= j32-j12, h33= j33-j12, h34= j34-j12, h35= j35-j12,
h36= j36-j12, h37= j37-j12, h38= j38-j12, h39= j39-j12,
h40= j40-j12, h41= j41-j12, h42= j42-j12, h43= j43-j12,
h44= j44-j12, h45= j45-j12, h46= j46-j12, h47= j47-j12,
h48= j48-j12, h49= j49-j12, h50= j50-j12, h51= j51-j12,
h52= j52-j12, h53= j53-j12, h54= j54-j12, h55= j55-j12,
h56= j56-j12, h57= j57 , h58= j58-j12, h59= j59-j12,
h60= j60-j12, h61= j61-j12, h62= j62-j12, h63= j63-j12,
h64= j64-j12, h65= j65-j12, h66= j66-j12, h67= j67-j12,
h68= j68-j12, h69= j69-j12, h70= j70-j12, h71= j71-j12,
h72= j72-j12, h73= j73-j12, h74= j74-j12, h75= j75-j12,
h76= j76 , h77= j77-j12, h78= j78-j12, h79= j79-j12,
h80= j80-j12, h81= j81-j12, h82= j82-j12, h83= j83-j12,
h84= j84-j12, h85= j85-j12, h86= j86-j12, h87= j87-j12,
h88= j88-j12, h89= j89-j12, h90= j90-j12, h91= j91-j12,
h92= j92-j12, h93= j93-j12, h94= j94-j12, h95= j95-j12,
h96= j96-j12, h97= j97-j12, h98= j98-j12, h99= j99-j12,
; reassign c-names in global block
c0=j100-j12, c1=j101-j12, c2=j102-j12, c3=j103-j12,
c4=j104-j12, c5=j105-j12, c6=j106-j12, c7=j107-j12,
c8=j108-j12, c9=j109-j12, c10=j110-j12, c11=j111-j12,
c12=j112-j12, c13=j113-j12, c14=j114-j12, c15=j115-j12,
c16=j116-j12, c17=j117-j12, c18=j118-j12, c19=j119-j12,
c20=j120-j12, c21=j121-j12, c22=j122-j12, c23=j123-j12,
c24=j124-j12, c25=j125-j12, c26=j126-j12, c27=j127-j12,
c28=j128-j12, c29=j129-j12, c30=j130-j12, c31=j131-j12,
\f
m.
m.fp text 2 86.12.12
\f
; fp text 2
; fgs 1988.04.24 file processor, simple check, page ...1...
; this segment is called when special status bits are set for
; all input/output except for magnetic tapes.
s. k=h13, e48 ; begin
w. 512 ; length ; segment 3:
e0: dl. w0 c11. ; w3,w0:=special, remaining bits;
dl. w2 c5. ; w1,w2:=zone, share;
jl. x3+2 ; goto case special of
jl. e1. ; (0: give up,
jl. e2. ; 2: areas,
jl. e3. ; 4: readers,
jl. e4. ; 6: typewriters,
jl. e5. ; 8: char output,
jl. e6. ; 10: mag tape);
e13: 25<16 ; <em><0><0>
e15: 1<21 ; test timer
e16: 1<20 ; test overrun
e17: 1<18 ; test end doc
; working locations:
; fnc area:
e42: 44<12+2.0000011<5+1; fnc<12+pattern<5+wait
<:bs :> ; <:bs :>
0, r.4 ; docname of area process
0 ; segments
0 ; 0 entries
e47: 0 ; area process descr.
e48: 0, r.10 ; tail
\f
; fgs 1988.04.24 fileprocessor simple check, page ...2...
e2: al w3 x1+h1+2 ; areas: w3:=name.addr;
sz w0 2.111100 ; if not normal answer
jl. e30. ; then goto dummy answer;
sz. w0 (e16.) ; if overrun
jl. e10. ; then repeat;
so. w0 (e17.) ; test outside: if not end doc (i.e. -, end doc and stopped)
jl. e23. ; then repeat the rest;
bz w0 x1+h1+1 ; end document (maybe stopped):
bz w3 x2+6 ; w0 := zone.kind;
sn w0 4 ; w3 := operation;
se w3 5 ; if proc kind = area process and
jl. e19. ; operation = output then
jl. e46. ; goto extend area;
e19: se w3 3 ; maybe physical end of medium:
jl. e1. ; if not input then give up;
rl. w0 c11. ;
so w0 1<8 ; if -, stopped then
jl. e7. ; goto return;
e20: rl w3 x1+h1+12 ; physical eom:
al w3 x3+1 ; file count:= file count+1;
al w0 0 ; block count:= 0;
ds w0 x1+h1+14 ; zone (first addr):= eom char;
rl. w0 e13. ; top transferred:= first addr+2;
rs w0 (x2+8) ; goto normal action;
rl w1 x2+8 ; comment: the following entries set
al w1 x1+2 ; the return point to the
rs w1 x2+22 ; io-segment;
e7: am h86-h87 ; normal return: set return
e8: am h87-h88 ; wait transport: set return
e1: al. w3 h88. ; give up: set return.
dl. w2 c5. ; w1,w2:=zone,share;
ds. w3 c11. ; w3:=return point;
jl. h70. ; call and enter io-segment;
e30: so w0 1<5 ; dummy answer: if existing
jl. e31. ; then goto rejected;
al w0 0 ; create:
rs w0 x3+8 ; name table addr := 0;
jd 1<11+52 ; create area process;
se w0 0 ; if not created then
jl. e1. ; goto give up;
bl w0 x2+6 ; if operation=input
sn w0 3 ; then
jl. e10. ; goto repeat;
\f
; fgs 1988.04.24 fileprocessor simple check, page ...3...
e32: jd 1<11+8 ; reserve: reserve process;
se w0 0 ; if not reserved
jl. e1. ; then goto give up;
jl. e10. ; goto repeat;
e31: bl w0 x2+6 ; rejected:
sn w0 5 ; if operation = output
jl. e32. ; then goto reserve;
bz w0 x1+h1+1 ; w0 := zone.kind;
sn w0 6 ; if kind = disc process then
jl. e32. ; goto reserve;
jl. e1. ; goto give up;
e46: al w3 x1+h1+2 ; extend:
jd 1<11+4 ; process description;
rs. w0 e47. ;
am (0) ;
rl w0 18 ; old size := no of segments (area process);
rl w3 x2+10 ;
ws w3 x2+8 ; new size :=
al w3 x3+2 ; segment(share) +
ls w3 -9 ; (last transfer-first transfer+2)//512;
wa w3 x2+12 ;
sl w0 x3 ; if old size >= newsize then
jl. e10. ; goto repeat;
al w0 x3 ;
al w3 0 ;
am. (e47.) ; device:=area(10);
rl w2 10 ; slice length:=device(26);
sn w2 0 ; if deviceref=0 then
jl. e33. ; jump
wd w0 x2+26 ; new size :=
se w3 0 ; (new size // slice length
ba. w0 1 ; + if remainder = 0 then 0 else 1)
wm w0 x2+26 ; * slice length;
e33: rl w2 0 ; w2 := new size;
\f
; fgs 1988.04.24 fileprocessor simple check, page ...4...
e14: al w3 x1+h1+2 ;
al. w1 e48. ;
jd 1<11+42 ; lookup entry(area);
rs w2 x1 ; size := new size;
jd 1<11+44 ; change entry;
se w0 6 ; if claims exceeded then
jl. e35. ; begin <*extend area*>
rl. w0 e42.+12 ;
se w0 0 ; if fnc area.segm <> 0 then
jl. e29. ; goto give up;
rl. w1 h51. ;
sz w1 1<10 ; if mode.bswait = false then
jl. e34. ; begin
rl. w0 e42. ; fnc area.fnc :=
ls w0 -1 ; fnc area.fnc -
ls w0 1 ; wait bit;
rs. w0 e42. ; end;
e34: rl. w1 e47. ; claim :=
rl. w0 e48. ; new size -
ws w0 x1+18 ; old size ;
rs. w0 e42.+12 ; fnc area.segm := claim;
dl w0 x1+22 ; move
ds. w0 e42.+6 ; area process.docname
dl w0 x1+26 ; to
ds. w0 e42.+10 ; fnc area.docname;
al. w1 e42. ; w1 := addr first half fnc area;
al w2 x1+8 ; w2 := addr second half fnc area;
jl. w3 h35. ; parent message special (w1=fnc area);
dl. w2 c5. ; w1 := zone;
rl. w2 e48. ; w2 := new size;
jl. e14. ; goto change entry;
; end else
e35: sn w0 0 ; if result <> 0 then
jl. e26. ; begin
e29: al w0 0 ; fnc area.segm := 0;
rs. w0 e42.+12 ; goto give up;
jl. e1. ; end else
;
e26: rs. w0 e42.+12 ; begin
dl. w2 c5. ; fnc area.segm := 0;
dl. w0 c11. ; restore registers ;
jl. e10. ; goto repeat;
; end;
\f
; rc 88.04.24 file processor, simple check, page ...5...
e3: ; readers:
rl. w3 c22. ; if bytes transf <> 0
sn w3 0 ;
jl. e20. ; goto normal action;
jl. e7. ; goto physical eom;
; change paper message to parent:
e25: 13<13+0<5+1 ; m(0) , pattern word, wait;
<:change<32>:> ; m(2:6)
e4: bl w3 x2+6 ; typewriters:
se w3 5 ; if operation = input then
jl. e27. ; goto test stop;
e5: sz. w0 (e15.) ; char output:
jl. e1. ; if timer then goto give up;
so. w0 (e17.) ; test end doc:
jl. e27. ;
al w2 x1+h1+2 ; if end document then
al. w1 e25. ; parent message(<:change :>, doc name);
jl. w3 h35. ;
dl. w0 c11. ;
dl. w2 c5. ;
e27: so w0 1<8 ; test stop:
jl. e7. ; if not stopped then
rl w3 x2+22 ; goto normal action;
rs w3 x2+8 ; first addr:=top transferred;
; repeat
e10: al w3 x1+h1+2 ; block repeat:
al w1 x2+6 ; send message (proc.zone,mess.share);
jd 1<11+16 ; share state:= message buffer address;
rs w2 x1-6 ; goto wait transport;
jl. e8. ;
e23: rl. w0 c10. ; repeat the rest: w0:=total status;
sz. w0 (e17.) ; if end doc in status
jl. e7. ; then return;
rl w0 x2+22 ;
rx w0 x2+8 ; first addr:=top transf
ac w0 (0) ; seg.number:=
wa w0 x2+22 ; seg.numer +
ls w0 -9 ; (top transf - old first)//512
wa w0 x2+12 ;
rs w0 x2+12
jl. e10. ; goto block repeat;
e6=e1 ; mag tape: goto give up;
b. g1 ; begin
g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes
c. -g1 m.length error on fp segment 3
z.w. 0, r.g1 ; zero fill
e. ; end fill up;
m.fp simple check 88.05.04
i. ; maybe names
e. ; end simple check;
\f
; rc 22.08.74 fileprocessor connect in, page ...1...
; connect input
; c4: w0 place result here
; c7: w1 zone descriptor address
; c9: w2 address of file descriptor or of name
; c11: w3 return
s. k=h13, a40, b10, e48, j24 ; begin
w. 512 ; length ; segment 4:
e0: rl. w2 c9. ; c9 = file descr;
dl w0 x2+2 ; if mode < 0 then
sh w3 -1 ; goto descriptor found;
jl. j3. ; name:
al w3 x2+0 ; cat look up:
al w2 x2-2 ; name pointer:= w2+2;
rs. w2 c9. ; comment: to handle not
al. w1 h54. ; found items;
jd 1<11+42 ; lookup (wtail,name words);
se w0 0 ; if result <> 0
jl. e33. ; then goto unknown;
rl w1 x1 ; if mode >= 0
sh w1 -1 ; then
jl. j1. ; move name to wtail;
dl w1 x3+2 ;
ds. w1 h54.+4 ;
dl w1 x3+6 ;
ds. w1 h54.+8 ;
j1: al. w1 h54.+0 ; test mode:
j4: al w2 x1 ; descriptor found:
j3: rl w0 x2+0 ; w2:=file descriptor addr;
sl w0 0 ; if mode >= 0
rl. w0 e47. ; then mode := 1<23+4;
rs. w2 c9. ; save file descr. addr;
rs w0 x2+0 ;
bz w1 1 ; if kind>max kind
ls w1 -1 ; then goto convention error;
sl w1 e16 ;
jl. e34. ;
bl. w0 x1+e13. ; block length:= standard (kind);
hs. w0 e14. ;
al w0 0 ;
rs w0 x2+10 ; name table address :=0;
bz w0 x2+16 ; algol or fortran procedures:
sn w0 4 ; if contents = 4
jl. j8. ; or
sh w0 31 ; contents >= 32
jl. j7. ; then
j8: ld w0 -65 ; file count:=block count:=0;
ds w0 x2+14 ;
j7: rl. w3 c7. ; area claim:
sn w3 0 ; if zone=0 then
jl. j6. ; goto separate proc;
bz w0 x3+h1+1 ; if kind.zone = 4 then
al w3 x3+h1+2 ; remove process (name.zone);
sn w0 4 ; comment: to save the area claim;
jd 1<11+64 ; result irrelevant;
\f
; fgs 1986.12.12 file processor, connect in, page ...2...
j6: am x1 ; separate proc:
jl. x1+e15. ; goto proc (kind);
e15: jl. e25. ; ip: goto check and init;
jl. e34. ; clock: goto convention error;
jl. e25. ; bs: goto check and init;
jl. e25. ; drum: goto check and init;
jl. e25. ; tw: goto check and init;
jl. e1. ; tr: goto readers;
jl. e34. ; tp: goto convention error;
jl. e34. ; lp: goto convention error;
jl. e1. ; cr: goto readers;
jl. e43. ; mt: goto reserve tape;
; standard block length :
h. ; bytes ; kind
e13: 512-2 ; 0: 768 chars
0-2 ; 2: 0 -
512-2 ; 4: 768 -
512-2 ; 6: 768 -
104-2 ; 8: 156 -
36-2 ; 10: 56 -
80-2 ; 12: 120 -
80-2 ; 14: 120 -
80-2 ; 16: 120 -
512-2 ; 18: 768 -
e14: 512-2 ; selected block size
e16=e14-e13 ; max kind
w. ;
e47: 1<23+4 ; mode,kind for bs
e48: 3<12+1<11 ; constant to be added to mode,kind
; mount tape message to parent:
a1: 7<13+0<5+1 ; m(0) , pattern word, wait
<:mount <0>:> ; m(2:6)
a5: al. w1 a1. ; mount tape:
al w2 x3 ; parent message(<:mount :>);
jl. w3 h35. ;
e43:
a4: rl. w2 c9. ; reserve tape:
al w3 x2+2 ; initialize process(proc.file);
jd 1<11+6 ;
se w0 0 ; if not ok
jl. a5. ; then goto mount tape;
\f
; fgs 1984.09.04 file processor, connect in, page ...3...
al w0 2047 ; set mode:
bz w1 x2 ;
la w0 2 ;
al w1 14 ;
hs w1 0 ; operation(message) :=
rs. w0 c10. ; set mode < 12 + mode;
al. w1 c10. ;
jd 1<11+16 ; send message;
jd 1<11+18 ; wait answer;
rl. w2 c9. ; set position:
al w1 6 ;
al w0 8 ;
hs. w0 e48. ; ...change <operation> to <move>...
ls w0 12 ; operation(message) := move < 12;
ds. w1 c10.+2 ; message(2) := 6;
dl w1 x2+14 ; message(4) := file count;
ds. w1 c10.+6 ; message(6) := block count;
al. w1 c10. ; send message;
jd 1<11+16 ;
rs. w2 e37. ; init buf := message buffer address;
jl. e40. ; goto move description;
; check and init:
e25: bz w1 x2+1 ; check and init:
al w3 x2+2 ; w3:=name addr;
al w0 0 ;
sn w1 4 ; if kind = 4 then
jd 1<11+52 ; create area process;
se w0 0 ; if result <> 0 then
jl. a27. ; goto set result;
jd 1<11+6 ; initialize process(w3);
sn w0 0 ; if result=0 (ok) then
jl. e40. ; goto move description;
sn w0 1 ; if result=1 then goto
jl. e35. ; access not allowed;
sn w0 2 ; if result=2 then goto
jl. e31. ; no resources;
jl. e33. ; not present;
\f
; fgs 1988.08.09 file processor, connect in, page ...4...
; until now the zone descriptor was unchanged:
; move the file descriptor to the zone descriptor.
e40: al. w2 e30. ; move description: return := set ok result;
a29: rs. w2 b3. ; save return;
dl. w2 c9. ;
al w0 0 ; if zone descr addr=0
sn w1 0 ; then goto ok result;
jl. e30. ;
dl w0 x2+2 ; move (mode,kind,name,
sz w3 1 ; <*if kind odd then
al w3 x3-1 ; truncate kind*>
ds w0 x1+h1+2 ; name table addr,
dl w0 x2+6 ; file count,
ds w0 x1+h1+6 ; block count) from:
dl w0 x2+10 ; (file descriptor) to:
ds w0 x1+h1+10 ; (zone descriptor);
dl w0 x2+14 ; segment count:=block count;
ds w0 x1+h1+14 ;
rs w0 x1+h1+16 ;
al. w3 h68. ; if give up action<fp std error
sl w3 (x1+h2+2) ; then give up action:=
rs w3 x1+h2+2 ; fp std error addr;
al w0 1 ; partial word:=1<16;
ls w0 16 ;
rs w0 x1+h2+4 ;
ld w0 -65 ; record base:=
ds w0 x1+h3+2 ; last byte:= 0;
rs w0 x1+h3+4 ;
rl w3 x1+h0+6 ; used share:=first share;
rs w3 x1+h0+4 ;
e46: bl w0 x1+h1+0 ; set shares:
wa. w0 e48. ; for share:=first share step
rs w0 x3+6 ; share descr length until last share
rl w0 x3+2 ; do begin
rs w0 x3+8 ; message(0):=(if magtape then move else 3<12)+mode;
rs w0 x3+22 ; top transferred := first shared;
ba. w0 e14. ; message(2):=first shared;
rs w0 x3+4 ; message(4):=last shared:=
rs w0 x3+10 ; first shared+block size-2;
al w0 0 ;
rs w0 x3+0 ; state.share:=0 (free);
al w3 x3+h6 ; end;
sh w3 (x1+h0+8) ;
jl. e46. ;
jl. (b3.) ; goto saved return;
; at return to the io-segment w0 must be set to the result of
; the connection, w1 must be unchanged , and the saved values
; of w2,w3 must also be unchanged.
\f
; fgs 1988.08.09 file processor, connect in, page ...5...
; connection results: if ok then w0=0 else w0<>0.
;e36: am 1 ; 6: name format error
e35: am 1 ; 5: not allowed
e34: am 1 ; 4: convention error
e33: am 1 ; 3: not user,non-exist
e32: am 1 ; 2: malfunctioning
e31: al w0 1 ; 1: no resources
jl. a27. ; goto set result;
e30: rl. w1 c7. ; ok result:
rl. w2 e37. ; w0 := result;
se w1 0 ; if zone <> 0 then
rs w2 (x1+h0+4) ; state(first share) := init buf;
se w2 0 ; if init buf = 0
se w1 0 ; or zone <> 0 then
jl. h70. ; return;
al. w1 c10. ; w1 := answer address;
jd 1<11+18 ; wait answer;
se w0 1 ; w0 := if result = 1 then 0 else 5;
am 5 ;
a28: al w0 0 ; ok exit: w0:=0;
a27: rl. w1 c7. ; set result:restore w1;
jl. h70. ; return;
e37: 0 ; init buf;
b2: 1<18 ; test end of paper
b3: 0 ; saved return
b4 = h37+10 ; clock message (jfr. permanent, page 6)
b5 = h37 ; name of clock (jfr. permanent, page 6)
; wait reader message to parent:
b0: 8<13+0<5+0 ; m(0) , pattern word
<:wait for :> ;
; load reader message to parent:
b1: 12<13+0<5+0 ; m(0) , pattern word
<:load :>, 0 ; m(2:6)
e1: al w3 x2+2 ; readers:
jd 1<11+6 ; initialize process;
sn w0 0 ; if initialized then
jl. a36. ; goto init zone;
sn w0 1 ; if reserved by another then
jl. a2. ; goto wait reader:
sn w0 2 ; if result = 2 then
jl. e31. ; goto no resources
jl. e33. ; else goto not user;
a2: al. w1 b0. ; wait reader:
al w2 x2+2 ;
jl. w3 h35. ; parent message(<:wait for:>, doc name);
a30: jl. w3 a33. ; rep: wait a second; w3 := doc name addr;
jd 1<11+6 ; initialize process;
sn w0 1 ; if reserved by another then
jl. a30. ; goto rep;
a36: jl. w2 a29. ; init zone: move description;
rl. w3 c7. ;
al w3 x3+h1+2 ; w3 := addr(document name);
\f
; fgs 1988.08.09 file processor, connect in, page ...6...
a31: jl. w2 a34. ; clean reader: read a block;
rl w1 x2+4 ; w1:=result;
jd 1<11+26 ; get event;
se w1 1 ; if not normal answer
jl. a37. ; then goto clear share;
so. w0 (b2.) ; if not end of paper then
jl. a31. ; goto clean reader;
jd 1<11+6 ; initialize process;
al. w1 b1. ;
rl. w2 c9. ;
al w2 x2+2 ;
jl. w3 h35. ; parent message(<:load :>,doc name);
rl. w3 c9. ; w3:=
al w3 x3+2 ; name address;
a32: jl. w2 a34. ; rep1: read a block;
rl w1 x2+10 ; w1 := bytes transferred;
se w1 0 ; if bytes transferred <> 0 then
jl. a28. ; goto okexit;
jd 1<11+26 ; get event;
jl. w3 a33. ; wait a second; w3:=name address;
jl. a32. ; goto rep1;
a33: rs. w3 b3. ; wait a second: save return;
al. w1 b4. ;
al. w3 b5. ;
jd 1<11+16 ; send message(clock);
al. w1 b4.+4 ;
jd 1<11+18 ; wait answer;
rl. w3 c9. ;
al w3 x3+2 ; w3 := doc name addr;
jl. (b3.) ; return;
a34: rs. w2 b3. ; read a block: save return;
rl. w1 c7. ;
rl w1 x1+h0+6 ; w1 := first share;
al w1 x1+6 ; w1 := message addr;
jd 1<11+16 ; send message;
rs w2 x1-6 ; share state := buf addr;
al w2 0 ; w2 := start event queue;
a35: rl w0 x2+8 ; rep2: (w0,w1) := (status,bytes transferred);
sn w2 (x1-6) ; if event = share state then
jl. (b3.) ; return;
jd 1<11+24 ; wait event;
jl. a35. ; goto rep2;
a37: rl. w1 c7. ; clear chare:
rl w1 x1+h0+6 ; share state
al w0 0 ; (first share
rs w0 x1 ; (zone)):=0;
jl. e31. ; goto no resources
b. g1
w.
g1 = (:h13+512-k:)/2
c. -1-g1, m. length error, connect in
z.
c. -1+g1
w. 0, r.g1 ; fill segment
z.
e. ; end fill
m.fp connect input 88.08.09
i. ; list names
e. ; end connect in
\f
; fgs 1988.05.01 fileprocessor connect output, page ...1...
; segment 1
; connect output consists of two backing storage segments. the first
; segment is loaded by the call. the second segment is loaded by con-
; nect output itself.
; entry: c4: w0: segments<2 + permkey
; c7: w1: zone descriptor address or 0
; c9: w2: address of filedescriptor or of name
; c11: w3: link
; exit: w0: result
; w1: unchanged
; w2: address of filedescriptor
; w3: undefined
; The contents of w0 are only used, if connect output creates (or changes)
; an area on backing storage:
; If w0 is zero no new bs area is created.
; If w0 is non-zero and if w2 defines a name, which is not found in
; the catalog (by a call of lookup_entry), or if the entry exists and it
; describes a backing storage area, which is protected against writing, then
; connect output will create an area on the disc with the most
; resources of the particular permkey.
; The name of the area is defined by w2. the size of the area is
; given as the second parameter in w0 (segments).
; If this parameter is negative, the size will be max. claim (for the
; device with the greatest claims of the particular permkey) decreased
; by the absolute value of segments.
; If segments is positive, the areasize will be minimum of <segments>
; and max. claim.
; If the entry already exists the areasize is increased if demanded
; according to the rules above.
; If the area exists in advance the areasize is
; never decreased by connect output.
\f
; fgs 1988.05.01 fileprocessor connect output, page ...2...
; segment 1
s. k=h13, a40, b20, e49 ; begin segment: connect output
w. 1024 ; size of connect output
al. w1 h54.-14 ; connect output:
rl. w3 c9. ; w1:=address of look up - area
al w2 x3 ; w2:= addr of file descr or name;
rl w0 x3 ;
sl w0 0 ; if w2 param points at filedescriptor then
jl. a0. ; begin
se. w0 (e47.) ; if modekind <> bs then
jl. a13. ; goto descriptor found;
al w3 x3+2 ;
jd 1<11+76 ; lookup head and tail;
sn w0 0 ; if not found
jl. w3 a35. ; or outside bases then
jl. a33. ; goto create new;
rl. w0 h54. ;
sh w0 -1 ; if size < 0 then
jl. a17. ; goto convention error;
jl. a2. ; end;
; else
\f
; fgs 1988.05.01 fileprocessor connect output, page ...3...
; segment 1
a0: jd 1<11+76 ; begin comment name parameters;
se w0 0 ; lookup head and tail;
jl. a32. ; if not found then
al. w2 h54. ; goto create blank
rl. w0 h54. ;
se. w0 (e47.) ; if modekind <> bs
sl w0 0 ; and modekind < 0 then
jl. 4 ; goto descriptor found;
jl. a13. ;
jl. w3 a35. ; if outside bases then
jl. a32. ; goto create blank;
se. w0 (e47.) ; if modekind = bs then
jl. b3. ; begin
al w2 2 ;
a1: dl. w0 x2+h54. ; move file descriptor
ds. w0 x2+b0. ; to saved file descriptor;
al w2 x2+4 ;
sh w2 19 ;
jl. a1. ;
al. w2 b0. ;
al w3 x2+2 ;
jd 1<11+76 ; lookup head and tail
sn w0 0 ; if not found
jl. w3 a35. ; or outside bases
jl. a33. ; then goto create new;
rl. w0 h54. ;
sh w0 -1 ; if size < 0 then
jl. a17. ; goto convention error;
jl. a2. ; end name indirect
b3: jl. w3 b8. ; else
dl. w1 h54.+18 ; begin
ds w1 x2+18 ; make blank;
dl. w1 h54.+14 ; move file, block, contry, length;
ds w1 x2+14 ;
rl. w0 h54. ; end;
jl. a2. ; goto make larger;
; end name parameter;
\f
; fgs 1988.05.01 fileprocessor connect output, page ...4...
;segment 1
a32: jl. w3 b8. ; create blank: make blank;
a33: rl. w3 c4. ; create new:
rs. w2 c9. ; save w2;
al w2 18 ;
ld w1 -100 ;
b6: ds. w1 x2+h54. ; for i:= 18 step -2 until 4 do
al w2 x2-4 ; lookup area(i):= 0;
se w2 2 ;
jl. b6. ;
al w1 3 ; lookup area (0) := 0;
la w1 6 ; lookup area (1) := w0.permkey;
ds. w1 h54.+2 ;
al w0 x1 ; key := permkey;
as w3 -2 ; wanted := w0.segments > 2;
jl. b7. ; goto get claims;
a2: rs. w2 c9. ; make larger: ;comment now size>=0;
rl. w3 c4. ; save address of file descr.
as w3 -2 ;
al w0 2.111 ;
la. w0 h54.-14 ; key:= key(entry);
b7: jl. w1 a8. ; get claims (key,entry);
\f
; fgs 1988.05.05 fileprocessor connect output, page ...5...
; segment 1
rx w0 6 ; swop (claim, wanted);
jl. w2 a4. ; convert to slices (claim);
rx w0 6 ; swop (claim, wanted);
jl. w2 a4. ; convert to slices (wanted);
rx. w3 h54. ; swop (wanted, size);
jl. w2 a4. ; convert to slices (size );
rx. w3 h54. ; swop (size, wanted);
sl w3 0 ; if wanted < 0 then
jl. a5. ; wanted := wanted +
wa. w3 h54. ; size +
wa w3 0 ; claims ;
a5: wa. w0 h54. ;
am (0) ;
sl w3 +1 ; if wanted > size + claims then
rl w3 0 ; wanted := size + claims;
sh. w3 (h54.) ; if wanted <= size then
rl. w3 h54. ; wanted := size ;
wm. w3 h10.+6 ; wanted := wanted * slicelength;
rs. w3 h54. ; size := wanted ;
al. w1 h54. ;
rl. w3 c9. ; change entry (lookup area, name in descr);
al w3 x3+2 ;
jd 1<11+44 ;
se w0 0 ; if not changed then
jd 1<11+40 ; create entry (lookup area, name in descr);
se w0 0 ; if not created then
jl. a18. ; goto no resources;
a6: rl. w3 c9. ;
al. w2 h54.+20 ; move file descriptor to
a7: al w3 x3-4 ; lookup area;
al w2 x2-4 ;
dl w1 x3+22 ;
ds w1 x2+2 ;
se. w2 h54. ; w2:= address of lookup area;
jl. a7. ;
a13: rl w0 x2 ; descriptor found:
rs. w2 c9. ; save file descriptor;
rl. w1 c7. ; call connect2: w1 := saved w1;
rl. w3 h41. ;
al w3 x3+1 ; segment(fp) := segment(fp) + 1;
jl. h70.+2 ; call segment 2(connect output);
\f
; fgs 1985.03.07 fileprocessor connect output, page ...6...
; segment 1
b0: 1<23+4
0, r.9 ; saved file descriptor;
0, b1: 0 ; work for outside bases, make blank and get claims
a35: ds. w2 b1. ; boolean procedure outside bases;
am. (h16.) ; returns to x3 if the entry in
dl w2 74 ; h54 is outside max base. else
al w2 x2+1 ; a return to x3+2 is made
sh. w1 (h54.-12) ; (just as skip-instructions do).
sh. w2 (h54.-10) ; the procedure is called with
al w3 x3-2 ; return in w3. w0,w1,w2 are
dl. w2 b1. ; unchanged.
jl x3+2 ;
b8: rs. w3 b1. ; procedure make blank:
al. w2 b0. ; w2:=saved file descriptor
rl. w3 c9. ;
dl w1 x3+2 ; saved file descr(2:8):= name;
ds w1 x2+4 ; comment it is used that the
dl w1 x3+6 ; rest of saved file descr = 0;
ds w1 x2+8 ; w2:= saved file descr;
jl. (b1.) ; return;
\f
; fgs 1988.05.01 fileprocessor connect output, page ...7...
; segment 1
; procedure get claims (key, filedescriptor);
;
; call: return:
;
; w0 key claim
; w1 link link
; w2 - unchanged
; w3 - unchanged
;
; filedescriptor.docname entry.docname or docname of disc
; 0, ..., 3 with claims
;
; The procedure finds the disc with the largest claims for the
; given key and returns the claims in w0 and the docname of the
; disc in filedescriptor.docname.
; If docname given in filedescriptor.docname is 0, all discs are
; searched for the one with the greatest claims of that particular
; permkey. The search goes on backwards from last disc to first disc
; or drum.
; If, however, the docname given is a document name for a disc
; included in the bs system, the procedure returns the claims
; for the given key for that disc.
;
a8: ds. w3 h10.+4 ; get claims: (fp exception routine dump area used)
rs. w1 h10.+0 ; save (w2, w3); save return;
zl w2 64 ;
sl w2 9 ; if monitor release > 8 then
am 1 ; key := key * 4 else
ls w0 1 ; key := key * 2 ;
hs. w0 b2. ;
al w0 -2 ;
sh w2 8 ; if monitor <= 8 then
hs. w0 b12. ; decr := -2;
rl w0 92 ; w0 := first drum;
rl w1 96 ; last device :=
al w1 x1-2 ; top discs - 2;
rs. w0 b1. ; first device := first drum;
\f
; fgs 1988.05.01 fileprocessor connect output, page ...7a...
; segment 1
rl. w2 h54.+2 ; w2 := first word of docname;
sh w2 3 ; if docname (1) <> (0, 1, 2, 3) then
jl. a12. ; begin <*docname specified*>
al. w3 h54.+2 ;
jd 1<11 + 4 ; w0 := proc descr addr (docname);
sn w0 0 ; if process exists then
jl. a12. ; begin
am (0) ; w0 :=
rl w0 24 ; chaintable addr (docname);
a25: rl w2 x1 ; loop: w2 := device.chaintable address;
sn w2 (0) ; if device.chaintable address <>
jl. a39. ; doc .chaintable address then
; begin
al w1 x1-2 ; device := device -2;
jl. a25. ; goto loop;
; end;
a39: rs. w1 b1. ; first device := last device := device found;
; end process exists;
; end docname specified;
a12: al w0 0 ;
rs. w0 h10.+8 ; max slices := 0;
a9: rl w2 x1 ; next device:
rl. w3 h16. ; w2 := device.chaintable address;
wa w3 x2-36 ; w3 := device.key zero claims;
rs. w3 h10.+12 ; save device.key zero claims;
al w0 2047 ; min slices :=
jl. w2 a3. ; convert to segments (
rs. w0 h10.+10 ; + infinity);
b2 = k + 1 ; key * (if mon rel < 9 then 2 else 4);
al w3 x3+0 ; w3 := device.slice claims.key
\f
; fgs 1988.05.01 fileprocessor connect output, page ...7b...
; segment 1
a10: zl w0 64 ; next key:
sl w0 9 ; if monitor release <= 8 then
jl. a36. ; begin <*halfwords*>
rl w0 6 ; device key :=
ws. w0 h10.+12 ; (device.key claims -
ls w0 -1 ; device.key0 claims) > 1;
zl w2 x3 ; w2 := entry claims;
sh w0 1 ; if device key <= 2 then
al w2 1 ; w2 := 1;
zl w0 x3+1 ; w0 := slice claims;
jl. a37. ; end else
a36: rl w0 6 ; begin
ws. w0 h10.+12 ; device key :=
ls w0 -2 ; (device key claims - device.key0 claims) > 2;
rl w2 x3 ; w2 := entry claims;
sh w0 1 ; if device key <= 2 then
al w2 1 ; w2 := 1;
rl w0 x3+2 ; w0 := slice claims;
a37: ; end;
sh w2 0 ; if entry claim = 0 then
al w0 0 ; slice claim := 0;
jl. w2 a3. ; convert to segments (slice claim);
sh. w0 (h10.+10) ; if slice claim <= min slices then
rs. w0 h10.+10 ; min slices := slice claim;
b12=k+1 ; decr:
a29: al w3 x3-4 ; decrease sliceclaim key address by decr;
sl. w3 (h10.+12) ;
jl. a10. ;
; if claim key addr >= claim key 0 address then
; goto next key;
rl w2 x1 ; device := chaintable;
rl. w0 h10.+10 ;
sl. w0 (h10.+8) ; if min slices >= max slices then
jl. a11. ;
jl. a38. ; begin
a11: rs. w0 h10.+8 ; max slices := min slices;
rs. w2 h10.+14 ; best device := device;
rl w0 x2-8 ; slice length := slice length (device);
rs. w0 h10.+6 ; end;
a38: al w1 x1-2 ; device := device - 2;
sl. w1 (b1.) ; if device <> first device then
jl. a9. ; goto next device;
\f
; fgs 1988.05.01 fileprocessor connect output, page ...7c...
; segment 1
rl. w2 h10.+14 ; get best device;
dl w0 x2-16 ; move
ds. w0 h54.+4 ; chaintable.docname
dl w0 x2-12 ; to
ds. w0 h54.+8 ; filedescriptor.docname;
rl. w0 h10.+8 ; w0 := max slices in segments;
dl. w3 h10.+4 ; restore (w2, w3);
jl. (h10.) ; return;
\f
; fgs 1988.05.01 fileprocessor connect output, page ...7d...
; segment 1
; procedure convert to segments (slices);
;
; call : return :
;
; w0 : slices slices * slicelength
; w1 : name table entry unchanged
; w2 : link address chaintable
; w3 : device.slice claims.key unchanged
b. b3 ; begin block
w.
a3: rs. w2 b2. ; save return;
rl w2 x1 ; w2 := chain table entry;
rs. w3 b3. ; save w3;
wm w0 x2-8 ; slices := slices * slicelength;
rl. w3 b3. ; restore w3;
jl. (b2.) ; return;
b2: 0 ; saved return
b3: 0 ; saved w3;
i.
e. ; end block
\f
; fgs 1988.05.01 fileprocessor connect output, page ...7e...
; segment 1
; procedure convert to slices (w3, slicelength);
;
; call : return :
;
; w0 : - unchanged
; w1 : - destroyed
; w2 : link destroyed
; w3 : value (value - sign)//slicelength + sign
; h10.+6 : slicelength slicelength
;
a4: rs. w2 h10.+0 ; entry: save return;
sh w3 0 ; i :=
am +2 ; sign (value);
al w1 -1 ;
sn w3 0 ;
al w1 0 ;
wa w3 2 ; extend sign (w3);
el w2 6 ; value := ((value + i)//
el w2 4 ; slicelength - i) *
wd. w3 h10.+6 ; slicelength ;
ws w3 2 ;
jl. (h10.) ; return;
\f
; fgs 1988.05.01 file processor connect output, page ...7f...
; segment 1
b9: am -1 ; unknown:
a17: am 3 ; convention error:
a18: al w0 1 ; no resources:
rl. w1 c7. ; w1 := saved w1; w0 := result;
jl. h70. ; return;
e47: 1<23 + 4 ; mode, kind for backing storage;
b. g1 ; fill segment
g1 = (:h13+512-k:)/2
c. -1-g1 m. length error connect output 1
z.
c. -1+g1
w. 0, r.g1
z.
e.
m.fp connect out 1 88.08.09
\f
; fgs 1988.05.05 fileprocessor connect output, page ...8...
; segment 2
k = h13 ; start segment 2
w. 0 ; dummy word
; c4 : filedescr.kind
; c7 : zone addr or 0
; c9 : file descr addr
; c11: link
e0: rl. w2 c9. ; entry segment 2:
rl. w0 c4. ; w2 := addr file descr; w0 := file descr.kind;
zl w1 1 ; kind := file descr.kind >
ls w1 -1 ; 1;
sl w1 e16 ; if kind > max kind then
jl. a27. ; goto convention error;
rs. w1 c4. ; save kind;
bl. w0 x1+e13. ;
rs. w0 h10. ; blocklength := standard(kind);
al w0 0 ;
rs w0 x2+10 ; name table address := 0;
bz w0 x2+16 ; algol or fortran procedures:
sn w0 4 ; if contents = 4
jl. a34. ; or
sh w0 31 ; contents >= 32
jl. a14. ; then
a34: ld w0 -65 ; filecount := blockcount := 0;
ds w0 x2+14 ;
a14: rl. w3 c7. ;
sn w3 0 ; if zone = 0 then
jl. a40. ; goto determine action;
bz w0 x3+h1+1 ;
al w3 x3+h1+2 ; if zone.kind = 4 then
sn w0 4 ; remove process(zone.name);
jd 1<11+64 ; comment result not checked;
a40: rl. w3 c4. ; w3 := kind > 1;
zl. w3 x3+e15. ; w3 := action address (kind);
a16: jl. x3+e0. ; switch to action(kind);
e49: 1<15 ; write enable bit
e48: 5<12 + 1<11 ; constant to be added to <mode,kind>
\f
; fgs 1986.12.12 fileprocessor connect output, page ...9...
; segment 2
; mount ring message to parent:
a19: 9<13 + 0<5 + 1 ; m(0) , pattern word, wait
<:enable <0>:> ; m(2:6)
; mount tape message to parent:
a20: 7<13 + 0<5 + 1 ; m(0) , pattern word , wait
<:mount <0>:> ; m(2:6)
a21: al. w1 a20. ; mount tape:
a22: al w2 x3 ;
jl. w3 h35. ; parent message(<:mount:>);
am (x2) ; test work tape:
se w3 x3 ; if first word(doc name) <> 0
jl. a23. ; then goto reserve tape;
dl. w1 h43.+2 ; move name from parent
ds w1 x2+2 ; answer to the file descriptor;
dl. w1 h43.+6 ; it will be moved to the zone-
ds w1 x2+6 ; descriptor later on;
e43 = k - e0 ; entry mag tape
a23: rl. w2 c9. ; reserve tape:
al w3 x2+2 ;
jd 1<11+6 ; initialize process(document);
se w0 0 ; if not ok
jl. a21. ; then goto mount tape;
\f
; fgs 1986.12.12 fileprocessor connect output, page ...10...
; segment 2
al w0 2047 ; set mode:
bz w1 x2 ;
la w0 2 ;
al w1 14 ;
hs w1 0 ; operation(message) :=
rs. w0 c10. ; set mode < 12 + mode
al. w1 c10. ;
jd 1<11+16 ; send message;
jd 1<11+18 ; wait answer;
rl w0 x1 ; mount ring:
al. w1 a19. ; if writing not enabled then
so. w0 (e49.) ; begin parent message(<:enable:>);
jl. a22. ; goto test work tape);
; end;
rl. w2 c9. ; set position:
al w1 6 ;
al w0 8 ;
hs. w0 e48. ; ...change <operation> to <move>...
ls w0 12 ; message(0) := move < 12;
ds. w1 c10.+2 ; message(2) := 6;
dl w1 x2+14 ; message(4) := filecount;
ds. w1 c10.+6 ; message(6) := blockcount;
al. w1 c10. ;
jd 1<11+16 ; send message;
rs. w2 e37. ; init buf := message buffer address;
jl. e40. ; goto move description;
e25 = k - e0, e26 = e25 ; check and init:
a24: al w3 x2+2 ; check and reserve:
bz w1 x2+1 ; w1 := descriptor.kind;
al w0 0 ;
sn w1 4 ; if proc.kind = 4 then
jd 1<11+52 ; create area process;
se w0 0 ; if result <> 0 then
jl. e30. ; goto set result;
jd 1<11+6 ; initialize process;
sn w0 0 ; if result = ok
jl. a31. ; then goto blank tape;
sn w0 1 ; if result = 1 then
jl. a26. ; goto access not allowed;
sn w0 2 ; if result = 2 then
jl. a30. ; goto no resources;
jl. a28. ; goto not present;
\f
; fgs 1988.08.09 fileprocessor connect output, page ...11...
; segment 2
e40: dl. w2 c9. ; move description:
al w0 0 ;
sn w1 0 ; if zone = 0 then
jl. e30. ; goto ok result;
dl w0 x2+2 ; move ( mode, kind, name,
sz w3 1 ; <*if kind odd then
al w3 x3-1 ; truncate kind*>
ds w0 x1+h1+2 ; name table address = 0,
dl w0 x2+6 ; filecount,
ds w0 x1+h1+6 ; blockcount)
dl w0 x2+10 ; from:
ds w0 x1+h1+10 ; filedescriptor
dl w0 x2+14 ; to:
ds w0 x1+h1+14 ; zone descriptor;
rs w0 x1+h1+16 ; segment count := blockcount;
al w0 1 ;
rs w0 x1+h2+4 ; partial word := 1;
al. w3 h68. ; if give up action < fp std error
sl w3 (x1+h2+2) ; then give up action :=
rs w3 x1+h2+2 ; fp std error;
rl w3 x1+h0+6 ;
rs w3 x1+h0+4 ; used share := first share;
rl w0 x3+2 ;
bs. w0 1 ; record base :=
rs w0 x1+h3+0 ; first share(used share) - 1;
ba. w0 -5 ;
wa. w0 h10. ; last byte :=
rs w0 x1+h3+2 ; record base + 2 + blocklength - 2;
; set shares:
e46: bl w0 x1+h1+0 ; for share := first share step
wa. w0 e48. ; 1 until last share do
rs w0 x3+6 ; begin
rl w0 x3+2 ; message(0) :=(if magtape then move else 5<12)+ mode;
rs w0 x3+8 ; message(2) := first shared;
rs w0 x3+22 ; top transferred := first shared;
wa. w0 h10. ; message(4) := last address of transfer :=
rs w0 x3+4 ; first shared + block length(kind) - 2
rs w0 x3+10 ;
al w0 0 ; message(4);
rs w0 x1+h3+4 ; record length := 0;
rs w0 x3 ; share state := 0;
al w3 x3+h6 ; end;
sh w3 (x1+h0+8) ;
jl. e46. ;
jl. e30. ; goto ok result;
\f
; fgs 1988.05.01 fileprocessor connect output, page ...12...
; segment 2
a26: am 1 ; not allowed:
a27: am 1 ; convention error:
a28: am 1 ; not user, not exist:
am 1 ; malfunction:
e34=a27-e0, e35=a26-e0 ;
a30: al w0 1 ; no resources:
e30: rl. w1 c7. ; ok result:
rl. w2 e37. ; w0 := result;
se w1 0 ; if zone <> 0 then
rs w2 (x1+h0+4) ; state(first share) := init buf;
se w2 0 ;
se w1 0 ; if zone <> 0 or init buf = 0 then
jl. h70. ; return;
al. w1 c10. ;
am. (c9.) ;
al w3 2 ; w3 := addr(name);
jd 1<11+18 ; wait answer;
se w0 1 ; w0 :=
am 5 ; if result = 1 then 0
al w0 0 ; else 5;
rl. w1 c7. ; restore w1;
jl. h70. ; resturn;
a31: se w1 12 ; blank tape:
jl. e40. ; if process kind <> punch then
al w1 5 ; goto move description;
ls w1 12 ;
al w1 x1+2 ;
rs. w1 c10. ; operation(message) := 5 < 12 + even parity;
al. w0 b4. ;
al. w1 b5. ; set first core and last core;
ds. w1 c10.+4 ;
al. w1 c10. ;
jd 1<11+16 ; send message;
jd 1<11+18 ; wait answer;
jl. e40. ; goto move description;
b4: 0, r.40 ; 100 blanks
b5 = k-2 ;
e37: 0 ; init buf;
\f
; fgs 1982.11.29 fileprocessor connect output, page ...12...
; segment 2
h. ; action table
e15: ; action ; kind action
e26 ; ip check and init
e34 ; clock convention error
e25 ; area check and reserve
e25 ; disc check and reserve
e26 ; tw check and init
e34 ; tr convention error
e25 ; tp check and reserve
e25 ; lp check and reserve
e34 ; cr convention error
e43 ; mt reserve tape
e25 ; pl check and reserve
h. ; blocklength table
e13: ; bytes ; kind no of characters
512-2 ; ip 768
0-2 ; clock 0
512-2 ; area 768
512-2 ; disc 768
104-2 ; tw 156
36-2 ; tr 56
80-2 ; tp 120
80-2 ; lp 120
80-2 ; cr 120
512-2 ; mt 768
80-2 ; pl 120
e16 = k - e13
w.
b. g1 ; fill segment
g1 = (:h13+512-k:)/2
c. -g1 m. length error connect output 2
z.
w. 0, r.g1
e.
e. ; end connect output
m.fp connect out 2 88.08.09
\f
; rc 26.10.73 file processor stack/unstack, page 0
; implementation of stack/unstack zone
;
; first stack zone is considered. if a stack chain area already
; exists, it is extended (if necessary) and the zone is stacked after
; the latest stacked zone. if either no stack area exists or the area
; cannot be extended, a new area is created, preferably on drum.
; the stack chain is always updated to give the name of the stack
; area, and the area for zone stacking is administered as follows:
; 1. the entire zone buffer occupies an integral number of segments.
; 2. the following segment contains:
; 2.1. the zone descriptor;
; 2.2. all share descriptors (max 498 bytes);
; 2.3. the old stack chain (8 bytes);
; 2.4. length in segments of former stacking (2 bytes);
; 2.5. +-infinity, or if the stacked zone is connected to an area,
; the base of the connected area process (4 bytes).
; if the zone which is to be stacked is connected to an area
; process, the area process is removed.
;
; both stack and unstack will be made at the std base, ensuring
; that the stack area(s) can always be found. after stack/unstack, the
; cat base is reestablished.
; the area entry of the stack area is used like this:
; tail+0 : size ; >=necessary segments
; +(2:12): name of bsdevice, 0, 0;
; +14 : block ; first seg. of latest stacking
; +16 : 5<12+0 ; content=5
; +18 : length (segm) ; segs. used for latest stacking
; note that the length part is in segments, and that the value of
; size is not used.
;
; zone unstacking will proceed in the reverse way of stacking.
; if the unstacked zone had been connected to an area process, this
; is reestablished with a cat base determined by catbase:= if
; saved_base < maxbase then saved_base else maxbase. the name table
; address in the zone is reestablished by means of send (unintell.)
; message - wait answer.
\f
; fgs 1982.12.09 file processor, stack, page ...1...
; stack medium:
s. k=h13, e48, j24 ; begin
w. 512 ; length ; segment 6:
e0: rl. w2 h16. ; treat break:
dl w0 x2+36 ; save old im and old ia;
ds. w0 e11. ; set interrupt (stack break,0);
al w0 0 ; comment: this is done in order
al. w3 e0.+2 ; to transfer control to the call
jd 1<11+0 ; of remove entry (work area).
jl. j0. ; otherwise the area claim may
10; stack error ; be exceeded and the area forgotten;
jl. 2, r.(:e0+2+h76-k+2:)>1
; goto restore used;
e30: al. w3 e10. ; stack break:
jd 1<11+48 ; remove entry(stack work area);
rl. w3 e11. ; if old ia=0 then
sn w3 0 ; goto fp break;
jl. h10.+h76 ;
dl. w1 e0.+4 ; move registers to old ia area;
ds w1 x3+2 ; comment: if e30 was entered because
dl. w1 e0.+8 ; of errors in stacking the register
ds w1 x3+6 ; values are undefined, however:
dl. w1 e0.+12 ; the cause is set to 10 to indicate
ds w1 x3+10 ; the situation;
rl. w1 e0.+14 ;
rs w1 x3+12 ;
rl. w0 e12. ; set interrupt (old ia, old im);
jd 1<11+0 ; goto old ia+h76;
al w3 x3+h76 ; comment: first is the io-segment
jl. j1. ; restored;
e26: am 1 ; stackerrors: zone descriptor
e27: am 1 ; transport
e28: am 1 ; create error
e29: al w3 0 ; zone size...
rs. w3 e0.+12 ; set breakaddress to errorkey...;
jl. e30. ; goto stack break;
e10: 0, r.5 ; working name, init to zero.
e12: -1 ; old interrupt mask
e11: -1 ; old interrupt address
e9: 0, r.10 ; entry tail for work area
e16: 5<12 ; output message
e15: 0 ; first address
e14: 0 ; last address
e13: 0 ; init to zero ; segment number
-8388608 ;
e17: 8388607 ; saved process bases
e18: 0 ; work size
e19: 0 ; saved length
-8388608 ;
e20: 8388607 ; saved area process bases
\f
; fgs 1985.03.07 file processor, stack, page ...2...
; procedure remove area process (zone, process bases);
;
; call: return:
;
; w0 : - destroyed
; w1 : c16 : zone addr zone addr
; w2 : link link
; w3 : - destroyed
;
; e20: -2 : process bases
;
e7: rs. w2 e0.-2 ; remove area process: save link;
rl w3 x1+h1+10 ;
sl w3 (76) ; if name table address does not belong
sl w3 (78) ; among area and pseudo processes then
jl x2 ; return;
rl w3 x3 ; w3 := proc descr addr;
al w0 4 ;
se w0 (x3) ; if process kind <> 4 then
jl x2 ; return;
dl w1 x3-2 ;
ds. w1 e20. ; area process bases := bases (process);
rl. w3 h16. ;
dl w1 x3+70 ; save cat bases;
ds. w1 e17. ;
dl. w1 e20. ;
rl w2 x3+74 ; bases :=
sl w0 (x3+72) ; if lower proc base >= lower max base and
sl w1 x2+1 ; upper proc base <= upper max base then
dl w1 x3+74 ; proc base else max base;
al. w3 e9. ; w3 := name addr (null name);
jd 1<11+72 ; set cat base (bases);
rl. w1 c16. ; w1 := zone addr;
al w3 x1+h1+2 ; w3 := name addr (area process);
jd 1<11+64 ; remove area process;
al. w3 e9. ;
dl. w1 e17. ;
jd 1<11+72 ; set catbase (old cat base);
rl. w1 c16. ; w1 := zone address;
jl. (e0.-2) ; return;
; procedure transport (mess)
e23: rs. w3 e0.-2 ; transport: save link;
al. w1 e16. ; repeat:
al. w3 e10. ; mess:= output message;
jl. w2 h11. ; name:=stack work area name;
sn w0 1 ; message (mess,name);
sh w0 (x1+0) ; if result <> 1 or
jl. e27. ; statusword.answer <> 0
rl w2 x1+2 ; then goto stack break;
sh w2 0 ; if bytes transferred = 0
jl. e23.+2 ; then goto repeat;
jl. (e0.-2) ; return;
\f
; fgs 1985.03.07 file processor, stack, page ...2a...
j0: rl. w1 c16. ; restore used:
rl. w0 c18.-2 ; used share:=saved used share;
rs w0 x1+h0+4 ; record base:=saved record base;
dl. w0 c27.+0 ; last byte:=saved last byte;
ds w0 x1+h3+2 ;
bz w2 x1+h1+1 ; if kind.zone=area then
sn w2 4 ; goto remove area;
jl. w2 e7. ; zone size:=last byte buf - base buf;
rl w3 x1+h0+2 ; if zone size mod 512 <> 0
ws w3 x1+h0+0 ; then goto stack break;
sz w3 511 ;
jl. e29. ; work size:=zone size/512+1;
ls w3 -9 ; first word.tail:=work size;
al w3 x3+1 ;
rs. w3 e18. ;
rl. w3 h16. ;
dl w1 x3+78 ; std base:=own proc(78);
dl w3 x3+70 ; cat base:=own proc(70);
ds. w3 e17. ; save catbase;
al. w3 e9. ; w3 := name addr (null name);
jd 1<11+72 ; set cat base (std base);
rl. w3 c17.-2 ;
al. w1 e9. ; look up entry
jd 1<11+42 ; (tail area, chain);
bz. w2 e9.+16 ; if not looked up
rl. w0 e9. ; or content <> 5
sn w2 5 ; or size < 0
sh w0 -1 ; then
jl. e6. ; goto new;
rl. w0 e18. ; w0:=length;
rx. w0 e9.+18 ; length:=work size;
rs. w0 e19. ; saved length:=w0;
wa. w0 e9.+14 ;
rs. w0 e13. ; first segment:=block:=
rs. w0 e9.+14 ; block + saved length;
wa. w0 e18. ;
rs. w0 e9. ; size:=block + work size;
jd 1<11+44 ; change entry;
sn w0 6 ; if claims exceeded then
jl. e6. ; goto new;
se w0 0 ; if other errors then
jl. e28. ; goto create error;
dl w1 x3+2 ;
ds. w1 e10.+2 ; move chain to area name;
dl w1 x3+6 ;
ds. w1 e10.+6 ;
jl. e3. ; goto get area process;
\f
; fgs 1982.12.09 file processor, stack, page ...3...
e6: ld w1 -100 ; new:
ds. w1 e9.+4 ;
ds. w1 e9.+8 ; clear entry tail
ds. w1 e9.+12 ;
rs. w1 e9.+14 ;
rs. w1 e13. ; first segm := 0;
rl. w0 e16. ; content := 5;
rl. w1 e18. ; length:=
ds. w1 e9.+18 ; size:=
rs. w1 e19. ; saved length:=
rs. w1 e9. ; work size;
al. w1 e9.
al. w3 e10. ; create entry
jd 1<11+40 ; (tail, entry name);
se w0 0 ; if not created
jl. e28. ; then goto create error;
e3: al. w3 h40. ; get area process:
jd 1<11+64 ; remove process (<:fp:>);
al. w3 e10. ; create area process (work area);
jd 1<11+52 ; reserve process (work area);
jd 1<11+8 ;
rl. w1 c16. ; adjust message:
dl w0 x1+h0+2 ; first addr:= base buf+1;
al w3 x3+1 ; last addr:= last byte buf-1;
bs. w0 1 ; segment no:= 0;
ds. w0 e14. ;
jl. w3 e23. ; dump zone:
rl. w1 c16. ; transport(mess);
al w3 x1+h5+h0 ;
rl w2 x1+h0+0 ; save zone descriptor:
e1: rl w0 x1+h0+0 ; move descriptor to buffer area;
rs w0 x2+1 ;
al w1 x1+2 ; comment: the zone descr and all
al w2 x2+2 ; the share descriptors are moved
se w1 x3-h0-0 ; to the buffer area and output to
jl. e1. ; the last segment of the working area;
\f
; rc 05.02.74 file processor, stack, page ...4...
rl w1 x3-h5+6 ; save shares:
rl w3 x3-h5+8 ; move all share descriptors
e2: rl w0 x1+0 ; to the buffer area;
rs w0 x2+1 ;
al w1 x1+2 ; if not room then
al w2 x2+2 ; then goto stack break;
am. (e15.) ;
sl w2 497 ; comment only 1 segment is
jl. e26. ; used to hold all descriptors;
se w1 x3+h6 ;
jl. e2. ;
rl. w3 c17.-2 ;
dl w1 x3+2 ;
ds w1 x2+3 ; move name (chain) to
dl w1 x3+6 ; first 8 bytes following
ds w1 x2+7 ; the saved shares
rl. w1 e19. ; move old length
rs w1 x2+9 ; and
dl. w1 e20. ; area process bases
ds w1 x2+13 ; to next 6 bytes;
dl. w1 e10.+2 ;
ds w1 x3+2 ; move name of dump area(work)
dl. w1 e10.+6 ; to name(chain)
ds w1 x3+6 ;
\f
; fgs 1982.12.09 file processor stack, page ...5...
rl. w0 e9.+14 ; dump descriptors:
al w3 510 ; last addr:=first addr+510;
wa. w3 e15. ; segment no := block + work size-1;
wa. w0 e18. ;
bs. w0 1 ;
ds. w0 e13. ; transport(mess);
jl. w3 e23. ;
al. w3 e10. ;
jd 1<11+64 ; remove process (work area);
rl. w0 e12. ;
rl. w3 e11. ; set interrupt (old im, old ia);
jd 1<11+0 ;
dl. w1 c16. ; restore io-segment;
al w2 -2 ;
la w2 x1+h2+0 ;
rs w2 x1+h2+0 ; i-bit := 0;
ld w3 -100 ; clear document name and n.t.addr. of zone
rs w3 x1+h1+10 ; which will cause no release
ds w3 x1+h1+4 ; if unstack is called before
ds w3 x1+h1+8 ; connect is ok;
al w3 x1+h1+2 ;
dl. w1 e17. ;
jd 1<11+72 ; set catbase(saved bases);
dl. w3 c17. ;
j1: ds. w3 c11. ; return to user;
dl. w1 c16. ; restore w0,w1
jl. h70. ;
b. g1 ; begin
g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes;
c. -g1 m.length error on fp segment 6
z. ;
w. 0, r.g1 ; zero fill
e. ; end fill up;
m.fp stack zone 85.03.07
i. ; maybe names;
e. ; end stack medium;
\f
; rc 76.02.02 file processor, unstack, page ...1...
; unstack medium:
s. k=h13, e48, j24 ; begin
w. 512 ; length ; segment 7:
e0: rl. w2 h16. ; treat breaks:
dl w0 x2+36 ; save old im and old ia;
ds. w0 e11. ; set interrupt (unstack break,0);
al w0 0 ; comment: this is done in order
al. w3 e0.+2 ; to transfer control to the call
jd 1<11+0 ; of remove entry (work area);
jl. j0. ; otherwise the area will not be removed;
10 ; stack error ; goto stop transports;
jl. 2, r.(:e0+2+h76-k+2:)>1
e30: al. w3 e10. ; unstack break:
jd 1<11+48 ; remove entry (stack work area);
rl. w3 e11. ; if old ia=0 then
sn w3 0 ; goto fp break;
jl. h10.+h76 ;
dl. w1 e0.+4 ; move registers to old ia area;
ds w1 x3+2 ; comment: if e30 was entered because
dl. w1 e0.+8 ; of errors in the unstacking then
ds w1 x3+6 ; the registers are undefined, however:
dl. w1 e0.+12 ; the cause is set to 10 to indicate
ds w1 x3+10 ; the situation;
rl. w1 e0.+14 ;
rs w1 x3+12 ;
rl. w0 e12. ; set interrupt (old ia, old im);
jd 1<11+0 ; goto old ia+14;
al w3 x3+h76 ; comment: restore the io-segment
rs. w3 c11. ; before leaving the unstack segment;
jl. j1. ;
e27: am 1 ; unstack errors: transport
e28: am 1 ; entry not found
e29: al w3 4 ; zone size...
rs. w3 e0.+12 ; set breakaddress to errorkey...;
jl. e30. ; goto unstack break;
e9: 0, r.10 ; look up area
e10: 0, r.5 ; stack work area name
e12: -1 ; old interrupt mask
e11: -1 ; old interrupt address
e16: 3<12+0 ; input message
e15: 0 ; first address
e14: 0 ; last address
e13: 0 ; segment number
0 ;
e18: 0 ; own process bases
e19: 0 ; null (used as such)
0 ;
e20: 0 ; area process bases
e21: -8388608 ; minus infinity
\f
; fgs 1985.03.07 file processor, unstack, page ...2...
; procedure transport (mess);
e23: rs. w3 e0.-2 ; transport: save link;
al. w1 e16. ; repeat:
al. w3 e10. ; mess: input message;
jl. w2 h11. ; name:= stack work area name;
sn w0 1 ; message (mess,name);
sh w0 (x1+0) ; if result <> 1 or
jl. e27. ; status word.answer <> 0
rl w2 x1+2 ; then goto unstack break;
sh w2 0 ; if bytes transferred=0
jl. e23.+2 ; then goto repeat;
jl. (e0.-2) ; return;
; procedure remove area process (zone);
;
; call: return:
;
; w0 : - destroyed
; w1 : c7 : zone addr zone addr
; w2 : link link
; w3 : proc name addr destroyed
;
e7: rs. w2 e0.-2 ; remove area process: save link;
rl w3 x1+h1+10 ; w3 := zone.proc.name table addr;
sl w3 (76) ; if name table address does not belong
sl w3 (78) ; among area and pseudo processes then
jl x2 ; return;
rl w3 x3 ; w3 := proc address;
al w0 4 ;
se w0 (x3) ; if zone.proc.kind <> 4 then
jl x2 ; return;
dl w1 x3-2 ; area process bases :=
ds. w1 e20. ; proc.bases;
rl. w3 h16. ;
dl w1 x3+70 ;
ds. w1 e18. ; save cat base;
dl. w1 e20. ;
rl w2 x3+74 ; bases :=
sl w0 (x3+72) ; if lower proc base >= lower max base and
sl w1 x2+1 ; upper proc base <= upper max base then
dl w1 x3+74 ; proc base else max base;
al. w3 e19. ; w3 := name addr (null name);
jd 1<11+72 ; set cat base (bases);
rl. w1 c7. ;
al w3 x1+h1+2 ; w3 name address (area process);
jd 1<11+64 ; remove area process;
al. w3 e19. ;
dl. w1 e18. ;
jd 1<11+72 ; set cat base (saved cat base);
rl. w1 c7. ; w1 := zone address;
jl. (e0.-2) ; return;
\f
; fgs 1985.03.07 file processor, unstack, page ...2a...
j0: rl. w2 (c9.) ; stop transports:
sn w2 0 ; if first word (name chain) = 0
jl. j5. ; then goto done1;
rl. w1 c7. ;
rl w3 x1+h0+6 ; zone:= zone in unstack param;
e1: rl w2 x3 ; wait transport:
al. w1 h43. ; for share:= first share step
sl w2 (86) ; share descr length until
jd 1<11+18 ; last share do
rl. w1 c7. ; if transport pending then
al w3 x3+h6 ; wait answer (state.share, irr, irr);
sh w3 (x1+h0+8) ; comment: no checking;
jl. e1. ;
bz w2 x1+h1+1 ; release file:
al w3 x1+h1+2 ; release process (process name.zone);
jd 1<11+10 ; if kind.zone=backing store then
sn w2 4 ; remove process (process name.zone);
jl. w2 e7. ;
rl w3 x1+h0+2 ; length:= last byte.zone - base.zone;
ws w3 x1+h0+0 ; if length modulo 512 <> 0
sz w3 511 ; then goto unstack break;
jl. e29. ;
rl. w3 h16. ;
dl w1 x3+78 ; saved proc base:=
dl w3 x3+70 ; base(own process);
ds. w3 e18. ;
al. w3 e19. ;
jd 1<11+72 ; set catbase(standard base);
rl. w3 c9. ;
dl w1 x3+2 ; save name at name chain;
ds. w1 e10.+2 ; comment: to save the name;
dl w1 x3+6 ;
ds. w1 e10.+6 ;
\f
;rc 15.10.73 file processor, unstack, page ...3...
al. w1 e9. ;
jd 1<11+42 ; lookup (name, wtail);
se w0 0 ; if not found then
jl. e28. ; goto unstack break;
al. w3 h40. ; get area process:
jd 1<11+64 ; remove process (<:fp:>);
al. w3 e10. ; create area process (entry name);
jd 1<11+52 ; comment: no checking;
rl. w2 c7. ;
rl. w0 e9.+14 ; segment no.mess:= block + length -1;
wa. w0 e9.+18 ;
bs. w0 1 ; first address.mess:= base.zone +1;
al. w1 e16. ; last address.mess:= first address+510;
rs w0 x1+6 ;
rl w3 x2+h0+0 ; transport (saved zone descriptor);
al w3 x3+1 ;
al w0 x3+510 ; init move:
ds w0 x1+4 ; from:= first address;
jl. w3 e23. ; to:= zone descriptor address;
rl. w2 c7. ;
al w2 x2+h0 ; comment:
al w3 x2+h5 ; the zone descriptor is restored from
rl. w1 e15. ; the stacked zone;
\f
; rc 15.01.74 file processor, unstack, page ...4...
e4: rl w0 x1 ; move zone descr:
rs w0 x2 ; word (to):= word (from);
al w2 x2+2 ; to:= to+2;
al w1 x1+2 ; from:= from+2;
se w2 x3 ; if more then goto move zone descr;
jl. e4. ;
am. (c7.) ; move share descriptors:
dl w3 h0+8 ; to:= first share;
al w3 x3+h6 ; move next:
e5: rl w0 x1 ; word (to):= word (from);
rs w0 x2 ; to:= to+2;
al w2 x2+2 ; from:= from+2;
al w1 x1+2 ; if more then goto move next;
se w2 x3 ;
jl. e5. ;
rl. w2 c9. ;
dl w0 x1+2 ;
ds w0 x2+2 ; move unstacked chain-name
dl w0 x1+6 ; to name(chain);
ds w0 x2+6
rl. w0 e9.+14 ; segm no in mess :=
rs. w0 e13. ; size:=
rs. w0 e9. ; block;
rl w3 x1+8 ;
rs. w3 e9.+18 ; length:=saved length;
ws w0 6 ;
rs. w0 e9.+14 ; block:=block - length;
dl w0 x1+12 ;
ds. w0 e20. ; peripheral proc base:= saved base;
rl. w1 c7. ; prepare restoring of zone buffer:
dl w0 x1+h0+2 ;
al w3 x3+1 ; first address.mess:= base.zone+1;
bs. w0 1 ; last address.mess:= last byte.zone-1;
al. w1 e16. ; segment no.mess:= 0;
ds w0 x1+4 ;
jl. w3 e23. ; transport(mess, zone buffer);
\f
; fgs 1985.03.07 file processor, unstack, page ...5...
j3: al. w3 e10. ; unstack ok:
rl. w0 e9. ;
se w0 0 ; if entry size = 0
jl. 6 ; then
jd 1<11+48 ; remove entry(work area)
jl. j4. ; else
jd 1<11+64 ; remove area process (work area)
al. w1 e9. ; change entry(tail, work area);
jd 1<11+44 ;
j4: se w0 0 ; if impossible
jl. e28. ; then error(not found);
dl. w1 e20. ; if area process bases
sn. w0 (e21.) ; = infinity
jl. j2. ; then goto unstack done;
rl. w2 h16. ; comment always area process: ;
rl w3 x2+74 ;
sl w0 (x2+72) ; if area process bases
sl w1 x3+1 ; outside max base
dl w1 x2+74 ; then base:=maxbase else base:=area proc base;
al. w3 e19. ; w3:= nullname;
jd 1<11+72 ; then set catbase(base);
al w0 0 ;
am. (c7.) ;
al w3 h1+2 ;
rs w0 x3+8 ; nametabaddr.zone := 0;
jd 1<11+52 ; create area process(name.zone);
al. w1 e21. ;
jd 1<11+16 ; send dummy message(area process);
al. w1 e9. ; comment in order to establish n.t.addr ;
jd 1<11+18 ; wait answer(dummy message);
j2: dl. w1 e18. ; unstack done:
al. w3 e19. ;
jd 1<11+72 ; own proc, saved catbase);
j5: rl. w0 e12. ; done1:
rl. w3 e11. ; set interrupt (saved im,ia);
jd 1<11+0 ; load and enter io-segment;
j1: dl. w1 c7. ; with return to the user;
jl. h70. ;
b. g1 ; begin
g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes;
c. -g1 m.length error on fp segment 7
z. ;
w. 0, r.g1 ; zero fill
e. ; end fill up;
m.fp unstack zone 85.03.07
i. ; maybe names
e. ; end unstack medium;
\f
\f
\f
; fgs 1984.09.04 file processor, magtape check, page ...1...
; this segment is called when special status bits are set for
; operations with magnetic tapes.
s. k=h13, e48 ; begin
w. 512 ; length ; segment 8:
dl. w0 c11. ; w0:=remaining bits;
dl. w2 c5. ; w1,w2:=zone,share;
jl. e1. ; goto magnetic tape;
e2: 1<22+1<20+1<19+1<7+1<6; test parity, w. defect, overrun, b.l. error and position
e3: 1<15 ; = 8<12 ; test write-enable; move operation
e4: 1<16 ; test tape mark
e5: 6<12 ; erase operation
8<12 ; move operation
e6=h0-h1-2 ; displacement zone-name
e8: 0 ; saved various
e7: 0 ; erasures
e9: 8.5703 6031 ; hard error mask
e34: 1<22 ; test parity
e35: 0 ; reposition count
; repeat:
e10: al w3 x1+h1+2 ; repeat:
e14: al w1 x2+6 ; w3:=name address;
jd 1<11+16 ; w1:=message address;
rs w2 x1-6 ; send message(w3,w1,buf);
al w2 x1-6 ; state.share:=buf addr;
e13: al w2 x2+h6 ; next share:
sh w2 (x3+e6+8) ; share:=share+share descr length;
jl. e11. ; if share>last share
rl w2 x3+e6+6 ; then share:=first share;
e11: rs. w2 e8. ; save share;
sn w2 (x3+e6+4) ; if share=used share
jl. e12. ; then goto check again;
rl w0 x2 ; if share is not pending
sh w0 1 ; then goto next share;
jl. e13. ; wait answer (buf,irr,irr);
al. w1 c10. ; restore saved share;
rl w2 x2 ; goto repeat;
jd 1<11+18 ; check again:
rl. w2 e8. ; goto wait transport;
jl. e14. ; return saved;
\f
; rc 23.05.72 file processor, magtape check, page ...1a...
e22: rl. w0 c22. ; stopped:
sn w0 0 ; if bytes transferred = 0
jl. e10. ; then repeat;
jl. e17. ; goto give up;
e20: ; update position:
se w3 10 ; if operation
sn w3 3 ; is input or output mark
jl. e15. ; then goto test tapemark;
sz w0 1<6 ; no update: if pos error
jl. e23. ; then parity
jl. e16. ; else return;
e15: ; test tapemark:
rl w3 x1+h1+12 ; file count := file count+1;
al w3 x3+1 ; block count := 0;
al w0 0 ;
ds w0 x1+h1+14 ;
sn. w3 (c26.) ; if file count <> file answer
se. w0 (c28.) ; or block count <> block answer
jl. e33. ; then goto add pos bit;
dl. w0 c11. ; w0:=remaining bits;
bl w3 x2+6 ;
sn w3 3 ; if operation <> input
so. w0 (e4.) ; or not tape mark
jl. e16. ; then return;
al w0 25 ; top transferred:=
ls w0 16 ; first addr+2;
rs w0 (x2+8) ; goto normal action;
rl w1 x2+8 ; comment: the return point to
al w1 x1+2 ; the io-segment must be set;
rs w1 x2+22 ;
e16: am h86-h87 ; normal action: set return
e12: am h87-h88 ; wait transport: set return
e17: al. w3 h88. ; give up: set return;
dl. w2 c5. ; w1,w2:=zone share;
ds. w3 c11. ; w3:=return point;
jl. h70. ; call and enter io-segment;
e33: al w3 1<6 ; add pos bit:
lo. w3 c10. ; status :=
rs. w3 c10. ; status or pos bit;
jl. e23. ; goto parity;
\f
; fgs 1984.09.04 file processor, magtape check, page ...2...
e1: bl w3 x2+6 ; magtape: w0:= remaining bits;
sz w0 1<5+1<2 ; if not exist or rejected message
jl. e21. ; then goto mount tape;
sz. w0 (e4.) ; if tape mark
jl. e20. ; then goto update position;
sz. w0 (e2.) ; if parity or word defect or block l. err. , overrun or position
jl. e23. ; then goto parity;
e0: lo w0 x1+h2+0 ; no transport:
sn w3 3 ; if operation = input
jl. e16. ; goto return;
sz. w0 (e3.) ; if write-enable or give up mask
jl. e22. ; then goto stopped;
jl. w3 e37. ; parent message (<:mount ring:>);
jl. e24. ; goto reserve tape;
e21: so w3 1 ; mount tape:
jl. e16. ; if not transport then goto return;
sz w0 1<5 ; if not exist then
e25: jl. w3 e38. ; parent message (<:mount:>);
e24: al w3 x1+h1+2 ; reserve tape:
jd 1<11+6 ; initialize process (proc.zone);
sl w0 2 ; if not existing or not user then
jl. e25. ; goto mount tape;
se w0 0 ; if not reserved then
jl. e17. ; goto give up;
rs. w0 c8. ; tries:= 0;
al w0 2047 ; operation :=
zl w3 x1+h1+0 ; 14 < 12 +
la w0 6 ; mode extract
al w3 14 ; 11;
hs w3 0 ;
al w3 e40 ; move action := repeat;
hs. w3 e39. ;
jl. e26. ; goto send;
\f
; fgs 1984.09.04 file processor, magtape check, page ...3...
; the following action implements the strategy for tape position. the
; routine will loop until the position matches the position count in
; the zone. when this is true, the switch -move action- determines what
; happens.
e27: ; reposition:
dl. w2 c5. ; w1w2 := zone, share;
dl w0 x1+h1+14 ; w3w0 := zone.filecount, blockcount;
sn. w3 (c26.) ; if zone.filecount <> fileno in answer
se. w0 (c28.) ; or zone.blockcount <> block in answer then
jl. e28. ; goto prepare spool;
e39 = k + 1; move action ;
jl. e39. ; switch to move action;
e28: ; prepare spool:
ds. w0 c10.+6 ; mess.file, block := zone.file, block;
al w3 1<6 ; status :=
lo. w3 c10. ; status add
rs. w3 c10. ; position error;
rl. w3 e35. ; reposition_count :=
al w3 x3+1 ; reposition_count + 1;
sl w3 6 ; if reposition_count = 6 then
jl. e17. ; goto give up;
rs. w3 e35. ;
rl. w0 e3. ; w0 := move operation < 12 + 0;
al w3 6 ; w3 := setposition;
e26: rs. w0 c10. ; send: set operation from w0;
rs. w3 c10.+2 ; set move from w3;
al w3 x1+h1+2 ; w3:=name address;
al. w1 c10. ; w1:=message address;
jd 1<11+16 ; send message (w3,w1,buf);
jd 1<11+18 ; wait answer (buf,answer,result);
al w3 1 ; status:= 1 shift result;
ls w3 (0) ; if normal answer (result=1) then
dl. w2 c5. ; status:= status or statusword.answer;
sn w3 1<1 ;
lo. w3 c10. ; if not existing or rejected
rs. w3 c10. ; then goto magnetic tape;
al w0 x3 ;
sz w0 1<5+1<2 ; if hard errors then
jl. e1. ; goto give up;
sz. w0 (e9.) ;
jl. e17. ;
jl. e27. ; goto reposition;
\f
; fgs 1986.12.12 file processor, magtape check, page ...4...
e23: ; parity:
rl. w3 c8. ;
sl w3 5 ; if tries=5 then
jl. e17. ; goto give up;
al w3 x3+1 ; tries:= tries+1;
rs. w3 c8. ; erasures:= 0;
al w3 e42 ; move action:= prepare repeat;
hs. w3 e39. ;
rl w3 x1+h1+14 ; saved position :=
sl w3 1 ; if block count > 0 then
al w3 x3-1 ; block count - 1
al w0 0 ; else
ds. w0 e7. ; block count;
sl w3 1 ; block count :=
al w3 x3-1 ; if saved position > 0 then
rs w3 x1+h1+14 ; saved position - 1
; else
; saved position;
jl. e27. ; goto reposition;
e42=k-e39+1 ; prepare repeat:
bz w0 x2+6 ; move action :=
rl. w2 c11. ; if -, parity
al w3 e43 ; or -, output then
sz. w2 (e34.) ; repeat
se w0 5 ; else
al w3 e40 ; erase; <*output and out mark*>
hs. w3 e39. ; block count :=
rl. w3 e8. ; saved position;
e48: rs w3 x1+h1+14 ;
jl. e27. ; goto reposition;
e40=e10-e39+1 ; define repeat
e41=e16-e39+1 ; define return
\f
; fgs 1986.12.12 file processor, magtape check, page ...5...
e43=k-e39+1 ; erase:
rl. w3 e7. ; if erasures >= tries
sl. w3 (c8.) ; then goto repeat;
jl. e10. ; erasures:= erasures+1;
al w3 x3+1 ; operation:= erase;
rs. w3 e7. ; goto send;
rl. w0 e5. ;
jl. e26. ;
; mount ring message to parent:
e18: 9<13+0<5+1 ; m(0) , pattern word , wait
<:enable <0>:> ; m(2:6)
; mount tape message to parent:
e19: 7<13+0<5+1 ; m(0) , pattern word , wait
<:mount <0>:> ; m(2:6)
e37: am e18-e19 ; call parent message:
e38: al. w2 e19. ; w2 := message;
ds. w0 c22. ; save(w0,w3);
al w1 x1+h1+2 ; w1 := doc name addr;
rx w2 2 ; swap(w2,w1);
jl. w3 h35. ; parent message(w1,w2);
dl. w0 c22. ; restore(w0,w3);
dl. w2 c5. ; restore(w2,w1);
jl x3 ; return;
b. g1 ; begin
g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes:
c. -g1 m.length error on fp segment 9
z. ;
w. 0 , r.g1 ; zero fill
e. ; end fill up;
m.fp magtape check 86.12.12
i. ; maybe names
e. ; end mag tape check;
\f
; fgs 1982.12.09 file processor, terminate zone, page ...1...
s. k=h13, e9,b6 ; begin segment: terminate zone;
w. 512 ; no of bytes on segment
e9: rl. w1 c16. ; terminate zone:
am. (c17.) ; w1 := zone addr;
se w3 x3+1 ; if called from io segment then
jl. e0. ; begin
rl. w2 c2. ; restore(w2: current share);
jl. (h19.+h4+4) ; return
; end;
e0: al w0 -1 ; start terminate:
rs. w0 h19.+h4+0 ; filemark := -1;
rx. w0 c17. ; called from io segment := true;
rs. w0 h19.+h2+6 ; save return to program;
rl w2 x1+h0+4 ; share := used share;
rs. w2 h19.+h4+2 ; saved used share := share;
e1: bz w0 x2+6 ; stop share:
al w3 18 ;
sn w0 5 ; if operation(share) = output then
rs. w3 h19.+h4+0 ; filemark := kind(magtape);
rl w3 x2 ; w3 := share state(share);
sh w3 1 ; if share is not pending then
jl. e3. ; goto set state;
sn w0 3 ; if operation(share) = input then
jl. e2. ; goto wait only;
jl. w3 e4. ; wait and free(share);
jl. e7. ; goto next share;
e2: ds. w2 c5. ; wait only: save(w1,w2);
al. w1 h66. ; w1 := answer area;
al w2 x3 ; w2 := share state;
jd 1<11+18 ; wait answer;
dl. w2 c5. ; restore(w1,w2);
e3: al w0 0 ; set state:
rs w0 x2 ; share state(share) := free;
e7: al w2 x2+h6 ; next share:
sh w2 (x1+h0+8) ; share := share + share length;
jl. 4 ; if share > last share then
rl w2 x1+h0+6 ; share := first share;
se. w2 (h19.+h4+2) ; if share <> saved used share then
jl. e1. ; goto stop share;
\f
; fgs 1984.09.04 file processor, terminate zone, page ...2...
bz w0 x1+h1+1 ; may be filemark:
se. w0 (h19.+h4+0) ; if process kind <> filemark then
jl. e8. ; goto blanks;
al w0 10 ; output filemark:
hs w0 x2+6 ; operation(share) := output mark;
al w3 x1+h1+2 ; w3 := addr(doc name);
al w1 x2+6 ; w1 := message address;
jd 1<11+16 ; send message;
sn w2 0 ; if buffer claim exceeded then
jd 1<11+18 ; provoke interrupt cause 6;
rs w2 x1-6 ; share state(share) := buffer address;
rl. w1 c16. ; restore zone addr;
rl. w2 h19.+h4+2 ; w2 := saved used share;
jl. w3 e4. ; wait and free(share);
e8: se w0 12 ; blanks:
jl. e5. ; if kind <> punch then
al w3 x1+h1+2 ; goto remove or release;
al. w0 b0. ;
al. w1 b1. ; set first and last core
ds. w1 b3. ; of message;
al. w1 b2. ;
jd 1<11+16 ; send message;
jd 1<11+18 ; wait answer;
rl. w1 c16. ; restore w1;
e5: al w3 x1+h1+2 ; remove or release:
bz w2 x1+h1+1 ; w3 := addr(doc name);
jd 1<11+10 ; release process;
sn w2 4 ; if process kind = backing store
jl. w2 e6. ; remove area process;
dl. w1 c16. ; finis terminate:
rl. w2 c17.-2 ; restore(w0,w1,w2);
rl. w3 h19.+h2+6 ; restore return to program;
ds. w3 c11. ; saved(w0,w3) := (w0,w3);
jl. h70. ; call and enter io segment;
\f
; fgs 1985.03.07 fileprocessor terminate zone, page ...2a...
e4: rs. w3 h19.+h4+4 ; call wait and free: save return;
ds. w1 c1. ; save(w0,w1);
al. w3 h78. ; return from io segment :=
ds. w3 c3. ; terminate zone segment;
al. w3 h48.+4 ; w3 := entry at wait and free;
ds. w3 c11. ;
jl. h70. ; call and enter io segment;
; procedure remove area process (zone);
;
;
;
; w0 : - destroyed
; w1 : c6 : zone address zone address
; w2 : link link
; w3 : zone.proc.name addr destroyed
;
e6: rs. w2 e9.-2 ; remove area process: save link;
rl w3 x1+h1+10 ; w3 := zone.proc.name table addr;
sl w3 (76) ; if name table adress does not belong
sl w3 (78) ; among area or pseudo processes then
jl x2 ; return;
rl w3 x3 ; w3 := proc descr addr;
al w0 4 ;
se w0 (x3) ; if proc.kind <> 4 then
jl x2 ; return;
dl w1 x3-2 ; area proc bases :=
ds. w1 b4. ; proc.bases;
rl. w3 h16. ;
dl w1 x3+70 ;
ds. w1 b6. ; save cat bases;
dl. w1 b4. ;
rl w2 x3+74 ; bases :=
sl w0 (x3+72) ; if lower proc base >= lower max base and
sl w1 x2+1 ; upper proc base <= upper max base then
dl w1 x3+74 ; proc base else max base;
al. w3 b0. ; w3 := name addr (null name);
jd 1<11+72 ; set cat base (bases);
rl. w1 c16. ; w1 := zone adddr;
al w3 x1+h1+2 ; w3 := name address (area process);
jd 1<11+64 ; remove area process;
al. w3 b0. ;
dl. w1 b6. ;
jd 1<11+72 ; set catbase (saved cat base);
rl. w1 c16. ; w1 := zone addr;
jl. (e9.-2) ; return;
b0: 0,r.40 ; 100 blanks
b1=k-2 ;
b2: 5<12+4 ; output, even parity;
0 ; first core;
b3: 0 ; last core;
0 ;
b4: 0 ; saved area proc bases;
0 ;
b6: 0 ; saved cat bases;
b. g1 ; begin block: fill segment with zeroes
g1 = (:h13+512-k:)/2 ;
c. -g1 m.length error, terminate zone
z.
w. 0, r.g1 ;
e. ; end block: fill segment
i. ; id list
e. ; end terminate zone
m.fp termin zone 85.03.07
m.
m.fp text 3 86.12.12
\f
; fp text 3
; fgs 1988.05.04 file processor, init, page ...1...
; initialize the file processor
s. k=h55, e48, b20 ; begin
w.1024 ; length ; segment 10:
e0: am. (h96.) ; fp init: skip next;
al w0 0 ; utility init: prim inout errors := 0;
rs. w0 h96. ;
al. w0 h12. ; word(first of process) :=
rs. w0 h12. ; first of process;
am. (h16.) ; parent:
rl w1 50 ; h17:=parent address;
rs. w1 h17. ; search the nametable
rl w2 78 ; to find the nametable address
al w2 x2+2 ; of the parent (to be used at
se w1 (x2-2) ; parent-messages);
jl. -4 ;
rx. w2 h44.+8 ;
rs. w2 b8. ; first:=(old addr=0);
al. w3 h10. ;
al w0 0 ;
jd 1<11+0 ; set interrupt (0,fp break);
am. (h16.) ; get parent name:
rl w2 50 ; w2:=parent;
dl w1 x2+4 ;
ds. w1 h44.+2 ; move parent name
dl w1 x2+8 ; to resident fp;
ds. w1 h44.+6 ;
rl. w1 h16. ; set catbase:
dl w1 x1+78 ; set catbase(standard);
al. w3 b4. ;
jd 1<11+72 ;
; initialize current out:
rl. w2 h15. ; create c:
rl w0 x2 ; kind := kind of prim out;
sl w0 20 ; if kind > 18 then
al w0 8 ; kind := tw;
wa. w0 b0. ;
al. w1 b1. ; tail(0) := 1<23 + kind;
rs w0 x1 ;
dl w0 x2+4 ;
ds w0 x1+4 ; tail(2:8) :=
dl w0 x2+8 ; process name(prim out);
ds w0 x1+8 ;
al. w3 b2. ;
e11: jd 1<11+40 ; create entry(<:c:>);
se w0 3 ; if not allready exists
jl. e12. ; then goto check created;
\f
; rc 06.10.72 file processor, init, page 2
al. w1 h54. ; c exists allready:
jd 1<11+42 ; lookup entry(c);
se w0 0 ; if not found
jl. e5. ; then goto failure;
dl. w3 b5. ; compare proc.names:
sn w2 (x1+2) ; if first part of name
se w3 (x1+4) ; does not fit
jl. e10. ; then goto remove c;
dl. w3 b6. ;
sn w2 (x1+6) ; if second part of name
se w3 (x1+8) ; does not fit
jl. e10. ; then goto remove c;
jl. e6. ; goto initialize curr in;
e10: al. w3 b2. ; remove c:
jd 1<11+48 ; remove entry(c);
al. w1 b1. ;
jl. e11. ; goto create c;
; check created:
e12: se w0 0 ; if not created then
jl. e5. ; goto failure;
; initialize current in:
e6: rl. w2 h17.-2 ; create v:
rl w0 x2 ; kind := kind of prim in;
sl w0 20 ; if kind > 18 then
al w0 8 ; kind := tw;
wa. w0 b0. ;
al. w1 b1. ; tail(0) := 1<23 + kind;
rs w0 x1 ;
dl w0 x2+4 ;
ds w0 x1+4 ; tail(2:8) :=
dl w0 x2+8 ; process name (prim in);
ds w0 x1+8 ;
al. w3 b3. ;
e13: jd 1<11+40 ; create entry(<:v:>);
se w0 3 ; if not allready exists
jl. e14. ; then goto check created;
al. w1 h54. ; v exists allready:
jd 1<11+42 ; lookup entry(v);
se w0 0 ; if not found
jl. e5. ; then goto failure;
dl. w3 b5. ; compare proc.names:
sn w2 (x1+2) ; if first part of name
se w3 (x1+4) ; does not fit
jl. e15. ; then goto remove v;
dl. w3 b6. ;
sn w2 (x1+6) ; if second part of name
se w3 (x1+8) ; does not fit
jl. e15. ; then goto remove v;
jl. e7. ; goto init zones;
e15: al. w3 b3. ; remove v:
jd 1<11+48 ; remove entry(v);
al. w1 b1. ;
jl. e13. ; goto create v;
; check created:
e14: se w0 0 ; if not created then
jl. e5. ; goto failure;
\f
; fgs 1986.12.12 file processor init, page ...3...
; initialize current zones and shares (max double buffered)
e7: rl. w3 h16. ; init current zones:
dl w2 x3+24 ;
al w1 x1-1+h53 ; base.prog:= first addr.proc - 1 + h53;
al w2 x2-21 ; last.prog:= top addr.proc -21;
ds. w2 h19.+h0+2 ;
al w1 x2-h91*512 ; base.out:= last.prog -h91*512;
ds. w2 h21.+h0+2 ; last.out:= last.prog;
al w3 x1+1 ; base.in:= base.out -h90*512-h53;
rs. w3 h82.+2 ; last.in:= base.out-h53;
e1: al w3 x3+512 ;
c. h91-2 ; comment: the init code will
rs. w3 h82.+2+h6 ; handle single and double
z. al w1 x1-h53 ;
al w0 x1-h90*512 ; buffered io zones;
ds. w1 h20.+h0+2 ;
ba. w0 1 ; first shared.first share.out:=
rs. w0 h81.+2 ; base.out +1;
c. h90-2 ;
ba. w0 e1.+1 ; first shared.last share.out:=
rs. w0 h81.+2+h6 ; base.out +1 + (h91-1)*512;
z. al. w0 h80. ; first shared.first share.in:=
rs. w0 h19.+h0+4 ; base.in +1;
rs. w0 h19.+h0+6 ; first shared.last share.in:=
rs. w0 h19.+h0+8 ; base.in +1 + (h90-1)*512;
al. w1 h81. ;
e2= (:h90-1:)*h6 ; set first,last share in prog;
al w2 x1+e2 ;
ds. w2 h20.+h0+8 ; set first,last share in out;
al. w1 h82. ;
e3= (:h91-1:)*h6 ; set first,last share in in;
al w2 x1+e3 ;
ds. w2 h21.+h0+8 ;
\f
; fgs 1986.12.12 file processor init, page ...3a...
rl. w2 h17.-2 ; prim proc := addr prim input proc;
; repeat:
e8: rl w0 x2 ; kind := prim proc.kind;
am. (h16.) ; addr (prim proc descr) :=
rl w1 +24 ; top own process -
e9=k+1 ; rel:
al w1 x1-20 ; rel;
rs w0 x1 ; stack.prim proc descr (0) :=
dl w0 x2+4 ; kind + 1<23;
ds w0 x1+4 ; stack.prim proc descr (2:8) :=
dl w0 x2+8 ; prim proc.name;
ds w0 x1+8 ;
el. w2 e9. ;
se w2 -20 ; if prim proc <> addr prim output proc then
jl. e18. ; begin
rs. w1 h17.-2 ; addr prim input proc := proc.top addr - 20;
al w0 -10 ; rel := -10;
hs. w0 e9. ; prim proc := addr prim output proc;
rl. w2 h15. ; goto repeat;
jl. e8. ; end;
e18: rs. w1 h15. ; addr prim output proc := proc.top addr - 10;
\f
; fgs 1988.05.02 file processor, init, page ...4...
e4: al w0 1<2 ; connect in and out:
al. w2 b2. ; no of segs := 1; permkey := 0;
jl. w3 h28.-2 ; connect out (c , out zone);
se w0 0 ; if result <> 0 then
jl. e5. ; goto failure;
al. w2 b3. ; connect in (v , in zone);
jl. w3 h27.-2 ; if result <> 0 then
se w0 0 ; goto failure;
jl. e5. ;
al w0 0 ; curr in.give up mask := curr out.give up mask :=
al. w1 h68. ; 1; <*i-bit*>
ds. w1 h92. ; curr prog.give up mask :=
al w0 1 ; 0;
ds. w1 h93. ; curr in.give up act. := curr out.give up act. :=
ds. w1 h94. ; curr prog.give up act. := fp std error;
rl. w3 h20.+h0+0 ; init command pointers:
al w3 x3-1-h53 ; current command pointer:=
rs. w3 h8. ; last of commands:=
rs. w3 h9. ; base.in -1-h53;
am. (b8.) ;
se w1 x1 ; if first init then
jl. e19. ; begin
al. w3 b13. ;
jd 1<11+4 ; addr of process (<:s:>);
rl. w1 h17. ;
sn w0 x1 ; if addr of parent process = addr of <:s:> then
am 1<10 ; add bswait to fp mode bits;
al w2 1<9 ; mode.initmess :=
lo. w2 h51. ; yes;
rs. w2 h51. ;
jl. e16. ; end else
e19: ; begin <*not first*>
al. w3 h50. ; if stack chain is used
rl. w0 h50. ; then
se w0 0 ; remove entry(stack chain);
jd 1<11 + 48 ; comment do not check the result;
al w0 0 ; stack chain := 0;
rs. w0 h50. ;
rs. w0 h94.-2 ; curr out.give up mask := 0; <*i-bit*>
al w0 -1-1<7 ;
la. w0 h51. ; if bit := 0;
rs. w0 h51. ;
al. w0 b7. ; outtext(<:***fp reinitialized:>);
jl. w3 h31.-2 ;
rl. w0 h51. ;
so w0 1<9 ; if mode 14.no then <*mode reinitmess.no*>
jl. e17. ; begin mode initmess.yes
; the following code is skipped at reinit when mode.14 = 0;
al w2 10 ;
jl. w3 h26.-2 ; outchar (out, 'nl');
; am. (h16.) ;
; al w0 +2 ; outtext (out, <own process name>);
; jl. w3 h31.-2 ;
; al. w0 b12. ;
; jl. w3 h31.-2 ; outtext (out, <: started with :>);
al. w0 h40. ;
jl. w3 h31.-2 ; outtext (out, <:fp:>);
al. w0 b10. ;
jl. w3 h31.-2 ; outtext (out, <: version:>);
rl. w0 h52.-2 ;
jl. w3 h32.-2 ; outinteger (out, <<dd>, version);
32<12+2 ;
al. w0 b11. ;
jl. w3 h31.-2 ; outtext (out, <: release:>);
zl. w0 h52. ;
jl. w3 h32.-2 ; outinteger (out, <<ddd>, release);
32<12+3 ;
al w2 46 ;
jl. w3 h26.-2 ; outchar (out, '.');
zl. w0 h52.+1 ;
jl. w3 h32.-2 ; outinteger (out, <<d>, subrelease);
48<12+2 ;
al w2 10 ;
jl. w3 h26.-2 ; outchar (out, 'nl');
e17: ; end <*mode 14.no*>;
al w2 10 ;
jl. w3 h34.-2 ; close up (out, 'nl');
am 2 ; prepare call and enter end program; <*warn.yes, ok.no*>
e16: ; end not first;
al w2 1 ; comment warn.no, ok.no to fetch unused areas etc,
; in case of stop load start;
jl. h7. ; call and enter end program;
e5: al. w1 b9. ; failure:
al. w3 h44. ; parent message
jd 1<11+16 ; (<:***fp init troubles:>);
jd 1<11+18 ;
jl. w3 h14. ; goto finis;
jl. e4. ; at start: goto connect in and out;
b0: 1<23 ;
b1: 0 ; file descriptor;
0 ;
b5: 0 ; first half of name;
0 ;
b6: 0 ; second half of name;
0, r.5 ; rest of tail;
b2: <:c:>,0,0,0 ;
b3: <:v:>,0,0,0 ;
b4: 0 ; zero used in set catbase
b7: <:***fp reinitialized<10><0>:>
b8: 0 ; first (boolean)
b9: 8<13+0<5 ; parent message
<:***fp init troubles :>
b10: <: version<0>:>
b11: <: release<0>:>
b12:; <: started with <0>:>
b13: <:s:>, 0, r.3 ; name of ancestor <:s:>
b. g1 ; begin
g1= (:h55+1024-k:)/2 ; fill up segment to 1024 bytes:
c. -g1 m.length error on fp segment 11
z.w. 0, r.g1 ; zero fill
e. ; end fill up;
c. h90-3 m.fp init, buf error: in
z. ;
c. h91-3 m.fp init, buf error:out
z. ;
m.fp init 88.05.04
i. ; maybe names
e. ; end init;
\f
; new fp syntax, dh 86.08.12, file processor, commands, page ***00***
s. d4, e1, f13, g27, i20
w. i20 = -1 ; i20 = 1 means that this is a utility program
; i20 = -1 means that this is a part of fp
c. i20 ; if this is a utility program then
d. p.<:fpnames:>, l. ; include fpnames
z. ;
w. k = h55
g18: i19. ; sign
; initially: code length
g19: jl. i0. ; bracket count
; initially: goto start in fp
g20: jl. i0. ; tastenext address as used from readstring
; initially: goto start as utility
g21: 0 ; integer
g22: 0 ; limit;
\f
; new fp syntax, dh 86.08.06, file processor, commands, page ***01***
b. a2, b0 w. ; local block for tastechar, tastenext, readchar
; procedure tastechar:
; call: w0: - return: w0: unchanged
; w1: - c1: w1: class
; w2: - c2: w2: char
; w3: return address w3: unchanged
;
; if a saved char exists, tastechar will deliver that char together
; with its class, otherwise tastechar will read a fresh character which
; is delivered together with its class. val can always be found in
; saved val (i.e. c0).
d0: dl. w2 g2. ;entry tastechar:
se w2 0 ; if a saved char exists then return
jl x3 ; else continue tastenext;
; procedure tastenext: call & return as for tastechar.
;
; reads the next character from current in, saves the character, its val,
; and its class. the class and the character value are delivered as
; return values.
d1: rs. w3 g2. ;entry taste next:
a0: jl. w3 h25.-2 ; save return(in saved char);
rl. w3 g3. ;rep:
al w3 x3+1 ; readchar(cur in);
sl. w3 g5. ; save char in char buffer cyclically;
al. w3 g4. ; increase char address
rs. w3 g3. ; cyclically;
hs w2 x3 ;
sl w2 128 ; if char >= 128
jl. f0. ; then goto syntax error;
al. w3 a0. ; if char = end medium then
sn w2 25 ; begin
jl. h30.-4 ; unstack(cur in); goto rep;
; end;
\f
; new fp syntax, dh 86.08.22, file processor, commands, page ***02***
el. w1 x2+e0. ; take valclass(char);
sn w1 0 ; if valclass = 0 then
jl. a0. ; then goto rep;
as w1 -5 ; val := valclass // 32;
rs. w1 g0. ;
el. w1 x2+e0. ; class := valclass mod 32;
la. w1 b0. ;
rl. w3 g2. ; savechar := char;
ds. w2 g2. ;
jl x3 ; return
; procedure readchar:
; call: w0: - return: w0: spoiled
; w1: - c1: w1: class
; w2: - w2: char (c2: 0)
; w3: return address w3: spoiled
;
; if no saved char exists, a character is read. saved char is cleared.
; note, however, that saved val and saved class are not cleared.
;
d2: al w0 x3 ;entry readchar:
jl. w3 d0. ; taste char;
al w3 0 ; saved char := 0;
rs. w3 g2. ;
jl (0) ; return;
b0: 2.11111 ; mask for last 5 bits
e. ; end block for character reading;
\f
; new fp syntax, dh 86.08.22, file processor, commands, page ***03***
b. a7, b0 w. ; common block for integers, texts and names
0 ; saved return and
b0: 0 ; partial word when both int and texts are read
f11: am 14-3 ;entry quote: limit := 14; skip next
f10: al w0 3 ;entry hyphen: limit := 3; tastenext;
al. w3 a0. ; if false then
jl. d1. ; begin
f2: ;entry letter:
jl. w3 d2. ; readchar; limit := 3;
al w0 3 ; end;
a0: sh w0 x1 ; if class >= limit
jl. i7. ; then goto test cancel;
al w1 x2+1<8 ; partial word := 1 shift 8 + char;
rl. w2 g6. ;
se w0 3 ; upper bound := cur addr +
am 64-8 ; (if delim was quote then 64 else 8) -2;
al w2 x2+8-2 ;
jl. w3 d3. ; readstring(limit, partial word, upper bound);
a1: ;endup:
wa. w1 g8. ; delim := delim + length;
jl. w3 d4. ; store delim;
jl. w3 d0. ; tastechar;
rl. w0 g17. ; delim := (sp, 2);
rs. w0 g8. ; if class = limit then
sn. w1 (g22.) ; readchar; <*to get rid of it*>
jl. w3 d2. ;
jl. i1. ; goto central;
\f
; new fp syntax, dh 86.08.11, file processor, commands, page ***04***
f9: al w0 10 ;entry digit:
rs. w0 g15. ; radix := 10;
al w0 1 ; sign := +1;
rs. w0 g18. ;
rl. w1 g0. ; int := val(char);
al. w0 a2. ; taste next addr in readstring := intercept;
ds. w1 g21. ; <* now simple integers and names may be read in
jl. f2. ; parallel *>
; goto letter; <* where each char is intercepted *>
a2: ds. w0 b0. ;intercept:
jl. w3 d1. ; save partial word and return;
al. w3 d1. ;
se w1 1 ; if class <> digit then
rs. w3 g20. ; reestablish tastenext address;
sn w1 2 ; if class = letter then
jl. (b0.-2) ; return <* to readstring *>;
rl. w0 g21. ; int := integer;
se w1 1 ; if class <> ditit then
jl. a4. ; goto special char;
wm. w0 g15. ; int := int * radix + val;
aa. w0 g0. ;
rs. w0 g21. ; integer := int;
se w3 0 ; if int > 16 777 215 then
jl. f0. ; goto syntax error;
dl. w0 b0. ; reestablish partial word and return;
jl x3 ; return <* to readstring *>;
\f
; new fp syntax, dh 86.08.18, file processor, commands, page ***05***
a4: se w2 58 ;special char:
jl. a7. ; while char <> ':' do
a5: rs. w0 g15. ; begin
jl. w3 d1. ;first digit: radix := int;
rl. w0 g0. ; taste next;
sh w1 2 ; int := val;
sl. w0 (g15.) ; if class neither letter nor digit or val > radix
jl. i7. ; then goto test cancel;
a6: jl. w3 d1. ; repeat
sl w1 3 ; tastenext;
jl. a4. ;
rl. w2 g15. ; if class either letter or digit then
wm w0 4 ; int := int * radix + extend val;
aa. w0 g0. ; if val >= radix
sn w3 0 ; or int > 16 777 215
sh. w2 (g0.) ; then goto syntax error;
jl. f0. ; until class neither letter nor digit;
jl. a6. ; end legal chars;
a7: wm. w0 g18. ; int := int * sign;
rs. w3 g22. ; limit := nonsense; <*signpart which is < 1*>
al w1 2 ; store int;
am. (g6.) ; length := 2;
rs w0 +2 ; goto endup;
jl. a1. ;<* end integer types *>;
f8: rl. w1 g0. ;entry sign:
rs. w1 g18. ; sign := val;
al w0 10 ; int := 10;
jl. a5. ; goto first digit;
e.
\f
; new fp syntax, dh 86.08.27, file processor, commands, page ***06***
b. a9, b2 w. ; local block for syntax error,
; initiate, and central logic
i7: sn w1 13 ;test cancel: if class = cancel
jl. f13. ; then goto fp cancel;
f0: ;
al. w0 g11. ;entry syntax error:
i4: jl. w3 h31.-2 ; outtext(out,<:***fp syntax :>);
rl. w1 g3. ;entry stack: outtext(out, <:***fp stack:>);
a0: al w1 x1+1 ; for i := char bufaddr + 1 step cyclic1
sl. w1 g5. ; until char bufaddr do
al. w1 g4. ; begin
rs. w1 b0. ;
zl w2 x1 ; char := hwd(i);
se w2 127 ; if char <> 127
sn w2 0 ; and char <> 0 then
jl. a2. ; begin
sh w2 126 ;
sh w2 32 ; if char > 126 or char <= 32 then
jl. 4 ; begin
jl. a1. ;
al w0 x2 ;
al w2 60 ; outchar(out, '<');
jl. w3 h26.-2 ; outinteger(out, <<zd>, char);
jl. w3 h32. ; outchar(out, '>');
48 < 12 + 2 ;
al w2 62 ; end
a1: jl. w3 h26.-2 ; else outchar(out, char);
rl. w1 b0. ; end <*nul chars not output*>;
al w0 0 ; hwd(i) := 0;
hs w0 x1 ;
a2: se. w1 (g3.) ;
jl. a0. ; end output of char buffer;
\f
; new fp syntax, dh 86.09.03, file processor, commands, page ***07***
rl. w2 g12. ; no of syntax errors :=
al w2 x2-1 ; no of syntax errors - 1;
rs. w2 g12. ;
al w0 -1-1<7 ;
la. w0 h51. ; if bit := 0;
rs. w0 h51. ;
al. w0 g24. ; write(out, <:<10>read from :>);
jl. w3 h31.-2 ;
rl. w1 h50. ; if stack chain = 0
se w1 0 ; then
jl. a9. ; begin
al. w0 g25. ; prepare(<:primary input:>);
sl w2 1 ; if no of syntax errors > 0 then
jl. a8. ; terminate:
a7: jl. w3 h31.-2 ; begin
al. w0 g26. ; write(out, prepared text,
jl. w3 h31. ; <:<10>***fp job termination:>);
jl. w3 h95. ; close up text(out); finis;
jl. h14. ; end;
a8: jl. w3 d2. ; repeat readchar;
se w1 15 ; until class = nl;
jl. a8. ; end
al. w0 g25. ;
jl. i3. ; else
a9: al. w0 h20.+h1+2; begin
jl. w3 h31.-2 ; write(out, name in current in zone);
jl. w3 h30.-4 ; unstack(current in);
al. w0 g27. ; write(out,
jl. w3 h31.-2 ; <:<10>unstacking to :>);
al. w0 h20.+h1+2; if stack chain <> 0 then
rl w2 x2 ; prepare(name in current in zone)
sn w2 0 ; else prepare(<:primary input:>);
al. w0 g25. ; end;
i3: jl. w3 h31.-2 ; write(out, prepared text, outend(nl));
jl. w3 h39. ; continue initiate;
\f
; new fp syntax, dh 86.08.08, file processor, commands, page ***08***
i0: al. w1 i10. ;entry initiate:
rl. w2 h8. ; cur addr := last program;
al w2 x2-70 ; top addr := cur command - 70;
ds. w2 g7. ;
al w0 0 ; saved char := 0;
rs. w0 g2. ;
al w3 1 ; sign := +1;
ds. w0 g19. ; bracket count := 0;
rs. w3 g14. ; state := 1;
rl. w0 g16. ; delim := (nl, 2);
rs. w0 g8. ;
al. w0 d1. ; taste next addr in readstring := taste next;
rs. w0 g20. ;
; continue central;
i1: rl. w0 g14. ;entry central:
se w0 0 ; if state = 0 then
jl. a6. ; begin
rl. w0 g19. ; if bracket count = 0 then
se w0 0 ;
jl. a5. ; begin comment this is the end of the beginning;
rl. w2 h9. ; to addr := last of commands;
c. -i20 ; if this is part of fp then
al w1 -1-1<7 ; begin
la. w1 h51. ; clear possible if bit;
rx. w1 h51. ; if if bit was set
sz w1 1<7 ; then
jl. i0. ; goto initiate;
dl. w1 i13. ; move endlist;
ds w1 x2 ; end part of fp
z. c. i20 ; else if this is a utility program then
al. w3 i13. ; begin
a3: dl w1 x3 ;<* starting at last of commands,
ds w1 x2 ; move the ending command et c
al w3 x3-4 ; while updating to address.
al w2 x2-4 ; note that when this is part of fp
sl. w3 i5. ; then only (nl, endlist) are moved
jl. a3. ; *>
se. w3 i15. ; if one word to much moved
al w2 x2+2 ; then to addr := to addr + 2;
al w2 x2+4 z.; end utility program part;
\f
; new fp syntax, dh 86.08.11, file processor, commands, page ***09***
rl. w3 g6. ;<*
a4: dl w1 x3-2 ; starting at last of commands - 2
ds w1 x2-4 ; move the entire command stack
al w3 x3-4 ; such as it has been read up until now,
al w2 x2-4 ; while updating the to address.
sl. w3 i16. ; *>
jl. a4. ;
sn. w3 i6. ; if one word to much moved
al w2 x2-2 ; then to addr := to addr + 2;
rs. w2 h8. ; current command := to addr;
c. -i20 ; if part of fp then
jl. h62. ; goto program load
z. ; else if utility program then
c. i20 ; begin
al w2 0 ; ok := true; warning := false;
jl. h7. ; goto end program;
z. ; end; end;
a5: rl. w1 g8. ; if delim <> (sp,2) then
se. w1 (g17.) ; store delim;;
jl. w3 d4. ; delim := (nl, 2);
rl. w1 g16. ;
al w0 1 ; state := 1;
rs. w1 g8. ; end state = 0;
a6: jl. w3 d0. ; tastechar;
wm. w0 b1. ; new stateact := stateacttable
wa w1 0 ; ( hwd(state * 15 + class) );
el. w1 x1+e1. ;
al w0 x1 ; state := new stateact extract 3;
la. w0 b2. ;
rs. w0 g14. ; act addr := new stateact // 4;
as w1 -2 ; <* it doesn't matter whether it is odd or even *>
i2: jl. x1 ; switch to action(act addr);
b0: 0 ; work cell
b1: 15 ; no of actions per state
b2: 2.111 ; 3 bits for extracting state
e. ; end local block for central et c.;
\f
; new fp syntax, dh 86.08.27, file processor, commands, page ***10***
; global variables and constants
0 ; zero (extends sign in case of integer reading)
g0: 0 ; saved val
g1: 0 ; saved class
g2: 0 ; saved char
g3: 8 388 600 ; address in char buffer, born well past the top
g4: h. 0, r.14, w. ; char buffer
g5: ; top char buffer
g6: 0 ; cur addr
g7: 0 ; top addr
g8: 0, g9=k-1 ; delim
g10: <:***fp stack: <0>:>
g11: <:***fp syntax: <0>:>
g12: 3 ; at most 3 syntax errors allowed per call
g14: 0 ; state
g15: 10 ; radix
g16: 2 < 12 + 2 ; nl, 2
g17: 4 < 12 + 2 ; sp, 2
; g18 .. g22 ; defined in page 00
g23: <:***fp cancel<0>:>
g24: <:<10> read from <0>:>
g25: <:primary input<0>:>
g26: <:<10><10>***fp job termination<10><0>:>
g27: <:<10>unstacking to <0>:>
i5 = k, i15 = k-2
c.i20, 2<12+2, -2<12+2, 2<12+10, <:newfpsyntax<0>:>, z. 2<12+2, -4<12+0
; (nl, 2), (right brack, 2), (nl, 10), this program, (nl, 2), endlist
i13 = k - 2
\f
; new fp syntax, dh 86.08.15, file processor, commands, page ***11***
; separators and special characters
f4: am 2 ;left hand brack: count := + 1; skip next;
f5: al w1 -1 ;right hand brack: count := - 1;
wa. w1 g19. ; bracket count := bracket count + count;
sh w1 -1 ; if bracket count <= -1 then
jl. f0. ; goto syntax error;
rs. w1 g19. ; continue store previous ... ;
f12: jl. w3 d2. ;store previous sep and prepare this:
rl. w1 g0. ; readchar <* to get rid of it *>;
ls w1 12 ; new item := val < 12 + 2;
al w1 x1+2 ; old item := delim;
rx. w1 g8. ; delim := new item;
se. w1 (g17.) ; if olditem <> space then
jl. w3 d4. ; store item
jl. i1. ; goto central
f7: ;komma:
f3: jl. w3 d2. ;semicolon:
se w1 15 ; while class <> 15 do
jl. f3. ; readchar;
jl. i1. ; goto central;
f6: rl. w1 g0. ;prepare this delim:
ls w1 12 ; delim := val < 12 + 2;
al w1 x1+2 ;
rs. w1 g8. ; continue blind;
f1: al. w3 i1. ;blind: readchar <* to get rid of it *>;
jl. d2. ; goto central;
f13: al. w0 g23. ;fp cancel: prepare(<:***fp cancel:>
jl. i3. ; goto textout;
; <* which continues in initiate *>;
\f
; new fp syntax, dh 86.08.07, file processor, commands, page ***12***
b. a6, b5 w. ; local block for readstring
; procedure readstring:
; call: w0: limit return: w0: spoiled
; w1: pwd w1: length
; w2: upper bound w2: spoiled
; w3: return addr w3: spoiled
;
; the procedure starts storing a string in cur addr + 2 (i.e. c6), and
; it continues upward against upper bound. at least one null character
; will terminate the string, and the string will occupy an integral
; multiple of 8 half words. the length will be the length that is to
; be used in the sep,length - word. the address of lthe tastenext
; procedure to be used must be stored in advance in g20.
d3: rs. w0 g22. ;entry readstring:
ds. w3 b2. ; save limit, upper bound,
al w0 x1 ; and return;
rl. w1 g6. ; start address := cur address;
rs. w1 b3. ;
a0: jl. w3 (g20.) ; for class := tastenext(char) while
sl. w1 (g22.) ; class < limit do
jl. a2. ; begin
so. w0 (b4.) ; if partial word full then
jl. a1. ; begin
rl. w3 b3. ; if upper bound reached
sl. w3 (b1.) ; then goto syntax error;
jl. f0. ;
ls w0 8 ; word(start address + 2) :=
wa w0 4 ; partial word shift 8 + char;
rs w0 x3+2 ;
al w3 x3+2 ; start address := start address + 2
rs. w3 b3. ; partial word := 1;
al w0 1 ; end
jl. a0. ; else
a1: ls w0 8 ; partial word :=
wa w0 4 ; partial word shift 8 + char;
jl. a0. ; end;
\f
; new fp syntax, dh 86.08.07, file processor, commands, page ***13***
a2: rl. w3 b3. ;
se w0 1 ; if partial word empty
jl. a3. ;
al w0 0 ; then partial word := 0
jl. a4. ;
a3: so. w0 (b4.) ; else partial word := partial word shift
am 8 ; (if partial word contains 2 characters
ls w0 8 ; then 16 else 8);
a4: rs w0 x3+2 ; save partial word;
al w0 0 ;
al w1 x3+2 ; length := start addr + 2 - cur addr;
ws. w1 g6. ;
a5: sl. w1 (g22.) ; while length < limit <* trick! *>
sz w1 2.111 ; and length mod 8 <> 0 do
jl. 4 ; begin
jl. (b2.) ; word(start addr + 4) := 0;
rs w0 x3+4 ; start addr := start addr + 2;
al w3 x3+2 ; length := length + 2;
al w1 x1+2 ; end;
jl. a5. ; return;
b1: 0 ; upper bound
b2: 0 ; return addr
b3: 0 ; start addr
b4: 1 < 16 ; test partial word full
e. ; end local block for readstring;
f00 = (:f00-i2:)<2, f01 = (:f01-i2:)<2, f02 = (:f02-i2:)<2
f03 = (:f03-i2:)<2, f04 = (:f04-i2:)<2, f05 = (:f05-i2:)<2
f06 = (:f06-i2:)<2, f07 = (:f07-i2:)<2, f08 = (:f08-i2:)<2
f09 = (:f09-i2:)<2, f10 = (:f10-i2:)<2, f11 = (:f11-i2:)<2
f12 = (:f12-i2:)<2, f13 = (:f13-i2:)<2
\f
; new fp syntax, dh 86.08.18, file processor, commands, page ***14***
; in the state-action table to follow, action addresses are packed as
; word addresses relative to the exit from the central action. the
; signed word addresses are packed into the 9 most significant bits
; of a halfword. in the least significant 3 bits, a new state is packed.
; state=0, the state before new line, contains only one action, namely
; preparing a new line separator, and preparing for a possible fp-cancel.
; character class 0, blind, is not described either, as the action for
; blind characters is taken in the character reading procedures.
e1 = k-16, h. m. state-action table as function of character class
;digit letter sp equal delim komma apostr l.bra. r.bra. ill. ; sign cancel quote nl
; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
;state = 1, before first name:
f00+0, f02+2, f01+1, f00+0, f00+0, f03+1, f00+0, f04+1, f05+7, f00+0, f03+1, f00+0, f13+0, f00+0, f01+1
;state = 2, possibly equals follows:
f09+5, f02+5, f01+2, f06+3, f00+0, f07+2, f10+5, f00+0, f05+7, f00+0, f03+0, f08+5, f13+0, f11+5, f01+0
;state = 3, after equals:
f00+0, f02+4, f01+3, f00+0, f00+0, f07+3, f00+0, f00+0, f00+0, f00+0, f00+0, f00+0, f13+0, f00+0, f00+0
;state = 4, after progname
f09+5, f02+5, f01+4, f00+0, f00+0, f07+4, f10+5, f00+0, f05+7, f00+0, f03+0, f08+5, f13+0, f11+5, f01+0
;state = 5, after param:
f09+5, f02+5, f01+5, f00+0, f06+6, f07+5, f10+5, f00+0, f05+7, f00+0, f03+0, f08+5, f13+0, f11+5, f01+0
;state = 6, before modifier:
f09+5, f02+5, f01+6, f00+0, f00+0, f07+6, f10+5, f00+0, f00+0, f00+0, f00+0, f08+5, f13+0, f11+5, f00+0
;state = 7, after right bracket:
f00+0, f00+0, f01+7, f00+0, f00+0, f00+0, f00+0, f00+0, f05+7, f00+0, f03+0, f00+0, f13+0, f00+0, f12+0
; short explanations:
; f00 = syntax error f01 = blind
; f02 = read name *) f03 = skip to and incl nl
; f04 = store and increase bracket f05 = store and decrease bracket
; f06 = prepare this delimiter f07 = possibly prepare space cont. f03
; f08 = read signed integer *) f09 = read name or integer *)
; f10 = read apostr.ized name *) f11 = read general text *)
; f12 = store delimiter **) f13 = back to nl, rev. bracket count
; *) these actions will prepare a space separator
; **) this action may be used in state 6, class 5, if sequences of de-
; limiters are to be allowed. the action continues as f06.
\f
; new fp syntax, dh 88.04.24, file processor, commands, page ***15***
; in the character table below, characters are described by an
; associated value and an associated class. the value is used for
; various purposes, such as separator value, and digit value when the
; character is used in integer reading. the class is used in lookup
; in the state-action table above.
; note that, only if both class and value are 0 (zero), a character
; is truly blind.
; the algorithms used are prepared for several delimiters and delimiters
; with values greater than 8. it is a simple matter to correct the
; character table, thus introducing new delimiters of class 5.
; capital letters, however, may give trouble with the interface to
; the rest of the system, i.e. the monitor and the catalog.
e0 = k m. character table containing val<5 + class
0, 0, 0, 0, 0; 0: NUL, SOH, STX, ETX, E0T
0, 0, 0, 0, 0; 5: ENQ, ACK, BEL, BS, HT
2<5+15, 0, 0, 0, 0; 10: NL, VT, FF, CR, S0
0, 0, 0, 0, 0; 15: SI, DLE, DC1, DC2, DC3
0, 0, 0, 0, 0; 20: DC4, NAK, SYN, ETB, CAN
25<5+ 0, 0, 0, 0, 0; 25: EM, SUB, ESC, FS, GS
0, 0, 4<5+ 3, 10<5+10, 4<5+14; 30: RS, US, SP, ! "
12<5+10, 14<5+10, 16<5+10, 18<5+10, 4<5+ 7; 35: # $ % & '
0<5+ 8, -2<5+ 9, 0<5+11, +1<5+12, 4<5+ 6; 40: ( ) * + ,
-1<5+12, 8<5+ 5, 8<5+ 5, 0<5+ 1, 1<5+ 1; 45: - . / 0 1
2<5+ 1, 3<5+ 1, 4<5+ 1, 5<5+ 1, 6<5+ 1; 50: 2 3 4 5 6
7<5+ 1, 8<5+ 1, 9<5+ 1, 0<5+10, 0<5+11; 55: 7 8 9 : ;
22<5+10, 6<5+ 4, 24<5+10, 0<5+13, 0<5+10; 60: < = > ? <64>
10<5+ 2, 11<5+ 2, 12<5+ 2, 13<5+ 2, 14<5+ 2; 65: A B C D E
15<5+ 2, 16<5+ 2, 17<5+ 2, 18<5+ 2, 19<5+ 2; 70: F G H I J
20<5+ 2, 21<5+ 2, 22<5+ 2, 23<5+ 2, 24<5+ 2; 75: K L M N O
25<5+ 2, 26<5+ 2, 27<5+ 2, 28<5+ 2, 29<5+ 2; 80: P Q R S T
30<5+ 2, 31<5+ 2, 32<5+ 2, 33<5+ 2, 34<5+ 2; 85: U V W X Y
35<5+ 2, 36<5+ 2, 37<5+ 2, 38<5+ 2, 0<5+10; 90: Z Æ Ø Å <94>
0, 0<5+10, 10<5+ 2, 11<5+ 2, 12<5+ 2; 95: _ <96> a b c
13<5 +2, 14<5+ 2, 15<5+ 2, 16<5+ 2, 17<5+ 2;100: d e f g h
18<5+ 2, 19<5+ 2, 20<5+ 2, 21<5+ 2, 22<5+ 2;105: i j k l m
23<5+ 2, 24<5+ 2, 25<5+ 2, 26<5+ 2, 27<5+ 2;110: n o p q r
28<5+ 2, 29<5+ 2, 30<5+ 2, 31<5+ 2, 32<5+ 2;115: s t u v w
33<5+ 2, 34<5+ 2, 35<5+ 2, 36<5+ 2, 37<5+ 2;116: x y z æ ø
38<5+ 2, 0<5+10, 0 ;120: å <126> DEL
w.
\f
; new fp syntax, dh 88.04.24, file processor, commands, page ***16***
; procedure store delim:
; call: w0: - return: w0: spoiled
; w1: delim w1: unchanged
; w2: - w2: cur addr
; w3: return addr w3: unchanged
;
; stores a delimiter, updates current address accordingly, and
; tests whether top address has been passed.
d4: rl. w2 g6. ;entry store delim:
rs w1 x2 ; store delim in word(cur addr);
ea w2 3 ; cur addr := cur addr + size(delim);
rs. w2 g6. ;
sh. w2 (g7.) ; if cur addr < top addr
jl x3 ; then return;
al. w0 g10. ; else goto stack alarm;
jl. i4. ;
i16 = k+2, i6 = i16-2 ; first command
2<12+10, <:this program:>; include a pseudo command
; for unstacking by end program;
i10:
m.fp comm. reading 88.04.24
; commands collected here
-1, r.256-(:i10-i10>9<9:)>1; fillup with -1 to ease testing
i19: ; end of segments
c. i20 ; if this is a utility program then
e. z. ; end fpnames
e. m. end of commands
\f
\f
; rc 12.07.79 file processor, load, page 1
; interpretation of commands; program loading
s. k=h55, e48 ; begin
w. 512 ; length ; segment 12:
al w0 1 ; give up mask.cur in:= 1;
al. w1 h68. ; give up mask.prog.cur out:= 0;
ds. w1 h93. ;
al w0 0 ; give up action.in.out.prog:=fp stderror;
ds. w1 h92. ;
ds. w1 h94. ;
e0: rl. w2 h8. ; upspace to next command:
ba w2 x2+1 ; cur comm:= param pointer:=
bl w0 x2+0 ; cur comm + item size;
rs. w2 h8. ; separator:= first byte.item;
rs. w2 e8. ; if separator= -4
sn w0 -4 ; then goto read commands;
jl. h61. ; if separator <> 2 (nl)
sz w0 -3 ; or <> 0 then goto
jl. e0.+2 ; upspace to next command;
e1: am. (e8.) ; find program name:
bz w2 +1 ; updated param pointer:=
wa. w2 e8. ; param pointer + size.param;
bl w3 x2+0 ; e8:= updated pointer;
rs. w2 h8. ; h8:= pointer;
rx. w2 e8. ; if end of commands in stack
sn w3 -4 ; then goto read commands;
jl. h61. ; w0:= separator.param;
bl w0 x2+0 ; w1:= kind.param;
bz w1 x2+1 ; w3:= next sep.param;
se w1 10 ; if kind.param <> 10 (i e name)
jl. e1. ; then goto find program name;
ds. w1 e33. ; save params for first name;
rs. w2 h8. ; h8:= current param pointer;
sn w3 6 ; if next sep = <equal>
al w2 x2+10 ; then upspace to next param;
rs. w2 c12. ; w3 at entry:=current param;
rs. w2 e12. ; addr of prog name param
\f
; rc 12.07.79 file processor, load, page 1a
al. w1 e4. ; test content of entry:
al w3 x2+2 ; lookup entry(program name, own filedescr.);
jd 1<11+42 ;
se w0 0 ; if unknown then
jl. e44. ; goto connect trouble;
bz. w3 e5. ; load content;
se w3 15 ; if content<>15 then
jl. e2. ; goto test content and load;
bz. w3 e6. ; load through sysldr:
sl w3 1000 ; if loaderno>999 then
jl. e47. ; goto call trouble;
al w1 -8 ; convert loaderno to text:
e11: al w1 x1+8 ; repeat
al w2 0 ; counter:=counter+8;
wd. w3 e10. ; w2:=loaderno mod 10;
al w2 x2+48 ; loaderno:=loaderno//10;
ls w2 x1 ; w2:=w2+48;
wa w0 4 ; w2:=w2 shift counter;
se w1 16 ; w0:=w0 add x2;
jl. e11. ; until counter=0;
rs. w0 e13. ; e13:=loaderno as text;
al. w2 e12. ; base for loader name
rs. w2 e12. ; used by connect trouble and size trouble
al. w1 e4. ; test content of loader entry:
al w3 x2+2 ;
jd 1<11+42 ; lookup_entry(loader name, own file descr);
se w0 0 ; if unknown then
jl. e44. ; goto connect trouble;
bz. w3 e5. ; load content;
\f
; rc 12.07.79 file processor, load, page 1b
; test content and load:
e2: se w3 2 ; if content<>2 and
sn w3 8 ; content <> 8
jl. 4 ; then
jl. e47. ; goto call trouble;
al w2 x2+2 ; file name pointer:= param pointer+2;
al. w1 h19. ; connect input (file name pointer,
jl. w3 h27. ; program zone,result);
se w0 0 ; if result <> 0 then
jl. e44. ; goto connect trouble;
bz. w0 e6. ; test size:
rl. w1 e7. ; if entry>=length
rs. w0 h19.+h3+6 ; or length<=0
sh w0 x1-1 ; then goto size trouble;
sh w1 0 ;
jl. e46. ; entry.pzone:= entry;
rl. w3 e4. ;
bz. w0 e9. ; if mode.kind >= 0
sl w3 0 ;
jl. 6 ; or
se w0 4 ; kind = 4
jl. e3. ;
al w1 x1+511 ; then
ls w1 -9 ; length:= (length+511)//512*512;
ls w1 +9 ;
\f
; rc 86.09.03 file processor, load, page 2
e3: rs. w1 h19.+h3+4 ; test room:
ac. w3 h55.+0 ; top length:= cur command pointer
wa. w3 h8. ; - base of transient;
sl w1 x3 ; if length>=top length
jl. e46. ; then goto size trouble;
al w1 x1-1 ; increment:= (length-1)//2*2;
ls w1 -1 ; adjust share:
ls w1 +1 ; first shared:= first address:=
al. w0 h55. ; base of transient;
al. w1 x1+h55. ; last addr:= first addr+increment;
ds. w1 h80.+10 ; last shared:= cur command pointer-2;
rl. w1 h8. ; set dump range:
al w1 x1-2 ; base.prog:= first addr.proc-1;
ds. w1 h80.+4 ; last.prog:= top addr.proc-1;
rl. w3 h16. ;
dl w2 x3+24 ; if list mode
al w1 x1-1 ; then list cur command;
al w2 x2-1 ;
ds. w2 h19.+h0+2 ; floating precision:= long;
rl. w3 h51. ;
sz w3 1<0 ; zone:= program zone;
jl. w3 e26. ; goto load and enter;
al. w1 h19. ;
xl. 0 ;
jl. h18. ;
e8: 0 ; ; current parameter pointer
e10: 10 ; ; constant 10
e31: 0 ; ; count
e32: 1 ; ; sep
e33: 1 ; ; kind
e34: 0 ; ; saved param pointer
e35: 0 ; w2 ; saved w2
e36: 0 ; w3 ; saved w3
e26: ds. w3 e36. ; list cur command:
dl. w1 e33. ; save (w2,w3);
rl. w2 h8. ; restore params for first name;
al w3 0 ; count:= 0;
rs. w3 e31. ;
e27: ds. w2 e34. ; print param:
sh w0 3 ;
al w2 42 ; char:= case separator of
sn w0 4 ; (<4: asterisk,
al w2 32 ; 4: space ,
sn w0 6 ; 6: equal ,
al w2 61 ; 8: dot );
sn w0 8 ;
al w2 46 ; if char=space
rl. w1 e31. ; and count>10
rl. w3 e33. ; then
ls w3 -2 ;
sl w3 3 ;
am x3-1 ;
al w1 x1+1 ; begin
rs. w1 e31. ; count := 0; outtext (cur out,<:,<10> :>);
sh w1 10 ; end;
jl. e28. ; count:= count+1+length shift(-3);
\f
; fgs 1988.07.21 file processor, load, page 3
al w1 0 ;
rs. w1 e31. ; outchar (cur out, char);
al. w0 e37. ;
jl. w3 h31.-2 ; if kind.param<>4
e28: jl. w3 h26.-2 ; then
dl. w2 e34. ;
al w0 x2+2 ;
sh w1 10 ; begin
jl. e14. ; if general text then
al w2 34 ; write(out, <:":>,
jl. w3 h26.-2 ; param, <:":>);
jl. w3 h31. ; else
al w2 34 ;
jl. w3 h26. ; outtext(out, param name)
jl. e29. ; end else
e14: se w1 4 ; <<d>,param integer);
jl. e15. ;
rl w0 x2+2 ;
jl. w3 h32.-2 ;
1<23 + 0<12 + 1 ;
jl. e29. ;
e15: rl w3 x2+2 ;
al w2 39 ;
sh. w3 (e16.) ;
jl. w3 h26.-2 ;
jl. w3 h31.-2 ;
e29: dl. w2 e34. ; take next param:
wa w2 2 ; param pointer:= pointer+size;
bl w0 x2+0 ; separator:= new separator;
bz w1 x2+1 ; kind:= new kind;
sl w0 4 ; if separator > 3 then
jl. e27. ; goto print param;
jl. w3 h39. ;
dl. w3 e36. ; outend (cur out,new line);
jl x3 ; return;
e37: <:,<10>* :> ; end list;
e38: <:***fp name<32><0>:> ; not found in catalog
e39: <:***fp connect<32><0>:> ; io trouble during connection
e40: <:***fp size<32><0>:> ; program to big
e41: <:***fp call<32><0>:> ; call convention error
e16: <:@<0><0>:> ; constant showing whether a name
; begins with a letter or a digit;
\f
; rc 86.10.10 file processor, load, page 3a
e44: sn w0 3 ; connect trouble:
am e38-e39 ; text:= if result <> 3 then <name>
am e39-e40 ; else <connect>
e46: am e40-e41 ; size trouble: or <size>
e47: al. w0 e41. ; call trouble: or <call>;
jl. w3 h31.-2 ; outtext (cur out, text);
rl. w3 e12. ; outtext(curr out,prog.name);
al w0 x3+2 ;
jl. w3 h31.-2 ;
jl. w3 h39. ; outend (cur out, new line);
al w2 3 ; warning:=true; ok:= false;
jl. h7. ; goto end program;
e4: 0 ; own filedescriptor: mode.kind
e9=e4+1 ; mode
0,r.7
e5: 0 ; content
e6=e5+1 ; entry
e7: 0 ; length
e12: 0 ; base of loader name or prog name param
<:sysldr:> ; space for loader name
0,r.2 ; space for number part of loader name
e13=e12+6 ; address of number part of loader name
b. g1 ; begin
g1= (:h55+512-k:)/2 ; fill up segment to 512 bytes;
c. -g1 m.length error on fp segment 13
z.w. 0, r.g1 ; zero fill
e. ; end fill up;
m.fp program load 88.07.21
i. ; maybe names
e. ; end load;
\f
; fgs 1986.12.12 file processor, end program, page ...1...
;this segment is entered when a utility program terminates by
;entering end program entry h7. the function is to stop the
;current out zone, to set the ok bit and to remove su-
;perfluos area processes and messages buffers.
;the segment calls either the load program segment, the device
;status segment or the break action.
;if load program is entered the current in zone will before be
;unstacked to the first i-bit.
;if device status is entered the current zone is unstacked to
;the i-bit unless there is hard error on the stacked curr in
;zone.
;in case of hard error on current out or on a curr in zone
;with i-bit the current out zone is connected to primary out.
;if this is impossible fp is reeinitialized.
s. k=h55, a10, e48, f7
w.
1024
e8: al w0 0 ; entry:
al. w3 h10. ; set interrupt;
jd 1<11+0 ;
dl. w3 c30. ; move troubled name
ds. w3 e35. ; to these segments:
dl. w3 c27. ;
ds. w3 e36. ;
al. w3 h68. ; restore give up action in:
al w2 0 ;
rs. w3 h19.+h2+2 ; program zone;
rs. w3 h20.+h2+2 ; curr in zone;
rs. w3 h21.+h2+2 ; curr out zone;
dl. w2 c20. ; set mode bits:
rs. w2 e7. ; save status word;
al w0 -1-1<6-1<5 ; w0:=mode bits -
la. w0 h51. ; (ok and warning);
al w3 2.11 ;
la w3 4 ;
bz. w3 x3+e6. ; w3:=table(w2.exit);
sz w2 -4 ; if device errors then
al w3 1<6 ; w3:=warn yes and ok no;
lo w0 6 ; mode bits := w0 or w3;
rs. w0 h51. ;
sz w2 -4 ; determine action:
jl. e1. ; if no device errors
al. w3 f1. ; get action and
jl. e5. ; goto start on actions;
e1: se. w1 c31. ; if hard error on curr out
jl. e2. ; then get actions
al. w3 f2. ;
jl. e5. ; and goto start on actions;
e7: 0 ; saved status word
;mode bit table:
h. ; warning: ok:
e6: 0<6+1<5 ; no yes
0<6+0<5 ; no no
1<6+1<5 ; yes yes
1<6+0<5 ; yes no
w.
\f
; fgs 86.12.12 file processor, end program, page 2
e2: se. w1 h20.+h1+2 ; if hard error curr in zone
jl. e3. ; then
rl. w0 h20.+h2+0 ;
al. w3 f3. ; get action(i-bit)
sz w0 2.1 ;
al. w3 f4. ;
jl. e5. ; and goto start on actions;
e3: al. w3 f5. ; other zone error:
jl. e5. ; get actions and goto actions;
e0: 0 ; action table pointer;
;central call of next action:
e4: rl. w3 e0. ; next action entry:
al w3 x3+1 ; pointer:=pointer+1;
e5: rs. w3 e0. ; start actions entry: save pointer;
bl w3 x3 ; action:=table(pointer);
a0: jl. x3+a0. ; goto action;
;outend and wait current out:
a1=k-a0
al w0 0 ; i-bit := curr out.give up mask;
rx. w0 h21.+h2 ; curr out.give up mask := 0 ;
sn w0 1 ; if i-bit = 1 then
jl. e4. ; goto next action; <*skip outend curr out*>
jl. w3 h59. ; outend(curr out,nl);
jl. w3 h89. ; check all(curr out);
jl. e39. ; goto free the share;
;unstack curr in to i-bit:
a2=k-a0
e33: rl. w0 h20.+h2+0 ; start: if bit 0 in give up
sz w0 2.1 ; is <> 0 then
jl. e4. ; goto next action else
jl. w3 h30.-4 ; unstack curr in and
jl. e33. ; goto start;
;close up and terminate curr out
a3=k-a0
al. w1 h21. ; char:=
bz w3 x1+h1+1 ; if kind(curr out) = bs
se w3 4 ; or kind(curr out) = mt
sn w3 18 ; then em
am 15 ; else nl;
al w2 10 ;
jl. w3 h34. ; terminate curr out;
jl. w3 h79. ; terminate zone;
jl. e4. ; goto next action;
\f
; rc 86.09.01 file processor, end program, page 3
;connect current out to primary out:
b. d10 w.
d1: 0 ; area for lookup entry:
0 ;
d2: 0 ; name first doubleword
0 ;
d3: 0 ; name second doubleword
0,r.5 ; rest of tail;
d4: <:c:>,0,0,0 ; name of primary output;
d0: 1<23
a4=k-a0
rl. w2 h15. ; start: create c:
rl w0 x2 ; kind:=kind(prim out process);
sl w0 20 ; if kind > 18
al w0 8 ; then kind = tw;
wa. w0 d0. ;
al. w1 d1. ;
rs w0 x1 ; tail(0):=1<23+kind;
dl w0 x2+4 ;
ds w0 x1+4 ; tail(2:8) := name(prim out);
dl w0 x2+8 ;
ds w0 x1+8 ;
al. w3 d4. ;
d5: jd 1<11+40 ; create entry(c);
se w0 3 ; if not allready exists
jl. d7. ; then goto check created;
al. w1 h54. ; c exists allready:
jd 1<11+42 ; lookup entry(c);
se w0 0 ; if not found
jl. e32. ; then goto give up;
dl. w3 d2. ; compare proc names:
sn w2 (x1+2) ;
se w3 (x1+4) ; if name cat entry (c)
jl. d6. ; < > name (prim out process)
dl. w3 d3. ; then goto remove c;
sn w2 (x1+6) ;
se w3 (x1+8) ;
jl. d6. ; else goto connect;
jl. d8. ;
d6: al. w3 d4. ; remove c:
jd 1<11+48 ; remove entry(c);
al. w1 d1. ;
jl. d5. ; goto create (c);
a10=k-a0
e32: rl. w1 h96. ;give up:
al w1 x1+1 ; prim inout errors :=
rs. w1 h96. ; prim inout errors + 1;
sh w1 10 ; if prim inout errors <= 10
jl. h60. ; then goto initialize fp;
al. w1 d10. ;
al. w3 h44. ;
jd 1<11+16 ; parent message:
jd 1<11+18 ; (<:***fp troubles with c:>);
jl. w3 h14. ; goto finis;
d10: 8<13+0<5
<:***fp trouble: c or v:>
\f
; fgs 1988.05.02 file processor, end program, page ...4...
d7: se w0 0 ; check created: if not created
jl. e32. ; then give up;
d8: al w0 1<2 ; connect c:
al. w2 d4. ;
jl. w3 h28.-2 ;
se w0 0 ; if not ok
jl. e32. ; then give up
jl. e4. ; else goto next action;
e.
a9=k-a0 ; goto (if stack empty) then commands else load;
b. b1 w. ;
dl. w3 h8. ; if first command address < stacktop - 10
sl w3 x2-10 ; then
jl. h61. ; begin
b0: ea w3 x3+1 ; for command := next in stack
el w1 x3 ; while kind > 2 do
sl w1 3 ; <* nothing *>;
jl. b0. ;
b1: el w1 x3+1 ; while
sl w1 10 ; length (command) < 10 do
jl. h62. ; begin
ea w3 x3+1 ; command := next in stack;
sl w3 x2-8 ; if command address >= stacktop - 8
jl. h61. ; then goto load;
jl. b1. ; end;
; end; goto commands
e.
\f
; fgs 1986.08.28 file processor, end program, page ...5...
; remove area processes :
b. d13 w.
; variables :
d9: -1 ; dummy message to fp (8 words):
0 ;
d13: 0 ; also first word of null name;
0 ; also save process bases;
d12: 0 ; -"-
0 ; also saved catalog bases;
d11: 0 ; -"-
d10: 0 ; also save buff addr and saved name table addr
; procedure remove area process (name table addr);
;
;
;
; w0: not used destroyed
; w1: name table addr name table addr
; w2: not used destroyed
; w3: link link
;
d3: rs. w3 e8.-2 ; remove area process: save link;
rs. w1 d10. ; save name table addr;
se. w1 (h20.+h1+10); if name table addr <> name table addr (in) and
sn. w1 (h21.+h1+10); name table addr <> name table addr (yt) then
jl x3 ; begin
rl w3 x1 ; w3 := proc addr;
al w0 4 ;
se w0 (x3) ; if proc.kind <> 4 then
jl. (e8.-2) ; return; <*pseudo process*>
dl w1 x3-2 ;
ds. w1 d12. ; save proc bases := bases.proc;
dl w1 x3+4 ;
ds. w1 h43.+2 ; save proc.name in answer area
dl w1 x3+8 ; lowest level in resident fp ;
ds. w1 h43.+6 ;
rl. w3 h16. ;
dl w1 x3+70 ;
ds. w1 d11. ; save cat bases;
dl. w1 d12. ; bases :=
rl w2 x3+74 ; if lower proc base >= lower max base and
sl w0 (x3+72) ; upper proc base <= upper max base then
sl w1 x2+1 ; proc bases else
dl w1 x3+74 ; max bases ;
al. w3 d13. ; w3 := addr null name;
jd 1<11+72 ; set cat base (bases);
al. w3 h43. ; w3 := addr proc name;
jd 1<11+64 ; remove area process ;
al. w3 d13. ; w3 := addr null name;
dl. w1 d11. ;
jd 1<11+72 ; set cat base (save cat base);
rl. w1 d10. ; restore name table addr;
; end;
jl. (e8.-2) ; return;
a5=k-a0
rl w1 76 ; remove area processes:
; name table index := first area proc;
d0: rl w2 x1 ; repeat
rl. w3 h16. ; w2 := area proc descr;
zl w0 64 ; w3 := own proc descr;
sl w0 9 ; if monitor release <= 8 then
jl. d1. ; w0 := user word from area proc
rl w0 x2+14 ; else
jl. d2. ; begin <*monitor release >= 9*>
d1: el w0 x3+12 ; w0 := rel addr of user half word in proc;
am (0) ; w0 := user half from area proc;
zl w0 x2 ; end;
d2: sz w0 (x3+12) ; if user word all zeroes in user id then
jl. w3 d3. ; remove area process;
al w1 x1+2 ; increase (name table index);
se w1 (78) ;
jl. d0. ; until name table index = top area proc ;
\f
; fgs 1986.08.28 file processor, end program, page ...6...
d4: al. w1 d9. ; remove buffers:
al. w3 h40. ; send dummy message to fp;
jd 1<11+16 ;
rs. w2 d10. ; save buffer address;
d5: al w2 0 ; first event: event:=first;
d6: jd 1<11+24 ; wait: wait event;
sn w2 0 ; if claims exceeded
jl. d7. ; then goto get clock buf;
sn w0 0 ; if event=message
jl. d6. ; then goto wait;
sn. w2 (h81.) ; if buf = sh.state(in) then
jl. d6. ; goto wait next;
jd 1<11+26 ; get event;
se. w2 (d10.) ; if buf <> clock buf
jl. d5. ; then goto first event;
jl. e4. ; goto next action;
d7: rl. w2 d10. ; get clock buf:
al. w1 d9. ;
jd 1<11+18 ; wait answer(clock buf);
jl. e4. ; goto next action;
e.
;free curr in - free cur out:
a6=k-a0
am h20-h21 ; zone:=curr in
a7=k-a0
e39: al. w1 h21. ; zone:=curr out;
al w0 0 ;
rl w2 x1+h0+6 ;
rs w0 x2 ; share state := free;
rl w3 x2+4 ; last address :=
rs w3 x2+10 ; last shared;
jl. e4. ; goto next action;
\f
; rc 86.09.01 file processor, end program, page ...7...
a8=k-a0
al. w0 e32. ;write device status alarm:
rs. w0 h21.+h2+2 ; giveup action(out) :=
al. w0 e47. ; reinitialize fp;
jl. w3 h31.-2 ; writetext(out,<:***device status:>);
al. w0 e34. ;
jl. w3 h31.-2 ; writetext(out,doc name);
al w2 0 ;
e46: rl. w1 e7. ; for bit := 0 step 1 until 21 do
ls w1 x2 ; begin
al. w0 e10. ;
ba. w0 x2+e45. ;
sh w1 -1 ; text := device status text(bit);
jl. w3 h31.-2 ; if bit = 1 then
al w2 x2+1 ; writetext(out,text);
se w2 22 ;
jl. e46. ; end;
jl. w3 h39. ; outend(nl);
rl. w0 h21.+h0+0 ; while base buffer area <> record base do
e37: sn. w0 (h21.+h3+0) ; begin
jl. e38. ; char := 127;
al w2 127 ; outchar current;
jl. w3 h26.-2 ; end;
jl. e37. ; comment either outend or this algorithm will
; force the block out thus preventing
e38: al w0 x1-h21+h68 ; endless looping on reselect out;
rs w0 x1+h2+2 ; giveup action(out) := fp std error;
al. w3 e34. ; examine hardware error:
jd 1<11+4 ; process description(document name);
sn w0 0 ; if non exist then
jl. e9. ; goto get mask;
rl w1 (0) ; w1 := kind(doc name);
se w1 4 ; if kind = 4 (bs)
sn w1 8 ; or kind = 8 (tw)
jl. +4 ; or
sn w1 14 ; kind = 14 (lp)
am 2 ; add parity to mask;
e9: rl. w1 e42. ; get mask;
rl. w0 e7. ; move status to message;
la w0 2 ;
rs. w0 e44. ;
sn w0 0 ; if status and mask(kind) <> 0
jl. e4. ; then
al. w1 e43. ;
al. w2 e34. ; parent message(<:status:>, doc name);
jl. w3 h35. ;
jl. e4. ; goto next action
; hard error message to parent, in case of hardware errors:
e43: 3<13+1<9+0 ; m(0) , pattern word
<:status:> ; m(2:4)
e44: 0 ; m(6) , logical status
e47: <:<10>***device status <0>:>
\f
; rc 86.08.28 file processor, end program, page ...8...
; mask(0:20) , to select hardware errors:
e42: 1<23+ 1<21+1<20+1<13+1<12+1<4 ; without parity bit
1<23+1<22+1<21+1<20+1<13+1<12+1<4 ; with parity bit
; device status text (0:21):
e10: <:<10>intervention<0>:> ;
e11: <:<10>parity error<0>:> ;
e12: <:<10>timer<0>:> ;
e13: <:<10>data overrun<0>:> ;
e14: <:<10>block length error<0>:> ;
e15: <:<10>end of document<0>:> ;
e16: <:<10>load point<0>:> ;
e17: <:<10>tape mark or attention<0>:> ;
e18: <:<10>writing enabled<0>:> ;
e19: <:<10>mode error<0>:> ;
e20: <:<10>read error<0>:> ;
e21: <:<10>card rejected or disk error<0>:> ;
e22: <:<10>checksum error<0>:> ;
e23: <:<10>bit 13<0>:> ;
e24: <:<10>bit 14<0>:> ;
e25: <:<10>stopped<0>:> ;
e26: <:<10>word defect<0>:> ;
e27: <:<10>position error<0>:> ;
e28: <:<10>process does not exist<0>:> ;
e29: <:<10>disconnected<0>:> ;
e30: <:<10>unintelligible<0>:> ;
e31: <:<10>rejected<0>:> ;
h.
e45: e10-e10, e11-e10, e12-e10, e13-e10, e14-e10, e15-e10
e16-e10, e17-e10, e18-e10, e19-e10, e20-e10, e21-e10
e22-e10, e23-e10, e24-e10, e25-e10, e26-e10, e27-e10
e28-e10, e29-e10, e30-e10, e31-e10
w.
e34: 0, e35: 0, 0, e36: 0 ; room for troubled device name
\f
; dh 86.08.28 file processor, end program, page ...9...
; table of sequences of actions
h.
; no device errors:
f1: a1, a2, a5, a9
;hard error on current out
f2: a7, a4, a2, a5, a8, a9
; hard error on stacked cur in zone
f3: a1, a6, a5, a8, a2, a9
; hard error on cur in zone:
f4: a3, a4, a6, a5, a8, a10
; hard error on other zone:
f5: a1, a2, a5, a8, a9
w.
; the actions are:
;a1: outend and free curr out
;a2: unstack curr in zone to i-bit
;a3: terminate curr out
;a4: connect primary out, if problems then reeinitialize fp
;a5: remove area processes and message buffers
;a6: free current in zone
;a7: free current out zone
;a8: write device status alarm, if problems then reinitialize fp
;a9: goto (if empty stack) then commands else load
;a10: reeinitialize fp
;comment if fp is reinitialized more than 10 times then
; the job will be terminated. this should take care
; of removed primary in and out.
e41 = (:h55+1024-k:)/2
0, r. e41 ; fill segment with zeroes
m.fp end program 88.05.02
m.fpnames follows:
e. ; end device status segment
\f
; fgs 1986.12.12 file processor, fpnames, insertproc page ...1...
e. i. ; list new fp names
b. g1 w. d. p.<:fpnames:>, w. l.; use old fpnames
b. w. ; a local block to cheat the i. in insertproc
g0: 18 ; segm
0, r.4 ; docname
s2 ; date
0, 0 ; fil, blok
3<12 + 2 ; contry
4096 ; length
g1: 1<23 + 4 ; secondary entry: init
0, r.4 ; room for docname
s2 ; date
0, 11 ; file, block
2<12 + 4 ; content, entry
1024 ; code length
d. p.<:insertproc:>, l.
e. ; end block with g-names
e. ; end file processor
▶EOF◀