DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦d1d7fa48b⟧ TextFile

    Length: 62208 (0xf300)
    Types: TextFile
    Names: »kkfptxt33«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦80d78256e⟧ »kkmon4filer« 
            └─⟦this⟧ 

TextFile

m. fp text 3


\f



;                   fp text 3
 
; rc 19.02.73              file processor, init, page 1

; initialize the file processor

s.    k=h55, e48,b12      ; begin
w.    512  ; length      ; segment 10:

e0:   al. w0  h12.       ; init:  word(first of process) :=
      rs. w0  h12.       ;    first of process;

      am     (66)        ; 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     (66)        ; 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  66         ; 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



; rc 06.10.72          filiprocessor         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       ;   base.prog:= first addr.proc -1;
      al  w2  x2-1       ;   last.prog:= top addr.proc -1;
      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;
      rs. w3  h82.+2     ;   last.in:= base.out;
e1:   al  w3  x3+512     ;
c.    h91-2              ;   comment: the init code will
      rs. w3  h82.+2+h6  ;      handle single and double
z.    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



; rc 05.06.73              file processor, init, page 4

e4:   al  w0  1<1        ; connect in and out:
      al. w2  b2.        ;   no of segs := 1;  device := drum;

      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   1         ;
      al. w1  h68.       ;   set i-bit to zero in cur input;
      ds. w1  h93.       ;   clear give up masks in all zones;
      al  w0   0         ;   set fp stdaction as
      ds. w1  h92.       ;   give up action in all cur. zones;

      rl. w3  h20.+h0+0  ; init command pointers:
      al  w3  x3-1       ;   current command pointer:=
      rs. w3  h8.        ;   last of commands:=
      rs. w3  h9.        ;      base.in -1;
      al  w0   0         ;   current name chain(0):= 0;
      rs. w0  h50.       ;
      am.    (b8.)       ;   if not first
      sn  w1  x1         ;   then
      jl.     e16.       ;   begin
      al. w0  b7.        ;     outtext(<:***fp reinitialized:>);
      jl. w3  h31.-2     ;
      al  w2  3          ;     goto end program;
      jl.     h7.        ;
      jl. w3  h33.       ;   end;
e16:  jl.     h61.       ;   call and enter command segment;
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  :>



b.    g1                 ; begin
g1=  (:h55+512-k:)/2     ; fill up segment to 512 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 05.06.73
i.                       ; maybe names
e.                       ; end init;

\f



\f


; rc 21.04.72              file processor, commands, page 1

; command assembly:

s. w.
b.    k=h55, e48, j24    ; begin
w.    1024 ; length      ; segment 11:
      rl. w3  h41.       ;   save segment number of
      hs. w3  j2.        ;   command reading segment;
      al. w2  h55.+516   ;   initialize char save area:
      rs. w2  h55.+512   ;   start:= slut:=
      rs. w2  h55.+514   ;   first of cycl buf;
e0:   al. w2  h55.+534   ;   state:=composite count:= 0;
      rs. w2  e8.        ;   delimpointer:= first free;
      dl. w0  e4.        ;   value pointer:=delim pointer+2;
      ds  w0  x2+0       ;   delim word:= start command;
      rl. w0  e3.        ;   comment: the stack begins with
      rs. w0 (h9.)       ;   the bytes: 4,2, 2,2;
      al  w3  x2+2       ;   last of commands:= end mark;
      rs. w2  e10.       ;   init saved delimpointer;
      jl.     e25.       ;   goto input char;
e3:   -4<12+0            ;   end command mark
       2<12+2            ;   start command mark
e4:    2<12+2            ;   nl-mark
e7:    0                 ;   value pointer
e8:    0                 ;   delim pointer
e5:    0, e6=e5+1        ;   state, composite count
e10:   0                 ;   saved delim pointer
e9:    0,                ;   saved state, saved comp. count
e11:  <:***fp cancel<0>:>;   cancel text
e13:   0                 ;   common return

; procedure next char;
;   reads the next non-blind character from current input.
;   end of medium and non-text characters cause unstacking
;   of input (possibly with an error message) and reading
;   continues from the old current input.
; registers             call          return
;   w0                               destroyed
;   w1                             character class
;   w2                             character value
;   w3                  link           link
e20:  rs. w3  e13.       ; begin
      jl. w3  h25.-2     ; next char:
      se  w2  0          ;   if char = 0
      sn  w2  127        ;   or char = 127 then 
      jl.     j1.        ;   bypass char saving;
      rl. w3  h55.+512   ;  save char in cycl buf:
      hs  w2  x3         ;   buf(pointer):=char;
      al  w3  x3+1       ;   pointer:=pointer+1;
      sh. w3  h55.+529   ;   if pointer>last of buf
      jl.     e12.       ;   then begin
      rs. w3  h55.+514   ;    start:=irrelevant;
      al. w3  h55.+516   ;    pointer:=first of buf;
e12:  rs. w3  h55.+512   ;   end;
\f


; rc 17.08.72             file processor, commands, page 1a


j1:
      bz. w1  x2+e47.    ;   char:=inchar(cur in);
      sl  w2  128        ;   class:=table(char,3);
      jl.     e45.       ;   if char>127 then goto off;
      la. w1  e28.       ;   if class=12 then begin
      al. w3  e20.+2     ;   eom: unstack(cur in,cur chain);
      sn  w1  12         ;   goto next char; end;
      jl. w0  h30.-4     ;   if class=9 then
      sn  w1   9         ;   blind char:
      jl.     e20.+2     ;   goto next char;
      sn  w1  14         ;   if class=14 then
      jl.     e19.       ;   goto cancel;
      jl.    (e13.)      ; end next char;



; input character:
e25:  rs. w3  e7.        ; input char: save value pointer;
e26:  jl. w3  e20.       ; get char: char,class:=next char;
      dl. w0  e5.        ;   if savestack then begin
e17=k+1, sn  w1 x1       ;   save (delim pointer,
      ds. w0  e9.        ;   state, composite count);
      hs. w2  e17.       ;   savestack:=false; end;
      se  w1  10         ;   if class=skip space 
      sn  w1  11         ;   or class=skip line
      jl.     e21.       ;   then goto skip;
      sl  w1   8         ;   if class>7 then
      jl.     e22.       ;   goto syntax;

\f



; rc 1.7.69              file processor, commands, page 2

e23:  ba. w1  e5.        ; get action and state:
      bz. w0  x1+e47.    ; lookup in state table:
      ld  w1  -8         ;   index:=8*state+class;
      ls  w0   3         ;   action:=table(index,2);
      hs. w0  e5.        ;   state:=table(index,1);
      ls  w1  -20        ;   w0=action addr
      bl. w0  x1+e48.    ;   w1=action number (0 to 15)
      rl. w3  e7.        ;   w2=character value
      am      (0)        ;   w3=value pointer
e24:  jl.     e24.       ;   enter action (w0);

e21:  hs. w1  e14.       ; skip: save class;
      jl. w3  e20.       ; new: char,class:=next char;
e28:  sn  w1  15 ;used   ;   if alarm then
      jl.     e22.       ;   goto syntax;
      se  w1   7         ;   if not new line then
      jl.     e21.+2     ;   goto new;
      al  w0   0         ;   savestack:=true;
      hs. w0  e17.       ;   causes saving at next char;
      am      -4         ;   class:=saved class-4;
e14=k+1 ; saved class    ;   comment: transforms
      al  w1  10         ;   <,> to <sp>, and <;> to <nl>;
      jl.     e23.       ;   goto get action and state;

; the action numbers are chosen so that the separator value
; can be computed from the action:  sep:=(action number)//2*2-6.

e30=e26                  ; empty:  goto get char;

e31:  ld  w1  -65        ; init name:
      ds  w1  x3+2       ;   words(value pointer) to:
      ds  w1  x3+6       ;        (value pointer+6):=0;
      al  w1  10         ;   increase:=10;
      hs  w1  x3-1       ;   count:=121;
      al  w1  121        ;   goto test count;
      jl.     j0.        ;

e35:  al  w1  121        ; pack name:
      al  w1  x1-11      ;   count:=count-11;
j0:   hs. w1  e35.+1     ; test count:
      sh  w1   0         ;   if count <= 0 then
      jl.     e22.       ;   goto syntax;
      sz  w1  16         ;   word(value pointer):=
      ls  w2   8         ;   word(value pointer) +
      sz  w1  28         ;   character value  shift
      ls  w2   8         ;   (count mod 33/11*8);
      lo  w2  x3+0       ;   if count mod 33=0
      rs  w2  x3+0       ;   then value pointer:=
      sz  w1  28         ;   value pointer+2;
      jl.     e25.       ;   goto input char;
      al  w3  x3+2       ;   
      jl.     e25.       ;

e33:  al  w0   0         ; init integer:
      al  w1   4         ;   word(value pointer):=0;
      rs  w0  x3+0       ;   increase:=4;
      hs  w1  x3-1       ;

\f



; rc 21.04.72              file processor, commands, page 3

e37:  al  w2  x2-48      ; pack integer:
      al  w1  10         ;   char:=char-iso digit base;
      wm  w1  x3+0       ;   word (value pointer):=
      wa  w1   4         ;   10*word (value pointer) + char;
      se  w0   0         ;   if too big then goto syntax;
      jl.     e22.       ;   goto input char;
      rs  w1  x3+0       ;
      jl.     e25.       ;

e36:  am      +2         ; increase:  change:= +1;  or:
e34:  al  w0  -1         ; decrease:  change:= -1;
      ba. w0  e6.        ;   composite count:=
      hs. w0  e6.        ;   composite count+change;
      sh  w0  -1         ;   if composite count<0
      jl.     e22.       ;   then goto syntax;
      jl.     e44.       ;   goto set delimeter;

e40:  am      e31-e33    ; space name: place to go:= init name;
e41:  am      e33-e25    ; space int: place to go:= init integer;
e39:  e42:               ;
e44:  al. w3  e25.+0     ; set delimeter:
e46:  rs. w3  e13.       ; set equal: set dot:
      ls  w1  -1         ;   place to go:= input char; if not mod.
      al  w0  x1-3       ;   separator value:=
      ls  w0  13         ;   (action number)//2*2-6;
      rl. w1  e8.        ;   delim pointer:=
      ba  w1  x1+1       ;   delim pointer+increase;
      rs. w1  e8.        ;   value pointer:=delim pointer+2;
      al  w3  x1+2       ;   delim word:=separator shift 12 + 2;
      hl. w0  -1         ;   if room enough then
      rs  w0  x1+0       ;   goto place to go;
      sh. w3 (h8.)       ; stack overflow:
      jl.    (e13.)      ;   goto stack overflow;
      jl.     e18.       ;

e32:  dl. w0  e5.        ; save stack:
      ds. w0  e9.        ;   save current status of the stack;
      jl.     e26.       ;   goto get char;

e38:  dl. w0  e5.        ; test end:
      ba  w3  x3+1       ;   update delim pointer;
      ds. w0  e9.        ;   save stack status;
      sz  w0  2047       ;   place to go:= if composite count <> 0
      jl.     e44.       ;   then input char else
      jl. w3  e46.       ;   end of commands; goto set delimeter;
e29:  rl. w2  h8.        ; end of commands:
      al  w3  x3-2       ;   for addr:=value pointer-2
      rl  w0  x3+0       ;   step -2 until first free do begin
      al  w2  x2-2       ;   cur comm:=cur comm-2;
      rs  w0  x2+0       ;   word(cur comm):=word(addr);
      se. w3  h55.+532   ;   end;
      jl.     e29.+2     ;
      al  w1  -1-1<7     ;   oldmode:= fp mode bits;
      la. w1  h51.       ;   fp mode bits:= fp mode bits remove if;
      rx. w1  h51.       ;   comment: clear if bit;
      sz  w1  1<7        ;   if oldmode (if bit) = 1 then
      jl.     h61.       ;   call and enter read commands;
      rs. w2  h8.        ;   goto program load segment;
      jl.     h62.       ;

\f



; rc 08.04.72              file processor, commands, page 4

; error handling:
e22:                     ; syntax:
e43:                     ; new line error
e45:  am      1          ; error
e18:  al  w0  0          ; stack overflow
j2=k+1
      al  w3  1          ;   goto command reading
      al  w3  x3+1       ;   error segment;
      jl.     h70.+2     ;

e19:  al. w0  e11.       ; cancel: text:=cancel;
      jl. w3  h31.-2     ;   outtext (cur out,
      jl. w3  h39.       ;   <:***fp <text>:>);
      dl. w3  e9.        ;   outend(new line);
      rs. w3  e5.        ; restore state:  comp.count:=
      al  w1  x2+2       ;   state:= delim pointer:= saved values;
      ds. w2  e8.        ;   value pointer:=delim pointer+2;
      al  w0   0         ;   increase.delimp:= 0;
      hs  w0  x2+1       ;
      al  w1   7         ;   simulate input of a
      al  w2   10        ;   new line character
      jl.     e26.+2     ;   goto got char; (+2);


; survey of  classes, states, and actions
;    value     char         state            action
;      0      letter     before command    empty action.
;      1      digit      in file name      init name
;      2      left (     after =           save stack
;      3      right )    in program name   init integer
;      4      equal =    after <s>         decrease
;      5      dot .      in param name     pack name
;      6      spaces     in param integer  increase
;      7      new lines  after dot         pack integer
;      8      illegal    after command     test end
;      9      blind      file name <s>     
;     10      skip <,>   parameter <s>     space name
;     11      skip <;>   after right )     space integer
;     12      end medium                   set equal
;     13                                   new line error
;     14      cancel                       set dot
;     15      alarm      error             error

; class values greater than 7 are handled at microsyntactical
; level, thus eliminating the need for a 256 bytes state table.

; most actions are composite and follows each other in rather
; complicated manners.
; init name              =>  init, pack name
; init integer           =>  init, pack integer
; increase               =>  count, set separator
; space name             =>  separator, init, pack name
; space integer          =>  separator, init, pack integer

\f



; rc 05.04.72              file processor, commands, page 5

; state 0:  before command
e47:                     ; start of tables
h.     1<8+ 1<4+ 9       ; l.      file,      init name    nul
      15<8+15<4+ 9       ; d.      error,     error        soh
       0<8+ 6<4+ 9       ; (       b.comm,    increase     stx
      11<8+ 4<4+ 9       ; )       after ),   decrease     etx
      15<8+15<4+ 9       ; =       error,     error        eot
      15<8+15<4+ 9       ; .       error,     error        enq
       0<8+ 0<4+ 9       ; <s>     b.comm,    empty        ack
       0<8+ 2<4+ 9       ; <nl>    b.comm,    save stack   bel
; state 1:  in file name
h.     1<8+ 5<4+15       ; l.      file,      pack name    bs
       1<8+ 5<4+ 6       ; d.      file,      pack name    ht
      15<8+15<4+ 7       ; (       error,     error        nl
       8<8+ 4<4+ 7       ; )       a.comm,    decrease     vt
       2<8+12<4+ 7       ; =       equal,     set equal    ff
      15<8+15<4+ 9       ; .       error,     error        cr
       9<8+ 0<4+15       ; <s>     after sp1, empty        so
       0<8+ 8<4+ 9       ; <nl>    b.comm,    test end     si
; state 2:  after =
h.     3<8+ 1<4+ 9       ; l.      program,   init name    dle
      15<8+15<4+ 9       ; d.      error,     error        dc1
      15<8+15<4+ 9       ; (       error,     error        dc2
      15<8+15<4+ 9       ; )       error,     error        dc3
      15<8+15<4+ 9       ; =       error,     error        dc4
      15<8+15<4+ 9       ; .       error,     error        nak
       2<8+ 0<4+ 9       ; <s>     after =,   empty        syn
      15<8+13<4+ 9       ; <nl>    error,     nl error     etb
; state 3:  in program name
h.     3<8+ 5<4+14       ; l.      program,   pack name    can
       3<8+ 5<4+12       ; d.      program,   pack name    eom
      15<8+15<4+15       ; (       error,     error        sub
       8<8+ 4<4+15       ; )       a.comm,    decrease     esc
      15<8+15<4+ 9       ; =       error,     error        fs
      15<8+15<4+ 9       ; .       error,     error        gs
       4<8+ 0<4+ 9       ; <s>     after sp,  empty        rs
       0<8+ 8<4+ 9       ; <nl>    b.comm,    test end     us
; state 4:  after sp  
h.     5<8+10<4+ 6       ; l.      param name,sp name      sp
       6<8+11<4+ 8       ; d.      param int, sp integer    !
      15<8+15<4+ 8       ; (       error,     error        quo
       8<8+ 4<4+ 8       ; )       a.comm,    decrease     ste
      15<8+15<4+ 8       ; =       error,     error        dol
      15<8+15<4+ 8       ; .       after dot, set dot        
       4<8+ 0<4+ 8       ; <s>     after sp,  empty         &
       0<8+ 8<4+ 8       ; <nl>    b.comm,    test end      ' 
; state 5:  in param name
h.     5<8+ 5<4+ 2       ; l.      param name,pack name     (
       5<8+ 5<4+ 3       ; d.      param name,pack name     )
      15<8+15<4+11       ; (       error,     error         *
       8<8+ 4<4+ 8       ; )       a.comm,    decrease      +
      15<8+15<4+10       ; =       error,     error         ,
       7<8+14<4+ 8       ; .       after dot, set dot       -
      10<8+ 0<4+ 5       ; <s>     after sp2, empty         .
       0<8+ 8<4+ 5       ; <nl>    b.comm,    test end      /

\f



; rc 1.7.69              file processor, commands, page 6

; state 6:  in param integer
h.    15<8+15<4+ 1       ; l.      error,     error         0
       6<8+ 7<4+ 1       ; d.      param int, pack integer  1
      15<8+15<4+ 1       ; (       error,     error         2
       8<8+ 4<4+ 1       ; )       a.comm,    decrease      3
      15<8+15<4+ 1       ; =       error,     error         4
       7<8+14<4+ 1       ; .       after dot, set dot       5
      10<8+ 0<4+ 1       ; <s>     after sp2, empty         6
       0<8+ 8<4+ 1       ; <nl>    b.comm,    test end      7
; state 7:  after dot
h.     5<8+ 1<4+ 1       ; l.      param name,init name     8
       6<8+ 3<4+ 1       ; d.      param int, init integer  9
      15<8+15<4+ 8       ; (       error,     error         :
      15<8+15<4+11       ; )       error,     error         ;
      15<8+15<4+ 8       ; =       error,     error         <
      15<8+15<4+ 4       ; .       error,     error         =
       7<8+ 0<4+ 8       ; <s>     after dot, empty         >
      15<8+13<4+14       ; <nl>    error,     nl error       
; state 8:  after command
h.    15<8+15<4+ 8       ; l.      error,     error        cat
      15<8+15<4+ 8       ; d.      error,     error         a
      15<8+15<4+ 8       ; (       error,     error         b
       8<8+ 4<4+ 8       ; )       a.comm,    decrease      c
      15<8+15<4+ 8       ; =       error,     error         d
      15<8+15<4+ 8       ; .       error,     error         e
       8<8+ 0<4+ 8       ; <s>     a.comm,    empty         f
       0<8+ 8<4+ 8       ; <nl>    b.comm,    test end      g
; aux state 9:  after space (following file name)
h.     5<8+10<4+ 8       ; l.      param name,sp name       h
       6<8+11<4+ 8       ; d.      param int, sp integer    i
      15<8+15<4+ 8       ; (       error,     error         j
       8<8+ 4<4+ 8       ; )       a.comm,    decrease      k
       2<8+12<4+ 8       ; =       after =,   set equal     l
      15<8+15<4+ 8       ; .       error,     error         m
       9<8+ 0<4+ 8       ; <s>     after sp1, empty         n
       0<8+ 8<4+ 8       ; <nl>    b.comm,    test end      o
; aux state 10:  after space (following parameter)
h.     5<8+10<4+ 8       ; l.      param name,sp name       p
       6<8+11<4+ 8       ; d.      param int, sp integer    q
      15<8+15<4+ 8       ; (       error,     error         r
       8<8+ 4<4+ 8       ; )       a.comm,    decrease      s
      15<8+15<4+ 8       ; =       error,     error         t
       7<8+14<4+ 8       ; .       after dot, set dot       u
      10<8+ 0<4+ 8       ; <s>     after sp2, empty         v
       0<8+ 8<4+ 8       ; <nl>    b.comm,    test end      w
; aux state 11:  after right )
h.    15<8+15<4+ 8       ; l.      error,     error         x
      15<8+15<4+ 8       ; d.      error,     error         y
      15<8+15<4+ 8       ; (       error,     error         z
      11<8+ 4<4+ 8       ; )       after ),   decrease      æ
      15<8+15<4+ 8       ; =       error,     error         ø
      15<8+15<4+ 8       ; .       error,     error         å
      11<8+ 0<4+ 8       ; <s>     after ),   empty        cir
       0<8+ 8<4+ 9       ; <nl>    b.comm,    test end      _  

\f



; rc 05.04.72              file processor, commands, page 7

; aux state 12:  not used
h.              8        ;                                acc
                0        ;                                 a
                0        ;                                 b
                0        ;                                 c
                0        ;                                 d
                0        ;                                 e
                0        ;                                 f
                0        ;                                 g
; aux state 13:  not used  
h.              0        ;                                 h
                0        ;                                 i
                0        ;                                 j
                0        ;                                 k
                0        ;                                 l
                0        ;                                 m
                0        ;                                 n
                0        ;                                 o
; aux state 14:  not used 
h.              0        ;                                 p
                0        ;                                 q
                0        ;                                 r
                0        ;                                 s
                0        ;                                 t
                0        ;                                 u
                0        ;                                 v
                0        ;                                 w
; aux state 15:  syntax error
h.              0        ;                                 x
                0        ;                                 y
                0        ;                                 z
                0        ;                                 æ
                0        ;                                 ø
                0        ;                                 å
                8        ;                                ovl
                9        ;                                del

; action table, containing addresses relative to e24
e48:  e30-e24            ;        *         empty
      e31-e24            ;        *         init name
      e32-e24            ;        *         save stack
      e33-e24            ;        *         init integer
      e34-e24            ;       -2         decrease
      e35-e24            ;        *         pack name
      e36-e24            ;        0         increase
      e37-e24            ;        *         pack integer
      e38-e24            ;        2         test end
      e39-e24            ;        *   
      e40-e24            ;        4         space name
      e41-e24            ;        *         space integer
      e42-e24            ;        6         set equal
      e43-e24            ;        *         new line error
      e44-e24            ;        8         set dot
      e45-e24            ;        *         error

b.    g1                 ; begin
w.g1=(:h55+512-k:)/2     ; fill segment to 512 bytes;
c.   -g1                 m.length error on commands part 1
z.w.  0, r.g1 e.         ; zero fill; end fill up;
i.e.                     ; 
\f


; rc 01.03.73             file processor, commands, page 8

;this second part of the command reading contains the error
;handling (syntax and stack overflow).  it is entered from the
;command reading via the generel swopping machinery with the last
;few characters read from current in in the cyclic buffer
;just after the segment.   the content of c4 (w0 at exit from command
;reading) determines whether the error is syntax or stack.
;the error handling first reselects primary output as current
;output.  then the first part of the error text consisting of
;a heading (*** etc..) and the characters in the cycl buf is
;output.   next the current input file is unstacked down to pri-
;mary input.  during unstacking the document names of the input
;files are output.   when unstacking is finished the current input
;and output files are terminated and the initialization of fp is
;entered (in order to abandon the command stack etc..)


b. k=h55, e48, w.        ; begin second part of commands
      0                  ; dummy word, not used;
      rl. w0  c4.        ; start:
      rs. w0  e0.        ;   save cause (syntax or stack);
      jl.     e1.        ;   goto reselect curr out;

e20:  <:c:>,0,0,0                   ; name of primary output
e21:  1<23                          ; area for create(c)
e22:  0,r.9                         ;
e23:  <:***fp stack<32><0>:>        ; error texts:
e24:  <:***fp syntax<32><0>:>       ;
e25:  <:<10>  *selected from<32><0>:> ;
e26:  <:primary input<0>:>          ;
e0:   0                             ; cause
e27:  <:<10>  *read from<32><0>:>
e30:  <:<10>***fp job termination<10><0>:>



e1:   al. w1  h21.       ; reselect curr out:
      bz  w3  x1+h1+1    ;   char:=
      se  w3  4          ;   if kind(curr out) = bs
      sn  w3  18         ;   or kind(curr out) = mt
      am      25         ;   then em
      al  w2  0          ;   else null;
      jl. w3  h34.       ;   close up(curr out,char);
      jl. w3  h79.       ;   terminate curr out; 
      rl. w2  h15.       ; find c:
      rl  w0  x2         ; 
      sl  w0  20         ;   try create c: kind:=kind(prim out);
      al  w0  8          ;   if kind > 18 then kind :=tw;
      al. w1  e21.       ;   tail(0) := 1<23+kind;
      hs  w0  x1+1       ;
      dl  w0  x2+4       ;
      ds  w0  x1+4       ;
      dl  w0  x2+8       ;
      ds  w0  x1+8       ;   tail(2:8):=name(prim out);
      al. w3  e20.       ;   create entry (c);
e11:  jd      1<11+40    ;
      se  w0  3          ;   if not allready exists
      jl.     e8.        ;   then goto check created
      al. w1  h54.       ; c exists allready:
      jd      1<11+42    ;   lookup entry(c);
      se  w0  0          ;   if not found
      jl.     h67.       ;   then break;
\f


; rc 21.04.72             file processor, commands, page 9

      dl. w3  e21.+4     ; compare proc names:
      sn  w2 (x1+2)      ;   if name(found c)
      se  w3 (x1+4)      ;    < >
      jl.     e12.       ;   name(primt out proc)
      dl. w3  e21.+8     ;   then goto remove c;
      sn  w2 (x1+6)      ;
      se  w3 (x1+8)      ;
      jl.     e12.       ;
      jl.     e2.        ;   goto connect c;
e12:  al. w3  e20.       ; remove c:
      jd      1<11+48    ;   remove entry(c);
      se  w0  0          ;   if not ok
      jl.     h67.       ;   then break
      al. w1  e21.       ;
      jl.     e11.       ;   goto create c;
e8:   se  w0  0          ; check created:  if not created
      jl.     h67.       ;   then break;

e2:   al. w2  e20.       ; connect(curr out,c);
      al  w0  1<1+1      ;
      jl. w3  h28.-2     ;
      se  w0  0          ;   if not ok
      jl.     h67.       ;   then break;

      am.    (e0.)       ; error text heading:
      se  w3  x3         ;   text:=if cause <> 0
      am      e24-e23    ;   then <:***fp syntax:>
      al. w0  e23.       ;   else <:***fp stack:>
      jl. w3  h31.-2     ;   outtext(curr out,text);
      rl. w0  h55.+514   ; write last input chars:
      se. w0  h55.+516   ;   pointer:=if start relevant
      rl. w0  h55.+512   ;   then start else char pointer;
e3:   bz  w2 (0)         ;  next char: w2:=char value;
      sn  w2  32         ;   if char = space
      jl.     e4.        ;   then write char;
      sh  w2  39         ;   if  40 <= value <= 62
      jl.     e7.        ;   or  97 <= value <= 125
      sh  w2  62         ;   then goto write char
      jl.     e4.        ;   else goto write value;
      sh  w2  125        ;
      sh  w2  96         ;
      jl.     e7.        ;
e4:   jl. w3  h26.-2     ;  write char: outchar(curr out,char);
e5:   am     (0)         ;  increase pointer:  pointer :=
      al  w0  1          ;   pointer+1;
      sl. w0  h55.+530   ;   if pointer > last of buf
      al. w0  h55.+516   ;   then pointer := first of buf;
      sn. w0 (h55.+512)  ;   if pointer = slut
      jl.     e28.       ;   then goto unstack in else
      jl.     e3.        ;   goto next char;

e6:   0                  ; saved pointer;

e7:   rs. w0  e6.        ; write value:  save pointer;
      al  w2  60         ;
      jl. w3  h26.-2     ;   outchar(<);
      bl. w0 (e6.)       ;
      jl. w3  h32.-2     ;   outinteger(value);
      1<23+0<12+1        ;
      al  w2  62         ;
      jl. w3  h26.-2     ;   outchar(>);
      rl. w0  e6.        ;   restore pointer;
      jl.     e5.        ;   goto increase pointer;
\f


; rc 01.03.73             file processor, commands, page 10

                         ; unstack in:
e28:  am      e27-e25    ; first time: text:=<:read from:>;
e9:   al. w0  e25.       ; output doc.name:
      jl. w3  h31.-2     ;   outtext(curr out,<:*selected from :>);
      am.    (h50.)      ;
      sn  w3  x3         ;   if curr in name chain = 0
      jl.     e10.       ;   then goto chain end;
      al. w0  h20.+h1+2  ;
      jl. w3  h31.-2     ;   outtext(curr out,doc.name(in));
      jl. w3  h30.-4     ;   unstack curr in;
      jl.     e9.        ;   goto output doc name;

e10:  al. w0  e26.       ; chain end:
      jl. w3  h31.-2     ;   outtext(curr out,<:primary input:>);
      al  w2  1          ; syntax count:
      wa. w2  h96.       ;   count:=count+1;
      rs. w2  h96.       ;
      sl  w2  10         ;   if count >= 10 then
      jl.     e29.       ;   goto termination;
      jl. w3  h39.       ;   outend(nl);
      jl. w3  h95.       ;   close up;
      jl. w3  h79.-2     ;   terminate curr in and curr out;
      jl. w3  h79.-4     ;
      jl.     h60.       ;   goto init fp;

e29:  al. w0  e30.       ; terminate:
      jl. w3  h31.-2     ;   output error text;
      jl. w3  h39.       ;   close up curr out;
      jl. w3  h95.       ;
      jl. w3  h79.-2     ;   terminate curr in
      jl. w3  h79.-4     ;   and curr out;
      jl.     h14.       ;   goto finis;



b. g1  w.                ; fill segment to 512 bytes
g1=(:h55+512-k:)/2
c. -g1 m.length error on commands part 2
z. w. 0,r.g1 e.          ; fill up
i.e.                     ; end commands part 2

m.fp commands 26.03.73

i.e.                     ; end 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 12.07.79              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
      al  w1  x1+1       ;   then begin
      rs. w1  e31.       ;      outtext (cur out,<:,<10>   :>);
      sn  w2  32         ;      count:= 0;
      sh  w1  10         ;   end;
      jl.     e28.       ;   count:= count+1;

\f



; rc 12.07.79              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=10
e28:  jl. w3  h26.-2     ;   then
      dl. w2  e34.       ;   outtext (cur out,param name)
      al. w3  e29.       ;   else
      al  w0  x2+2       ;   outinteger (cur out,
      sn  w1  10         ;            <<d>,param integer);
      jl.     h31.-2     ;
      rl  w0  x2+2       ;
      jl. w3  h32.-2     ;
      0<23 + 32<12 + 1   ;
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


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 12.07.79
i.                       ; maybe names
e.                       ; end load;

\f


; rc 09.03.73             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 the break action is entered.


s. k=h55, a8, e7, f7
w.
      512
      al  w0  0          ; entry:
      al. w3  h10.       ;   set interrupt;
      jd      1<11+0     ;

      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;
      ds. w3  h21.+h2+2  ;   curr out zone; g.up.mask(out):=0;
      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





; rc 16.04.72             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:   jl. w3  h59.       ;   outend(curr out,nl);
      jl. w3  h89.       ;   check all(curr out);
      jl.     a7.        ;   goto free the share;

;unstack curr in to i-bit:

a2:   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.     a2.        ;   goto start;

;close up and terminate curr out
a3:   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 19.02.73             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:   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.     d9.        ;   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);

d9:   al. w1  d10.       ; give up:
      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 troubles with c:>

\f


; rc 76.05.25             file processor, end program, page ...4...

d7:   se  w0  0          ; check created: if not created
      jl.     d9.        ;   then give up;
d8:   al  w0  1<1+1      ; connect c:
      al. w2  d4.        ;
      jl. w3  h28.-2     ;
      se  w0  0          ;   if not ok
      jl.     d9.        ;   then give up

; flg for at undgaa at cykle, naar forbindelse til primært
; output er afbrudt
      al  w3  x1+h1+2    ;
      al. w1  d4.+2      ;   w1:=sense
      jd      1<11+16    ;   send message
      al. w1  d1.        ;
      jd      1<11+18    ;   wait answer
      se  w0  1          ;   if not ok then
      jl.     d9.        ;   goto give up
      jl.     e4.        ;   else goto next action;
e.

;remove area processes and message buffers:

b. d12 w.
d9:          -1,r.8      ; dummy message to fp;
d10:          0          ; buf address;
d11:          0          ; rel. addr of bittable in areaproc
d12:          24         ;

a5:
     rl  w1     80       ; last internal
     ws  w1     78       ;
     ls  w1     -1       ; w1:=number of internals
     al  w1  x1+23       ;
     al  w0      0       ;
     wd. w1     d12.     ; w1:=size of bittable for userbits
     ls  w1     1        ;
     ac  w1  x1+4        ;
     rs. w1     d11.     ; d11:=rel. addr of bittable i areaproc
      rl  w1  76         ; start: remove area processes:
d1:  rl  w2  x1+0        ; for w2 through area in name table do
     rl  w3     66       ; w3:=cur;
     ba  w2  x3+12       ; w2:=w2+rel addr.curr
     am.        (d11.)   ;
     bz  w0  x2          ; w0:=userbits.cur
     bs  w2  x3+12       ; reset w2
     sz  w0  (x3+12)     ; if cur is user of area proc then
      jl.     d3.        ;   then goto maybe remove proc;
d2:   al  w1  x1+2       ;
      se  w1 (78)        ;
      jl.     d1.        ;
      jl.     d4.        ;   goto remove buffers;
d3:   se. w1 (h20.+h1+10); maybe remove process:
      sn. w1 (h21.+h1+10);   if name tab addr(proc) <>
      jl.     d2.        ;   name tab(in) and name tab(out)
      dl  w0  x2+4       ;   then begin
      ds. w0  h43.+2     ;     if proc name <> <:fp:>
      sn. w3 (h40.)      ;     then
      jl.     d2.        ;     copy name into own core area
      dl  w0  x2+8       ;
      ds. w0  h43.+6     ;
      al. w3  h43.       ;     and remove process;
      jd      1<11+64    ;   end
      jl.     d2.        ;   return;

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;
\f


; rc 19.02.73             file processor, end program, page 5

      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:   am      h20-h21    ; zone:=curr in
a7:   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;

;enter device status:

a8:   rl. w1  e7.        ; restore status word;
      rs. w1  c20.       ;
      jl.     h64.       ;   goto device status;


\f


; rc 19.02.73             file processor, end program, page 6

;table of sequences of actions:
;(each sequence consists of an even number of bytes)
h.
;no device errors:
f1: a1-a0,a2-a0,a5-a0,h62-a0
;hard error on current out:
f2: a7-a0,a4-a0,a2-a0,a5-a0,a8-a0,0
;hard error on stacked curr in zone:
f3: a1-a0,a6-a0,a5-a0,a8-a0
;hard error on curr in zone:
f4: a3-a0,a4-a0,a6-a0,a5-a0,a8-a0,0
;hard error on other zone:
f5: a1-a0,a2-a0,a5-a0,a8-a0
w.
;the actions are:
;
;a1    outend and free curr out
;a2    unstack curr in zone to i-bit
;a3    terminate cur out
;a4    connect primary output
;a5    remove area processes and message buffers
;a6    free curr in zone
;a7    free curr out zone
;h62   call and enter load program segment
;a8    call and enter device status segment

b. g1                    ; fill up to 512 bytes:
g1=(:h55+512-k:)/2
c. -g1 m.length error on end program segment
z.w. 0,r.g1
e.
m.fp end program 07.03.73
i.e.

\f

                                                                                     

; rc 12.04.72                       file processor, device status, page 1



s. k=h55, e48            ; begin segment: device status;
w.                       ;
      512                ; length of segment

      al. w0  e7.        ; device status:
      jl. w3  h31.-2     ;   writetext(out,<:***device status:>);
      al. w0  h10.+2     ;
      jl. w3  h31.-2     ;   writetext(out,doc name);
      al  w2  0          ;

e6:   rl. w1  c20.       ;   for bit := 0 step 1 until 21 do
      ls  w1  x2         ;   begin
      al. w0  e10.       ;
      ba. w0  x2+e5.     ;
      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.     e6.        ;   end;
      jl. w3  h39.       ;   outend(nl);

      al. w3  h10.+2     ; 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  e2.       ;   get mask;
      rl. w0  c20.      ;   move status to message;
      la  w0  2         ;
      rs. w0  e4.       ;
      sn  w0  0          ;   if status and mask(kind) <> 0
      jl.     e8.        ;   then
      al. w1  e3.        ;
      al. w2  h10.+2     ;   parent message(<:status:>, doc name);
      jl. w3  h35.       ;
e8:   dl. w2  c20.       ; test if current in error:
      rl. w0  h20.+h2+0  ;
      sn. w1  h20.+h1+2  ;   if error on curr in zone
      so  w0  2.1        ;   and i-bit then
      jl.     e33.       ;   begin
      al. w3  2          ;     unstack curr in
      rl. w0  h50.       ;     until name
      se  w0  0          ;     chain end;
      jl.     h30.-4     ;
      rl. w3  h20.+h0+0  ;     reset the
      al  w3  x3-1       ;     fp command stack;
      rs. w3  h8.        ;
      rs. w3  h9.        ;     call and enter
      jl.     h61.       ;     command segment;
e33:  al. w3  2          ;   end;
      rl. w0  h20.+h2+0  ;   unstack curr in zone
      so  w0  2.1        ;   until first i-bit;
      jl.     h30.-4     ;   call and enter
      jl.     h62.       ;   load program segment;

; hard error message to parent, in case of hardware errors:
e3:   3<13+1<9+0    ; m(0) , pattern word
      <:status:>    ; m(2:4)
e4:   0             ; m(6) , logical status

e7:   <:<10>***device status <0>:>

\f

                                                                          

; rc 77.09.22                        file processor, device status, page ...2...



; mask(0:20) , to select hardware errors:

e2:  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.
e5:   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.

e1 = (:h55+512-k:)/2
0, r. e1             ; fill segment with zeroes
m.fp device status  77.09.22
m. fpnames follows:
e.   ; end device status segment
i.   ; list fp names
b. g1  w.
g0: g1: 17            ; segm
         0, r.4       ; docname
         s2           ; date
         0, 0         ; fil, blok
         3<12 + 2     ; contry
         3584         ; length

p.<:insertproc:>
e.   ; end file processor

▶EOF◀