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

⟦0a81c208f⟧ TextFile

    Length: 138240 (0x21c00)
    Types: TextFile
    Names: »tterm1«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦0b92c64d5⟧ »ctb« 
            └─⟦this⟧ 

TextFile

(bterm1 = set 1 disc
bterm1 = slang proc.options
scope user bterm1
print bterm1 integer words.4 0.6
)

b.  w.
p.1

; sl 12.11.71          ext table          term1   ...1...

s0=0, s1=0             ;
s. h30 w.              ;
h10, h11               ; version:
78 05 04, 112   ; version id:
m.          boss 2  tterm1
s. d100, g300  w.      ;
h29:
k=10000                ; list of external words:
h30:
     g47.,g48.,g49.
     g50.,g51.,g52.,g53.,g54.,g55.,g56.,g57.,g58.,g59.
     g60.,g61.,g62.,g63.,g64.,g65.,g66.,g67.,g68.,g69.
     g70.,g71.,g72.,g73.,g74.,g75.,g76.,g77.,g78.,g79.
     g80.,g81.,g82.,g83.,g84.,g85.,g86.,g87.,g88.,g89.
     g90.,g91.,g92.,g93.,g94.,g95.,g96.,g97.,g98.,g99.
     g100.,c.e25-1,g101.,g102.,g103.,g104.,g198.,g199.,g200.,g201.,g202.,g203. z.
     g105.,g106.,g107.,g108.,g109.
     g110.,g111.,g112.,g113.,g114.,g115.,g116.,g117.,g118.,g119.
     g120.,g121.,g122.,g123.,g124.,g125.,g126.,g127.,g128.,g129.
     g130.,g131.,g132.,g133.,g134.,g135.,g136.,g137.,g138.,g139.
     g140.,g141.,g142.,g143.,g144.,g145.,g146.,g147.,g148.,g149.
     g150.,g151.,g152.,g153.,g154.,g155.,g156.,g157.,g158.,g159.
     g160.,g161.,g162.,g163.,g164.,g165.,g166.,g167.,g168.,g169.
     g170.,g171.,g172.,g173.,g174.,g175.,g176.,g177.,g178.,g179.
     g180.,g181.,g182.,g183.,g184.,g185.,g186.,g187.,g188.,g189.
     g190.,g191.,g192.,g193.,g194.,g195.,g196.,g197.
     g204.,g205.,g206.,g207.
     g210.,g211.,g212.,g213.,g214.,g215.,g216.,g217.
     g220.,g221.,g222.,g223.,            g226.,g227.,g228.,g229.
     g230.,g231.
     g245.
     g255.,g256.,g257.,g258.,g259.,g260.,g261.,g262.
    c.e61-1, g263. , g264. z.
h1:  h2
     am.       (4)     ;    goto start init
     jl.       +2      ;
     g43.              ;
\f


; bbj 77 06 28                     contents of tterm1                 ...1a...
 
 

; block structure and contents:        page structure:
;
; s. d, g
;    external words.                   initialisation          1
;    job file page                     job file page           2
;    b. b, c, j
;       local variables, read login    commandio central       5
;       b. a
;          next block, attention              -                6
;          next char, central actions         -                7
;       e.
;       b. a
;          edit actions                       -               10
;       e.
;       entries to print segment              -               14
;       character table, syntax table         -               14
;       command table                         -               17
;    i.e.
;    b. b, c
;       local variables                commandio bulk file     1
;       various procedures                    -                2
;       next line                             -                5
;       init line                             -                7
;       bulk get                              -                8
;       bulk save                             -                9
;       clear correction, release             -               10
;    i.e.
;       initialisation                 initialisation         11
;     s. b,c,g                         print                  37
;        output block                    -
;        login after error               -
;        general print                                        38b
;        verify,list                   list,verify            41
;        alarm print                       -                  43
;        init                              -                  46
;     e.
;
;     s. f,g
;        b. b,d
;           snapshot                                          48
;           autoline                                          50
;        e.
;     i.e.
; i.e.                                                        14
\f


; sl 14.6.71          job file page          term1   ...2...

g0=k-4-i46              ; begin page 1, job file page
                       ;    return virt and rel for commandio procs
d7=4, d8=4             ;    param list and line buffer.
                       ;    also used as working area by command actions.
d34=k-2-g0, d35=d8-2   ;    last of line, base line

; variables for next block and attention:
d36=k-g0, 0            ;    job descr page
d38=k-g0, g63: 53      ;    terminal reserve. binary semafore. ext(221)
d39=k-g0, g64:         ;+2  attention semafore.
h. e13*i4+e13, 19  w.  ;
d40=k-g0, g65:         ;    terminal sender descr
h. 10*i4+10,   20  w.  ;
d41=k-g0, 0, r.5       ;    name, name addr of terminal
d42=k-g0, g66: 150     ;    first addr of terminal buffer.

c. d42+2-e11-1
m.*** e11 too small
z.

; variables for next char and central actions:
d1=k-g0,  0            ;    partial word
d2=k-g0, -1            ;    special char. logout cause
d3=k-g0,  g20          ;+2  state. initially: start state, testing only.
d4=k-g0,  0            ;    curr word. abs address in input buffer.
d5=k-g0,  0            ;    top buf.     -     -     -     -      .
d6=k-g0, 29<12+0       ;    console state < 12 + jobstate
; console state:   8 + ready*4 + user*2 + operator*1 + unlogged*16
; job state:   defined in tjob, io page
d37=k-g0, 0            ;+2  conversational * 8
; d10 is used to count buffers returned with timer status

; variables for edit actions:
d9=k-g0,  d14          ;    top corr list. rel address within page 1.
d10=k-g0, 0            ;+2  work. line number. timer count(from command input).
d11=k-g0, 0            ;    work. return rel inside page.
d12=k-g0, d15          ;    curr corr segm. rel address within page 1.
d15=k-g0, 1000 001     ;    first corr segm:   list of corr segments each
          r. 2*i44     ;    described by two words, thus:
; first word:   top corr list when the corr segment became full, large
; until it is full. second word:   virt address of corr segment.
d86=k-g0, 0           ;    start line for autoline
d87=k-g0, 0           ;    linedistance in autoline

; variables for next line and init line:
d16=k-g0, 0            ;    work page. buffer for basis file.
d18=k-g0, 0            ;    abs or page. relative on bulk file page.
                       ;      (page 0-4 are indicated by value 0-8,
                       ;       abs addr by: ext 155)
d27=k-g0, 0            ;-2  last store rel. used by next line.
d19=k-g0, 0            ;+0  store rel.          -     -      .
d20=k-g0, 0            ;+2  return rel.         -     -      .
d21=k-g0, 0            ;    segment number in basis file.
d22=k-g0, 0, r.5       ;    name, name address of basis file.
d26=k-g0               ;    logical status at alarm.
d33=k-g0, 0            ;    line got. used by next line.
d28=k-g0, 0            ;    next corr line
d29=k-g0, 0            ;+2  next corr index
d30=k-g0, 0            ;    used already from corr line.
d31=k-g0, 0            ;    next file line
d32=k-g0, 0            ;+2  next file index
d25=k+2-g0, 0, 0       ;    return virt and rel from nextline etc, print catalog entry
\f


; sl 12.11.71          job file page          term1   ...3...

; variables for accounting and stdinterval
d43=k-g0,   0          ;    time logged in (seconds)
d44=k-g0,   0          ;+2  operations performed
d45=k+2-g0, 0, 0       ;    stdinterval

; variables for psjob, primary io:
d50=k-g0, g67:         ;    psjobque, chained semafor.
h. e13*i45,    19 w.   ;
d51=k-g0, g68:         ;    job in core, binary semafor.
h. e13*i45,    19 w.   ;
d52=k-g0, 0            ;    exhaust count.

d53=k-g0, 0            ;    rest room on page, job contr. printer.
d54=k-g0, 0            ;+2  job buffer index.
d55=k-g0, 0            ;+4  get current virt buffer addr
d56=k-g0, 0            ;    message addr
d57=k-g0, 0            ;    first of job (even)
d58=k-g0, 0            ;    top of job (even)

d59=k-g0, 0            ;    rest room on page, primary output
d60=k-g0, 0            ;+2  job buffer index
d61=k-g0, 0            ;+4  virt buf (ext 193)
d62=k-g0, 0            ;    first buf byte
d63=k-g0, 0, r.5       ;    name of super buffer area
d64=k-g0, 0            ;    length of super buffer
d65=k-g0, g69: 54      ;    terminal full, simple semafor

d66=k-g0, 0            ; card reader: ext 198, 450: prog state, start rel
d67=k-g0, 0            ;    ext 199    : curr virt address of card buffer
d68=k-g0, 0            ;    ext 200    : last received status of card reader
d69=k-g0, 0            ;    ext 201    : card length
d82=k-g0, 0            ;-2  ext 367    : free buffer semafore
d83=k-g0, 0            ;    ext 368    : full buffer semafore
d84=k-g0, 0            ;-2  ext 369    : virt first buffer addr
d85=k-g0, 0            ;    ext 370    : virt top buffer addr

d71=k-g0, 0            ;    ext 299    : state of terminal output
d72=k-g0, 0,0          ;    ext 301,302: next byte, buf byte
d73=k-g0, 0,0          ;    ext 303,304: virt buf, appetite
d74=k-g0, 0            ;    ext 305    : out bytes
d75=k-g0, 0            ; job controlled tape reader: ext 446: prog state
d76=d75+1              ;    ext 447    : start rel
d77=k-g0, 0            ;    ext 448    : curr virt address of tape buffer
d78=k-g0, 0            ;    ext 449    : last received status of tape reader
d90=k-g0, 0            ;    ext 518    : job reader free
d91=k-g0, 0            ;    ext 519    : job reader full
d92=k-g0, 0            ;    ext 520    : first virt buffer
d93=k-g0, 0            ;    ext 521    : top virt buffer

                       ; card reader and reader:
d81=k-g0, 0            ;    ext 429    : next store in job input area

d79=k-g0, 0            ;    ext 474:    : job controlled printer:
                       ;                 current paper type
d80=k-g0, g140: 81     ;    terminal input semafore

; variables for various commands
d88=k-g0, 0            ;    terminal user rights;
d70=k-g0, g100:        ;    commandio answer semafore
h. e13*i4+e13, 19 w.   ;    (ext 236)
\f


; sl 14.6.71          job file page          term1   ...4...

; line table, correction list, related g-names.

d17=k-g0, 1000 000     ;    line table. contains one word for each
; segment in the basis file, specifying the line number for the first
; character on the segment. if the file is not terminated by an em-
; character, the top segment is considered containing the em-character.
; the table is terminated by one more word containing a large value.

d14=d17+2+2*i47        ;    corr list. one word for each correction
                       ; specifying the line number corrected.

g2 =d14+2+2*i48        ; end page 1, job file page. g2 = length

g12=g2, g13=510-i46    ;    max top corr list, max last on corr page
g14=d15+2*i44-2        ;    max current corr segm.
g15=8+4                ;    required edit bits: conversational, ready.
g16=i46, g19=i3        ;    max line length, length terminal buffer

; the corrected lines are stored on correction segments, each
; segment composed like this:
; 0:    last on corr page (1 word, specifying last used on this page)
; 2:    corrected line (possibly some words containing the characters,
;                       one word containing line number,
;                       one word containing -length of corrected line)
;       corrected line, ...
\f


; sl 14.6.71          command input          term1   ...5...

b. b60, c60, j10  w.   ; begin commandio central page
g1:                    ;
b0:       0, r.5       ;    page addresses
     20<12+0           ; pageident:  command input
b1:       0            ;    sh count. used by pack char.
b2:       0            ;    curr text.     -     -
b3:       0            ;+2  top text.      -     -
b4:       0            ;    the number so far read from the input buffer
b6:       0            ;    first of comm name. packing of name.
b12:                   ;    param addr. used for storing params.
b15:      0, r.20      ;    template. used by replace command.
b17=k-1                ;    last of template
b7=k                   ;    top comm name
b8:       10           ;    used in creation of numbers from digits (no:=no*10+digit)
b9:       255<16       ;    mask for 4-letter names
b14:                   ;    template addr
b10:      0            ;    pattern. for checking params
b11:      0            ;+2  comm addr
b26:      0            ;    comm rel
b13: g50: 8            ;    page jump
b16:      0            ;    line number. used during edit commands.
b18:      0            ;-2  constant. used by replace command.  (used at prepare attention)
b19:      0            ;+0  partial of line.   -     -
b20:      0            ;+2  word of line.      -     -
b22:      0            ;    saved char.        -     -     and login
b23=k+2,  0, 0         ;    saved pos.         -     -

b24: g51: 7            ;    get pages
b25:      1 000 001    ;    large
b27=k+2,g52:157,g53:158;    entry next line
b28=k+2,g54:157,g55:161;    entry init line
b29: g56: 25           ;    call
b30:      6<12         ;    check ready and user console
b31: g57: 4            ;    open
b32: g58: 3            ;    lock
b21: g49: 5            ;    lock chained

b33:      3<12, 0, 0   ;    input message
b34=k-2                ;
b35: g59: 1            ;    send and wait
b36:      1<16         ;    attention 
b37:      1<21         ;    timer
b38: -1-1<23-1<21-1<1  ;    other than local or timer or normal
b39=k+2,g60:162,g76:204;    entry alarm
b40=k+2,g61:162,g77:205;    entry io alarm
b41:      1 000 000    ;    large - 1
b42: g62: 26           ;    current corutine
b43:      5<12,0,0     ;   output message
b44:      <:>><10>:>   ;   attention text
b45: g137:34           ;    w0 call
b46: g141:21           ;    private output
b47:      15           ;    private output, kind
b48: g47: 162, g48: 310;    message action
b49:      (:-1:)>8     ;    mask for 16 bit param spec
b51=k+2,g259 : 162, g260 : 229;      virtual and relative address of general print
b50:      i177         ;    max timer count
b52:      2.1111       ;    mask for removing user rights;
\f

                                                  
; sl 30.11.71          command input          term1   ...6...

g45=k-g1               ; read login information:
     al  w0     g30    ;
     rs  w0  x3+d3     ;    read state:= expecting login;
     al  w0    -1      ;
     rs  w0  x3+d2     ;    special char:=not exist;
     jl.        c49.   ;    goto input;
c50: rs. w1     b22.   ; prep login:   save w1 = char;
     al. w2     g46.   ;    command found(w2 = login);
     jl. w3     c47.   ;
     rl. w1     b22.   ;    w1:= char;
     jl.        c12.   ;    goto prep name;

b. a25 w.              ; next block:   w3= page 1 abs;
c1:  rl  w1  x3+d40    ;
     rl  w0  x1+8      ;
     rl  w1 (x3+d39)   ;
     sn  w0     0      ;    if sender.mess <> 0 or
     sl  w1     1      ;    attention > 0 then
     jl.        a8.    ;    goto wait attention;
     dl  w1  x3+d37    ;    w0:= console state; w1:= conversational;
     so. w0    (b30.)  ;    if ready and user console
     sz  w1     8      ;    or conversational then
     jl.        c49.   ;    goto input first;

a8:  rl  w2  x3+d38    ; wait attention:
     jl. w3    (b31.)  ;    open(terminal reserve);
     rl  w2  x3+d39    ;
     jl. w3    (b21.)  ;    lock chained(attention);
     rl. w1    (b42.)  ;
     rl  w0  x1+10     ;    page 3:= operation;
     rs  w0  x1+12     ;
     rl  w2  x3+d38    ;
     jl. w3    (b32.)  ;    lock(terminal reserve);
     rl. w2     b0.+6  ;
     al  w0     0      ;
     hs  w0  x2+2      ;    release operations;
     bz  w1  x2+3      ;
     sl  w1     4      ;    if login attention then
c.-1, o100 , z.        ;  (bossfault xref)
     jd        -100    ;      ***bossfault 100
     bz. w1  x1+a0.    ;    goto case operation of
     jl.     x1+b0.    ;    (output attention, message, logout op, finis);

a0: h. a11, a12, a7, a13  w.
a13=k-b0               ; finis:
     bz  w1  x3+d6     ;
     al  w1  x1+4      ;    console state:= console state +
     hs  w1  x3+d6     ;    + ready;
     jl.        a14.   ;    goto prep;

a11=k-b0               ;
     rl. w1     b0.+6  ; output attention:
     al  w2     0      ;    sender.message:= 0;
     rx  w2  x1+4      ;
     al  w0     1      ;    result:= 1;
     jd         1<11+22;    send answer(mess);
     rl. w2     b0.+2  ;
     rl  w1  x2+d3     ;   load current state
     se  w1     g31    ;   if autoline then
     jl.        a14.   ;      change state
     al  w1     g20    ;    autoline is stopped by setting the start
     rs  w1  x2+d3     ;    state to g20 instead of g31.
a14: rl  w1 (x3+d41+8)  ; prep: 
     rl  w0  x1+12      ;   w0:= terminal descr.reserver;
     sn  w0     0       ;   if terminal not reserved then
     jl.        c49.    ;   goto input first;
     rl  w1  x3+d42     ;
     al  w2  x1         ;   fa of message :=
     ds. w2     b43.+4  ;   la of message := fa;
     rl. w0     b44.    ;
     rs  w0  x1         ;   buffer:= <:>>nl:>;
     al. w1     b43.    ;
     al  w2  x3+d41     ;   w2:= terminal name;
     jl. w3    (b35.)   ;   send and wait;
\f

                                                            
; sl 30.11.71          command input          term1   ...7...

c49:                   ; input first:
     al  w0     0      ;    comment top buff used for summation of bytes transferred;
     rs  w0  x3+d5     ;    top buff := 0;
     rs  w0  x3+d10    ;    timer count := 0;
a10:                   ; input:
     rl  w1 (x3+d39)   ;    if attention sem > 0 then
     sl  w1     1      ;
     jl.        a17.   ;      goto prep1 attention;
     rl  w1  x3+d42    ;    w1:= current word:= fa - 2;
     al  w0  x1-2      ;
     rs  w0  x3+d4     ;    fa of message:= fa + top buff;
     al  w2  x1+g19-2  ;    la of message:= fa - 2 + length term buf;
     wa  w1  x3+d5     ;
     ds. w2     b34.   ;
     al. w1     b33.   ;    w1:= mess addr;
     al  w2  x3+d41    ;    w2:= terminal name;
     jl. w3    (b35.)  ;    send and wait;

     sz  w0     15<2   ;    if process does not exist etc then
     jl.        a18.   ;    goto harderror logout;
     sz. w0    (b36.)  ;    if attention then
     jl.        a15.   ;    goto prepare attention;
     sz. w0    (b38.)  ;    if other than local or timer or normal then
     jl.        c48.   ;    goto terminal io alarm;

     rl  w2  x3+d5     ;    top buff := top buff + bytes transferred;
     wa  w2  x1+2      ;
     rs  w2  x3+d5     ;
     sz. w0    (b37.)  ;    if timer then
     jl.        a16.   ;      goto count timer;

     rs  w2  x1+2      ;    bytes transferred := top buff;

     wa  w2  x3+d42    ;    top buff := top buff + fa;
     rs  w2  x3+d5     ;
     al  w0     0      ;    conversational:= false;
     rs  w0  x3+d37    ;    prepares for empty buffer;
     rl  w2  x3+d44    ;    accounting:
     al  w2  x2+1      ;    operations:= operations + 1;
     rs  w2  x3+d44    ;
     rl. w2    (b42.)  ;    w2:= current corutine;
     bz  w0  x2+4      ;
     so  w0     2      ;    if testmode 2 then
     jl.        a22.   ;    begin
     rl  w0  x1+2      ;
     ls  w0     6      ;      w0:=bytes transferred
     wa. w0     b47.   ;      shift 6 + 15;
     rl  w1  x3+d42    ;      w1:=fa; privout;
     jl. w3    (b46.)  ;    end;
a22: rl  w0  x3+d3     ;    load current state
     se  w0     g31    ;    if autoline mode then
     jl.        a1.    ;    begin
     rl  w0  x3+d86    ;      w0:= current linenumber
     rs. w0     b4.    ;      b4:= current linenumber
     jl. w2     c29.   ;      update correction tables
                       ;    end
     jl.        a1.    ;    goto next word;

a17: al. w1     b18.-2 ; prep1 attention: bytes transferred := 0;
a15: rl  w2  x3+d5     ; prepare attention:
     wa  w2  x1+2      ;    if top buff + bytes transferred = 0 then
     sh  w2     0      ;
     jl.        a8.    ;      goto wait attention;
     jl.        c54.   ;    goto input line skipped;

a16: al  w0     1      ; count timer:
     wa  w0  x3+d10    ;    timer count := timer count + 1;
     rs  w0  x3+d10    ;
     sh. w0    (b50.)  ;    if timer count <= max timer count then
     jl.        a10.   ;      goto input;
     jl.        a19.   ;    goto timer logout;

\f



; btj 03.04.73         command input          term1   ...7a...


a12=k-b0               ; message operation:
     dl. w3     b48.+2 ;
     jl.       (b13.)  ;

a18: am         32-33  ; harderror logout:
a7=k-b0                ; logout operation:
     am         33-34  ; operator remove:
a19: al  w1     34     ; timer logout:
     rs  w1  x3+d2     ;    save logout cause in special char;
     rl. w2     g17.   ; 
     al  w0     -1     ;    param1:=empty;
     rs  w0  x3+d7     ;    prepare kill.
     rl. w1    (b42.)  ;
     rl  w0  x3+d36    ;    page 4 descr:= job descr;
     rs  w0  x1+14     ;
     bz. w3     g18.   ;    goto logout command;
     jl.       (b13.)  ;

g35= k-g1
c44: al  w0     -1     ; after action:   special char:= non exist;
     rs  w0  x3+d2     ;
     rl  w0  x3+d3     ;    w0:= current state
     rl  w1 (x3+d39)   ;
     sh  w1     0      ;   if attention or
     se  w0     g31    ;      not(autoline) then
     jl.        a5.    ;   goto a5
     jl. w2     c57.   ;    print next lineno
     jl.        c1.   ;   end
a5:
     ld  w1    -100    ;
     rl. w2    (b42.)  ;    page 2 descr:= page 3 descr:=
     ds  w1  x2+12     ;    page 4 descr:= 0;
     rs  w0  x2+14     ;
     jl.        c1.    ;    goto next block;
\f


; sl 7.6.71          command input          term1   ...8...

; central logic:   unpacks a character, looks up in character table
; and syntax table, and switches to an action.
; variable explanation :
; d1 - contains the partial word currently being unpacked.
; d2 - contains the delimiter from replace.
; d3 - the current state of the state-action table.
; d4 - index to next word to read.
; d5 - max length of line to be read.

c0:  rl. w3     b0.+2  ; nextchar:   w3:= page 1 abs;
     rl  w2  x3+d1     ;+2: w2:= partial word;
     sn  w2     0      ;    if partial word = 0 then
     jl.        a1.    ;    next word;
a2:  al  w1     0      ;   
     ld  w2     8      ;    w1:= char:= first char in partial;
     rs  w2  x3+d1     ;    partial word:= remaining chars;

     bl. w2  x1+g5.    ;    w2:= class:= char table(char);
     sn  w1 (x3+d2)    ;    if char = special char then
     al  w2     10     ;    w2:= class:= 10;
                       ;    the class 10 is used in the state table to make
                       ;    the right replace.
     sh  w1     127    ;    if char>127 or
     sn  w2     12     ;       class = blind then
     jl.        c0.+2  ;    goto next char, w3 ok;

     am     (x3+d3)    ;    w2:= action, new state
j1:  rl. w2  x2        ;    := syntax(state + class);
     hs  w2  x3+d3+1   ;    state:= new state;
     bl  w2     4      ;    w2:= action;
j2:  jl.     x2        ;    switch to action, w1 = char;

a1:  rl  w2  x3+d4     ; next word:
     al  w2  x2+2      ;    w2:= curr word + 2;
     sl  w2 (x3+d5)    ;    if w2 >= top buf then
     jl.        c53.   ;    goto line termination;
     rs  w2  x3+d4     ;    curr word:= w2;
     rl  w2  x2        ;    w2:= buf(curr word);
     jl.        a2.    ;    return;

; variable explanation :
; b1 - a shift constant.
; b2 - the address of the current text word.
; b3 - the max length of a text string in words.
; the addresses are absolute in page3 (correction page).


; pack char:   w1 = char. returns to x3+2 normally. calls alarm
; if the text area is full. then x3 should contain alarm code.
c2:  rl. w2     b1.    ; pack char:
     al  w2  x2-8      ;    w2:= sh count:= sh count - 8;
     sl  w2     0      ;    if w2 < 0 then
     jl.        a3.    ;    begin
     rl. w2     b2.    ;  
     al  w2  x2+2      ;      w2:= curr text + 2;
     sl. w2    (b3.)   ;      if w2 >= top text then
     jl.        c30.   ;      goto alarm;
c3:  al  w0     0      ; start packing:   w2 = curr text;
     rs  w0  x2        ;      text(w2):= 0;
     rs. w2     b2.    ;      curr text:= w2;
     al  w2     16     ;      sh count:= 16;
a3:  rs. w2     b1.    ;    end;
     ls  w1  x2        ;    text(curr text):=
     wa. w1    (b2.)   ;    char shift sh count
     rs. w1    (b2.)   ;    + text(curr text);
     jl      x3+2      ;    return;
\f


; sl 7.6.71          command input          term1   ...9...

c4:  jl. w3     c2.    ; pack name:    pack char;
     g10               ;    full alarm is name-length;
     jl.        c0.    ;    goto nextchar;

c5:  al  w1  x1-48     ; first digit:
     rs. w1     b4.    ;    number:= char - 48;
     jl.        c0.+2  ;    goto nextchar, w3 ok;

c6:  al. w2     b7.    ; first letter:
     rs. w2     b3.    ;    top text:= top comm name;
     al  w0     0      ;
     rs. w0     b6.+2  ;    clear second of comm name;
     al. w2     b6.    ;    w2:= curr text:= first of comm name;
     al. w3     c0.-2  ;    prepare return to next char;
     jl.        c3.    ;    start packing(char);


c7:  al  w1  x1-48     ; digit:
     rx. w1     b4.    ;
     wm. w1     b8.    ;    w1:= number:= 
     wa. w1     b4.    ;    number * 10 + char - 48;
     sl  w1     0      ;
     sl. w1    (b41.)  ;    if number >= large - 1
     jl.        c33.   ;    then goto number alarm;
     rs. w1     b4.    ;
     jl.        c0.+2  ;    goto nextchar, w3 ok;

c8:  al. w3     c0.    ; find command:   prepare return to nextchar;
c9:  dl. w1     b6.+2  ; procedure find command:
     la. w1     b9.    ;    command name:=
     ds. w1     b6.+2  ;    first 4 chars of name;
     al. w2     g6.    ;    w2:= base comm table;
a4:  al  w2  x2+8      ; rep:   w2:= next in comm table;
     sl. w2     g7.    ;    if w2 >= top comm table then
     jl.        c31.   ;    goto what alarm;
     dl  w1  x2+2      ;
     la. w1     b9.    ;    w0 w1:= first 4 letters from comm table;
     se. w0    (b6.)   ;
     jl.        a4.    ;    if entry <> comm name then
     se. w1    (b6.+2) ;    goto rep;
     jl.        a4.    ;

c47: dl  w1  x2+4      ; command found:   pattern:= comm pattern(w2);
     la. w0     b49.   ;
     ds. w1     b11.   ;    comm addr:= comm addr(w2);
     rl  w1  x2+6      ;    comm rel:= comm rel(w2);
     hs. w1     b26.+1 ;
     bz  w1     2      ;    w1:= required bits;
c. i179-1              ;    if main console is normal console
     sz  w1     2      ;      then remove user-only bit;
     al  w1  x1-2      ;
z.                     ;
     rl. w2     b0.+2  ;    w2:= page 1 abs;
     al  w0  x1        ;
     la. w0     b52.   ;    conversational:=required bits;
     rs  w0  x2+d37    ;   
     bz  w0  x2+d6     ;
     lo  w0  x2+d88    ;    w0:=console state <or> user rights;
     so  w0  x1        ;    if required bits not part of console state
     jl.        c38.   ;    then goto state alarm;
     al  w1  x2+d7     ;    param addr:= param list on page 1;
     rs. w1     b12.   ;
     jl      x3        ;    return;
\f



; sl 7.6.71          command input          term1   ...10...

c10: jl. w3     c9.    ; find and do:   find command;
c11: rl. w0     b10.   ; do:   w0:= pattern;
     so  w0     1      ;    if empty forbidden then
     jl.        c34.   ;    goto param alarm;
     al  w0     -1     ;
     rs. w0    (b12.)  ;    param(param addr):= end mark;
     rl. w3     b0.+2  ;    w3:= page 1 abs;
     rl  w0  x3+d36    ; 
     rl. w1    (b42.)  ;    w0:= virt job descr; w1:= current corutine;
     rl. w2     b11.   ;    w2:= command virtual addr;
     bz. w3     b26.+1 ;    w3:= relative of comm addr;
     so  w3     1      ;    if even relative then
     rs  w0  x1+14     ;    page 4 descr:= job descr;
     jl. w1    (b29.)  ;    call command action;
     jl.        c44.   ;    goto after action;
     jl.        c51.   ;+4  goto limited alarm;
     jl.        c34.   ;+6  goto param alarm;
     jl.        c52.   ;+8  goto device unknown;

c12: rl. w2     b12.   ; prep name:   w1 = char; w2:= param addr;
     al  w0  x2+8      ;
     rs. w0     b3.    ;    top text:= next param addr;
     ld  w0    -100    ;
     ds  w0  x2+6      ;    the first word is cleared in pack char the remaining here;
     rs  w3  x2+2      ;
     al. w3     c0.-2  ;    prepare return to next char;
     jl.        c3.    ;    start packing(char);

c13: al. w3     c0.    ; name param:   prepare return to next char;
c14: rl. w0     b10.   ; procedure name param:
     so  w0     4      ;    if name forbidden then
     jl.        c34.   ;    goto param alarm;
 
     rl. w2     b12.   ; test for that a name param. is not too long
     rl  w2  x2+6      ; w2:= fourth word of name
     sz  w2     255    ; if last char <> 0 then
     jl.        a21.   ;    name too long
a6:  ls  w0     -3     ; update pattern:
     rs. w0     b10.   ;    pattern:= pattern shift(-3);
     rl. w2     b12.   ;  
     al  w2  x2+8      ;    param addr:= param addr + 8;
     rs. w2     b12.   ;
     jl      x3        ;    return;
a21: jl. w3     c30.   ; goto name length alarm
     g10               ;

c15: jl. w3     c14.   ; name and do:   name param;
     jl.        c11.   ;    goto do;

c16: al. w3     c0.    ; numerical param:   prepare return to next char;
c17: rl. w1     b4.    ; procedure numerical param:
     al  w0     0      ;
     am.       (b12.)  ;
     ds  w1     +2     ;    param area:= 0, number;
     rl. w0     b10.   ;
     so  w0     2      ;    if number forbidden then
     jl.        c34.   ;    goto param alarm;
     jl.        a6.    ;    goto update pattern;

c18: jl. w3     c17.   ; numerical and do:   numerical param;
     jl.        c11.   ;    goto do;

e.                     ; end central actions
\f


; sl 7.6.71          insert, replace          term1   ...11...

; edit actions.
b. a10 w.              ;
c27: rl. w1     b4.    ; store numerical:   w1:= char:= number;
     sn  w1     10     ;    if char = newline then
     jl.        c33.   ;      goto char alarm;
     sl  w1     1      ;    if char < 1
     sl  w1     128    ;    or char >= 128 then
     jl.        c33.   ;    goto char alarm;
c19: jl. w3     c2.    ; pack line:   pack char;
     g11               ;    full alarm is line length;
     jl.        c0.    ;    goto nextchar;

c20: rs  w1  x3+d2     ; replace:   special char:= char;
     jl.        c28.   ;    get line;
c40: jl. w2     c29.   ; return:   get free corr;
     al  w0     0      ;
     al  w1  x3+d35    ;    partial of line := 0;
     ds. w1     b20.   ;    word of line := abs line base;
     al. w2     b15.   ;
     rs. w2     b14.   ;    template addr:= first of template;
     al. w2     c41.   ;
     rs. w2     b11.   ;    comm addr:= terminate replace;
     jl.        c0.    ;

c21: jl. w2     c29.   ; insert:   get free corr;
     al. w2     c42.   ;
     rs. w2     b11.   ;    comm addr:= terminate insert;
     jl.        c0.    ;

c22: jl. w2     c29.   ; delete:   get free corr;
     jl.        a1.    ;    goto terminate delete;

c23: jl.       (b11.)  ; end edit:   switch to terminating action;

; in replace the char 50 must be remembered in the following ex. 7/a/b/50
c55: rl. w1     b4.    ; w1:=number
     sn  w1     0      ;
     jl.       (b11.)  ; if number = 0 then end edit actions
     sl  w1     1      ; if char < 1  or
     sl  w1     128    ;    char > 128 then
     jl.        c33.   ;  goto char alarm
     jl. w3     c2.    ; pack the char
     g11               ; name length is full alarm
     jl.       (b11.)  ; end edit actions

c41: jl. w3     c43.   ; terminate replace:   w1:= char from line;
     sn  w1     10     ;    if w1 <> nl then
     jl.        c42.   ;    begin
     jl. w3     c2.    ;      pack char;
     g11               ;      full alarm is line length;
     jl.        c41.   ;      goto terminate replace;
                       ;    end;
c42: al  w1     10     ; terminate insert:
     jl. w3     c2.    ;    pack char(nl);
     g11               ;    full alarm is line length;
a1:  rl. w3     b0.+2  ; terminate delete:   w3:= page 1 abs;
     rl. w2     b2.    ;    w2:= curr text;
     al  w1  x2+4      ;    last on corr page :=
     ws. w1     b0.+6  ;    curr text + 4 - page 3 abs;
     rx. w1    (b0.+6) ;    w1:= old last on corr page;
     ws. w1    (b0.+6) ;    w1:= - length of corr;
     rl. w0     b16.   ;    w0:= line number;
     ds  w1  x2+4      ;    save line number, - length of corr;
     rl  w1  x3+d9     ;
     al  w1  x1+2      ;    top corr list:= top corr list + 2;
     rs  w1  x3+d9     ;
     jl.        c44.   ;    goto after action;
\f


; sl 7.6.71          insert, replace          term1   ...12...

c24: rl. w2     b14.   ; pack template:
     sl. w2     b17.   ;    if template addr > last of template
     jl.        c35.   ;    then goto template length alarm;
     hs  w1  x2        ;    template(template addr):= char;
     al  w2  x2+1      ;
     rs. w2     b14.   ;    template addr:= template addr + 1;
     jl.        c0.    ;    goto next char;

c26: al  w1     0      ; prep numerical:
     rs. w1     b4.    ;    number:= 0;
     jl.        c0.    ;    goto next char;

; search template:   copies the line until a text string matching
; the template is met. the string and blinds preceding it are not copied.
c25: al. w2     b15.   ; search template:   w2:= p:= addr first template;
a3:  sn. w2    (b14.)  ; match next:   if p = top template then
     jl.        c0.    ;    goto next char; template skipped.
     jl. w3     c43.   ;    w1:= char:= char from line;
     se. w2     b15.   ;    if p = first template then
     jl.        a2.    ;    begin
     rs. w1     b22.   ;      saved char:= char;
     dl. w0     b20.   ;      saved pos:= pos in line;
     ds. w0     b23.   ;    end;
a2:  bl. w0  x1+g5.    ; rep:   w0:= char class;
     al. w3     a2.    ;    prepare return to rep;
     sn  w0     12     ;    if class = blind
     jl.        c43.   ;    then w1:= next char, goto rep;
     sn  w0     6      ;    if class = nl then
     jl.        c37.   ;    goto not found alarm;
     bl  w0  x2        ;    w0:= template(p);
     al  w2  x2+1      ;    if template(p) = char then
     sn  w0  x1        ;    w2:= p:= p + 1, goto match next;
     jl.        a3.    ;
     dl. w0     b23.   ; no matching:
     ds. w0     b20.   ;    pos in line:= saved pos;
     rl. w1     b22.   ;
     jl. w3     c2.    ;    pack char(saved char);
     g11               ;    full alarm is line length;
     jl.        c25.   ;    goto search template;

c45: bz  w0  x3+d6     ; test state:   if required edit bits
     so  w0     g15    ;    not part of console state then
     jl.        c38.   ;    goto state alarm;
     al  w0     g15    ;
     rs  w0  x3+d37    ;    conversational:= required edit bits;
     jl.        c5.    ;    goto first digit;
\f


; sl 7.6.71          insert, replace          term1   ...13...

; the next char is read and returned in w1, b19 contains the
; remaining chars. If no more chars (b19=0) then a new word
; is read. B20 contains the address of the line.


c43: dl. w1     b19.   ; char from line:   w2 saved, w3 = return.
     sn  w1     0      ;    w0:= 0; w1:= partial of line;
     jl.        a4.    ;    if partial = 0 then next word;
a5:  ld  w1     8      ;    w0:= char; w1:= remaining chars;
     rs. w1     b19.   ;    partial of line:= remaining chars;
     rl  w1     0      ;    w1:= char;
     jl      x3        ;    return;
a4:  rl. w1     b20.   ; next word:
     al  w1  x1+2      ;    word of line:= word of line + 2;
     rs. w1     b20.   ;
     rl  w1  x1        ;    w1:= line(word of line);
     jl.        a5.    ;    return to char from line;


c28: rl. w0     b4.    ; get line:
     rs  w0  x3+d10    ;    w0:= saved line number:=
     rs  w0  x3+d33    ;    line got:= number;
     al  w0  x3+d25    ;    w0:= addr of return point;
     rl  w1  x3+d16    ;
     rl. w3    (b42.)  ;
     rs  w1  x3+12     ;    page 3 descr:= work page;
     dl. w3     b28.   ;
     jl. w1    (b45.)  ;    w0 call init line;
     jl.        c46.   ;    if io alarm then goto io alarm;

     al  w0     d34    ;    last store rel:= last of line;
     al  w1     d35    ;    base store rel:= base of line;
     ds  w1  x3+d19    ;
     al  w0     2      ;    abs or page:= page 1;
     rs  w0  x3+d18    ;
     al  w0  x3+d25    ;
     dl. w3     b27.   ;
     jl. w1    (b45.)  ;    w0 call next line;
     jl.        c46.   ;    if io alarm then goto io alarm;
     jl.        c39.   ;    if line too long then goto line length alarm;

     rl  w0  x3+d10    ;
     se  w0 (x3+d33)   ;    if saved line <> line got then
     jl.        c37.   ;    goto not found alarm;
     rs. w0     b4.    ;    number:= saved line;
     jl.        c40.   ;    return to replace;
\f


; sl 7.6.71          insert, replace          term1   ...14...

c29: ws. w2     b0.    ; get free corr:   w2:= return rel;
     rl. w1     b4.    ;    w1:= line number:= number;
     rl. w3     b0.+2  ;    w3:= page 1 abs;
     rs  w1  x3+d33    ;    save line number for >verify<
     ds  w2  x3+d11    ;    save line number, return rel;
     rl  w0  x3+d9     ;    w0:= top corr list;
     sl  w0     g12    ;    if w0 >= max top corr list then
     jl.        c36.   ;    goto no room alarm;
     am        (0)     ;
     rs  w1  x3+0      ;    corr list(top corr):= line number;

     am     (x3+d12)   ;
     rl  w1  x3+2      ;    w1:= virt corr segm(curr corr segm);
     rl. w3    (b42.)  ;
     rs  w1  x3+12     ;    page 3 descr:= w1;
     jl. w3    (b24.)  ;    get pages;
     rl. w2     b0.+6  ;    w2:= page 3 abs;
     rl  w1  x2        ;    w1:= last on corr page;
     sh  w1     g13    ;    if w1 > max last on corr page then
     jl.        a6.    ;    begin

     rl  w1  x3+d12    ;      w1:= curr corr segm;
     sl  w1     g14    ;      if curr corr segm >= max then
     jl.        c36.   ;      goto no room alarm;
     al  w1  x1+4      ;
     rs  w1  x3+d12    ;      curr corr segm:= curr corr segm + 4;
     wa  w1     6      ;      w1:= addr of corr segm descr;
     rl  w0  x3+d9     ;    
     rs  w0  x1-4      ;      old corr limit:= top corr list;
     rl. w0     b25.   ;
     rs  w0  x1        ;      corr limit:= large;
     rl  w1  x1+2      ;      w1:= virt corr segm(curr corr segm);
     rl. w3    (b42.)  ;
     rs  w1  x3+12     ;      page 3 descr:= w1;
     jl. w3    (b24.)  ;      get pages;
     rl. w2     b0.+6  ;      w2:= page 3 abs;
     al  w1     0      ;      last on corr page:= w1:= 0;
     rs  w1  x2        ;    end;

a6:  wa  w1     4      ;    w1:= curr text:= last on corr page + page 3 abs;
     al  w2  x1+g16    ;    w2:= top text:= curr text + max line length;
     ds. w2     b3.    ;
     al  w0     0      ;    w0:= sh count:= 0;
     rs. w0     b1.    ;
     dl  w2  x3+d11    ;    line number:= saved line number;
     rs. w1     b16.   ;    w2:= return rel;
     jl.     x2+b0.    ;    return;
\f


; bbj 76 10 25             autoline          term1     ...14a...


; autoline - remaining initializations.
g41=k-g1               ;
     al  w0     g31    ;
     rs  w0  x3+d3     ;    curr state := state g31 telling that we are in autoline.
                       ;    now autoline has been initialized and behaves
                       ;    like insertion but with empty input buffer
     jl.        c44.   ;    therefore - goto after action.

; print next lineno - used by autoline
;  first the mode is set to conversational.
; second the parameters to print general are set in page 1 
; at last the call is performed.
c57: bz  w0  x3+d6     ;   test state (see c45)
     so  w0     g15    ;   if required edit bits not part of console state then alarm
     jl.        c38.   ;
     al  w0     g15    ;   conversational:=required edit bits
     rs  w0  x3+d37    ;  
 
     al  w0    -13     ;   start of parameters to general print
     rl  w1  x3+d86    ;
     ds  w1  x3+6      ;    first param := linenumber to write

     al  w0      0     ;
     al  w1     19     ;
     ds  w1  x3+10     ;    second param := space

     al  w0      -6    ;
     rs  w0  x3+ 12    ;    end of parameters
     al  w1  x2        ;
     dl. w3     b51.   ;
     jl.       (b29.)  ;    call general print -end of next line no

c56: rl. w3     b0.+2  ;    w3 := page 1 add
     rl  w0  x3+d86    ;    w0 := current lineno.
     wa  w0  x3+d87    ;    w0 := w0+linedistance
     sl. w0    (b41.)  ;    if w0 > large then
     jl.        c33.   ;       number too large
     rs  w0  x3+d86    ;    old line := newline
     jl.        c42.   ;    jump to terminating action for current line


e.                     ; end edit actions
\f


; sl 7.6.71          alarms, tables          term1   ...15...

b. a10 w.              ; entries to print segment

g10= 9, g11= 0         ; name length, line length alarm.

; alarms:
c54: am         43-35  ; 43: input line skipped
c53: am         35-30  ; 35: line termination
c52: am         1      ;30 device unknown
c51: am         21     ;29 limited
c31: am         1      ;8 what alarm:
c32: am         1      ;7 syntax alarm:
c33: am         1      ;6 numerical alarm:
c34: am         1      ;5 param alarm:
c35: am         1      ;4 template length:
c36: am         1      ;3 no room:
c37: am         1      ;2 template not found:
c38: am         1      ;1 state alarm:   illegal command.
c39: al  w1     0      ;0 line length alarm:
a1:  am         b39-b40; alarm:
a2:  al. w2     b40.   ; alarm(hard error):
     rl. w3     b0.+2  ;
     rs  w1  x3+d7     ;    param:= alarm code;
     al  w0     g20    ;    state:= start;
     rs  w0  x3+d3     ;
     rs  w0  x3+d5     ;    top buf:= buffer empty;
     al  w0     8      ;    conversational:= true;
     rs  w0  x3+d37    ;
     rs  w0  x3+d1     ;    partial word:= dummy;
     dl  w3  x2        ;
     jl.       (b13.)  ;    page jump to alarm or hard error;

c30: rl  w1  x3        ; alarm code in (x3):
     jl.        a1.    ;    w1:= alarm code; goto alarm;

c48: rs  w0  x3+d26    ; terminal io alarm:   logical status:= w0;
     am      d41-d22   ;
c46: al  w1     d22    ; io alarm:   param:= relative name addr;
     jl.        a2.    ;    alarm(hard error);
e.                     ;

g5:  h.
; character table: each entry gives the character class.
; NUL SOH STX ETX EOT ENQ ACK BEL BS  HT  NL  VT  FF  CR  SO  SI
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6,  12, 8,  12, 12, 12

; DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM  SUB ESC FS  GS  RS  US
  12, 12, 12, 12, 12, 12, 12, 12, 12, 6,  12, 12, 12, 12, 12, 12

; SP  !   apo pou dol per &   '   (   )   *   +   ,   -   .   /
  4,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8

; 0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   que
  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  8,  8,  8,  8,  8

; ca  A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8

; P   Q   R   S   T   U   V   W   X   Y   Z   Æ   Ø   AA  ci  _ .
  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8

; apo a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0

; p   q   r   s   t   u   v   w   x   y   z   æ   ø   aa  bar DEL
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  12
w.
\f


; sl 7.6.71          tables          term1   ...16...

; syntax table. each row corresponds to one state. each entry consists
; of action and new state. the comments give the action.

; 0: letter , 2: digit  , 4: space  , 6: nl,etc., 8: other  ,10:special

g20=k-j1; start state
h. c6-j2,g21, c45-j2,g25,  c0-j2,g20,  c1-j2,g20, c32-j2,g29
;first lett., test state, empty     , empty     , alarm

g21=k-j1; in command name
   c4-j2,g21,  c31-j2,g21,  c8-j2,g22, c10-j2,g20, c32-j2,g29
; pack name , pack name , find comm.,find and do, alarm

g22=k-j1; expecting parameter
  c12-j2,g23,  c5-j2,g24,  c0-j2,g22, c11-j2,g20, c32-j2,g29
; prep name ,first digit, empty     , do        , alarm

g23=k-j1; in name param
   c4-j2,g23,  c4-j2,g23, c13-j2,g22, c15-j2,g20, c32-j2,g29
; pack name , pack name , name param,name and do, alarm

g24=k-j1; in number param
  c32-j2,g29,  c7-j2,g24, c16-j2,g22, c18-j2,g20, c32-j2,g29
; alarm     , digit     , num. param,num. and do, alarm

g25=k-j1; in edit head
  c20-j2,g26,  c7-j2,g25, c21-j2,g27, c22-j2,g20, c20-j2,g26
; replace   , digit     , insert    , delete    , replace

g26=k-j1; in template
  c24-j2,g26, c24-j2,g26, c24-j2,g26, c32-j2,g20, c24-j2,g26, c25-j2,g27
;pack templ.,pack templ.,pack templ., alarm     ,pack templ.,search templ.

g27=k-j1; in edit line or after template
  c19-j2,g27, c19-j2,g27, c19-j2,g27, c23-j2,g20, c19-j2,g27, c26-j2,g28
; pack line , pack line , pack line , end edit  , pack line , prep num.

g28=k-j1; in numerical character
  c33-j2,g29,  c7-j2,g28,  c0-j2,g28, c55-j2,g20, c33-j2,g29, c27-j2,g27
; alarm     , digit     , empty     , end edit  , alarm     , store num.

g29=k-j1; skip command
   c0-j2,g29,  c0-j2,g29,  c0-j2,g29,  c1-j2,g20,  c0-j2,g29
; empty     , empty     , empty     , empty     , empty     
g30=k-j1; expecting login
  c50-j2,g23, c32-j2,g29,  c0-j2,g30,  c1-j2,g30, c32-j2,g29
; prep login, alarm     , empty     , empty     , alarm

g31=k-j1;  autoline
  c19-j2,g31,  c19-j2,g31,  c19-j2,g31,  c56-j2,g31,  c19-j2,g31,
;  pack char   pack char    pack char    new line     pack char.
w.
\f


; sl 14.6.71          command list          term1   ...17...


; command table:
;
;   each entry is four words describing one command:
;
;   -------------------------
;   !  1.   !  2.   !  3.   !   first three letters of command
;   -------------------------
;
;   -------------------------
;   !  4.   !!p5!p4!p3!p2!p1!   fourth letter, parameter specif.
;   -------------------------
;
;   -------------------------
;   !  virt. address        !   virtual address of command code
;   -------------------------
;
;   -------------------------
;   !  bit mask ! rel.addr. !   required bits in user rights,cons.state 
;   -------------------------   relative address of command code
;
;
;   each of the parameterspecifications consists of 3 bits like this:
;
;     text allowed < 2 + integer allowed < 1 + empty allowed < 0
;
;
;   required bits in user rights, console state are composed like this:
;
;   0 0 0 0 0 0 0 0 0 0 0 0
;   A A A A A A A A A A A A
;   ! ! ! ! ! ! ! ! ! ! ! '-  operator rights
;   ! ! ! ! ! ! ! ! ! ! '---  user only         (console state)
;   ! ! ! ! ! ! ! ! ! '-----  ready only        (console state)
;   ! ! ! ! ! ! ! ! '-------  conversational    (console state)
;   ! ! ! ! ! ! ! '---------  half operator - start,job
;   ! ! ! ! ! ! '-----------  may know other user names
;   ! ! ! ! ! '-------------  may run jobs with non-std job options
;   ! ! ! ! '---------------  may run jobs with std job options only
;   ! ! ! '-----------------  may convert files
;   ! ! '-------------------       unassigned
;   ! '---------------------       unassigned
;   '-----------------------       unassigned
;
;

; When a command action is entered during runtime, page 1 holds
; the return point (byte 0 to 3 on page 1), and the actual parameter
; list (byte 4 to i46+3). Each parameter occupies 8 bytes like this:
;   number :  0, value of number, undefined, undefined
;   name   :  name packed as text with unused words zerofilled
;   first unused param:  -1, undefined, undefined, undefined
; The command action may use the entire parameter list as working
; space. The value of a number fullfills 0 <= number < 1000 000.
; If the relative entry is even, page 4 will be the job description
; page. Otherwise page 4 descr is 0.

;   command       p5  p4  p3  p2  p1   virt.addr.    required bits  rel.addr.    command name
\f


; bbj 76 10 25        online command table     term1      ...17a...

 
g6=k-8

<:cle:>,  97<16+2.000 000 001 100 101, g78: 251, h.2.000000001100,  g79: 253 w.  ;  clear
 
<:get:>,   0<16+2.000 000 001 101 100, g80: 206, h.2.000000001100,  g81: 208 w.  ;  get
 
<:lis:>, 116<16+2.000 000 001 011 011, g82: 162, h.2.000000001100,  g83: 209 w.  ;  list
 
<:ver:>, 105<16+2.000 000 001 011 011, g220:162, h.2.000000001100,  g221:174 w.  ;  verify
 
<:sav:>, 101<16+2.000 000 001 101 100, g84: 206, h.2.000000001100,  g85: 207 w.  ;  save
 
<:log:>, 111<16+2.000 000 000 000 001, g86: 215, h.2.000000000000,  g87: 216 w.  ;  logout
 
<:   :>,   0<16+2.000 001 011 010 100, g96: 215, h.2.000000000000,  g97: 220 w.  ;  login
c. e25-1
<:nam:>, 101<16+2.001 011 101 100 010, g101:296, h.2.000000000001,  g102:297 w.  ;  name
 
<:lab:>, 101<16+2.001 011 101 100 010, g103:296, h.2.000000000001,  g104:298 w.  ;  label
 
<:eve:>, 110<16+2.001 011 101 100 010, g198:296, h.2.000000000001,  g199:487 w.  ;  even
 
<:nrz:>,   0<16+2.001 011 101 100 010, g200:296, h.2.000000000001,  g201:488 w.  ;  nrz
 
<:nrz:>, 101<16+2.001 011 101 100 010, g202:296, h.2.000000000001,  g203:489 w.  ;  nrze
z.
<:con:>, 118<16+2.000 001 011 111 100, g105:237, h.2.000100000110,  g106:238 w.  ;  convert
 
<:go:>,    0<16+2.000 000 000 000 001, g107:237, h.2.000010000110,  g108:239 w.  ;  go
 
<:run:>,   0<16+2.000 000 000 000 001, g109:237, h.2.000001000110,  g110:240 w.  ;  run
 
<:new:>, 106<16+2.000 000 001 101 100, g214:237, h.2.000001000100,  g215:232 w.  ;  newjob
 
<:reg:>, 114<16+2.000 000 001 101 010, g111:237, h.2.000001000100,  g112:241 w.  ;  regret
 
<:job:>,   0<16+2.000 000 001 101 010, g113:237, h.2.000000010100,  g114:242 w.  ;  job
 
<:ans:>, 119<16+2.000 001 011 111 100, g115:244, h.2.000000000001,  g116:245 w.  ;  answer
 
<:kil:>, 108<16+2.000 000 000 001 111, g117:244, h.2.000000000000,  g118:246 w.  ;  kill

<:aut:>, 111<16+2.000 000 001 011 111, g257:130, h.2.000000001100,  g258:132 w.  ;  autoline
 
<:dis:>, 112<16+2.000 001 111 111 101, g119:247, h.2.000000000000,  g120:248 w.  ;  display
 
<:req:>, 117<16+2.000 000 000 000 001, g121:247, h.2.000000100000,  g122:249 w.  ;  request
 
<:kit:>,   0<16+2.000 000 000 001 010, g124:247, h.2.000000000001,  g125:250 w.  ;  kit
 
<:ren:>,  97<16+2.000 000 001 100 100, g126:251, h.2.000000001100,  g127:252 w.  ;  rename
 
<:sco:>, 112<16+2.000 000 001 100 100, g128:251, h.2.000000001100,  g129:243 w.  ;  scope
 
<:loo:>, 107<16+2.000 000 001 101 100, g222:251, h.2.000000001100,  g223:307 w.  ;  lookup
 
<:sta:>, 114<16+2.000 001 101 101 110, g130:244, h.2.000001000000,  g131:254 w.  ;  start
 
<:rep:>, 101<16+2.000 000 001 111 010, g132:244, h.2.000000000001,  g133:255 w.  ;  repeat
 
<:clo:>, 115<16+2.000 000 000 000 001, g135:244, h.2.000000000001,  g136:256 w.  ;  close
 
<:cha:>, 110<16+2.000 000 001 010 010, g138:244, h.2.000000000001,  g139:258 w.  ;  change
c. -1
<:new:>, 116<16+2.000 000 000 001 100, g188:244, h.2.000000000001,  g189:295 w.  ;  newtape
z.
\f


; bbj 76 10 25        online command table     term1      ...17b...

<:sel:>,101<16+2.1011 011 011 110 010, g204:385, h.2.000000000001,  g205:396 w.  ;  select
 
<:rej:>,101<16+2.1011 011 011 110 010, g206:385, h.2.000000000001,  g207:397 w.  ;  reject
 
<:acc:>, 111<16+2.000 000 000 001 010, g142:400, h.2.000001000100,  g143:464 w.  ;  accounts
 
<:are:>,  97<16+2.000 000 000 001 010, g144:400, h.2.000001000100,  g145:456 w.  ;  areas
 
<:buf:>,   0<16+2.000 000 000 001 010, g146:400, h.2.000001000100,  g147:455 w.  ;  buf
 
<:cbu:>, 102<16+2.000 000 000 001 010, g148:400, h.2.000001000100,  g149:468 w.  ;  cbuf
 
<:dev:>, 105<16+2.000 000 000 001 110, g150:473, h.2.000001000100,  g151:466 w.  ;  device
 
<:int:>, 101<16+2.000 000 000 001 010, g152:400, h.2.000001000100,  g153:453 w.  ;  internals
 
<:key:>,   0<16+2.000 000 000 001 010, g154:400, h.2.000001000100,  g155:457 w.  ;  key
 
<:lat:>, 101<16+2.000 000 001 011 010, g156:400, h.2.000001000100,  g157:460 w.  ;  latest
 
<:mou:>, 110<16+2.000 000 000 001 010, g158:400, h.2.000001000100,  g159:461 w.  ;  mounts
 
<:out:>, 112<16+2.000 000 000 001 010, g160:400, h.2.000001000100,  g161:462 w.  ;  output
 
<:per:>, 109<16+2.000 001 010 010 100, g162:400, h.2.000001000100,  g163:458 w.  ;  perm
 
<:pro:>, 103<16+2.000 000 000 001 100, g164:400, h.2.000001000100,  g165:454 w.  ;  program
 
<:siz:>, 101<16+2. 001 010+i178*4    , g166:400, h.2.000001000100,  g167:452 w.  ;  size
 
<:sta:>, 116<16+2.000 000 000 001 010, g168:400, h.2.000001000100,  g169:465 w.  ;  stations
 
<:sus:>, 112<16+2.000 000 000 001 010, g170:400, h.2.000001000100,  g171:469 w.  ;  suspends
 
<:tap:>, 101<16+2.000 000 000 001 010, g172:473, h.2.000001000100,  g173:467 w.  ;  tapes
 
<:tem:>, 112<16+2.000 001 011 010 100, g174:400, h.2.000001000100,  g175:459 w.  ;  temp
 
<:tim:>, 101<16+2.000 001 011 011 010, g176:400, h.2.000001000100,  g177:463 w.  ;  time
 
<:onl:>, 105<16+2.000 000 000 001 100, g178:400, h.2.000001000100,  g179:483 w.  ;  online
 
<:cor:>, 101<16+2.000 000 000 001 010, g180:400, h.2.000001000100,  g181:484 w.  ;  corelock
 
<:tra:>, 110<16+2.000 001 101 100 100, g182:259, h.2.000000000100,  g183:260 w.  ;  transmit
 
<:kit:>,108<16+2.1010 010 010 100 010, g184:247, h.2.000000000001,  g185:263 w.  ;  kitlabel
 
<:att:>,   0<16+2.000 000 000 001 100, g186:162, h.2.000000000000,  g187:264 w.  ;  att
 
<:res:>, 111<16+2.000 000 001 011 100, g190:247, h.2.000000000000,  g191:265 w.  ;  resource
 
<:mes:>, 115<16+2.000 000 001 010 100, g192:247, h.2.000000000100,  g193:485 w.  ;  message
 
<:rem:>, 111<16+2.000 000 000 001 100, g194:247, h.2.000000000001,  g195:486 w.  ;  remove
\f


; bbj 76 10 25        online command table     term1      ...17c...

 
<:tes:>, 116<16+2.000 001 011 010 010, g196:244, h.2.000000000001,  g197:490 w.  ;  test
 
<:clo:>,  99<16+2.000 000 000 000 001, g210:162, h.2.000000000000,  g211:491 w.  ;  clock
 
<:sto:>, 112<16+2.000 000 000 001 100, g212:237, h.2.000000000001,  g213:506 w.  ;  stop
 
<:min:>, 105<16+2.000 000 000 001 100, g216:400, h.2.000001000100,  g217:420 w.  ;  minimal
 
<:pri:>, 111<16+2.000 000 000 001 010, g226:400, h.2.000001000100,  g227:372 w.  ;  priority
 
<:wai:>, 116<16+2.000 000 000 001 010, g228:400, h.2.000001000100,  g229:373 w.  ;  wait
 
<:pre:>, 115<16+2.000 000 000 001 100, g230:400, h.2.000001000100,  g231:374 w.  ;  preserve
 
<:sna:>, 112<16+2.000 000 001 101 100, g255:130, h.2.000000000001,  g256:131 w.  ;  snapshot

<:hot:>, 110<16+2.000 000 000 001 111,  g261:247, h.2.000000000000,  g262:137 w.  ;  hotnews

<:lin:>,107<16+2.000 000 000 001 010, g188:400, h.2.000100000100,  g189:526 w.  ;  link

c. e61-1
<:cal:>, 108<16+2.000 000 001 100 010, g263:244, h.2.000000000001,  g264:528 w.  ;  call
z.

g17=g86       ;  virt,
g18=g87       ;  rel    logout action (in case of forced logout)
g46=g96-4     ;  index for simulated login command




\f


; sl 13.6.72          command list          term1   ...21...


; for further commands

g7:                                     ; top command table

i.e.


\f



; sl 29.6.71          bulk file          term1   ...22...

b. b30, c20  w.        ; begin commandio bulk file
g9:                    ;
b0:       0, r.5       ;    page addresses and a zero for abs addressing
    21<12+0            ; pageident:  commandio bulk file
g8=k-b0,  0            ;    zero for abs adressing(next line)
b1:       3<12, 0      ;    input from basis file
b2:       0            ;    last addr, last get
b3:       0            ;    segment in operation
b4:       e30>9        ;    segments in work page
b5:  g70: 2            ;    send and wait fast
b6:       1<18         ;    end doc
b7=b2                  ;    last get
b8:       25<16        ;    em-character
b9:  g71: 8            ;    page jump
b10=k+2,  0, 0         ;    work for subroutines
b11:      0            ;    last store
b12:      1000 001     ;    large
b13:      1<6+1<14+1<22;    mask for checknl
b14:      127          ;    mask for checknl
b15:      1000 000     ;    large - 1
b16:      1000         ;    handling of ff
b17:      1<5+1<13+1<21;    mask prior to call of checknl
b18: g72: 7            ;    get pages
b19:      0            ;    top line
b20:      0            ;    abs base corr
b21: g73: 26           ;    current corutine
b22=k+2,g74:202,g75:203;    entry after action
b23:      -15          ;    for checknl
b24: g123:33           ;    terminate access
\f


; sl 7.6.71          bulk file          term1   ...23...

; procedure transfer:   w1 = abs store, w2 = return, page 3 = work page.
; returns with w1 = updated abs store, w2 = base segment buffer, w3 =
; page 1 abs, abs last store and abs last get updated. generates 6 em-chars
; when the basis file is exhausted (or not present). performs a page return
; after hard errors with logical status in page 1.
b. a10  w.             ;
c13: rl. w3     b0.+2  ; transfer and account:
     rl  w0  x3+d44    ; 
     ba. w0     1      ;    operations:= operations + 1;
     rs  w0  x3+d44    ;
c1:  rl. w3     b0.+2  ; transfer:   w3:= page 1 abs;
     ws. w2     b0.    ;    w2:= return rel:= return - page 0 abs;
     am     (x3+d18)   ;  
     rl. w0    +b0.    ;    w0:= page abs;
     ws  w1     0      ;    w1:= store rel:= abs store - page abs;
     ds  w2  x3+d20    ;    save return rel, store rel;

     rl. w1     b0.+6  ;    w1:= fa:= page 3 abs;
     al  w2  x1+e30-2  ;    w2:= la:= fa + work page length - 2;
     ds. w2     b2.    ;
     rl  w0  x3+d21    ;    w0:= current segment in basis file (see initline)
     rs. w0     b3.    ;    segm in op:= segment;
     wa. w0     b4.    ;
     rs  w0  x3+d21    ;    segment:= segment + segments in work page;
     al. w1     b1.    ;    w1:= message;
     al  w2  x3+d22    ;    w2:= name;
     rl  w0  x2+8      ;    if name table addr dummy then
     sh  w0     50     ;    goto generate em;
     jl.        a1.    ;
     jl. w3    (b5.)   ;    send and wait fast; w0:= logical status;

     rl. w2     b0.+6  ;    w2:= base segment buffer:=
     al  w2  x2-2      ;    page 3 abs - 2;
     sz. w0    (b6.)   ;    if end doc then
     jl.        a1.    ;    goto generate em;
     se  w0     2      ;    if not normal answer then
     jl.        a2.    ;    goto io alarm;
     al  w0  x2        ;    last get:=
     wa  w0  x1+2      ;    base segment buffer + bytes transferred;
a3:  rs. w0     b7.    ; exit:
     jl. w1     c2.    ;    update store; w1:= abs store;
     am     (x3+d20)   ;    w2 = base segment buffer
     jl.        b0.    ;    return to page 0 abs + return rel;

a1:  rl. w1     b8.    ; generate em:
     rl. w2     b0.+6  ;    w2:= base segment buffer:=
     al  w2  x2-2      ;    page 3 abs - 2;
     rs  w1  x2+2      ;    buffer:= one em-char;
     al  w0  x2+2      ;    last get:= base segment buffer + 2;
     jl.        a3.    ;    goto exit;

a2:  rs  w0  x3+d26    ; io alarm:   logical status:= w0;
     dl  w3  x3+d25    ;    return from bulk procedure,
     jl.       (b9.)   ;    e.g. nextline, init line;
e.                     ;
\f



; sl 7.6.71          bulk file          term1   ...24...

; procedure update store:   w1 = return, w3 = page 1 abs.
; returns with w2, w3 unchanged, w1 = abs store.
b. a10  w.             ;
c2:  rs. w1     b10.   ; update store:   save return;
     am     (x3+d18)   ;
     rl. w1     +b0.   ;    w0:= w1:= page abs;
     al  w0  x1        ;
     aa  w1  x3+d19    ;    w0:=
a1:  rs. w0     b11.   ;    last store:= page abs + last store rel;
     jl.       (b10.)  ;    return;

; procedure update next corr:   w2 = return, w3 = page 1 abs.
; return: w1, w3 unchanged, page 3 descr = work page, next corr line
; and next corr index updated.
; The routine searches the correction list to find the next
; line to be used by save etc. The found linenumber is stored
; in page1 rel d28 and the index to the linenumber  in the
; correction list is stored in d29.


c3:  ds. w2     b10.   ; update next corr:   save w1, return;
     al  w0     6      ;    used already:= 6;
     rs  w0  x3+d30    ;    compensate for loop code in next line.
     rl  w0  x3+d28    ;
     ba. w0     1      ;    w0:= next corr line + 1;
     rl  w2  x3+d9     ;
     wa. w2     b0.+2  ;    w2:= abs top corr list;
     rl. w1     b12.   ;    w1:= large;

a2:  sn  w2  x3+d14    ; rep:   w1 = smallest line number >= w0.
     jl.        a3.    ;    if w2 = first of corr list then goto byp;
     al  w2  x2-2      ;    w2:= preceding in corr list;
     sh  w0 (x2)       ;    if w0 <= line(w2)
     sh  w1 (x2)       ;    and line(w2) < w1 then
     jl.        a2.    ;    begin
     rl  w1  x2        ;      w1:= line(w2);
     rs  w2  x3+d29    ;      next corr index:= w2;
     jl.        a2.    ;    end; goto rep;

a3:  rl  w2  x3+d29    ; byp:   next corr index:=
     ws. w2     b0.+2  ;    next corr index - page 1 abs;
     ds  w2  x3+d29    ;    next corr line:= w1;
     rl  w0  x3+d16    ;
     rl. w2    (b21.)  ;
     rs  w0  x2+12     ;    page 3 descr:= work page;
     dl. w2     b10.   ;    reestablish w1;
     jl      x2        ;    return;

; procedure update get:   w1 = return, returns with w2 = get addr.
c4:  rl. w2     b0.+6  ; update get:   w2:= page 3 abs;
     al  w0  x2+e30-2  ;    last get:= page 3 abs
     rs. w0     b7.    ;    + work page length - 2;
     wa  w2  x3+d32    ;    w2:= get addr:=
     jl      x1        ;    next file index + page 3 abs; return;
e.                     ;
\f



; sl 7.6.71          bulk file          term1   ...25...

; procedure checknl:   w0 = text word possibly containing nl, em, or ff.
; w1 = store addr, w2 = get addr, w3 = return.
; returns to x3+2 when nl, em, or ff was present, to x3 otherwise.
; w1, w2 unchanged, next file line updated, w0 = the characters
; belonging to the preceding line - including nl etc.
; the buffer element given by w2 holds the remaining characters.
; if w0 = 0 initially, w1 is decreased by 2 to avoid storing
; empty words.
b. a10  w.             ;
c5:  sn  w0     0      ; checknl:   if empty word then
     al  w1  x1-2      ;    decrease store addr;
c16: al  w0     0      ; check no decrease:   preceding chars:= 0;

; continue checknl:   as checknl, but preceding chars loaded prior to
; entry. store addr is never decreased.
c14: ds. w2     b10.   ; continue checknl:   save store addr, get addr;
     rl  w1  x2        ;
     ls  w1     1      ;    w1:= text word or (text word shift 1);
     lo  w1  x2        ;
     so. w1    (b13.)  ;    if all chars >= 32
     sn  w1     0      ;    or empty word then
     jl.        a7.    ;    goto exit0;
     am.       (b0.+2) ;    save return;
     rx  w3    +d31    ;    w3:= next file line;
     rl  w1  x2        ;    w1:= text word;
a1:  ld  w1     8      ; rep:   w0 = first chars, w1 = remaining chars.
     rl  w2     0      ;
     la. w2     b14.   ;    w2:= char:= w0 mod 128;
     bl. w2  x2+a2.    ;    
     jl.     x2+a6.    ;    switch to chartable(char);

a4:  se. w3    (b15.)  ; em:   if w3 <> large - 1 then replace em by nl;
     wa. w0     b23.   ;    never return em until next file line has
     rl. w1     b8.    ;    been large; w1:= remaining chars:= em;
     rl. w3     b15.   ;    w3:= large - 1;
     jl.        a8.    ;    goto exit;
a5:  sl. w3    (b15.)  ;    if next file line>=1000000 then
     jl.        c8.    ;    goto file too long;
     al  w2     0      ;    w3:= next file line
     wd. w3     b16.   ;    // 1000 * 1000 + 1000;
     wm. w3     b16.   ;
     al  w3  x3+1000   ;
     jl.        a1.    ;    goto rep;
a6:  se  w1     0      ; other:
     jl.        a1.    ;    if remaining chars <> 0 then goto rep;
     am.       (b0.+2) ;
     rx  w3    +d31    ;    save next file line; w3:= return;
a7:  dl. w2     b10.   ; exit0:   reestablish w1, w2;
     jl      x3        ;    return;
a3:  sl. w3    (b15.)  ;    if next file line>=1000000 then
     jl.        c8.    ;    goto file too long;
     al  w3  x3+10     ;    w3:= next file line + 10;
a8:  am.       (b0.+2) ; exit:
     rx  w3    +d31    ;    save next file line; w3:= return;
     rs. w1    (b10.)  ;    buffer(get addr):= remaining chars;
     dl. w2     b10.   ;    reestablish w1, w2;
     jl      x3+2      ;    return;

a2:  h. 0, r.10, a3-a6, 0, a5-a6, 0, r.12, a4-a6, 0, r.102; char table
;               10: nl    12: ff          25: em
e.
\f


; sl 7.6.71          bulk file          term1   ...26...

; page procedure nextline:   page 1 must contain: last store rel, base
; store rel, abs or page, return virtual and relative. page 3
; must be the work page. init line must have been called.
; at return, line got gives the actual line number, base store rel
; is updated to point to the last word got.
; return takes place to:
;   return + 0 :   after io alarm, line got contains logical status.
;   return + 2 :   when the line was too long. the remaining part
;                  of the line is delivered at next call of get line.
;   return + 4 :   normal return.

; next line, init line, and bulk get are procedures common for
; commandio and psjob. as a consequence they may not use the
; work area on job file page, but only the variables dedicated
; for them. this also applies to the return point.

b. a20  w.             ;
g36= k-g9              ;
c6:  rl  w0  x3+d31    ; nextline:
     sl  w0 (x3+d28)   ;    if next corr line <= next file line
     jl.        a4.    ;    then goto line from corrections;

                       ; line from basis file:
     rs  w0  x3+d33    ;    line got:= next file line;
     jl. w1     c4.    ;    update get; w2:= get addr;
     jl. w1     c2.    ;    update store; w1:= abs store;

a1:  sl. w2    (b7.)   ; rep:   if get addr >= last get then
     jl. w2     c1.    ;    transfer;
     al  w2  x2+2      ;    w2:= get addr:= get addr + 2;
     sl. w1    (b11.)  ;    if abs store >= last store then
     jl.        a2.    ;    goto file line too long;
     al  w1  x1+2      ;    w1:= abs store:= abs store + 2;
     rl  w0  x2        ;    core(abs store):= core(get addr);
     rs  w0  x1        ;
     so. w0    (b17.)  ;    if the word does not contain
     jl. w3     c5.    ;    nl, ff, or em
     jl.        a1.    ;    then goto rep;

     rs  w0  x1        ;    core(abs store):= chars belonging to line;
     am         2      ;    w0:= 4; prepare normal return;
c17:                   ;
a2:  al  w0     2      ; file line too long:   w0:= 2; prepare return;
     al  w2  x2-2      ;    get addr:= get addr - 2; ready for
                       ;    examining the word again.
a3:  rl. w3     b0.+2  ; exit:   w3:= page 1 abs;
     ws. w2     b0.+6  ;    w2:= next file index:=
     rs  w2  x3+d32    ;    get addr - page 3 abs;
a11: am     (x3+d18)   ; exit1:
     rl. w2    +b0.    ;    w2:= page abs;
     ws  w1     4      ;    w1:= store rel:= abs store - page abs;
     rs  w1  x3+d19    ; 
     dl  w3  x3+d25    ;    w2:= return virt;
     wa  w3     0      ;    w3:= return rel + w0;
     jl.       (b9.)   ;    page jump;

c9:  am         4      ; end save:   prepare return to end save;
c8:  al  w0     2      ; return init:   w0:= 2; prepare
     jl.        a3.    ;    return; goto exit;
\f


; sl 7.6.71          bulk file          term1   ...27...

c15:                   ;
a4:  rl  w0  x3+d28    ; line from corrections:
     rs  w0  x3+d33    ;
     se  w0 (x3+d31)   ;    line got:= next corr line;
     jl.        a6.    ;    if next corr line = next file line then
                       ;    begin comment skip line in file;
     jl. w1     c4.    ;      update get; w2:= get addr;
     jl. w1     c2.    ;      update store to set w1 = abs store;
a5:  sl. w2    (b7.)   ; rep: if get addr >= last get then
     jl. w2     c1.    ;      transfer;
     al  w2  x2+2      ;      w2:= get addr:= get addr + 2;
     rl  w0  x2        ;      w0:= core(get addr);
     so. w0    (b17.)  ;      if the word does not contain
     jl. w3     c16.   ;      nl, ff, or em
     jl.        a5.    ;      then goto rep;

     rl. w3     b0.+2  ;      w3:= page 1 abs;
     ws. w2     b0.+6  ;      w2:= next file index:=
     al  w2  x2-2      ;      get addr - page 3 abs - 2;
     rs  w2  x3+d32    ;      ready for examining the word again;
                       ;    end;
a6:  rl  w2  x3+d29    ; get correction:   w2:= next corr index;
     al  w1  x3+d15    ;    w1:= abs first corr segm;
a7:  al  w1  x1+4      ; rep:   w1:= next abs corr segm;
     sl  w2 (x1-4)     ;    if next corr index >= corr limit(w1-4)
     jl.        a7.    ;    then goto rep;
     rl  w0  x1-2      ;
     rl. w3    (b21.)  ;
     rs  w0  x3+12     ;    page 3 descr:= virt corr segm(w1 - 4);
     jl. w3    (b18.)  ;    get pages; correction page ready.

     rl. w2     b0.+6  ;    w2:= abs base corr:=
     wa  w2  x2        ;    page 3 abs + last on corr page;
a8:  dl  w1  x2        ; rep:   w0:= corr line number; w1:= -length;
     rs. w2     b19.   ;    top line:= abs last of corr;
     wa  w2  x2        ;    w2:= abs base corr:= w2 - length;
     se  w0 (x3+d33)   ;    if corr line number <> line got then
     jl.        a8.    ;    goto rep; correction found;

     rs. w2     b20.   ;    abs base corr:= w2;
     sh  w1     -5     ;    if length > -5 then
     jl.        a12.   ;    begin line deleted.
     jl. w2     c3.    ;      update next corr;
     jl. w3    (b18.)  ;      get pages; goto next line;
     jl.        c6.    ;    end;

a12: jl. w1     c2.    ;    update store; w1:= abs store;
     wa  w2  x3+d30    ;    w2:= get addr:= w2 + used already;
a9:  sl. w1    (b11.)  ; rep:   if abs store >= last store then
     jl.        a10.   ;    goto corr line too long;
     al  w1  x1+2      ;    abs store:= abs store + 2;
     rl  w0  x2-4      ;    core(abs store):= core(get addr - 4);
     rs  w0  x1        ;
     al  w2  x2+2      ;    get addr:= get addr + 2;
     sh. w2    (b19.)  ;    if get addr <= top line then
     jl.        a9.    ;    goto rep;
\f


; sl 7.6.71          bulk file          term1   ...28...

     jl. w2     c3.    ;    update next corr; w1 = abs store;
     al  w0     4      ;    w0:= 4; prepare normal return;
     jl.        a11.   ;    goto exit1, set store rel;

a10: ws. w2     b20.   ; corr line too long:
     rs  w2  x3+d30    ;    used already:= get addr - abs base corr;
     al  w0     2      ;    w0:= 2; prepare return to
     jl.        a11.   ;    line too long; goto exit1, set store rel;
e.                     ;


; page procedure initline:   page 1 must contain: line got = number of
; the first line needed, return virt and rel. page 3 must be the work
; page. returns to:
;   return + 0 :   after io alarm, line got contains logical status.
;   return + 2 :   normal return.
b. a10  w.             ;
g37= k-g9              ;
c7:  rl  w1  x3+d33    ; initline:
     al  w1  x1-1      ;    w1:= next corr line:= line got - 1;
     rs  w1  x3+d28    ;
     jl. w2     c3.    ;    update next corr;

     al  w2  x3+d17    ;    w2:= base line table;
a1:  al  w2  x2+2      ; rep:   w2:= next of line table;
     sl  w1 (x2-2)     ;    if line got - 1 >= line table(x2 - 2)
     jl.        a1.    ;    then goto rep;
                       ;    line got <= line table(x2 - 2), i.e. start
     sn  w2  x3+d17+2  ;    of line on segment given by x2 - 4, except
     al  w2  x2+2      ;    in case of segment 0, where x2 is increased.
     ac  w1  x3+d17+4  ;
     wa  w1     4      ;    w1:= segment:=
     as  w1     -1     ;    (w2 - base line table - 4)/ 2;
     rs  w1  x3+d21    ;    segment = -1 for empty files.
     rl  w0  x2-4      ;    next file line:= line table(x2 - 4);
     rs  w0  x3+d31    ;    
     jl. w2     c1.    ;    transfer; w2:= base segment buffer;

a3:  rl. w3     b0.+2  ; test:   w3:= page 1 abs;
     rl  w0  x3+d33    ;    w0:= line got; beware of line 0.
     sh  w0 (x3+d31)   ;    if line got <= next file line then
     jl.        c8.    ;    goto return init;

a2:  sl. w2    (b7.)   ; rep:   if get addr >= last get then transfer;
     jl. w2     c1.    ;    only needed if file is changed meanwhile.
     al  w2  x2+2      ;    w2:= get addr:= w2+2;
     rl  w0  x2        ;  
     so. w0    (b17.)  ;    if core(get addr) does not contain
     jl. w3     c5.    ;    nl, ff, em then
     jl.        a2.    ;    goto rep;
     al  w2  x2-2      ;    w2:= get addr:= w2-2; prepare examining the word again.
     jl.        a3.    ;    goto test;
e.                     ;
\f


; sl 29.6.71          bulk file          term1   ...29...

; page procedure bulk get:   initialises the line table. page 1 must contain:
; return virtual and relative, line table index = nextfile line = segment = 0.
; page 3 must be the work page. return takes place to:
;     return + 0:   after io alarm.
;     return + 2:   when the file was too long.
;     return + 4:   normally.
b. a10  w.             ;
g38=k-g9               ;
     al  w2     0      ;
     rs  w2  x3+d33    ;    line got := 0;  (prepare for >verify< command)
c10: jl. w2     c13.   ; bulk get:transfer and account; w2 = get addr = base buffer.
     rl  w0  x3+d31    ;    w0:= next file line;
a1:  rl  w1  x3+d32    ; set line table:   w1:= index;
     sl  w1     2+2*i47;    if index > 2 * max segments in file then
     jl.        c8.    ;    goto return init; i.e. file too long.
     am      x3+d17    ;
     rs  w0  x1+0      ;    line table(index):= next file line;
     sl. w0    (b15.)  ;    if next file line >= large - 1 then
     jl.        a2.    ;    goto exit;
     rs  w0  x3+d33    ;    line got := next file line; (>verify< again)
     al  w1  x1+2      ;
     rs  w1  x3+d32    ;    index:= index + 2;

a3:  sl. w2    (b7.)   ; rep:   if get addr >= last get then
     jl.        c10.   ;    goto bulk get;
     al  w2  x2+2      ;    w2:= get addr:= get addr + 2;
     rl  w0  x2        ;
     so. w0    (b17.)  ;    if core(get addr) does not contain
     jl. w3     c5.    ;    nl. ff, or em
     jl.        a3.    ;    then goto rep;

     rl. w3     b0.+2  ;    w3:= page 1 abs;
     rl  w0  x3+d31    ;    w0:= next file line;
     sl. w0    (b15.)  ;    if next file line >= large - 1 then
     jl.        a1.    ;    goto set line table;
     rs  w0  x3+d33    ;    line got := next file line; (>verify< again)
     al  w2  x2-2      ;    get addr:= get addr - 2; ready for examining
     jl.        a3.    ;    the word again; goto rep;
a2:  dl  w3  x3+d25    ; exit:
     al  w3  x3+4      ;
     jl.       (b9.)   ;    page jump to return + 4;
e.                     ;


; page procedure bulk save:   page 1 must contain: last store rel,
; base store rel, abs or page ( must be 8), return virt and rel.
; page 3 must be the work page, page 4 must be the save buffer.
; init line must have been called. return takes place to:
;     return + 0:   after io alarm
;     return + 2:   when the store buffer is full
;     return + 4:   corr line stored
;     return + 6:   end save.
\f


; sl 29.6.71          bulk file          term1   ...30...

b. a10  w.             ;
g39=k-g9               ;
c11: rl  w0  x3+d31    ; bulk save:
     sl  w0 (x3+d28)   ;    if next corr line <= next file line
     jl.        c15.   ;    then goto line from corrections;

     rs  w0  x3+d33    ; line from basis file:   line got:= next file line;
     jl. w1     c4.    ;    update get; w2:= get addr;
     jl. w1     c2.    ;    update store; w1:= store addr;

a1:  sl. w2    (b7.)   ; rep:   if get addr >= last get then
     jl. w2     c13.   ;    transfer and account;
     al  w2  x2+2      ;    w2:= get addr:= get addr + 2;
     sl. w1    (b11.)  ;    if store addr >= last store then
     jl.        c17.   ;    goto file line too long; i.e. buffer full.
     al  w1  x1+2      ;    w1:= store addr:= store addr + 2;
     rl  w0  x2        ;    core(store addr):= core(get addr);
     rs  w0  x1        ;
     so. w0    (b17.)  ;    if the word does not contain
     jl. w3     c5.    ;    nl, ff, or em
     jl.        a1.    ;    then goto rep;

a2:  rl. w3     b0.+2  ; test end:   w3:= page 1 abs;
     rl  w2  x3+d33    ;    notice that get addr is saved in b10.
     sn. w2    (b15.)  ;    if line got = large - 1 then
     jl.        c9.    ;    goto end save;
     rl  w2  x3+d31    ;    w2:=
     rs  w2  x3+d33    ;    line got:= next file line;
     sl  w2 (x3+d28)   ;    if next file line >= next corr line
     jl.        a3.    ;    then goto prep corr line;

     rl. w2     b10.   ;    w2:= saved get addr;
     jl. w3     c14.   ;    continue checknl;
     jl.        a1.    ;    if no nl, ff, or em then goto rep;
     jl.        a2.    ;    goto test end;

; the basisfile is copied strictly word by word, except when a
; correction is to be inserted. the modified chars belonging
; to the line (possibly em replaced by nl or some chars missing)
; are then saved.
a3:  rs  w0  x1        ; prep corr line:   save modified chars;
     rl. w2     b10.   ;  
     al  w2  x2-2      ;    w2:= next file index:=
     ws. w2     b0.+6  ;    saved get addr - 2 - page 3 abs;
     rs  w2  x3+d32    ;    ready for examining the word again.
     ws. w1     b0.+8  ; 
     rs  w1  x3+d19    ;    w1:= store rel:= abs store - page 4 abs;
     jl.        c15.   ;    goto line from corrections;
e.                     ;
\f


; sl 29.6.71          bulk file          term1   ...31...

; page procedure clear corrections:   page 3 must be first corr segm,
; page 3 = unused at return.
b. a10  w.             ;
g40=k-g9               ;
c12: al  w0     d14    ; clear corrections:
     rs  w0  x3+d9     ;    top corr list:= first of corr list;
     al  w0     d15    ;
     rs  w0  x3+d12    ;    curr corr segm:= first corr segm;
     rl. w0     b15.   ;
     rs  w0  x3+d15    ;    limit first corr segm:= large - 1;
     rs  w0  x3+d17    ;    first of line table:= large - 1;
     al  w0     0      ;
     rs. w0    (b0.+6) ;    last on first corr segm:= 0;
     rl. w2    (b21.)  ;
     rs  w0  x2+12     ;    page 3 descr:= not used;
     al  w2  x3+d22    ;    w2:= name of basis file;
     jl. w3    (b24.)  ;    terminate access;
     al  w0     0      ;    basis file.name table addr := 0;
     rs  w0  x3+d22+8  ;    makes clear corrections idempotent.
     rs  w0  x3+d22    ;    name:=undef; for test primout.
     dl  w3  x3+2      ;
     jl.       (b9.)   ;    return;
e.                     ;
g4=k-g9                ;  top bulk file page
i.e.
\f


; sl 12.11.71          initialization          term1   ...32...

; initialisation.
; commandio reserves the psjob descriptions and inserts into their
; page 3 description the virtual address of the job file page.
; in pass 2, commandio will also get the job descr virt address
; from the psjob descriptions (page 4). this procedure requires that
; commandio is loaded first.

b. a20, b25  w.        ;
g3=g0+2000             ;  stepping stone: base of addressing
b0=g0-g3               ;  displacement for addressing

b1:  g88: 0            ;  base of external table
b2:  g89: 12           ;  reserve virt
b3:  g90: 13           ;  move to virt
b4:  g91:              ;  psjob descriptions
     h. e12*i45, 18 w. ;
b5:  g92:              ;  commandio descriptions
     h. e12*i4+e12,18w.;+2
b6:  g93: 14           ;  simulate lock
b7:  g94: 15           ;  end init
b8:  g95: 27           ;  new line
b9:  g134:22           ;  terminal output descr

h.100<3+e95,g98: 224 w.;-2  start commio, test mode, relative
b10: g99: 162          ;    virtual = list etc.
b11:      0            ;  init corr segment
b12:      0            ;  count corr pages
b13:      0            ;  virt job file
b14:      0            ;  incarnations

; list of words to be increased from incarnation to incarnation:
; commandio increments:
b18: h. d65+b0,e13,  d39+b0,e13,  d38+b0,e13,  d40+b0,10,   d42+b0,i3
        b5-g3,e12,   d70+b0,e13,  b9-g3,e12,   d80+b0,e13
; psjob increments:
b20:    d50+b0,e13,  d51+b0,e13,  b4-g3,e12,   b20-g3,0 w.
b21:  g7-g1            ;   length of comio central code page
g43:
\f


; sl 5.7.71          initialization          term1   ...33...

a2:  al. w3     g3.    ;    w3:= begin bulk file. (base of addressing)
     rl  w0  x3+d39+b0 ; insert values in ext table:
     rs. w0     g246.  ;    first attention semafore
     rl  w0  x3+d40+b0 ;
     rs. w0     g247.  ;    first terminal sender descr
     rl  w0  x3+d50+b0 ;
     rs. w0     g248.  ;    first psjobque semafore
     rl  w0  x3+d51+b0 ;
     rs. w0     g249.  ;    first job in core semafore
     dl. w1     b5.    ;
     rs. w0     g250.  ;    first psjob;
     rs. w1     g251.  ;    commandio descr;

     al  w0     i56    ; reserve and move code pages:
     rl. w1   b21.    ;    reserve for commio central
     jl. w3    (b2.)   ;
     rs. w2     g252.  ;    virt commandio central;
     am.        g3.    ;
     al  w0     g1-g3  ;    w0:= begin commio central;
     jl. w3    (b3.)   ;    move to virt;

     al  w0     i56    ;
     al  w1     g4     ;
     jl. w3    (b2.)   ;    reserve for commio bulk file;
     rs. w2     g253.  ;    virt commio bulk free;

     jl. w3    (2)     ;    set externals;
g245:           40     ;

         d6 ,   179    ;
         d16,   189    ;    virt addr work page;
         d18,   188    ;    abs on page;
         d19,   187    ;    base store rel;
         d33,   190    ;    line got - logical status of alarm;
         d36,   177    ;    job description page;
         d50,   175    ;    psjob queue;
         d51,   176    ;    job in core;
         d52,   180    ;    exhaust count;
         d53,   181    ;    rest room on page;
         d54,   182    ;    job buffer index;
         d55,   183    ;    get current virt buffer addr;
         d56,   184    ;    message address;
         d57,   185    ;    first of job (even);
         d58,   186    ;    top of job;
         d59,   191    ;    rest room on page;
         d60,   192    ;    job buffer index;
         d61,   193    ;    virt buffer;
         d62,   194    ;    first buffer byte;
         d63,   195    ;    name of superbuffer area;
         d64,   196    ;    length of superbuffer (no of segments*512-512);
         d65,   197    ;    terminal full;
         d66,   198    ;    prog state (and answer rel);
         d67,   199    ;    current virtual address of card buffer;
         d68,   200    ;    last received status of cardreader;
         d69,   201    ;    card length;
         g36,   158    ;    rel nextline;
         g37,   161    ;    rel initline;
         g35,   203    ;    rel after action;
         g38,   211    ;    rel bulk get;
         g39,   212    ;    rel bulk save;
         g40,   213    ;    rel clear correction;
         g41,   133   ;    rel autoline
         d81,   429    ;    rel next store in job input area;
         d42,   178    ;    first address of terminal buffer;
         d41,   217    ;    terminal name;
         d22,   218    ;    basis file name;
         g45,   219    ;    rel read login information;
         d38,   221    ;    rel terminal reserve;
         d39,   223    ;    rel attention semaphore;
         d40,   222    ;    rel terminal sender descr addr;
         d44,   226    ;    rel(-2:login time), operations performed;
         d45,   227    ;    rel std interval;
       d15+2,   228    ;    rel of first correction segment;
         d32,   230    ;    rel next file index;
         d21,   231    ;    rel segm number in base file;
         d70,   236    ;    rel commandio answer semaphore;
         d41,   300    ;    rel terminal name;
         d71,   299    ;    rel state of term output;
         d72,   301    ;    rel next byte;
       d72+2,   302    ;    rel buf byte;
         d73,   303    ;    rel virt byte;
       d73+2,   304    ;    rel appetite;
         d74,   305    ;    rel out bytes;
       d66+1,   450    ;    card reader (job) start rel of input buf;
         d75,   446    ;    tape reader (job) prog state (and answer rel);
         d76,   447    ;    tape reader (job) start rel;
         d77,   448    ;    tape reader (job) curr. virt addr. of tape buf;
         d78,   449    ;    tape reader (job) last received status;
         d25,   257    ;    rel return from nextfile etc.;
         d79,   474    ;    rel current papertype on jobfile page;
         d80,   306    ;    rel terminal input semaphore;
         d43,   494    ;    rel time logged in on jobfile page;
         d2 ,   289    ;    rel special char and logout cause;
         d82,   367    ;    rel cards free jobcontrolled;
         d83,   368    ;    rel cards full jobcontrolled;
         d84,   369    ;    rel first virt card jobcontrolled;
         d85,   370    ;    rel top virt card jobcontrolled;
         d86,   135    ;    autoline current line
         d87,   136    ;       -     lineincrement
         d88,   134    ;    terminal user rights (rel on job file page);
         d90,   518    ;    reader free sem
         d91,   519    ;    reader full sem
         d92,   520    ;    first virt buffer
         d93,   521    ;    top virt buffer
         g8 ,   155    ;    value for abs page (nextline);
g246:    0  ,    62    ;    first attention semapgore;
g247:    0  ,   163    ;    first terminal sender descr;
g248:    0  ,    63    ;    first psjobque semaphore;
g249:    0  ,    64    ;    first job in core semaphore;
g250:    0  ,   100    ;    first psjob;
g251:    0  ,   101    ;    commandio descr;
   (:g2+511:)>9+i62,507;    segments in save buffer + jobfile;
g252:    0  ,   202    ;    virt commio central;
g253:    0  ,   157    ;    virt commio bulk file;
         0  ,  -1000   ;    end of externals;

     al. w0     g9.    ;
     jl. w3    (b3.)   ;    move to virt;
c.-1   ; if no main console termout then include the following
     rl. w1     b9.    ;    decrease termout descr to account for main console;
     al  w1  x1-e12    ;
     rs. w1     b9.    ;
     am.        g3.    ;
     rl  w1     g69-g3 ;
     al  w1  x1-e13    ;    decrease term full semafore;
     am.        g3.    ;
     rs  w1     g69-g3 ;
     am.        g3.    ;
     rl  w1     g140-g3;
     al  w1  x1-e13    ;    decrease input semafore;
     am.        g3.    ;
     rs  w1  g140-g3   ;
z.     ;

\f


; sl 5.7.71          initalization           term1   ...34...

a3:  al  w0     i57    ; next incarnation:
     al  w1     g2     ;
     jl. w3    (b2.)   ;    reserve for job file;
     al  w2  x2+1      ;    write page;
     rs. w2     b13.   ;    save virt addr;

     rl. w3     b4.    ;    w3:= psjob descr;
     rs  w2  x3+12     ;    page 3 descr:= job file;
     rl  w0  x3+14     ;
     am.        g3.    ;    job descr page:= page 4 descr;
     rs  w0     +d36+b0;

     al  w0     i58    ;
     al  w1     e30    ;
     jl. w3    (b2.)   ;    reserve for work page;
     al  w2  x2+1      ;    write page;
     am.        g3.    ;
     rs  w2     +d16+b0;

     al  w0     i59    ;
     al  w1     512    ;
     jl. w3    (b2.)   ;    reserve for primary output buf;
     al  w2  x2+1      ;    write page;
     am.        g3.    ;
     rs  w2     +d61+b0;

     al  w1     0      ;    count:= 0;
a4:  rs. w1     b12.   ; next corr segment:
     al  w0     i60    ;
     al  w1     512    ;
     jl. w3    (b2.)   ;    reserve for one corr segment;
     al  w2  x2+1      ;    write page;
     rl. w1     b12.   ;
     am.        g3.    ;
     rs  w2  x1+d15+2+b0;   corr segment(count):= virt addr;
     al  w1  x1+4       ;   count:= count+ 4;
     se  w1     4*i44   ;   if count <> 4 * number of corr segments
     jl.        a4.     ;   then goto next corr segment;

     rl. w2     b13.   ;
     al  w1     g2     ;
     am.        g3.    ;
     al  w0     g0-g3  ;    move job file to virt;
     jl. w3    (b3.)   ;
\f


; sl 5.7.71          initialization          term1   ...35...

     rl. w1     b14.   ;
     sh  w1     i45-i4-2;   if incarnations >= no of off-line jobs then
     jl.        a5.    ;    begin
c.-1   ; if no mainconsole termout then include:
     sn  w1     i45-i4-1;     if incarnations <> no of off line jobs then
     jl.        a7.    ;     
z.     ;
     rl. w0     b13.   ; 
     rl. w2     b9.    ;      page 1 of termout:= job file virt addr;
     rs  w0  x2+8      ;
a7:  rl. w2     b5.    ;      w2:= commio descr;
     rl. w0     b13.   ;
     rs  w0  x2+8      ;      page 1 descr:= job file virt addr;
     al. w3     g3.    ;      w3:= addressing base;
     rl  w2  x3+d40+b0 ;      w2:= sender table addr;
     rl  w1  x3+d39+b0 ;
     rs  w1  x2+2      ;      sender table.sem:= attention sem;

     rl. w1     b5.    ;      w1:= commio descr;
     am.        g3.    ;
     rl  w2     +d39+b0;      w2:= attention sem;
     jl. w3    (b6.)   ;      simulate lock;
     dl. w3     b10.   ;      return, page 0:= start commandio;
     ds  w3  x1+6      ;    
     bl. w1     b10.-2 ;
     al  w1  x1+1<3    ;      next corutine ident;
     hs. w1     b10.-2 ;
     al. w3     g3.    ;      w3:= addressing base;
     al  w0     30     ;      console state:= unlogged, ready user;
     hs  w0  x3+d6+b0  ;    end;
     am         b18-b20;    commandio increments only after commio incarn.

a5:  al. w2     b20.   ; increase semafore addresses, etc:
a6:  bl  w1  x2        ; rep:   w1:= relative address:= byte 0;
     rl. w0  x1+g3.    ;
     ba  w0  x2+1      ;    increase word by byte 1;
     rx. w0  x1+g3.    ;
     al  w2  x2+2      ;    w2:= addr of next two bytes;
     se. w0 (x1+g3.)   ;    if word not changed then
     jl.        a6.    ;    goto rep;

     jl. w3    (b8.)   ;    new line; listing of virt addresses.
     rl. w1     b14.   ;
     al  w1  x1+1      ;    incarnations:= incarnations + 1;
     rs. w1     b14.   ;
     se  w1     i45    ;    if incarnations <> number of psjobs
     jl.        a3.    ;    then goto next incarnation;
     jl. w3    (b7.)   ;    end init;
e.                     ;
i.e.; end segment
\f


; sl 7.7.71          command print          term1   ...36...

s. b50, c20, g90 w.    ;
h2=h1-k  ; continue external list
     g20.
     g21., g22., g23., g24., g25., g26., g27., g28., g29., g30.
     g31., g32., g33., g34., g35., g36., g37., g38., g39., g40.
     g41., g42., g43., g44., g45., g46., g47., g48., g49., g50.
     g51., g52., g53., g54., g55., g56., g57., g58., g59., g60.
     g61., g62., g63., g64., g65., g66., g67., g68., g69., g70.
     g71., g72.,       g74., g75., g76., g77., g78., g79., g80. 
     g81., g82.,g84.,g85.,g86.
h3: h4                 ;
     am         2000   ;
     jl.        g4.    ;    goto initialise;


g0:                    ; begin commandio list etc
b0:       0, r.5       ;    page addresses
     22<12+0           ; pageident:  command print
b1:       999 999      ;    large - 2
b2=k+2,g42:157, g43:161;    init line
b3=k+2,g44:157, g45:158;    next line
b4:  g46: 34           ;    w0 call
b5:  g47: 26           ;    current corutine
b6=k+2,g48:202, g49:203;    after action
b7:  g50: 8            ;    page jump
b8:       5<12, 0, 0   ;    output message
b9:  g51: 1            ;    send and wait
b10: -1<6-1<23-1<16    ;    not local, attention, no output, normal
b11:      1<16+15<2    ;    attention or no output
b12=k+2,g52:202,g53:219;    read login information
          100          ;b13-2: constant
b13:      0            ;    work, move text, io alarm
          r.5          ; work, used by generate date and time
b14:      <:<19><15><10>device status <0>:>
b15:      10<16        ;    nl
b16: g58: 3            ;    lock
b17: g59: 4            ;    open
b18:      0            ;    param addr, work for general print
b19:      0            ;    for set base  and  sense message
b20:      <:no:>       ;    att param
b21:      10000*60*4   ;    for time conversion:
b22:      10000*60     ;
b23:      15*24        ;
b25:      10000        ;
b26:      15           ;
b27:      1461         ;      no of days in 4 years
b28:      365          ;      no of days in 1 year
b29: h.
  -1, 30, 58, 89,119,150;     month table:
 180,211,242,272,303,333;       accumulated - 1
w.
b30:      <:.00:>      ;    mask
\f


; sm 75.05.27        command print          term1   ...36a...

b24: g72: 5            ;    lock chained
;***** test begin
b31:      0            ; test for code bugs (or buffer sizes): first of buffer
b32:      0            ;+2 -   -   -    -     -   -       -    top of buffer
;***** test end
b33:      48           ;    constant
b34:      <:  octal status = <0>:>;
b35: g86: 140          ;    virt,
b36: g84: 146          ;      rel lookup and reserve device
b41: g85: 25           ;    call;
b37: g81: 7            ;    get pages
b38:      0            ;    virt addr of alarm text page
b39:      32<8+45      ;    <: -:>
b40:           45      ;    <:-:>
\f

; sl 7.7.71          command print          term1   ...37...


; output block:   w2 = return, w3 = page 1 abs. w2 odd signals
; that io alarm is to be ignored. return: w1 = base buffer,
; w3 = page 1 abs;
b. a10, j10  w.        ;
c2:  rl  w1  x3+187    ; output block:   w1:= base store;
c3:  ws. w2     b0.    ; output block, w1 = last addr:
     rs  w2  x3+i46+2  ;    last work:= return rel;
j1:  rl  w0  x3+178    ;    first addr mess:= first of term buf;
     ds. w1     b8.+4  ;    last addr mess:= w1;
     al. w1     b8.    ;
     rl. w2     b5.    ;    w2:=current coroutine description
     bz  w2  x2+4      ;    w2:=current coroutine number
     sn  w2     10     ;    if w2=10  (= operator display)
     am         4-0    ;    then mode:=4
     al  w0     0      ;    else mode:=0
     hs. w0     b8.+1  ;
j2:  al  w2  x3+217    ;    w2:= name of terminal;
     jl. w3    (b9.)   ;    send and wait;

     sz. w0    (b10.)  ;    if hard errors then
     jl.        a1.    ;    goto test io alarm;
j5:  rl  w1 (x3+223)   ;
     sh  w1     0      ;    if attention sem > 0 or
     sz. w0    (b11.)  ;    attention or no output then
     jl.        a3.    ;    goto sense;
a2:  rl  w1  x3+178    ;    w1:= first of term buf - 2;
     al  w1  x1-2      ;
     am     (x3+i46+2) ;    return;
     jl.        b0.    ;

; this sense insures that the attention message will be accepted first
a3:  al. w1     b19.   ; sense: w1 := sense message;
     al. w2     b19.   ;    w2:=ref zero name;
     jl. w3    (b9.)   ;    send and wait(no check on transfer);
     jl.        c4.    ;    goto exit alarm;

a1:  rl  w2  x3+i46+2  ; test io alarm:
     sz  w2     1      ;    if return odd then
     jl.        c4.    ;    goto exit alarm;
     jl.        c7.    ;    goto term alarm;
c9:  am         2      ; release:
c10: al  w0 -1<11+8    ; reserve:
     hs. w0     j3.    ;
     al. w3     b19.   ;
     am        (66)    ;
     dl  w1    +74     ;    set cat base to boss max base;
     jd         1<11+72;
     rl. w3     b0.+2  ;
j4:  al  w3  x3+217    ;    release/reserve terminal;
j3=k+1, jd             ;
     rl. w3     b0.+2  ;    w3:= page 1 abs;
     jl      x2        ;    return;

g10=k-b0               ; att:
     al  w0      1   ;    possible alarmtext=forbidden
     rx  w0   x3+4   ;    w0=param (yes or no)
     al  w2   i181   ;
     sl  w2     -1   ;    if i181=0 or = -1 then
     sl  w2      1   ;    continue else ( = 1 or = -2)
     jl.       g6.   ;    goto alarmprint
     sn. w0    (b20.)  ;    if param = no then
     am      c10-c9    ;    reserve else
     jl. w2     c9.    ;    release;
     dl. w3     b6.    ;
     jl.       (b7.)   ;    page jump to after action;

g11=k-b0               ; clock:
     al  w0    -10     ;    param1:= time;
     al  w1     0      ;
     ds  w1  x3+6      ;    param2 := newline;
     al  w0     8      ;
     al  w1    -4      ;    param3:= out and after action;
     ds  w1  x3+10     ;
     jl.        g9.    ;    goto general print;


g30=c2+1, g31=j1+1, g32=j2+1, g33=a2+1, g66=j4+1, g71=j5+1
e.                     ;
\f


; sl 7.7.71          command print          term1   ...38...

; login after error:   waits for the first attention, prints the
; initial message, and jumps to read login information (commio central).
b. a10, j10  w.        ;
c6:  rl  w2  x3+221    ; login after error:
     jl. w3    (b17.)  ;    open(terminal reserve);
     al  w0     0      ;
j1:  rl  w1  x3+222    ;    w1:=sender table entry;
     rs  w0  x1        ;    sender descr addr:=0;
     rs  w0  x1+8      ;    sender.mess:=0;
     jl. w2     c9.    ;    release terminal;

a0:                    ; skip internal operation:
j2:  rl  w2  x3+223    ;
     jl. w3    (b24.)  ;    lock chained(attention);
g8:  al  w0     0      ;
     hs  w0  x1+2      ;    release operation;
     bz  w0  x1+3      ; start of commandio:
     se  w0     0      ;    if operation = attention and
     jl.        a4.    ;       operation <> login attention then
     al  w2     0      ;      begin
     rx  w2  x1+4      ;      sender.message := 0;
     al  w0     2      ;      result := rejected;
     jd         1<11+22;      send answer;
     jl.        a0.    ;      goto skip internal operation;
a4:                    ;      end;
     se  w0     4      ;    if operation<>login attention then
     jl.        a0.    ;    goto skip internal operation;
     rl  w2  x1+4      ;
     jl. w3    (b17.)  ;    open(login att answer);
j0:  rl  w2  x3+221    ;
     jl. w3    (b16.)  ;    lock(terminal reserve);

\f



; btj 14.8.74          command print          term1   ...38a...


     rl. w2    (b5.)   ;
j4:  rl  w1  x3+177    ;    page 4 := job descr page;
     rs  w1  x2+14     ;

; find out, whether or not the terminal is a rb-terminal
 
j5:  al  w2  x3+217    ;    w2:=address of terminal name;
     rl  w0 (x2+8)     ;    w0:=process description address
     rs  w0  x3+r41    ;    set process description address
j9:  rl  w0  x3+178    ;
     rs  w0  x3+r40    ;    set abs ref message area
     dl. w3     b36.   ;
     jl. w1    (b41.)  ;    call (lookup host)
     jl.        a6.    ;+2    no rb terminal
     dl  w1  x3+r142+2 ;+4
a3:  rl. w2     b0.+8  ;    w2:=job descr page
j7:  rs  w0  x2+423    ;    set host ident
j8:  ds  w1  x2+424    ;    set device host description
 

     al. w2     a1.    ;    w2 := text address;
j3:  rl  w1  x3+178    ;    w1 := first of terminal buffer;
     jl. w3     c5.    ;    move text;
     al  w1  x1-2      ;
     jl. w2     c3.    ;    output block, w1 = last address;

     dl. w3     b12.   ;
     jl.       (b7.)   ;    page jump to read login information;

a6:  al  w0     0      ;    host ident :=0
     jl.        a3.    ;

a1: <:type user name and project number<10><0>:>
g60=c6+1, g61=j1+1, g62=j2+1, g63=j0+1, g64=j3+1
g76=j4+1, g77=j5+1, g78=j8+1, g79=j7+1, g80=j9+1, 

g2:  rl. w2     b0.+2  ; message action:
     rl. w1     b0.+6  ;
a2:  rl  w0  x1        ;    copy operation to
     rs  w0  x2        ;
     al  w1  x1+2      ;    param space on
     al  w2  x2+2      ;
     se  w2  x3+i46+4  ;    page 1;
     jl.        a2.    ;
e.                     ;
\f


; kll 17.10.72          command print          term1   ...38b...


; general print:   the parameter list contains items with this format:
;     name of 4 words :   printed
;     0, text index   :   text index = 0, 1, 2... the text is printed
;    -2, integer     :   the integer is printed using 4 positions.
;    -4               :   output block and goto after action
;    -5               :   as -6, but no output block
;    -6               :   output block and return  (at return (x3+4) = last addr)
;    -8, text length, text: print text;
;   -10               :   print time
;   -12, abs buffer start : set own buffer addr
;   -13, integer      :   as -14, but with layout <<-d>
;   -14, integer      :   the integer is printed with the layout << -d>
;   -16               :   page 3 is interpreted as a request line and printed
;   -18               :   a text to appear after login is included via j.-code

b. a30, f60  w.        ;
g9:  rl  w1  x3+178    ; general print:   w1:= first of terminal buf;
;***** test begin
al  w2  x1+i3     ;    w2 := top of terminal buffer;
ds. w2     b32.   ;    save first,top;
;***** test end
     al  w2  x3+4      ;    w2:= addr of param 1;
     jl.        a1.    ;    goto byp;
a19: rl  w1  x2+2      ; start line: first store addr := param;
;***** test begin
rl. w2     b1.    ;    top := large;
ds. w2     b32.   ;    save first,top;
;***** test end
a3:  al  w2     4      ; rep:
a2:  wa. w2     b18.   ; rep(param length):    w2:= increased param addr;
a1:  rs. w2     b18.   ; byp:   param addr:= w2; w1 = first store addr.
     rl  w0  x2        ;    w0:= param type;
     sl  w0     1      ;    if w0 >= 1 then
     jl.        a4.    ;    goto print name;
     am        (0)     ;
     jl.       +a0.    ;    switch to action;
     jl.        a23.   ;-18 goto print text from options

     jl.        a21.   ;-16 goto print request line
     jl.        a20.   ;-14 goto print signed integer
     jl.        a19.   ;-12 goto start line;
     jl.        a12.   ;-10 goto time
     jl.        a9.    ;-8  goto long text;
     jl.        a8.    ;-6  goto out and return;
     jl.        a7.    ;-4  goto out and after action;
     jl.        a6.    ;-2  goto print integer 4;
a0:  jl.        a5.    ;0   goto print text;

\f



; btj 14.8.74          command print          term1   ...38c...



g65=g9+1   ;    general print actions:

a4:  al  w0     8      ; print name:  w0:=text length;
     jl. w3     c11.   ;    move text;
     jl.        a1.    ;    goto general print, byp;

a5:  rl  w2  x2+2      ; print text:
     al. w2  x2+a10.   ;    w2:= text index + text table base
     ba  w2  x2        ;    + text table (text index);
     jl. w3     c5.    ;    move text;
     jl.        a3.    ;    goto rep;

a6:  al  w1  x1+2      ; print integer 4:   w1:= last store addr;
     rl  w0  x2+2      ;    w0:= integer;
     al  w2     4      ;    w2:= 4 positions;
     jl. w3     c1.    ;    convert number;
;***** test begin
     al  w1  x1+2      ;    w1 := store addr;
     sl. w1    (b31.)  ;    if printed integer >= 1000 000 then
     jl.        4      ;
c.-1, o102 , z.        ;  (bossfault xref)
     jd        -102    ;      bossfault 102;
     al  w1  x1-2      ;    w1 := base store addr;
;***** test end
     al  w1  x1+6      ;    w1:= top store addr;
     jl.        a3.    ;    goto rep;

a7:  al  w1  x1-2      ; out and after action:
;***** test begin
     sl. w1    (b32.)  ;    if last address >= top of buffer then
c.-1, o103 , z.        ;  (bossfault xref)
     jd        -103    ;      bossfault 103;
;***** test end
     jl. w2     c3.    ;    output block, w1 = last addr;
     dl. w3     b6.    ;    page jump to after action;
     jl.       (b7.)   ;

a8:  al  w1  x1-2      ; out and return:
;***** test begin
     sl. w1    (b32.)  ;    if last address >= top of buffer then
c.-1, o103 , z.        ;  (bossfault xref)
     jd        -103    ;      bossfault 103;
;***** test end
     rs  w1  x3+4      ;    save last addr;
     se  w0    -5      ;    if code <> -5 then
     jl. w2     c3.    ;    output block, w1 = last addr;
     dl  w3  x3+2      ;
     jl.       (b7.)   ;    page jump to return;
\f


; sm 75.05.27        command print          term1   ...38d...

; print signed integer with layout << -d>
; 2-4 words in the buffer is used

                0      ;-2  saved last store
a20: 
     rl  w3  x2+2      ;    w3:=number;
     sn  w0    -13     ;    if code = -13 then
     am         b40-b39;      abort leading space;
     rl. w2     b39.   ;    w2:=32<8+45
     al  w0  x3        ;    w0:=number;
     sl  w0     0      ;    if number >= 0 then
     ls  w2    -8      ;      delete minus sign
     sh  w0     0      ;    else
     ac  w0    (0)     ;      change sign;
     rs  w2  x1        ;    store space and sign;

     al  w3     0      ;
     rs  w3  x1+2      ;    prepare for 
     rs  w3  x1+4      ;      number < 1000
     al  w1  x1+6      ;    w1:=last store;
     sh. w0    (b1.)   ;    if number< 1 000 000 then
     al  w1  x1-2      ;      save 1 word;
     sh  w0     999    ;    if number < 1 000 then
     al  w1  x1-2      ;      save another word;
     al  w2     1      ;    w2:=min print pos;
     rs. w1     a20.-2 ;    save last store
     jl. w3     c1.    ;    convert number;
     rl. w1     a20.-2 ;    w1:=last store;
     al  w1  x1+2      ;    w1:=top store;
     jl.        a3.    ;    goto rep (next parameter)


g3:  al  w1     0      ; from create output: first store addr := 0;

a12: rs. w1     b13.+8 ; generate date and time:
     jd         1<11+36;    get clock(w0, w1);
     ld  w3    -100    ;
     wd. w1     b21.   ;    w1:= fourmin:= clock // (10000 * 60 * 4);
     wd. w0     b22.   ;    clock:= clock mod (10000 * 60 * 4);
     wd. w3     b25.   ;    min:= clock // (10000 * 60);
     rs. w0     b13.   ;    clock:= clock mod (10000 * 60);
     al  w0     0      ;    w3:= sec:= clock // 10000;
     wd. w1     b23.   ;    w1:= days:= fourmin // 360;
     rx  w3     0      ;    w0:= w3:= sec; w3:= fourmin:= fourmin mod (15 * 24);
     al  w2     0      ;    w3:= hour:= fourmin // 15;
     wd. w3     b26.   ;    w2:= fourmin:= fourmin mod 15;
     as  w2     2      ;
     wa. w2     b13.   ;    w2:= min:= fourmin * 4 + min;
     ds. w3     b13.+2 ;    save min, hour;
     ld  w0    -100    ; julian calendar:
     wd. w1     b27.   ;    w1:= years:= days // 1461 * 4 + 68;
     as  w1     2      ;    w0:= days:= days mod 1461;
     al  w1  x1+68     ;   
     se  w0     59     ;    if days = 59 then
     jl.        a13.   ;    begin comment leap year;
     al  w2     2      ;      w2:= month:= 2;
     al  w3     29     ;    w3:= date:= 29;
     jl.        a15.   ;    goto date found;
                       ;    end;
\f


; sm 75.05.27        command print          term1   ...38e...

a13: sl  w0     59+1   ;    if days > 59 then
     bs. w0     1      ;    days:= days - 1;
     wd. w0     b28.   ;    year:= year + days // 365;
     wa  w1     0      ;    days:= days mod 365;
     al  w2     13     ;    w2:= month:= 13;
a14: al  w2  x2-1      ; search month:
     bl. w0  x2+b29.-1 ;    w2:= month:= month - 1;
     sh  w3    (0)     ;    if days <= month table(month)
     jl.        a14.   ;    then goto search month;
     ws  w3     0      ;    date:= days - month table month;
a15: al  w1  x1+1900   ; date found:  add century
     rx. w1     b13.+8 ;    save year; w1=first store addr;
     ds. w3     b13.+6 ;    save month, date;
     sn  w1     0      ;    if called from create output then
     jl.        c0.    ;      goto pack date and time;
     al  w1  x1+2      ;  prepare for 4 digits
     rl. w0     b13.+8 ;    year
     jl. w3     a18.   ;    convert (4 digits)
     al  w1  x1+2      ;    w1:=first store;
     rl. w0     b13.+4 ;    month
     jl. w3     a16.   ;    convert and add point
     rl. w0     b13.+6 ;    date
     jl. w3     a16.   ;    convert and add point
     rl. w0     b13.+2 ;    hour
     jl. w3     a17.   ;    convert (3 digits)
     rl. w0     b13.   ;    minute
     jl. w3     a16.   ;    convert and add point
     al  w1  x1+4      ;    w1 := top store addr (=first store addr)
     al  w2     2      ;    w2 := param length
     jl.        a2.    ;    goto rep(param length);

a16: rs. w3     b13.+8 ; convert and add point: save return;
     jl. w3     a17.   ;    convert (3 digits);
     rl  w0  x1+2      ;
     lo. w0     b30.   ;    add <:.00:>;
     rs  w0  x1+2      ;
     jl.       (b13.+8);    return;

a17: al  w1  x1+4      ; convert (3 digits):
     am         3-4    ;    w1 := top store addr;
a18: al  w2     4      ; convert (4 digits): w2 := positions;
     jl.        c1.    ;    goto convert number;
\f


; kll 17.10.72          command print          term1   ...39...

a9:  rl  w0  x2+2      ; long text:  w0:=length;
     al  w2  x2+4      ;    w2:=first get addr;
     jl. w3     c11.   ;    move text;
     jl.        a1.    ;    goto general print, byp;

a21: rl. w2     b0.+6  ; print request line:  w2:=request line;
     rl  w0  x2+4      ;    w0:=length;
     al  w2  x2+6      ;    w2:=first get addr;
     jl. w3     c11.   ;    move text;
     al  w2     10     ;    store nl
     rs  w2  x1        ;    after text
     al  w1  x1+2      ;
     al  w2     2      ;    w2:=param length
     jl.        a2.    ;    goto general print, rep(param length);
 

b. j4  w.
j1:  0,r.10            ;
j2:  h30.-h29+e101-4   ;   a text to appear after login is included

j3:  al. w1     j1.    ;
     al. w2     j2.    ;  
     wa  w2  x2        ;
j4:  rl  w0  x2        ;
     rs  w0  x1        ;
     al  w1  x1+2      ;
     al  w2  x2+2      ;
     sh. w1     j1.+20 ;  if w1<= length of text then
     jl.        j4.    ;   goto rep
     al  w0     0      ;
     al  w2     0      ;
     jl      x3        ;
     jl.        j3.    ;
j.
; end of j.-code to include a text from options

a23: al. w2     j1.    ;  w2:= get addr
     al  w0     20     ;  w0:= length of text
jd-1
jd-1
     jl. w3     c11.   ;  move text
     al  w2     10     ;  insert nl
     rs  w2  x1        ;
     al  w1  x1+2      ;
     al  w2      2     ; 
     jl.        a2.    ;
e.
 

; procedure move text:   jl. w3  c11.
;        call:           return:
; w0= text length        undef.
; w1= first store addr   top store addr
; w2= first get addr     top get addr
; w3= link               page 1 abs

                0      ;-2  return addr
c11: rs. w3     c11.-2 ; move text:  save return;
a22: rl  w3  x2        ; next:
     rs  w3  x1        ;    move one word;
     al  w2  x2+2      ;    increase get addr;
     se  w3     0      ;
     al  w1  x1+2      ;-2  increase store addr;
     bs. w0    -1      ;    decrease text length;
     sl  w0     1      ;    if text length >= 1 then
     jl.        a22.   ;      goto next;
     rl. w3     b0.+2  ;    w3:=page 1 abs;
     jl.       (c11.-2);    return;
\f


; bbj 76 10 25          command print     term1      ...39a...


a10: h.f0., f1., f2., f3., f4., f5., f6., f7., f8., f9., 
f10.,f11., f12., f13., f14., f15., f16., f17., f18., f19.
f20.,f21.,f22.,f23.,f24.,f25.,f26.,f27.,f28.,f29.
f30.,f31.,f32.,f33.,f34.,f35.,f36.,f37.,f38.,f39.
f40.,f41.,f42.,f43.,f44.,f45.,f46.,f47.,f48.,f49.
f50.,f51.
w.
f0:  <:<10>logged in<0>:>
f1:  <: min.  operations<0>:>
f2:  <: tape jobs waiting<10><0>:>
f3:  <: loading    <0>:>
f4:  <: reserving  <0>:>
f5:  <: waiting    <0>:>
f6:  <: in core    <0>:>
f7:  <: swopped out<0>:>
f8:  c. i171
     <:<30><30><30><30><13><10><127><0>:>
     z.
     c. -i171
     <:<13><10><127><0>:>
     z.
f9:  <:*********unknown error code 9<10><0>:> ; not used
f10: <:*********unknown error code 10<10><0>:>; not used
f11: <:<19><15><10>end transmit<10><0>:>  ; <19>= stop reader, <15>= start print
f12: <:<19><15><10>mode unknown<10><0>:>
f13: <:<19><15><10>no resources<10><0>:>     ; from transmit
f14: <:<19><15><10>harderror input<10><0>:>     ; from transmit (probably not used)
f15: <:<19><15><10>harderror output<10><0>:>     ; from transmit (probably not used)
f16: <:a:>
f17: <:b:>
f18: <:<10>from <0>:>
f19: <: :>
f20: <:in: <0>:>
f21: <:end display<10><0>:>
f22: <:end request<10><0>:>
f23: <:wait<10><0>:>
f24: <:no such job<10><0>:>
f25: <:<0>:>
f26: <:   login<0>:>
f27: <:stat entr disc<0>:>             ; from display
f28: <: con acco buf ar. int sus drum<0>:>; from display
f29: <: size<0>:>                      ; from display
f30: <:boss2 performance  <0>:>        ; from display
f31: <:<10>logout caused by <0>:>       ; from logout
f32: <:harderror on terminal<0>:>       ;  do.
f33: <:operator remove<0>:>             ;  do.
f34: <:timeout on terminal<0>:>         ;  do.
f35: <:login<0>:>      ; from print catalog entry
f36: <:user<0>:>       ;   do.
f37: <:project<0>:>    ;   do.
f38: <:system<0>:>     ;   do.
f39: <:***<0>:>        ;   do.
f40: <: =set<0>:>      ;   do.
f41: <:; <0>:>         ;   do.
f42: <:.<0>:>          ;   do.
f43: <:no<0>:>         ; from regret
\f


;    lkn  20.10.75        command print        tterm1        ...39b...

f44: <:: <0>:>         ;    from display convert
f45: <:  files <0>:>   ;    from display convert
f46: <:paper<0>:>      ;    from display convert
f47: <:  segments <0>:>;    from display convert
f48: <:after <0>:>     ;    from display convert
f49: <:primout    <0>:>;    from display convert
f50: <:job contr  <0>:>;    from display convert
f51: <: d.<0>:>        ;    from print catalog entry

e.
\f


; sl 7.7.71          command print          term1   ...40...

; convert number:   w0 = number, w1 = last store addr, w2 = minimum
; print positions, w3 = return. return: w3 = page 1 abs, w1 = base
; store addr.
b. a10  w.             ;
c1:  rs. w3     a1.    ; convert number:   save return;
     ls  w2     12     ;    w2:= remaining positions, char pos = 0;

a2:  al  w3     0      ; digit:
     wd. w0     a3.    ;    w0:= number:= number// 10;
     al  w3  x3+48     ;    w3:= remainder + 48;

a4:  wa. w2     a5.    ; print:   w2:= remaining pos - 1, char pos + 4;
     hs. w2     a6.    ;
a6=k+1, jl.            ;+0  switch to char pos;
a3:  10                ;+2  also: byte = 0

     al  w1  x1-2      ;+4  first char:   decrease store addr;
     jl.        a7.    ;+6    goto store;

     ls  w3     8      ;+8  second char:   shift 8;
     jl.        a8.    ;+10   goto pack;

     hl. w2     a3.    ;+12 last char:   char pos:= 0;
     ls  w3     16     ;    shift 16;
a8:  wa  w3  x1+2      ; pack:   w3:= shifted char + core(store addr + 2);
a7:  rs  w3  x1+2      ; store:   core(store addr + 2):= w3;
     se  w0     0      ;    if number <> 0 then
     jl.        a2.    ;    goto digit;

     al  w3     32     ; fill:   w3:= space;
     sl  w2     100    ;    if remaining positions > 0 then
     jl.        a4.    ;    goto print;
     rl. w3     b0.+2  ;    w3:= page 1 abs;
     jl.       (a1.)   ;    return;

a1:  0                 ;    saved return
a5:  -1<12+4           ;    update w2

; pack date and time: w3 = date
c0:  rl. w3     b13.+4 ;   page1(0):=
     wm. w3     b13.-2 ;     month*100+date;
     wa. w3     b13.+6 ;
     ls  w3     12     ;
     rl. w2     b13.+8 ;      +year shift 12
     ld  w3     12     ;
     rx. w2    (b0.+2) ;
     rl. w3     b13.+2 ;    page 1 (1) :=
     ls  w3     12     ;      hour shift 12
     wa. w3     b13.   ;      + min;
     am.       (b0.+2) ;
     rx  w3    +2      ;
     jl.       (b7.)   ;    return;

e.                     ;
\f


; sl 7.7.71          list,verify   term1   ...41...

; verify:   0, 1, or 2 integer parameters
;   specifying:  0: verify line got
;                1: verify the line specified
;                2: verify the line specified and the specified number of following lines

; list:   0, 1, or 2 integer parameters specifying the interval of lines
; to be listed.
b. a10, d10, j20  w.   ; begin list
d1=6, d2=14            ;    param 1 and param 2 relative
d3=4                   ;    top line number
d4=6                   ;    print number. (boolean, 0 = false)
d5=8                   ;    number address (abs)
d6=10                  ;    number of lines to print

g12: dl  w2  x3+d1     ; verify:
     sl  w1     0      ;    if param 1 empty then
     jl.        a4.    ;      begin
j12: rl  w2  x3+190    ;      line to get := line got;
     jl.        a7.    ;      no of lines := 1;
                       ;      end else
a4:  dl  w1  x3+d2     ;      begin line to get := param 1;
     sh  w0    -1      ;      no of lines := if param 2 empty then
a7:  al  w1     1      ;        1 else param 2;
     rs  w1  x3+d6     ;      end;
j13: rs  w2  x3+190    ;    line got := line to get;
     rl. w1     b1.    ;    top line := large-2 + 1;
     al  w1  x1+1      ;
     rs  w1  x3+d3     ;
     jl.        a8.    ;    goto init list;

g5:  dl  w2  x3+d1     ; list:
     sl  w1     0      ;    if param 1 empty then
     jl.        a1.    ;    begin
     al  w2     0      ;      w2:= line got:= 0;
     jl.        a2.    ;      w1:= top line number:= large - 2 +1;

a1:  dl  w1  x3+d2     ;    end else
     sh  w0     -1     ;    begin top line number:=
a2:  rl. w1     b1.    ;      (if param 2 empty then large - 2
     al  w1  x1+1      ;      else param 2) + 1;
     sh  w1  x2        ;      if top line <= line got then
     al  w1  x2+1      ;        top line :=line got + 1;
     rs  w1  x3+d3     ;      line got:= param 1;
j1:  rs  w2  x3+190    ;    end;
     rl. w1     b1.    ;    no of lines to print := large-2;
     rs  w1  x3+d6     ;

a8:                    ; init list:
j4:  rl  w1  x3+189    ;
j10: al  w0  x3+257    ;    w0:= store return addr;
     al  w2     0      ;    page 3 descr:= work page;
     rl. w3    (b5.)   ;    page 4 descr:= 0;
     ds  w2  x3+14     ;
     dl. w3     b2.    ;
     jl. w1    (b4.)   ;    w0 call init line;
     jl.        c8.    ;+0  goto file alarm;

j14: al  w0     155    ;
j2:  rs  w0  x3+188    ;    abs or page:= abs;
     rs  w0  x3+d4     ;    print number:= true;
j3:  rl  w1  x3+178    ;
     al  w1  x1-2      ;    w1:= base terminal buffer;
\f


; sl 7.7.71          list          term1   ...42...

a3:  al  w0     i3-2   ; list next:   w0:= last store:=
j5:  wa  w0  x3+178    ;    length buf - 2 + first of term buf;
     rl  w2  x3+d4     ;    w1 = base store.
     se  w2     0      ;    w1:= base store:=
     al  w1  x1+6      ;    if print number then w1 + 6 else w1;
j6:  ds  w1  x3+187    ;
     rs  w1  x3+d5     ;
j11: al  w0  x3+257    ;    w0:= store return addr;
     dl. w3     b3.    ;
     jl. w1    (b4.)   ;    w0 call next line;
     jl.        c8.    ;+0  goto file alarm;
     am         -1     ;+2  buffer full:   print number:= false;
     al  w1     1      ;+4  line stored:   print number:= true;
j7:  rl  w0  x3+190    ;    w0:= line got;
     rl  w2  x3+d6     ;
     sh  w2     0      ;    if no of lines<=0 then
     jl.        a5.    ;      goto endlist;
     se  w1     0      ;
     al  w2  x2-1      ;    decrease(number of lines to print)
     rs  w2  x3+d6     ;
     rx  w1  x3+d4     ;    w1:=old print number;
     sl  w0 (x3+d3)    ;    if line got >= top line number
     jl.        a5.    ;    then goto end list;

     sn  w1     0      ;    if old print number then
     jl.        a6.    ;    begin
     rl  w1  x3+d5     ;      w1:= number address;
     al  w2     32     ;
     rs  w2  x1        ;    store space;
     al  w1  x1-2      ;    w1:= number address - 2;
     al  w2     4      ;      w2:= 4 print positions;
     jl. w3     c1.    ;      convert number(w0 = line got);
j8:                    ;    end;
a6:  rl  w1  x3+187    ;    w1:= base store;
j9:  rl  w2  x3+178    ;    w2:= first of term buf;
     sl  w1  x2+i3-6   ;    if base store >= last of term buf - 4 then
     jl. w2     c2.    ;    output block; prepare room for number.
g69=k+1                ;
     rl  w0  x3+226    ;    accounting:
     ba. w0     1      ;    operations:= operations + 1;
g70=k+1                ;
     rs  w0  x3+226    ;
     jl.        a3.    ;    goto list next;

a5:  rl  w1  x3+d5     ; end list:
     al  w1  x1-6      ;    w1:= number address - 6;
     jl. w2     c3.    ;    output block, w1 = last;
     dl. w3     b6.    ; 
     jl.       (b7.)   ;    goto after action;

g21=j1+1, g22=j2+1, g23=j3+1, g24=j4+1, g25=j5+1, g26=j6+1
g27=j7+1, g28=j8+1, g29=j9+1, g67=j10+1, g68=j11+1, g74=j12+1, g75=j13+1
g20=j14+1
e.                     ; end list
\f


; sl 3.1.72          alarm print          term1   ...43...

; alarm:   param 1 holds the alarm index.
b. a10, j10  w.   ;

g6:  rl. w2    (b5.)   ; alarm:
     ld  w1    -100    ;    page 2 := page 3 := 0;
     ds  w1  x2+12     ;
     rl. w1     b38.   ;    page 4 := alarm texts;
     rs  w1  x2+14     ;
     jl. w3    (b37.)  ;    get pages;
     rl. w2     b0.+8  ;    w2 := page 4 abs
     wa  w2  x3+4      ;    + alarm index
     ba  w2  x2        ;    + alarm table(alarm index);
j1:  rl  w1  x3+178    ;    w1:= first of term buf;
     jl. w3     c5.    ;    move text;
     rl. w2    (b5.)   ;
     al  w0     0      ;    page 4 := 0;
     rs  w0  x2+14     ;
     al  w1  x1-2      ;    w1:= last addr to print;
     jl. w2     c3.    ;    output block, w1 = last addr;

c4:  bl  w0  x3+179    ; exit alarm:   w0:= console state;
     sz  w0     16     ;    if unlogged then
     jl.        c6.    ;    goto login after error;
     dl. w3     b6.    ;
     jl.       (b7.)   ;    page jump to after action;

g34=j1+1, g35=c4+1

; move text:   w1 = first store, w2 = first text, w3 = return.
; return: w1 = top store, w3 = page 1 abs.

c5:  rs. w3     b13.   ; move text:   save return;
a1:  rl  w0  x2        ; rep:
     rs  w0  x1        ;    move word;
     al  w2  x2+2      ;
     se  w0     0      ;
     al  w1  x1+2      ;    update pointers;
     sz  w0     255    ;    if no null stored then
     jl.        a1.    ;    goto rep;
     rl. w3     b0.+2  ;    w3:= page 1 abs;
     jl.       (b13.)  ;    return;
e.                     ;
\f


; sl 7.7.71          alarm print          term1   ...44...

; io alarm:   line got contains logical status, param 1 relative address
; of document name.
b. a10, j10  w.        ;
c7:  rs  w0  x3+190    ; terminal alarm:   save logical status;
j1:  al  w0     217    ;    doc name:= param 1:= terminal name;
     jl.        a1.    ;

c8:  al  w0     218    ; file alarm:
a1:  rs  w0  x3+4      ;    doc name:= param 1:= basis file name;

g7:  rl  w1  x3+178    ; io alarm:   w1:= first of term buf;
     al. w2     b14.   ;    w2:= <:device status:>;
     jl. w3     c5.    ;    move text;
     rl  w2  x3+4      ;
     wa. w2     b0.+2  ;    w2:= abs addr of doc name;
     jl. w3     c5.    ;    move text;

     al. w2     b34.   ;    w2 := <:octal status = :>;
     jl. w3     c5.    ;    move text;
j2:  rx  w1  x3+190    ;    w1 := logical status; save store address

     al  w0     0      ;
     ld  w3    -100    ;    w2w3w0 := 0;
a2:  ld  w3     8      ;    repeat
     ls  w3    -8      ;
     ld  w0     8      ;      w2w3w0 := w2w3w0 shift 8
     ls  w0    -3      ;              + status shift (-21)
     ld  w1     3      ;              + 48;
     wa. w0     b33.   ;      status := status shift 3;
     sh  w2     255    ;
     jl.        a2.    ;    until w2w3w0 contains 8 characters;

     am.       (b0.+2) ;
j3:  rx  w1    +190    ;    w1 := store addr;
     ds  w3  x1+2      ;    save octal status in buffer;
     rs  w0  x1+4      ;
     al  w1  x1+6      ;    store addr := store addr + 6;
     rl. w3     b0.+2  ;

a3:  rl. w0     b15.   ; output:   store nl;
     rs  w0  x1        ;
     al. w2     c4.+1  ;    w2:= exit alarm, no io alarm test;
     jl.        c3.    ;    output block, w1 = last;

g36=c7+1, g37=j1+1, g38=c8+1, g39=g7+1, g40=j3+1, g41=j2+1
e.                     ;
g1=k-g0                ;    length of code page

g13:                   ;    start of alarm text page:
b. f70 h.

; alarm table:
     f0., f1., f2., f3., f4., f5., f6., f7., f8., f9.
     f10., f11., f12., f13., f14., f15., f16., f17., f18., f19.
     f20., f21., f22., f23., f24., f25., f26., f27., f28., f29.
     f30., f31., f32., f33., f34., f35., f36., f37., f38., f39.
     f40., f41., f42., f43., f44., f45., f46., f47., f48., f49.
     f50.,f51.,f52.,f53.

w.

\f



; btj 14.8.74          alarm print            term1   ...45...

f0:  <:line too long<10><0>:>     ; edit, message, newjob
f1:  <:forbidden<10><0>:>         ; console state does not allow it
f2:  <:not found<10><0>:>         ; template matching
f3:  <:no room<10><0>:>           ; correction list full
f4:  <:template too long<10><0>:> ;
f5:  <:param<10><0>:>             ; wrong parameter kind (name-num)
f6:  <:illegal number<10><0>:>    ; param > large or num char
f7:  <:syntax<10><0>:>            ; state table
f8:  <:what<63><10><0>:>          ; wrong command name
f9:  <:name too long<10><0>:>     ;

f10: <:illegal identification<10><0>:> ; from login, newjob
f11: <:user index too large<10><0>:>   ; from login, newjob
f12: <:kit not present<10><0>:>        ; from save
f13: <:no resources<10><0>:>           ; from save, scope, transmit
f14: <:file too long<10><0>:>          ; from get, newjob
f15: <:file does not exist<10><0>:>    ; from get, clear, newjob, lookup
f16: <:kind must be w, p or r<10><0>:> ; from name, label
f17: <:device not tape station<10><0>:>; from name, label
f18: <:tape used by a job<10><0>:>     ; from name, label
f19: <:no room for output<10><0>:>     ; from go, run
f20: <:user index conflict<10><0>:>    ; from login, newjob
f21: <:no such job<10><0>:>            ; from kill answer
f22: <:file in use<10><0>:>            ; from rename, clear, scope
f23: <:kit in use<10><0>:>             ; from kit change
f24: <:change kit<10><0>:>             ; from kit change
f25: <:new name exists already<10><0>:>; from rename, call
f26: <:file protected<10><0>:>         ; from rename, clear, scope
f27: <:device kind illegal<10><0>:>    ; from start etc
f28: <:killed by operator<10><0>:>     ; from run, go during job start
f29: <:limited<10><0>:>                ; from option commands
f30: <:device unknown<10><0>:>         ; from option commands, start card, convert, newjob, call
f31: <:primout in use<10><0>:>         ; from go, run
f32: <:device not disc<10><0>:>        ; from kit change
f33: <:project number missing<10><0>:> ; from label
f34: <:forbidden, the installation is closing<10><0>:>; from go run , newjob, convert
f35: <:<10>line termination<10><0>:>   ; from central read
f36: <:job queue full<10><0>:>         ; from newjob
f37: <:file not permanent<10><0>:>     ; from newjob
f38: <:file unreadable<10><0>:>        ; from newjob
f39: <:temp exceeded<10><0>:>          ; from newjob
f40: <:option unknown<10><0>:>         ; from newjob
f41: <:param at job<10><0>:>           ; from newjob
f42: <:syntax at job<10><0>:>          ; from newjob
f43: <:<10>last input line skipped<10><0>:>; from command input, start card, lookup rbprintername
f44: <:parent device disconnected<10><0>:>;  from rbconvert and rbnewjob
f45: <:device not card reader<10><0>:> ; from start card
f46: <:no more card readers<10><0>:>   ;  -     -    -
f47: <:card reader busy<10><0>:>       ;  -     -    -
f48: <:not same mode<10><0>:>          ;  -     -    -
f49: <:wait<10><0>:>                   ;  -     -    -
f50: <:file is no text file<10><0>:>   ; from get
f51: <:bosstest not bs-area<10><0>:>   ;   from snapshot;
f52: <:name already exists on another document<10><0>:>            ;  from save
f53: <:device reserved<10><0>:> ; from call
e.                     ;

g14=k-g13              ;    length of alarm text page
\f


; sl 7.7.71          init          term1   ...46...

b. f10  w.             ;
g54: 0                 ;    base ext table
g55: 12                ;    reserve virtual
g56: 13                ;    move to virtual
g57: 15                ;    end init

g4=k-2000

     al  w0     i56    ;    w0 := commandio on disc
     al  w1     g14    ;
     jl. w3    (g55.)  ;    reserve virtual(alarm text page);
     am        -2000   ;
     rs. w2     b38.+2000;    save virt addr on code page;
     al. w0     g13.   ;
     jl. w3    (g56.)  ;    move to virtual(alarm text page);

     al  w0     i56    ;    w0:= commandio on disc
     al  w1     g1     ;
     jl. w3    (g55.)  ;    reserve virtual
     rs. w2     g83.   ;    virtual list etc.

     jl. w3    (2)     ;    set externals;
g82:            40     ;

f1:  g5-g0+1,   209    ;    entry list;
f2: g12-g0+1,   174    ;    entry verify;
     g6-g0  ,   204    ;    entry alarm;
     g7-g0  ,   205    ;    entry io alarm;
     c8-g0  ,   210    ;    entry file alarm;
     g8-g0  ,   224    ;    start commandio;
     c6-g0  ,   225    ;    login after error;
     g9-g0  ,   229    ;    general print;
     g10+1  ,   264    ;    att;
     g2-g0  ,   310    ;    rel message action;
     g11    ,   491    ;    rel clock;
     g3-g0  ,   214    ;    rel date and time;
g83:    0   ,   162    ;    virtual list etc.;
        0   ,  -1000   ;    end of externals;

     am        -2000   ;
     al. w0     g0.+2000;
     jl. w3    (g56.)  ;    move to virtual
     am.       (4)     ;
     jl.       +4      ;    next init
     h1.               ;
e.                     ;
e.
\f


;  lkn  24.9.75          snapshot          term1     ...47...


s.   f10,  g50   w.

h4=h3-k
     g10.,g11.,g12.,g13.,g14.,g15.,g16.,g17.,g18.,g19.
     g20.,g21.,g22.,g23.,g24.,g25.,g26.,g27.,g28.,g29.
     g30.,g31.,g32.,g33.,g34.,g35.,g36.,g37.,g38.,g39.,g40.,g41.,g42.,g43.,g44.,g45.
     0

     jl.        g2.    ;    goto initialize;

f0:  g10:   12         ;    reserve virtual;
f1:  g11:   13         ;    move to virtual;


g2:  al  w0     i204   ;
     al  w1     g1     ;    w1:=length of page;
     jl. w3    (f0.)   ;    reserve virtual;
     al  w2  x2+1      ;    write page;
     al. w0     g0.    ;    w0:=start of page;
     jl. w3    (f1.)   ;    move to virtual;
     rs. w2     f3.    ;    save virt of code page;

     jl. w3    (2)     ;    set externals;
g12:            40     ;

f3:      0  ,   130    ;    virt of code;
         g4 ,   131    ;    rel of snapshot;
         g5 ,   132    ;    rel of autoline
         0  ,  -1000   ;    end of externals;

     am.(4,jl.4,h3.)   ;    goto next init;

\f



;  lkn  24.9.75          snapshot          term1     ...48...


b.      b50,  d10,      w.

g0:                    ;    start of code page;
b0:          0         ;    page 0;
b1:          0         ;    page 1;
b2:          0         ;    page 2;
b3:          0         ;    page 3;
b4:          0         ;    page 4;
        23<12+0        ;    page identification;

b5:  g13:    2         ;    send and wait fast;
b6:  g14:    8         ;    page jump;
b7:  g15:   21         ;    private output;
b8:  g16:   25         ;    call;
b9:  g17:   33         ;    terminate access;
b10: g18:   34         ;    w0 call;
b11: g19:   37         ;    testoutput switch;
b12: g20:   38         ;    current segment in bosstest;
     g21:  162         ;    virt,
b13: g22:  205         ;      rel ioalarm;
b14: g23:  204         ;      rel alarm print;
     g24:  202         ;    virt,
b15: g25:  203         ;      rel after action;
     g26:  206         ;    virt,
b16: g27:  261         ;      rel create output;
     g28:  473         ;    virt,
b17: g29:  498         ;      rel copy area;
     g30:  415         ;    virt,
b18: g31:  414         ;      rel terminate bs adjust;
b30: g35:   39         ;    name table address of bosstest;
b31: g39:  133          ;    rel of autoline
b25: g37:   26         ;    current corutine descr.;

b26: g38:   34         ;    w0 call;

b19: <:bosstest:>,0,0  ;    name of testoutput area;
b20:       5<12        ;    output operation;
           0           ;    first of output;
b21:       0           ;    last of output;
b22:       0           ;    current segment in bosstest;

b23:       9,1,1,0    ;    stop element for testoutput;
b24:       0           ;    zero for set cat. base;


d1  =  4    ;    param1  (rel on page 1  -  job file page);
d2  = 12    ;    param2                  -
d3  = 20    ;    param3                  -
d4  = 16    ;    kit name in tail;
d6  =  8    ;    rel of input file name;
d7  = 18    ;    rel of output file name;

\f


;  lkn  24.9.75          snapshot          term1     ...49...
b.  a10,  j10  w.


g4 = k-g0              ;    rel entry snapshot;

     rl. w2     b30.   ;    w2:=ext(39)   -  nta(bosstest);
     rl  w2 (x2)       ;    w2:=processdescr.(besstest);
     rl  w0  x2        ;    w0:=process kind;
     se  w0     4      ;    if not area process then
     jl.        a2.    ;      goto alarm 1;
     rl  w1  x2+e49    ;    w1:=size;
jd-1
     al  w0     0      ;
     ds  w1  x3+d3+2   ;    param3:=size;
j0:  al  w0  x3+262    ;    w0:=rel return;
     dl. w3     b16.   ;
     jl. w1    (b10.)  ;    w0call(create output);

j1:  dl  w1  x3+227    ;    w01:=std interval;
     al. w3     b24.   ;
     jd         1<11+72;    set std interval;
jd-1
     al  w1     2      ;    w1:=catalog key;
     rl. w3     b1.    ;    w3:=abs page 1;
     al  w2  x3+d4     ;    w2:=kit name in tail;
     al  w3  x3+d1     ;    w3:=file name;
     jd         1<11+50;    permanent entry;
jd-1
     dl. w3     b18.   ;
     jl. w1    (b8.)   ;    call(terminate bs adjust);
     jl.        a1.    ;+2    goto alarm 2;

     rl. w2     b4.    ;    w2:=abs page 4 (job descr. page);
     dl  w1  x3+d1+2   ;    move output file name;
     ds  w1  x2+d7+2   ;
     dl  w1  x3+d1+6   ;
     ds  w1  x2+d7+6   ;
     rl  w0  x3+d1+8   ;
     rs  w0  x2+d7+8   ;
     dl. w1     b19.+2 ;    move input file name;
     ds  w1  x2+d6+2   ;
     dl. w1     b19.+6 ;
     ds  w1  x2+d6+6   ;
     rl. w0    (b30.)  ;
     rs  w0  x2+d6+8   ;
     al  w0     d6     ;    w0:=rel input file name;
     al  w1     d7     ;    w1:=rel output file name;
     ds  w1  x2+6      ;
jd-1
     al  w0     506    ;    w0:=length of tail;
     ls  w0     6      ;    shift 6 + kind;
     al. w1     0      ;
     jl. w3    (b7.)   ;    private output   - fill buffer;

     al  w0    -1      ;
     rs. w0    (b11.)  ;    turn off testoutput switch;
     rl. w0    (b12.)  ;    w0:=current segment in bosstest;
     rs. w0     b22.   ;    save current segment;


\f



;  lkn  24.9.75          snapshot          term1     ...50...


     rl. w2    (b25.)  ;    w2:=current corutine descr.;
     rl  w0  x2+8      ;    w0:=virt page 1;
     rl  w1  x2+14     ;    w1:=virt page 4;
     rs  w0  x2+14     ;    page 4:=page 1  (=job file page);
     rs  w1  x2+8      ;    page 1:=page 4  (=job descr page);
     am.       (b4.)   ;
     al  w0    +2      ;    w0:=abs job descr page + rel 2;
     dl. w3     b17.   ;
     jl. w1    (b26.)  ;    w0 call(copy area);
     jl.        a3.    ;+2  goto hard error;

     al  w0     0      ;
     rs. w0    (b11.)  ;    turn on testoutput switch;

     al. w1     b23.   ;    w1:=first of stop element;
     al  w2  x1+510    ;    w2:=last of testout;
     ds. w2     b21.   ;
     al. w1     b20.   ;    w1:=message;
     al  w2  x3+d7     ;    w2:=areaname;
     jl. w3    (b5.)   ;    send and wait fast;
     al  w2  x3+d7     ;
     jl. w3    (b9.)   ;    terminate access;
     rl. w2    (b25.)  ;    w2:=current corutine descr;
     rl  w1  x2+14     ;
     rs  w1  x2+8      ;    page 1:=page 4   (=job file page);
     dl. w3     b15.   ;
     jl. w1    (b6.)   ;    page jump to after action;

a2:  al  w1     51     ; alarm 1:   (bosstest not bs-area);
a4:  rs  w1  x3+4      ;    param1:=alarm index;
     rl. w2     b13.-2 ;
     rl. w3     b14.   ;
     jl.       (b6.)   ;    page jump to alarm print;

a1:  al  w2  x3+d1     ; alarm 2:
     jl. w3    (b9.)   ;    terminate access;
     al  w3  x3+d1     ;    w3:=file name;
     jd         1<11+48;    remove entry;
jd-1
     dl. w3     b18.   ;
     jl. w1    (b8.)   ;    call(terminate bs adjust);
c.-1, o104, z.         ;    (bossfault xref);
     jd        -104    ;+2  ***bossfault(104);
     al  w1     13     ;    w1:=alarm index  (no resources);
     jl.        a4.    ;    goto alarm 1;

a3:  al  w0     0      ; hard error:
     rs. w0    (b11.)  ;    turn on testoutput switch;
     al  w2  x3+d7     ;
     jl. w3    (b9.)   ;    terminate access;

     rl. w2     b4.    ;    w2:=abs page 4;
j2:  dl  w1  x3+499    ;    w01:=status, inout operation;
j3:  rs  w0  x2+190    ;    save status;
     se  w1     3      ;    if input operation then
     jl.        a5.    ;
     dl  w1  x3+d6+2   ;    move inputfile name;
     ds  w1  x2+d6+2   ;
     dl  w1  x3+d6+6   ;
     ds  w1  x2+d6+6   ;
     jl.        a6.    ;    else
a5:  dl  w1  x3+d7+2   ;    move outputfile name;
     ds  w1  x2+d6+2   ;
     dl  w1  x3+d7+6   ;
     ds  w1  x2+d6+6   ;

a6:  al  w0     d6     ;
     rs  w0  x2+d1     ;    param 1:=rel file name;
     rl. w2    (b25.)  ;
     rl  w1  x2+14     ;
     rs  w1  x2+8      ;    page 1:=page 4  (=job file page);
     al  w1     0      ;
     rs  w1  x2+14     ;     page 4:=0;
     dl. w3     b13.   ;
     jl.       (b6.)   ;    page jump to ioalarm;

g32=j0+1,  g33=j1+1,  g34=j2+1,  g36=j3+1
e.
\f


; bbj 76 10 25             autoline          term1      ...51...




; autoline.
; the routine produces automatically linenumbers to insertion. 
; Autoline has zero,one or two parameters. The first parameter,if any,
; is the startline and the second the lineincrement (linedistance).
; The following possibilities exist for the parameters :
;   a) zero parameters
;      default 10 is used for both the startline  and the lineincrement.
;   b) one parameter
;      b1) integer
;          the startline is set to integer and the linedistance to 10.
;      b2) last
;          the startline is set to first free line (only relevant after a
;          get command). The linedistance is set to default 10.
;   c) two parameters
;      the startline is set to the first parameter and the linedistance to
;      the second.
; The parameters,if any, are situated in page1 from byte 4 each occupying
; 8 bytes.
b. a10, j10 w.
j1:  1000000           ;   large
j2:  <:las:>           ;

g5=k-g0+1
     al  w0     10     ;
g41=k+1
     rs  w0  x3+135    ;   startline:= default value
g42=k+1
     rs  w0  x3+136    ;   lineincrement:= default value
     dl  w1  x3+d1+2   ;   w0,w1:= two first words of param1
     sn  w0    -1      ;   if no parameters (-1) then
     jl.        a1.    ;    defaults are used
     sn. w0    (j2.)   ;   if param1=<:last:> then
     jl.        a2.    ;    get last line from get
     se  w1     0      ;
     sl. w1    (j1.)   ;   if number out of range then
     al  w1     10     ;    use default value
g43=k+1
     rs  w1  x3+135    ;   store startline (param1)
     dl  w1  x3+d2+2   ;   w0,w1:= two first word of param2
     sn  w0    -1      ;   if no more params then use default value
     jl.        a1.    ;
g44=k+1
     rs  w1  x3+136    ;                     else use param2

a1:  rl. w2     b15.-2 ;
     rl. w3     b31.   ;
     jl.       (b6.)   ;   page jump to autoline in commandio

g40=k+1
a2:  rl  w2  x3+190    ;   get last lineno
g45=k+1
     rs  w2  x3+135    ;   store in startline
     jl.        a1.    ;
e.
g1=k-g0               ;  length of code page

e.                     ;    end code;
h10=s0, h11=s1         ;    final checksums
i.e.e.e.e.  ; end segment, end h-names, end options, end tterm1
\f

▶EOF◀