|
|
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: 52224 (0xcc00)
Types: TextFile
Names: »fptext1«, »kkfptxt1«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦84635a524⟧ »kkmon4filer«
└─⟦this⟧
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦f781f2336⟧ »kkmon0filer«
└─⟦this⟧
\f
; rc 19.02.73 file processor, permanent, page ...1...
b. h99, c31, j131 ; begin global block
m.file processor 76.02.02 system 3
; slang structure:
;
; b. h99, c31, j131 ; global block
;
; s. k=0, h99, c31 ; 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
;
; s. k=h55, e48 ; command assembly
; e. ; segment 12,13
;
; s. k=h55, e48 ; load program
; e. ; segment 14
;
; s. k=h55, e48 ; end program action
; e. ; segment 15
;
; s. k=h55, e48 ; device errors
; e. ; segment 16
;
; e. ; end global block
;
\f
; rc 76.02.02 file processor, permanent, page ...2...
; resident file processor
s. k=0, h99, c43 ; 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;
rl w1 66 ; saved w2;
dl w3 x1+70 ; saved w3; user interval:=
ds. w3 h58. ; saved ex; initial catbase;
jl. h60. ; saved ic; goto init fp;
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. h67. ; parent message(<:break:>);
am 0
; 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 76.02.02 file processor, permanent, page ...3a...
b. a3,b2
w.
; dummy notes
h96: 0 ; count of fp syntax 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
; rc 76.02.02 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
0,r.2
; space used by notes - now partly used by breakpoint routine
e.
\f
; rc 76.02.02 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 76.02.02
\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
; rc 19.05.72 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;
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
; rc 26.05.72 file processor, block io, page ...4...
; device table containing mask index and special action no.
h. ; bytes
e21=k , e22=k+1 ;
20 , 6 ; ip ; special actions:
20 , 0 ; clock ; 0: give up
8 , 2 ; bs ; 2: area process action
4 , 0 ; drum ; 4: end of medium
12 , 6 ; tw ; 6: timer error
16 , 4 ; tr ; 8: char output
20 , 8 ; tp ; 10: mag tape errors
20 , 8 ; lp
16 , 4 ; cr
0 , 10 ; mt
20 , 8 ; pl
; mask table specifying hard and special errors depending
; on the index selected via the process kind
w.
e24: 8.1107 7031 ; 0: mt
e25: 8.2620 0744 ;
8.7677 7375 ; 4: hard error
8.0100 0400 ; special action
8.7277 7331 ; 8: backing storage
8.0500 0444 ;
8.2757 7375 ; 12: typewriters
8.1000 0400 ;
8.1614 7775 ; 16: readers
8.0100 0000 ;
8.3677 7375 ; 20: char oriented output media
8.1100 0400 ;
e28: 8.7777 4777 ; official bits.
; treatment of status bits for different indices.
; bit error hard special
; 0 4 8 12 16 20 0 4 8 12 16 20
; 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 * * * * * *
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 26.03.73 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 <> console
se w2 8 ; or kind <> punch
sn w2 12 ; or kind <> printer
jl. e8. ; or 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 26.03.73
e. ; end character input/output;
\f
\f
; rc 1977.09.14 file processor, resident, page ...1...
; fp segmentation and fp messages
h40: <:fp:>, 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+1<9+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)
h43: 0, r.8 ; answer area lowest level
h64: am 1 ; hard error:
h63: am 1 ; end program:
h62: am 2 ; load:
h61: am 1 ; 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;
al w2 x1+510 ; last address.mess:= first addr+510;
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 result<>1 then
se w0 1 ; create area process (<:fp:>,result);
jd 1<11+52 ; if result <> 1 or
sn w0 1 ; result=1 and bytes transf=0
sl w0 (x1+2) ; then goto send for segment;
jl. h69. ;
am. (h47.) ; enter at second word
jl +2 ; at called segment;
\f
; rc 29.5.70 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 h85. ; w2 := dummy;
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 15.4.71 file processor, resident, page ...3...
h38: 0, r.4 ; dummy entry:
; 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 76.02.02 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
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
; rc 76.02.02 file processor, resident, page ...6...
; transmitting h-names to global block:
j50=h50 ; current name chain address
j51=h51 ; fp mode bits
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
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 12.6.70 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
j128=c28 ; block count
j129=c29 ; digitstring end
j130=c30 ; used by stack
j131=c31 ; device name current output
m.fp resident 76.02.02
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
; rc 76.02.02 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,
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
▶EOF◀