DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

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

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦e50e3c7e5⟧ TextFile

    Length: 199680 (0x30c00)
    Types: TextFile
    Names: »D38«

Derivation

└─⟦2294a1cd1⟧ Bits:30005867/disk06.imd Dokumenter (RCSL m.m.)
    └─⟦this⟧ »D38« 

TextFile

                    
           \f

                                                i 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  GENERAL ...............................................   1 
           \f

                                               ii 
           \f

         1_._ _ _ _ _ _ _ _ _G_E_N_E_R_A_L_ 1.
           
          The Testcable CBL936 is used to test the two parallel I/O ports
          of the RC701 or RC702 microcomputer system. The cable J3 is con-
          nected to J3 of the microcomputer and J4 is connected to J4 of
          the microcomputer. The test itself is described in the manual for
          RC702 Testprogram.  
           \f

                    
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
                                  CBL936 DRAWING 
           
           \f

                   T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ 
           
           
          1  DATA AND INSTRUCTIONS FORMATS                  Page 7
            1.1 Data formats                                             7
             1.2 Working Registers                                       8
             1.3 Instruction Format                                       8
             1.4 Use of the Effective Address as an Operand              10
             1.5 Use of the Effective Address 
                 to refer to Memory Location                             10
             1.6 Jump Instructions                                       11
             1.7 Modify Next Address Instruction                         11
              
          2  SUMMARY OF OPERATORS                                        12
             2.1 Address Instructions                                    12
                 2.1.1  Address Load (al)                                12
                2.1.2  Address Complement (ac)                          12
                 2.1.3  Address Modity (am)                              12
             2.2 Transfer between Memory and Registers                   14
                 2.2.1  Register Load (rl)                               14
                 2.2.2  Extend (and) Load (el)                           14
                 2.2.3  Zero Load (zl)                                   14
                 2.2.4  Register Store (rs)                              14
                 2.2.5  Double Load (dl)                                 14
                          2.2.6  Double Store (ds)                                14
                 2.2.7  Half Load (hl)                                   14
                 2.2.8  Half Store (hs)                                  14
                 2.2.9  Register Exchange (rx)                           15
                 2.2.10Exception Load (xl)                              15
          2.2.11 Exception Store (xs)                             15
             2.3 Integer Arithmetic                                      15
                 2.3.1  Word Add (wa)                                    15
                 2.3.2  Word Subtract (ws)                               15
                 2.3.3  Word Multiply (wm)                               16
                          2.3.4  Word Divide (wd)                                 16
                 2.3.5  Double Add (aa)                                  16
                 2.3.6  Double Subtract (ss)                             16
                 2.3.7  Extend (and) Add (ea)                            17
                 2.3.8  Extend (and) Subtract (es)                       17
             2.4 Floating Point Arithmetic                               18
                 2.4.1  Floating Add (fa)                                18
              2.4.2  Floating Subtract (fs)                           18
                 2.4.3  Floating Multiply (fm)                           18
       2.4.4  Floating Divide (fd)                             18
       2.4.5  Convert Integer to Floating (ci)                 18
    2.4.6  Convert Floating to Integer (cf)                 18
    2.4.7  Normalize Single (ns)                            18\f

    2.4.8 Normalize Double (nd)                             18
             2.5 Bit Processing                                          19
                 2.5.1 Logical And (la)                                  19
                 2.5.2 Logical Or (lo)                                   19
                 2.5.3 Logical Exclusive Or (lx)                         19
             2.6 Shift Operations                                        19
                 2.6.1 Arithmetic Single (as)                            19
                 2.6.2 Arithmetic Double (ad)                            19
                 2.6.3 Logical Single (ls)                               19
                2.6.4 Logical Double (ld)                               19
             2.7 Jump Instructions                                       21
                 2.7.1 Jump with Link (jl)                               21
                      2.8 Conditional Instructions                                22
                 2.8.1 Skip Equal (se)                                   22
                 2.8.2 Skip Not Equal (sn)                               22
                 2.8.3 Skip Less than (sl)                               22
                 2.8.4 Skip Higher than (sh)                             22
             2.9 Skip on Individual bits                                 25
                 2.9.1 Skip Ones (so)                                    25
                 2.9.2 Skip Zeroes (sz)                                  25
                 2.9.3 Skip if no Exception (sx)                         25
           
          3  SLANG                                                      27
             3.1 Simple Directives                                       27
                 3.1.1 Comments                                          27
                 3.1.2 Block Construction                                27
                 3.1.3Storage Mode                                      27
             3.2 Instruction Addressing29
                 3.2.1 Direct Addressing29
                 3.2.2 Relative Addressing29
                 3.2.3 Indexed Addressing29
                 3.2.4 Indirect Addressing30
             3.3 Names                                                   31
                 3.3.1 Declaration of Identifiers                        31
                 3.3.2 The Reserved Identifier                           32
                 3.3.3 Relative Addressing using Identifiers             33
                 3.3.4 Expressions in SLANG                              33
                 3.3.5 Explicit Definition of Identifiers                35
                 3.3.6 Redefinition of Identifiers                       36
                  3.4 Program Elements                                        36
                 3.4.1 Instructions                                      37
                 3.4.2 Numbers                                           38
                 3.4.3 Text strings                                      38
                 3.4.4 Directives                                        38
           \f

                3.4.5 j. code                                           40
3.5 Blocks and Segments                                     41
3.6 Calling the SLANG Assembler                             43
3.7 Source Program Administration                           44
3.8 Input and Output                                        46
    3.8.1 Read a Character                                  47
                 3.8.2 Output a Character                                47
                 3.8.3 Output a Text string48
                 3.8.4 Output a Number                                   48
                 3.8.5 End Program                                       49
                 3.8.6 Construction of a Program which makes use
                       of Input and Output Routines                      50
             3.9 Code Procedure50
           
          4  PROGRAMMING EXAMPLES                                        53
 
          APPENDIX A:  Assembly Messages                                 61
          APPENDIX B:  RC 8000 Instruction Set                           65
      APPENDIX C:  RC 4000 Instruction Set                           68
      APPENDIX D:  The SLANG Syntax71
      APPENDIX E:  Debugging of SLANG-programs78
      APPENDIX F:  The ISO 7 Bit Character Set                       80
                   APPENDIX G:  Survey of Instructions                            82
               APPENDIX H:  References                                        84

                   Index                                                          85
                              \f

F_       1         D_A_T_A_ _A_N_D_ _I_N_S_T_R_U_C_T_I_O_N_S_ _F_O_R_M_A_T_S_ 
           
           
1.1       D_a_t_a_ _f_o_r_m_a_t_s_ 
           
          The data structure of the RC 4000/8000 is shown in the following
          figure: 
           
           
                                    DOUBLE-WORD 
                FIRST WORD                              SECOND WORD 
                
                   HALF-WORD   HALF-WORD                    HALF-WORD   HALF-WORD 
           
           
            INTEGER HALF-WORD INTEGER HALF-WORD 
            0      11 12             23 

                      INTEGER WORD
            0        23 
           
           
          FRACTION           EXPONENT 
   0      353647
           
          INTEGER DOUBLE-WORD 
   0                                                                       47
           
          The basic arithmetic or logical operand is an integer of 24 bits.
          Two>s complement arithmetic is used. Data is packed with twohalf-
          words per word. The 12-bit half-words are directly addressable.
          The address of the first half-word is 0, the next is 1 etc. Doub-
          le words are used to represent integers of 48 bits and floating-
          point numbers with 36-bit fractions and 12-bit exponents. 
                    
          If a double-word/word/half-word is treated as a number, the left-
          most bit is the sign. 
                   If a double-word is treated as a floating point number, the first
          bit in both fraction and exponent are treated as the signs. 
           
          The alignment of words in store is always such that the effective
          address is divisible by 2. Therefore the effective address, in
          word instructions, is the address of the left-hand half-word. An
          odd address in word instructions will be treated as if the corre-
          sponding left-hand half-word address had been used. \f

T_1.2       W_o_r_k_i_n_g_ _r_e_g_i_s_t_e_r_s_ 
           
          The register structure includes four 24-bit working registers,
&_          one of which is specified as the result register in each instruc-
          tion. Three of the working registers also function as index regi-
          sters. The current index register is selected by the instruction
          format. 
           
          The working registers are addressable as the first eight half-
          words (or four words) of the primary memory. The programmer can
                   therefore perform operations directly between two registers by
          specifying a memory address between 0 and 7. It is also possible
          to execute instructions stored in the working registers. 
           
           
T_                           Half-word 
          address
                    0         24 bits      working reg 0 (w0) 
                    2         24 bits      working reg 1 (w1) index reg 1 (x1)
                    4         24 bits      working reg 2 (w2) index reg 2 (x2)
&_                    6         24 bits      working reg 3 (w3) index reg 3(x3)

                
          Two adjacent working registers can be used to hold a double-length
          operand of 48 bits. In double-length operations, the four registers
          are connected cyclically as follows: 
           
T_                    double reg 0  address  w3 and w0 
                    double reg 1  address  w0 and w1 
                    double reg 2  address  w1 and w2 
&_                    double reg 3  address  w2 and w3 
           
          These connections are established by specifying the second regis-
          ter of the concatenation in the instruction format. 
           
           
T_     1.3       I_n_s_t_r_u_c_t_i_o_n_ _F_o_r_m_a_t_ 
           
          The instruction format is divided into an operation half-word and
&_          an address half-word, each containing 12 bits: 
           
                    \f

     T_        FWMXD 
                      0          5 6 7 8 9 10 11 12                    23 
           
          Example: 
                    The instruction:  al  w3  7 
                    will load working register 3 with the number 7 i.e. the
              contents of w3 is now 7. 
 
                             The mapping of this instruction in a primary storage
          word is: 
 
                         F        W   M    X            D 
&_                      11        3   0    0            7 

          Bits 0:5   F_ _f_i_e_l_d_. Contains the function code, specifying one of
                     sixty-four basic operations. 
           
          Bits 6:7   W_ _f_i_e_l_d_. Specifies one of the four working registers
                     as the result register. 
           
                   Bits 8:9   M_ _f_i_e_l_d_. Specifies one of four address modes, used to
                     control generation of the effective address (see be-
                      low). 
                    
          Bits 10:11  X_ _f_i_e_l_d_. Selects the current index register. Only
                      working registers w1, w2, and w3 act as index re-
                      gisters (X field = 0 indicates no indexing). 
                
          Bits 12:23  D_ _f_i_e_l_d_. Contains a truncated address, specifying a
                      displacement from -2048 to +2047 half-words within
the program. This is adequate for the majority of
addresses, but not sufficient for direct addressing
of the entire memory. 
                
          A full address of 24 bits is formed by means of the displacement,
          D, in conjunction with the contents of an index register, X, and
the contents of the instruction counter, IC. The generation of the
effective address, A, is controlled by the address mode field, M,
as follows: 
                 
  T_          relative bit  indirect bit 
           
                  M = 00    A = X + D              direct addressing 
                M = 01    A = word (X + D)       indirect addressing 
             M = 10    A = X + IC + D         relative addressing 
&_           M = 11    A = word (X + IC + D)  indirect relative addressing 
           \f

          In the address calculation, the displacement is treated as a 12-
          bit signed integer that is extended towards the left to 24 bits
          before being added to the index register and the instruction
          counter. In the final addition of X, IC, and D, overflow is ig-
           nored. 
           
The address modes 01 and 11 permit indirect addressing on one
level. The indirect address fetched from the memory is assumed to
be a full address of 24 bits. 
 
          The address modes 10 and 11 modify the indexed displacement with
          the current load address of the instruction. This permits reloca-
                 tion of programs during loading. 
           
           
T_1.4       U_s_e_ _o_f_ _t_h_e_ _e_f_f_e_c_t_i_v_e_ _a_d_d_r_e_s_s_ _a_s_ _a_n_ _o_p_e_r_a_n_d_ 
           
                   For some function codes, the effective address is used directly
&_          as an operand. This is done in three different ways. 
           
          The effective address or its two>s complement can be assigned to
          the addressed register. 
           
          The contents of the working register can be compared with the
effective address (word comparison) in several ways, the result
of the comparison determining whether the following instruction
is to be executed or skipped. 
           
          The effective address can define a number of shifts to be per-
                 formed on the addressed register. 
           
           
T_1.5       U_s_e_ _o_f_ _t_h_e_ _e_f_f_e_c_t_i_v_e_ _a_d_d_r_e_s_s_ _t_o_ _r_e_f_e_r_ _t_o_ _m_e_m_o_r_y_ _l_o_c_a_t_i_o_n_s_ 
             
          For other function codes, the effective address is used to refer
&_          to memory locations. 
           
          Memory addresses are always expressed as half-word addresses. The
          half-word locations are numbered consecutively starting with
          zero. In word operations, the right-most bit in the effective
          address is ignored; thus it is irrelevant whether a word
          operation refers to the left or the right half of a word. In
double-word operation the right-most bit in the effective address
is also ignored; the word thus specified is the second word of
the operand. \f

                   The effective address is used to refer to memory locations in
          register transfer instructions as well as instructions for arith-
          metic and logical operations. 
           
           
T_     1.6       J_u_m_p_ _i_n_s_t_r_u_c_t_i_o_n_s_ 
           
          Jump instructions represent a special kind of memory reference,
                   as they transfer program control to the instruction pointed out
          by the effective address. 
&_           
          Subroutine jumps are implemented as follows: If the W field is
          different from zero, the logical address of the return point,
          i.e. the instruction following the subroutine jump, is placed in
                   the addressed working register. A jump is then made to the effec-
          tive address. 
           
          At the end of the subroutine, a return jump is made as a simple
          unconditional jump. 
                    
T_       1.7       M_o_d_i_f_y_ _N_e_x_t_ _A_d_d_r_e_s_s_ _i_n_s_t_r_u_c_t_i_o_n_ 
           
          The AM instruction, which modifies the displacement in the fol-
          lowing instruction by its own effective address, provides various
          possibilities of address modification. 
&_           
          One use of this instruction is for direct indexing with the con-
          tents of any memory location, for example: 
           
                             am (x1 + d1) 
                    jl d2 
           
          The effective address of the AM instruction is A1 = word (X1 +
          D1). This is used to modify the displacement D2 in the following
          JL instruction to produce an effective address A2 = word (X1 +
          D1) + D2. 
           
          Another use of the AM instruction is for multi-level indirect
          addressing, for example: 
           
T_                    am (x1 + d1) ; a1 = word (x1 + d1) 
                    am (0)       ; a2 = word (a1) 
                    am (0)       ; a3 = word (a2) 
&_                    etc. 
                    \f

F_       2         S_U_M_M_A_R_Y_ _O_F_ _O_P_E_R_A_T_O_R_S_ 
           
           
          The operators most frequently used (basic operations) will be
          briefly described in the following. As a verbal description only
          is given, doubts may arise as to subtle uses of the operators; in
          such cases the complete description in the "Reference Manual"
          should be read. 
           
          In the notation indirect addressing is indicated by parentheses
     and comments are preceded by semicolons. Relative addressing is
        indicated by a period. 
 
Example: 
          al  w2  (82)  ; w2:=word(82) 
 
           With this instruction the contents of primary storage
word with address 82 is placed in working register 2. 
 
 
2.1       A_d_d_r_e_s_s_ _i_n_s_t_r_u_c_t_i_o_n_s_ 
           
     2.1.1     A_d_d_r_e_s_s_ _l_o_a_d_ _(_a_l_)_ 
          The final address is transferred to the register. 
               Example:  al w1 500 ; w1 := 500; 
           
     2.1.2     A_d_d_r_e_s_s_ _c_o_m_p_l_e_m_e_n_t_ _(_a_c_)_ 
          The final address with the opposite sign is transferred to the
          register. 
          Example:  ac w1  100 ; is the same as  al w1 -100 
           
          Example: 
                   The contents of w1 can be complemented (two>s complement) using
          the instruction: 
                    ac w1 x1 
           
                     e.g  if       w1 is +2   = 000........10  in the binary 
                         then    -w1 is -2   = 111........10  system 
                
        2.1.3     A_d_d_r_e_s_s_ _m_o_d_i_f_y_ _(_a_m_)_ 
          The final address is added to the displacement in the following
          instruction. (The instruction is not altered in memory though). 
          A working register is not used in an am instruction. 
           
T_        Example: 
                                   am        100 
                              al   w0   200 
                    causes    w0   :=   300 \f

          Example: 
                              am        (100) 
                              al   w0    200 
         &_                  causes    w0   :=    word(100) + 200. 
                   Example: 
                          Word 74 contains the start address of a table where word
                 with address 10 (relative to table start) contains the
address of a description of device no. 5 (usually the
printer). 
T_         
          Half-word address 
         relative to first           0 dev. 0 
                                               2 dev. 1 
                             74:  first        4 dev. 2                   printer 
                                      6 dev. 3                   descriptor
                                             8 dev. 4 
                                     10 dev. 5 
                                     12 dev. 6 
           
                
                    
         &_         
T_        The start address of this description can be transferred to the
                   w2 register by the instructions: 
                    am        (74)  i.e. adds contents of word 74 to
                    rl   w2   +10       the displacement 10 and uses this
                                        as address of the word which is
&_                                     loaded to w2. 
           
T_        Example: 
                             A long sequence of am instructions is often found on
&_                  entry into procedures etc. 
                    
                    Imagine the following instruction sequence starts at
            word 100: 
           
T_                  am                  1 ; word 100 
                    am                  1 ; word 102 
                    am                  1 ; word 104 
&_                  al        w0        0 ;word 106 
           
          In this example if entry is made at word 106, w0 will be initia-
          lized to 0, if entry is made at word 104, w0 will be 1 and if
      entry is made at word 100, w0 will be 3. 
           
           \f

2.2       T_r_a_n_s_f_e_r_ _b_e_t_w_e_e_n_ _m_e_m_o_r_y_ _a_n_d_ _r_e_g_i_s_t_e_r_s_ 
           
2.2.1     R_e_g_i_s_t_e_r_ _l_o_a_d_ _(_r_l_)_ 
          The contents of the storage word addressed are transferred to the
W register. This instruction using a signed half-word integer
          corresponds to the el instruction. Using a unsigned integer half-
          word, this instruction corresponds to the zl instruction. 
T_                
2.2.2     E_x_t_e_n_d_ _(_a_n_d_)_ _l_o_a_d_ _(_e_l_)_ 
               The half-word addressed is transferred to the right half of the W
         register, and the sign is extended through the left half of the
         register. 
           
&_ 2.2.3     Z_e_r_o_ _l_o_a_d_ _(_z_l_)_ 
          The half-word addressed is transferred to the right half of the W
     register and the left half of the register is zeroed. 
                 
2.2.4     R_e_g_i_s_t_e_r_ _s_t_o_r_e_ _(_r_s_)_ 
          The contents of the W register are transferred to the storage
                word addressed. 
                   
  2.2.5     D_o_u_b_l_e_ _l_o_a_d_ _(_d_l_)_ 
           
2.2.6     D_o_u_b_l_e_ _s_t_o_r_e_ _(_d_s_)_ 
          These instructions are the double-word equivalents of rl and rs. 

          Example: 
                    dl  w0    100 
                    causes word(98) to be transferred to w3 and word(100)
                    to be transferred to w0. 
 
T_ _      2.2.7     H_a_l_f_ _l_o_a_d_ _(_h_l_)_ 
 
2.2.8     H_a_l_f_ _s_t_o_r_e_ _(_h_s_)_ 
                   These instructions transfer of a single half-word between memory
          and the right half of a W register. The left half of the register
          is unaffected. 
                   
          Example: 
&_                    hl  w1    0 
                    The left half-word of w0 (=half-word 0) is transferred
to the right half-word of w1. 
           
          Example: 
                    hs  w0    2 
                    The right half-word of w0 is stored in half-word 2 i.e.
the left half-word of w1. \f

2.2.9     R_e_g_i_s_t_e_r_ _e_x_c_h_a_n_g_e_ _(_r_x_)_ 
          The contents of the W registers are exchanged with the contents
          of the storage word addressed. 
           
                  Example: 
                         rx  w3   0   ; Interchange of w3 and w0 
           
          Example: 
                    rl  w0   100; w0:= word(100) 
                      rx  w0   200; word(200):= word(100), w0:= word(200) 
                    rs  w0   100; word(100):= word(200) (w0 = word(200)) 
           
          These three instructions interchange the contents of word 100 and
            word 200. 
           
            Example: 
                    The contents of w1 are to be transferred to w0. 
                    This is executed by each of the following 4 instruc- 
                      tions, but the first is the fastest (and "most natu- 
                    ral"). 
                          
                           al  w0    x1; or 
                    al  w0    (2); or 
                         rl  w0     2 ; or 
                             rs  w1     0 
 
  2.2.10    E_x_c_e_p_t_i_o_n_ _L_o_a_d_ _(_x_l_)_ 
          The contents of the three rightmost bits in the half-word
          addressed are loaded into the exception register. 
         
        2.2.11    E_x_c_e_p_t_i_o_n_ _S_t_o_r_e_ _(_x_s_)_ 
          Extend the exception register towards the left with zeroes and
          store it in the half-word addressed. The exception register
          remains unchanged. 
           
           
     2.3       I_n_t_e_g_e_r_ _a_r_i_t_h_m_e_t_i_c_ 
             
2.3.1     W_o_r_d_ _a_d_d_ _(_w_a_)_ 
           
2.3.2     W_o_r_d_ _s_u_b_t_r_a_c_t_ _(_w_s_)_ 
          The contents of the word addressed are added to/subtracted from
          the W register. Overflow and carry are noted in the exception
          register. \f

         T_        Example: 
                    The instructions 
                    rl  w0    100 
                    wa  w0    102 
                    ws  w0    104 
                    rs  w0    106 
         &_        execute:  word(106):= word(100) + word(102) - word(104); 
           
         2.3.3     W_o_r_d_ _m_u_l_t_i_p_l_y_ _(_w_m_)_ 
          The W register is multiplied by the contents of the word addres-
          sed. The result appears in the corresponding double register.
          Overflow cannot occur. 
                    
         T_        Example: 
                    wm  w0    100 
                    will insert "w0 D*U word(100)" in the double
&_                  register w3, w0. 
                
     2.3.4     W_o_r_d_ _d_i_v_i_d_e_ _(_w_d_)_ 
          The contents of the double register specified are divided by the
          contents of the word addressed. The quotient appears in the W
          register specified, and the remainder in the preceding register.
          The remainder has the same sign as the quotient. Overflow is
          noted in the exception register and in this case the double
          register remains unaltered. 
           
          Example: 
                    The positive number in word(200) is to be divided by
the contents of word(100). The quotient is to be stored
in word(104) and the remainder stored in word(102). 
           
                    rl  w1    200 ; w1:= word(200); 
                    al  w0    0   ; w0:= sign(+); 
                    wd  w1    100 ; divide; 
                    ds  w1    104 ; word(102):= word(200) mod word(100); 
                                    word(104):= word(200)/word(100); 
T_     2.3.5     D_o_u_b_l_e_ _a_d_d_ _(_a_a_)_ 
           
     2.3.6     D_o_u_b_l_e_ _s_u_b_t_r_a_c_t_ _(_s_s_)_ 
&_               The instructions act as wa/ws but using double-word operands. 
           
          Example: 
                    In copy loops etc. there are often two registers which
                         must be updated simultaneously. This is often done
                             using e.g. \f

                    al  w1    x1 + 2 
                    al  w2    x2 + 2 
                    but the following could also be used: 
                    aa  w2    - - 
                    where the address points at two numbers of value 2 (the
                    latter method is slow, but saves space). 
           
          Example: 
                   All double-word operations (dl, ds, aa, and ss) are carried out
          in two stages in that right-hand words in the operand are dealt
          with before left-hand words. Usually this is not important but if
          both operands are double registers and these overlap, surprising
          results may occur. 
           
          The instruction     aa  w1    4 
               has as operands w0,w1 and w1,w2 and will be executed as the fol-
          lowing ALGOL statement sequence: 
                    w1:= w1 + w2; 
                    w0:= w0 + w1; 
          It will be seen that in the second statement an updated w1 is one
           of the operands. 
          
T_       2.3.7     E_x_t_e_n_d_ _(_a_n_d_)_ _a_d_d_ _(_e_a_)_ 
           
         2.3.8     E_x_t_e_n_d_ _(_a_n_d_)_ _s_u_b_t_r_a_c_t_ _(_e_s_)_ 
          The contents of the half-word addressed are extended to a 24-bit
          operand (sign extension) which is added to/subtracted from the
&_          contents of the W register. 
           
          Example: 
                    calculate w0:= word(200) + 
                                   half-word(351) - half-word(17); 
                              rl  w0    200 
                              ea  w0351 
                                       es  w0    17 
           
                   Example: 
          In connection with the al instruction it was seen that the con-
          tents of a register could be increased by 10, for example, in the
          following way: 
                         al  w2    x2 + 10  
          This method cannot be used for W0, but incrementing/decrementing
          by 1 can be carried out in the following way: 
                    ea. w0    1 ; w0:= w0 + 1; 
                    es. w0    1 ; w0:= w0 - 1; \f

          In these instructions the number 1 is used both as an address and
          a data half-word, as the final address is (IC + 1) which points
          at the address (displacement) in the current instruction. 
                
                
T_2.4       F_l_o_a_t_i_n_g_ _p_o_i_n_t_ _a_r_i_t_h_m_e_t_i_c_ 
                
     2.4.1     F_l_o_a_t_i_n_g_ _a_d_d_ _(_f_a_)_ 
                
2.4.2     F_l_o_a_t_i_n_g_ _s_u_b_t_r_a_c_t_ _(_f_s_)_ 
                
2.4.3     F_l_o_a_t_i_n_g_ _m_u_l_t_i_p_l_y_ _(_f_m_)_ 
                
2.4.4     F_l_o_a_t_i_n_g_ _d_i_v_i_d_e_ _(_f_d_)_ 
          Note that floating point operands are always double-words. The
&_          operand is added to (subtracted from,...) the contents of the
          double register specified and the result appears in the double
          register. Over- and underflow are noted in the exception
          register. 
                
2.4.5     C_o_n_v_e_r_t_ _i_n_t_e_g_e_r_ _t_o_ _f_l_o_a_t_i_n_g_ _(_c_i_)_ 
          Convert the w register, interpreted as an integer multiplied by
          2** effective address, to a floating point number and place it in
          the corresponding double register. An overflow is registered in
          the exception register if the exponent exceeds the 12 bit range. 
                
2.4.6     C_o_n_v_e_r_t_ _f_l_o_a_t_i_n_g_ _t_o_ _i_n_t_e_g_e_r_ _(_c_f_)_ 
               Convert the specified double register, interpreted as a floating
          point number divided by 2** effective address, to an integer and
          place it in the register specified. An overflow is registered if
          the integer exceeds the 24 bit range. 
           
T_     2.4.7     N_o_r_m_a_l_i_z_e_ _s_i_n_g_l_e_ _(_n_s_)_ 
           
     2.4.8     N_o_r_m_a_l_i_z_e_ _d_o_u_b_l_e_ _(_n_d_)_ 
          The contents of the register (double register) are shifted to the
&_          left until bit(0) is different from bit(1). 
                    
          The number of shifts (= normalization exponent) is stored with
          opposite sign in the half-word addressed. 
           
          If the register contains 0, -2048 is stored. 
           \f

T_     2.5       B_i_t_ _P_r_o_c_e_s_s_i_n_g_ 
           
     2.5.1     L_o_g_i_c_a_l_ _a_n_d_ _(_l_a_)_ 
           
     2.5.2     L_o_g_i_c_a_l_ _o_r_ _(_l_o_)_ 
           
     2.5.3     L_o_g_i_c_a_l_ _e_x_c_l_u_s_i_v_e_ _o_r_ _(_l_x_)_ 
          In these operations the contents of the register specified as
&_          well as the contents of the word addressed are regarded as 24
          single bits which are processed in parallel. The result appears
          in the register specified. "Logical and" is used to zero bits in
          a word. "Logical or" is used to set bits to 1 and "logical exclu-
          sive or" is seldom used. 
                    
           
T_       2.6       S_h_i_f_t_ _o_p_e_r_a_t_i_o_n_s_ 
           
          The operations shift the contents of a register (or a double re-
          gister) linearly (circular shift does not exist). The absolute
&_          value of the address gives the number of shifts. Left shift for a
          positive address, and right shift for a negative address. Logical
          shift is distinguished from arithmetic shift. In the latter the
          sign is propagated on right shift, and possible overflow is noted
          (in the exception register) on left shift. 
           
T_     2.6.1     A_r_i_t_h_m_e_t_i_c_ _s_i_n_g_l_e_ _(_a_s_)_ 
           
     2.6.2     A_r_i_t_h_m_e_t_i_c_ _d_o_u_b_l_e_ _(_a_d_)_ 
          The operations act as a multiplication by 2 ** (effective ad-
&_                 dress). 
           
T_2.6.3     L_o_g_i_c_a_l_ _s_i_n_g_l_e_ _(_l_s_)_ 
           
     2.6.4     L_o_g_i_c_a_l_ _d_o_u_b_l_e_ _(_l_d_)_
     The operations are analogous with "shift" in ALGOL. The chosen
&_               working register (double or single) will be shifted as noted in
          the resulting address. It will be filled up with zeroes at both
          left and right shifts. 
           
          Example: 
                 Calculate word(1000):= word(2000) shift(-9) extract 3;
          (word(100) is expected to contain a suitable pattern). 
           \f

T_                    rl  w0    2000 ; w0:= word(2000); 
                    ls  w0    -9   ;shift(-9); 
                    la  w0    100  ; and word(100); 
&_                    rs  w0    1000 ; word(1000):= w0; 
           
                 The contents of word(100) must be defined such that on logical
          multiplication all bits will be set to zero apart from the last
          three. That is, the last three bits in word(100) must = 1 and the
          other bits = 0. 
           
          Thus word(100) must contain the number 7. 
           
          Example: 
          The contents of the last 4 bits of word(1002) are to be inserted
          in the word(1000) from bit(12) to bit(15). To achieve this 2 work
          areas (2000 and 2002) with bit patterns are used. 
                   Using the first, 4 bits are to extracted i.e. it must contain the
          binary number 1111 = 15. 
           
          Using the second constant bit(12) - bit(15) are to be zeroed and
          all the other bits extracted. On calculating this bit pattern it
          is to be noted that the number "-1" consists of 1 bit only. Thus
          in this case it is easier to extract the unwanted bits from the
          number "-1". 
           
                   In SLANG notation the constant will appear as follows: 
                    -1-(15  8)or 
                    2.111111111111000011111111 or 
8.77770377 
          as 15 is 4 bits set to 1 and 8 is the number of places from the
          rightmost bit (i.e. from bit(23) to bit(15)). 
           
          When the constants are set up, the program is as follows: 
T_           
                    rl  w0    1002; w0:= word(1002); 
                   la  w0    2000  ; extract 4; 
                    ls  w0    8;shift 8; 
                    rl  w1    1000; w1:= word(1000); 
                    la  w1    2002; clear bits (12-15); 
&_                      lo  w1    0   ; w1:= w1 or w0; 
                      rs  w1    1000; word(1000):= w1; 
           
          Example: 
          w0 contains a text word (3 characters), which is to be stored
          character for character in the half-words (2000-2002); \f

T_                    al  w3    0     ; 
                    ld  w0    8     ; w3:= 1st character 
                    hs  w3    2000  ; store 1st character 
                    al  w3    0     ; 
                    ld  w0    8     ; 2nd character 
                    hs  w3    2001  ; 
                    al  w3    0     ; 
                    ld  w0    8     ; 3rd character 
&_                    hs  w3    2002  ; 
           
          The last 3 instructions could be replaced by the two following,
          but they are slower than those above: 
T_                    ls  w0    -16 
&_                           hs  w0    2002 
           
           
T_       2.7       J_u_m_p_ _i_n_s_t_r_u_c_t_i_o_n_s_ 
           
         2.7.1     J_u_m_p_ _w_i_t_h_ _l_i_n_k_ _(_j_l_)_ 
          The effective address is transferred to the IC. If the W-field in
          the jump is greater than 0, the previous IC-value will be stored
&_          in the W-register specified. 
           
          If a W-register (only w1, w2, w3) is specified when using a jump
          instruction it corresponds to a CALL-statement in FORTRAN. For
          example, if word(900) contains the instruction: 
                    jl  w3    1000 
          when this is reached at runtime 
   
          1) the jump instruction is fetched from memory 
          2) the final address is calculated (=1000) 
          3) the IC is updated to point at the next word (=902) 
          4) the jump instruction is carried out  
                    i.e. w3:= IC; IC:= address; 
                    i.e. w3:= 902 and IC = 1000. 
          The next instruction is then taken from word(1000). 
           
          If a jump to a procedure uses 
                    jl  w3 ..... 
          return can be made with the instruction 
                    jl      x3 
           
          Parameters for a procedure will generally be transferred via the
          registers, but in some cases it is an advantage to have the para-
          meters positioned immediately after the call: \f

T_                    jl  w3    1000 ; call add (2,3) 
&_                         2,    3   ; 
         T_        the procedure will then appear as follows: 
                    rl  w0    x3+0 ; w0:= 1st parameter 
                    wa  w0    x3+2 ; + 2nd parameter 
&_                  jl        x3+4 ;return; 
         
          Example: 
          Often a procedure needs all 4 registers for intermediate results
          and thus must store the return address in a work variable. En-
          trance and exit may then appear thus: 
                             rs  w3    1000 ; save return; 
                     -   -     - 
                     -   -     - 
                     -   -     - 
                    jl       (1000); return; 
 
          
T_2.8       C_o_n_d_i_t_i_o_n_a_l_ _i_n_s_t_r_u_c_t_i_o_n_s_ 
           
          All conditional instructions have the following construction: 
                    skip next instruction if ..... 
&_           
T_      2.8.1     S_k_i_p_ _e_q_u_a_l_ _(_s_e_)_ 
           
2.8.2     S_k_i_p_ _n_o_t_ _e_q_u_a_l_ _(_s_n_)_ 
           
      2.8.3     S_k_i_p_ _l_e_s_s_ _t_h_a_n_ _(_s_l_)_ 
           
      2.8.4     S_k_i_p_ _h_i_g_h_e_r_ _t_h_a_n_ _(_s_h_)_
     In these instructions the relation has the W register as the left
&_          operand and the effective address as the right operand. 
           
          Example: 
                    sn  w0    100 
                    al  w3    0 
                    Here the zeroing of w3 is skipped if w0 does notcon- 
                    tain the value 100. 
                
          Note that an ALGOL comment to a skip instruction will contain the
          opposite condition: \f

          Example: 
                    sn  w0    100 ; if w0=100 then 
                    al  w3    0   ; w3:= 0; 
           
          This is one of the reasons why most programming errors occur in
                   the vicinity of skip instructions!!!
         T_        Example: 
                    The ALGOL statement: 
                    for w1:= 1 step 1 until 100 do 
                        begin ............. end; 
                   can be coded as (starting at word 2000): 
                    al  w1    1 ;w1:= 1; 
                    -   -     -     ; word2002; begin..... 
                    -   -     -     ;..........end; 
                    al  w1    x1+1  ; w1:= w1+1; 
                    sh  w1    100   ; if w1 = 100 then 
                    jl        2002  ;goto word2002; 
         &_         
                   Example: 
          A group of records are chained together such that the word with
          relative address, 10, contains the start address of the next
          record in the chain. If this address = -1, the chain is finished.
           
         T_        In ALGOL the chain can be run through thus: 
                    while chain ' -1 do 
                        begin 
                         - - 
                         - - 
                         - - 
                        chain:= record(chain,10); 
                        end; 
         &_         
         T_        In SLANG it appears thus (first word is no. 2000): 
                    sn  w2    -1    ; if chain = -1 then 
                    jl        - -   ; exit_loop; 
                    -   -     - -   ;  - - - 
                    -   -     - -   ;  - - - 
                    rl  w2    x2+10 ; chain:= record(chain,10); 
         &_                  jl        2000  ;repeat; 
           \f

         T_        C_o_m_b_i_n_e_d_ _c_o_n_d_i_t_i_o_n_a_l_ _i_n_s_t_r_u_c_t_i_o_n_s_ 
           
          Example: 
                    if a = 2 or a = 4 then a:= 3; 
                    se  w0    2 
                    sn  w0    4 
                    al  w0    3 
         &_         
         T_                  if a = 2 and b = 4 then c:= 3; 
                             sn  w0    2 
                    se  w1    4 
                    jl.       4 
                    al  w2    3 
         &_         
          In this case the condition cannot be calculated directly so the
                   opposite condition is calculated. If this holds true, jl. 4 is
          executed, thus skipping an instruction. 
           
         T_                  if a ' 0 and a  5 then a:= 17; 
                    sl  w0    1 
                    sl  w0    5 
                    jl.       4 
         &_                  al  wl    17 
           
         T_        Example: 
               Comparison of double words: 
                             Jump to word2000 if 
                    double-word(900,902) ' double-word(800,802). 
                              
                    dl  w1    902  ; w0,w1:= double-word(900,902); 
                    sn  w0   (800) ; jump if 1st part not true; 
                    se  w1   (802) ; skip jump if 2nd part true; 
         &_                  jl        2000 ; 
         T_        Example: 
                   Register comparison: 
                    continue if w2 ' w0 
                    sh  w2    (0)  ;word(0) = w0; 
                    jl  - -    - 
           
                    continue if w2 = w3 + 10 
                    se  w2    x3+10; 
         &_                  jl         - - - 
           \f

         T_        Example: 
                    Simple if... then.... else.... 
                    w0:= if w1 = 2 then 100 else 200; 
                    se  w1    2    ; 
                    am        100  ; 
                    al  w0    100  ; 
         &_         
                   Example: 
          Comparison of a primary storage word with a small constant
          without using registers: 
                    am        (200) ;
                    sh  w2    x2-10 ; 
                    -   -      - - 
          condition is: 
                    skip if w2 ' x2-10+word(200) which is 
                    skip if word(200)10 
                    
                    
T_ 2.9       S_k_i_p_ _o_n_ _i_n_d_i_v_i_d_u_a_l_ _b_i_t_s_ 
                    
2.9.1     S_k_i_p_ _o_n_e_s_ _(_s_o_)_ 
          The effective address is regarded as a 24-bit bit pattern. All
          the positions which are 1 in the address are examined in the W
&_          register. If all = 1 the next instruction is skipped. 
                
2.9.2     S_k_i_p_ _z_e_r_o_e_s_ _(_s_z_)_ 
          The same effect as >so>, but all the specified bits in W register
          must = 0. 
           
          Example: 
          Rounding up an odd number to the nearest even number. 
                    sz  w1    1    ; if w1 is odd then 
                    al  w1    x1+1 ; w1:= w1+1; 
           
                   Example:  Status word test. 
                     
                    if parity error or block-length error 
                        then goto .....; 
                    As word(100) is meant to contain a bit pattern, where
the two status bits = 1, the query can be written
thus: 
          sz  w0    (100) ; if error bits = 0 then skip; 
                 
2.9.3     S_k_i_p_ _i_f_ _n_o_ _e_x_c_e_p_t_i_o_n_ _(_s_x_)_ 
          The instruction acts as skip zeroes, using the exception regis-\f

          ter is used instead of a W-register (therefore this must not be
          stated in the instruction). 
           
          Example: 
                             Word(100) is to be added to w0. 
                    On overflow a branch is made to word(2000). 
                              
                    wa  w0    100   ; 
                    sx        2     ; if overflow then 
                    jl        2000  ; goto....; 
                    
          The address "2" in the sx instruction is used because overflow is
          noted in bit(22) of EX (see "Reference Manual"). ).
           \f

F_       3         S_L_A_N_G_ 
           
           
          The programming language used to describe the machine code is
          called SLANG (= Symbolic LANGuage). 
           
          The SLANG input text contains two different types of information,
                    1. definition of that which is to be stored in the
                       program (instructions, textstrings, and numbers) 
                         2. information controlling the assembly (directives). 
          A directly executable object program is produced on the backing
                   storage. 
           
           
         3.1       S_i_m_p_l_e_ _d_i_r_e_c_t_i_v_e_s_ 
                    
          In the following section the most important directives will be
          described. A complete description follows in section 3.4.4. 
           
     3.1.1     C_o_m_m_e_n_t_s_ 
          In the source text (input to the SLANG assembler) comments may
               be inserted between the delimiter, semicolon, and the "new line"
          character. Syntactically such a construction is equivalent to the
          "new line" character alone. 
           
          In this case semicolon is a "command" to the SLANG assembler (a
          directive), which says: ignore all text until "new line" is read.
           
     3.1.2     B_l_o_c_k_ _c_o_n_s_t_r_u_c_t_i_o_n_ 
          A SLANG program can be structured in blocks as an ALGOL program.
          The intention is the same as with ALGOL: variable identifiers
          declared in an inner block are local to this and cannot cause
          conflict with identifiers of corresponding variables in an outer
          block. 
           
          A block is initiated with "b". or "s." (the difference is ex-
          plained later in section 3.4). A block is terminated with "e.". 
           
     3.1.3     S_t_o_r_a_g_e_ _m_o_d_e_ 
          The SLANG program consists of elements which may be instructions,
          text strings or variables. As it is not always possible to decide
          implicitly whether a variable can be contained in a half-word or
          a word, the programmer is required to state explicitly to the
          assembler how all elements of the program are to be stored. This
          is done using directives which define storage mode: \f

          "w."      (= word mode) is the most usual, and states that all
                    following elements are to be assembled as words.
                    Variables, instructions and text strings may be stored
                    in this mode. 
                     
               "h."      (= half-word mode) states that the following program
         elements are to be stored as half-words. In this mode
half-word variables and instruction codes may be
stored, (the latter being the left half of an
instruction, so this is seldom used). 
                     
               "f."      (= floating point mode) can only be used to store
                    floating point numbers. 
                     
               Storage mode must be defined at each block start (i.e. between
          "b." or "s." and the first program element to be stored). The
          mode may also be redefined at any time between two program ele-
          ments. 
           
          On exit from a block (e.) the mode will be reset to that value
          which was valid immediately before entry into the block. 
           
                   On exit from half-word mode SLANG may store an extra half-word
(containing 0), as a word (or double-word) must always begin with
an even half-word address. 
           
          Example: 
               This example shows how numbers are stored in the various modes: 
           
                    Source text 
                    b. w.          ; block start, word mode 
                         2, 4, 6        ; integers 
                         b. f.          ; new block, floating-point number 
                         8, -1          ; floating-point number 
                         e.             ; end inner block 
                         8, -1          ; integers 
                         h.             ; change to half-word mode 
                         4, -1, 3000    ; half-words 
                         w. 117         ; word 
                         e.             ; end outer block 
           
          If these numbers are printed out after assembly as signed half-
          words, the result will be as follows: 
           \f

         T_          half-word 1  half-word 2
                  0             2       ; integer word 
                           0             4       ; integer word 
                  0             6; integer word 
                        1024             0       ; 
                  0             4       ; floating point no. = 8 
              -2048             0       ; 
                  0             0       ; floating point no. = -1 
                  0             8       ; integer word 
                 -1            -1       ; integer word 
                      4            -1       ; half-words 
              -1096             0       ; half-words, 0 inserted by SLANG 
                  0           117       ; integer word 
                    
           
       3.2       Instruction addressing 
           
       3.2.1     D_i_r_e_c_t_ _a_d_d_r_e_s_s_i_n_g_ 
          As it is only possible to address the first 2048 half-words with
                   the displacement alone (negative storage-addresses do not exist),
          this addressing method is not much used, except for addressing of
          the register. 
           
         3.2.2     R_e_l_a_t_i_v_e_ _a_d_d_r_e_s_s_i_n_g_ 
          If the R-field is included in the address (i.e. set to 1) it
          means that the value of the instruction counter will be added to
          the displacement before it is used as an address. This address,
          which is used by the operator, is called the effective address. 
           
          When implemented the relative addressing means that regardless of
          where in the storage an operator is situated, it can reach its
          operands if they are placed less than 2048 half-words before or
          after the current instruction. 
           
          In the SLANG-notation relative addressing is indicated by a
          period immediately following the instruction-code. 
           
          Examples: 
                    jl.       0         The instruction will be executed an
                                        infinite number of times. 
                         jl.       +6        Skip the two next instructions. 
                    50000               Constant 
                         rl.  w2   -2        Result   w2:= 50000 
           
      3.2.3     I_n_d_e_x_e_d_ _a_d_r_e_s_s_i_n_g_ 
                   As well as it is possible to have the instruction counter added
          to one>s address, it is possible to specify that one of the
          working registers is to be part of the effective address. This is\f

                   done by simply placing the number of the working register in the
          X-field - as "0" in the X-field means that this type of address-
          ing is not wanted, w0 can not be used in this way. In the SLANG-
          notation indexed addressing is indicated by means of x1, x2 or x3
          between W-register and the displacement. 
           
          When the working registers are used as described above, they are
          often called i_n_d_e_x_-registers. Normally index-registers are used
          in two principally different ways: 
           
          1)  As basis-registers. 
              Let us assume that x1 contains the address of the first word
              of a table. The effective address of the instruction "rl  w0
              x0+0" is: The start address +0, which means that the first
              table word will be fetched to w0. The instruction "rl  w0
              x1+2" will fetch the second table word etc. This type of
              addressing is well suited for processing a number of data-
              structures (e.g. simple tables) with an identical construc-
              tion. 
               
          2)  As "real" index registers. 
              Let us assume that a table is stored from word 1000 and
              forward and that the index value always is calculated in w1.
              A table word is thus fetched to w0 with the instruction "rl
              w0  x1+1000". 
               
                   Finally one can take advantage of the working registers also
          being index registers. 
           
          Example: 
                    The instruction   al  w2  x2+100 
                    will add 100 to w2 
           
     3.2.4     I_n_d_i_r_e_c_t_ _a_d_d_r_e_s_s_i_n_g_ 
          Using this type of addressing a temporary address is calculated
          on the basis of the R, X and D-fields. A word with this address
          is fetched from the storage, and the contents of the word -
          regarded as an ordinary integer with a sign - constitutes the
          effective address. 
           
          Example: 
                    If w1 contains the number 30, and the contents of
                    word 100 is -5000 the instruction: 
                              al  w3  (x1+70) 
                    will transfer the number -5000 to w3. \f

                   In SLANG-notation indirect addressing is indicated by parentheses
          around the X-field and displacement. 
           
          Indirect addressing is used e.g. in procedures as follows. When
          the procedure is entered, the return address is placed in one of
          the index-registers. As it is not normally possible to reserve a
          register for this purpose throughout the procedure, the return
          address will normally be stored in a working variable. When the
          exit from the procedure is to be made, the index register can, of
          course, be reestablished and the exit then made, but with in-
          direct addressing it is possible to exit indirectly via the
          working variable in which the return address is stored. 
           
               Example:  rs.  w3    i1.      ; save return 
                         . 
                         . 
                         . 
                    jl.       (i1.)     ; return 
               i1:  0 
              
           
3.3       N_a_m_e_s_ 
           
          In the explanation of instruction addressing it was noted that in
          the majority of references to memory, the use of relative addres-
          sing is necessary. The manual calculation of relative addresses
          is difficult, and it is a complicated problem to correct the com-
          pleted program, as the insertion of a single half-word would
          alter all the addresses throughout the program. 

3.3.1     D_e_c_l_a_r_a_t_i_o_n_ _o_f_ _i_d_e_n_t_i_f_i_e_r_s_ 
          To help with declaration of identifiers SLANG has introduced
          identifiers which can be used as symbolic addresses (labels) -
          for both absolute and relative addressing. 
           
          An identifier is a letter followed by a serial number. The let-
          ters may be "a" to "j" and "l" to "v". 
           
          Example: 
                    Examples of identifiers: 
                         a0, b45, v322 
           
          All the local names for a block should be declared after "b." or
          "s.". The declarations must be made "letter by letter" by giving
          the letter and the maximum serial number. The declarations are\f

          separated by commas and concluded by the definition of the
          storage mode. 
                
          Example: 
          The local identifiers a0, a1, a2 and v0, v4 are used in a block.
                   The block head for this block will appear thus: 
                    b.        a2, v4 
                    w. 
           
                   In declarations, identifiers will often be defined with serial
          numbers larger than necessary. This simplifies later amendments
          in the block as the insertion of a new identifier will not make
          alteration of the declarations necessary. 
           
          The following standard names are used: 
                    s0 
                    s1 
                         these contain the sum and the double sum of the
                         characters processed (not including comments etc.). 
          s2   shortclock, meant for tails for insertproc, so
                         that program entries will contain the time of
                          the SLANG compilation. 
                         s3   Isodate, decimal 
                    s4   Clock, decimal 
                         s3 and s4 are meant for the date in code pro- 
                         cedures so that they will contain the time of
                         the SLANG compilation. 
                
     3.3.2     T_h_e_ _r_e_s_e_r_v_e_d_ _i_d_e_n_t_i_f_i_e_r_ _"_k_"_
          "k" is a reserved identifier which is updated by SLANG every time
          a half-word, word or double-word is stored. k is initialized to
          0, and will, unless its value is explicitly altered, at all times
            gives the number of half-words SLANG has translated. Therefore k
          will always give the relative address, in relation to program
          start, of the next half-word which is to be stored. 
           
          The current value of k can be transferred to an identifier by
          writing the identifier followed by a colon. The identifier is in
          this case called a label. Labels are used as symbolic addresses
          of storage locations. These may either be position in a program
          or data items. In floating point mode the identifier is given the
          value k+2 to simplify the addressing of floating-point numbers.  
           
Example:
                    The current value of k can be transferred to an\f

                      identifier in this way. 
 
                    a0:  k 
           
          A piece of code which is to be executed at assembly time should
          not contain assignments to the reserved identifier k. 
           
T_       3.3.3     R_e_l_a_t_i_v_e_ _a_d_d_r_e_s_s_i_n_g_ _u_s_i_n_g_ _i_d_e_n_t_i_f_i_e_r_s_ 
          If a word to be addressed is supplied with a label, relative
&_          addressing will (nearly) always be used. The D field (displace-
          ment) in the instruction will then be "interval from the current
          instruction to the label", which may be expressed as "label-k". 
           
          As this form of addressing is used in most instructions in a
          program, the expression is abbreviated to "label" followed by a
          period. The identifier in this case is called r_e_l_a_t_i_v_e_. 
           
          This gives the general rule for addressing: 
                         If the address in an instruction is a label 
                    then this as well as the operator must be 
                    given with relative notation. 
           
          Example: 
                    jl.       w3        p12.      ;call procedure p12; 
                    rl.       w0        b0.       ;w0:= word(b0); 
                    wa.       w0        b2.       ;w0:= w0+word(b2); 
                    rs.       w0        b5.       ;word(b5):= w0; 
          al.       w0        b5.       ;w0:= word b5; 
 
                  As the values for the relative identifiers are calculated during
          the SLANG assembly, programs which use such relative addressing
          are not sensitive to amendments which alter the interval between
          the operators and their operands, whereas programs which contain
          relative intervals as fixed numbers (this has been used in pre-
          vious examples) will be nearly impossible to alter. 
                
3.3.4     E_x_p_r_e_s_s_i_o_n_s_ _i_n_ _S_L_A_N_G_ 
          Simple arithmetic expressions can be used for: 
                     
                    1) variable initialization 
                    2) statement of address (definition of the D field) 
                    3) definition of identifier values (to be explained
                            later) 
                    4) parameters for certain SLANG directives (this is
                            explained later). \f

                   The operands in a SLANG expression may be: 
                    1) numbers 
                    2) identifiers (both relative and absolute) - though
only if the identifiers have been given a value
          previously in the program (see the following). 
                   3) "k". 
           
                   All operands in SLANG expressions are regarded as 24-bit signed
          integers. 
           
          Integers will, as a rule, be given as decimal numbers but other
          number systems may be used by giving the number as: 
                    "radix"."number in radix system" 
           
          Example: 
          The number 10 may be stated in the following ways: 
           
T_                           10        ;implicitly stated: decimal system 
                    10.10     ;explicitly stated: decimal system 
                             3.101     ;explicitly stated: ternary system 
&_                    2.1010    ;explicitly stated: binary system 
           
          There is no syntactical upper limit on the value of the radix,
          but as digits can only be given with the characters "0", "1",
          ..."9", radix values greater than 10 can hardly be used in
          practice. As it is not tested whether a digit is larger than the
          radix a number such as the following may be stated: 
           
                    2.256 
           
          This number would have the value ("normally" calculated as a 
          polynomial): 
                    4 * 2 * 2 * 5 + 1 * 6 = 24 
           
          The following operators may be used in expressions: 
           
                      '     respectively left, right shift (logical shift)
                    *  /     multiplication, division 
                    +  -     addition, subtraction 
                    a. &     both mean: and (i.e. logical multiplication) 
                    o.  !    both mean: or (i.e. logical addition) 
           
          The operators are given in order of priority (shift has highest
                   priority). \f

                   The order of priority can be altered by the use of parentheses
           supplied with colon "(:"and":)" - the normal parentheses are used
                for indirect addressing in instructions. 
           
          Example: 
                   In the example k has the value 200, and a0 has the value 100 (for
          example, a0 could have been used as a label at a point where k
          had the value 100). 
           
                    a0+4                ;value = 104 
                    a0-k                ;value = -100 
                    a0.-10              ;value = -110 
                    (:a0.+200:)/a0      ;value = 1 
                         k12+a0             ;819300(=200*2**12+100) 
           
     3.3.5     E_x_p_l_i_c_i_t_ _d_e_f_i_n_i_t_i_o_n_ _o_f_ _i_d_e_n_t_i_f_i_e_r_s_ 
          It is shown above that an identifier can be assigned a value by
          declaring it as a label. A more direct method for assigning
          values is the explicit definition: 
                    "identifier" = "expression" 
          where "expression" is a SLANG expression as described above. 
           
          This gives the possibility of defining labels, as the expression
          may contain "k": 
           
          Example: 
                    a2 = k 
                    a3 = k + 6 
               a5:  a6 = a5 - 4 
           
           
          Example: 
          Also a form of field variable as in ALGOL 7 may be introduced, as
          tables may be structured using identifiers with relative address
          values. 
           
          A table contains elements of 4 words (a double-word, a word and
          two half-words). The table is stored beginning at a0. 
           
                    b0 = 8    ;defines element length 
                    b1 = 3    ;defines field variable for the double-word 
                    b2 = 5    ;defines field variable for the word 
                    b3 = 6    ;defines field variable for half-word 1 
          b4 = 7    ;defines field variable for half-word 2 
           \f

          If w2 gives the position of the current element in the table,
          this can be updated using the instruction: 
            
                             al  w2  x2 + b0     ; w2:= next element; 
                    
          half-word 1 can be extracted with the instruction: 
           
                    el  w0  x2 + b3     ; w0:= element.half-word1; 
           
          If the double-word in element no. 17 is to be used this can be
          done by, for example: 
                    dl. w1  a0. + 17 * b0 + b1 
          (with this example it is shown, a little prematurely, that addres-
          ses in instructions may also be SLANG expressions).  
           
          Finally, identifiers may be used as a kind of direct variable as
          according to the description of explicit definition it is valid
          to write, for example: 
                    a17 = a15 + 2 
                    
 3.3.6     R_e_d_e_f_i_n_i_t_i_o_n_ _o_f_ _i_d_e_n_t_i_f_i_e_r_s_ 
          Identifiers which have already been assigned a value can always
          be redefined using an expression. On the other hand it is not
          permitted to redefine using a label. Thus it is not entirely the
          same if the following are used: 
           
                    q43:      or 
                    q43 = k 


           as the latter form is a valid redefinition, whereas the former is
          only permissible if q43 has not been previously defined. 
           
          "k" can be redefined as for explicitly defined names. In this con-
          nection it must be stressed that "k" is used for address calcula-
          tion in SLANG and has no influence as to where the program ele-
                   ments are stored. 
                    
           
T_3.4       P_r_o_g_r_a_m_ _e_l_e_m_e_n_t_s_ 
           
          A program element is an instruction, a number, or a text string.
          Program elements are separated from each other by: 
                    1. "new line" (or constructions which are syntactically
&_                       equivalent to "new line" e.g. comments) \f

                    2. a directive 
                    3. a comma 
          Any program element may have a label. 
           
          Assignments (explicit definitions) may be placed anywhere among
                   the program elements, but must be separated from them by one of
          the three constructions above. 
           
     3.4.1     I_n_s_t_r_u_c_t_i_o_n_s_ 
          Instructions written in word mode, consist of an operation part
          and a D field value. The operation part begins with an operation
          code, then comes the specification of relative addressing ".", W
          register (w0,w1,w2, or w3), indirect addressing indication "("
          and x register (x1,x2, or x3) in if the corresponding fields in
          the instruction are non-zero. 
           
          The order of these specifications is not fixed but the order used
          above is usually followed. Note that a left parenthesis alone is
          required to specify an indirect address;  a right parenthesis may
          also be used, it is treated as a blind symbol. 
           
          The displacement value (D field) follows the operation part. 
           
          This value may be given as: 
                    1) a SLANG expression 
                    2) an identifier (defined or undefined) 
                    3) a relative identifier (defined or undefined). 
           
          When the value is inserted, the SLANG assembler will check that
          it lies in the range -2048 to 2047. If not an alarm is given. 
           
          If the displacement is given as an expression (defined names in-
           cluded) the value is inserted when the instruction is translated.
           
           
          In half-word mode, instructions may be written as a half-word
          containing the operation part (described in notation above) fol-
          lowed by a half-word giving the displacement value. This method
          of writing instructions has two points where errors can arise,
          firstly it is not checked that the operation part is stored in a
          half-word with an even address, and secondly relative addressing
          of identifiers is not quite the same as in word mode: \f

       T_        1)        k = 100,  a9 = 200 
                         w.   al.  w0    a9. ;the instruction is translated as:
                                                 ;al. w0 100 
     &_                   
T_        2)        k = 100,  a9 = 200 
                    h.   al.  w0,   a9. ;the instruction is translated as: 
                                        ;al. w0 99 
                                                 ;as k is updated between the two 
                      ;half-words 
         &_        
         3.4.2     N_u_m_b_e_r_s_ 
          Integer numbers are stated in word or half-word mode as SLANG
          expressions or as undefined names (absolute or relative). In
          half-word mode the value has the range from -2048 to 4095
          (corresponding to signed and unsigned half-words) - if this is
          not the case an alarm is given. 
           
          In floating-point mode values can only be given as absolute deci-
          mal numbers according to the syntax in appendix D. 
           
     3.4.3     T_e_x_t_ _s_t_r_i_n_g_s_ 
          Text strings may only be stored in word mode. All the characters
          between ":" and ":'" are taken as text and are stored. The only
          exception is the construction integer' which will be stored as a
          single character with the value "integer". 
           
          A text string will always be held in a complete number of words.
          Any unused character positions in the last word will be zeroed
          (corresponding to the NULL character). As a rule it is desirable
          that texts are terminated by at least one NULL character, this
          will normally be explicitly inserted at the end of the text. 
           
         T_        Example: 
                    :alpha0':'  =' 2 words 
                             :ab:'        =' 1 word 
         &_
3.4.4     D_i_r_e_c_t_i_v_e_s_ 
          The following gives a complete list of all valid directives: 
                    
          ;         comment. Everything up to a "new line" is ignored. 
           
m.        m_essage. Everything up to a "new line" is printed out\f

          but is not included in the program (corresponds to
               "message" in ALGOL). 
           
          b.s.e.    block and segment definition. (The difference is de- 
                    scribed in the next section). 
           
h.w.f.    definition of storage mode. Described previously. 
r.        r_epetition. An expression must follow "r.". If this is
                    greater than zero the last stored word (half-word or
                    double-word - depending on storage mode) is repeated so
          that it occurs "expression" times. Repetition is used,
          for example, to set up variable areas inside the
          program. 
If the value of "expression" is less than (or equal to)
zero, a warning is printed out. 
If the delimiter r. follows a k assignment, the word/
                             double-word value loaded expression'-1 times is unde-
fined. 
   
         c.z.      c_ondition. After c. there follows an expression which
          determines whether the following program text - up to
          z. - is to be included in the program or not. 
                    If the value of the expression is less than zero the
                    following SLANG code will be ignored. If the expression
                    is greater than or equal to zero the code will be as-
                    sembled. 
                    This method of determining assembly of certain parts of
                    the program may be, for example, used to include text
                    output in the program - controlled by an identifier
                    which is defined at the beginning of the program. 
 
i.        i_dentifier listing. All local defined names together
          with their values will be output during assembly. (The
          output can be suppressed with a parameter when calling
          the SLANG assembler). 
                     
                   t.n.      Read from the other input medium: The SLANG assembler
                    will switch input from the current source text area to
                    the medium from which the assembler was called. When n.
                    is read from this medium, input is continued from the
source text area. 
                    Examples of the use of these directives are given in
                    the description of the SLANG assembler call. 
                     
               p.u.      Copying of text. A specification of a source text must\f

                    follow p. This is done by writing "p.text", where
                    "text" is a normal SLANG text string containing a
maximum of 11 characters.The SLANG assembler will
replace "p.text" by the complete source text stored in
"text". This source text must be terminated by "end
medium" or "u". 
                    This directive can be used to copy standard procedures,
          etc. 
          Examples of p. are given later. 
           
          l.d.      Used for selective listing of the source text. If it is
                             specified in the call of the SLANG assembler that the
                    program is to be listed during assembly (the parameters
                    "list.yes" or "list.on") the listing may be terminated
                    by using "d." (= "d_elete listing") and later reestab-
                    lished using "l." (= l_ist). 
                     
               j.        This directive causes the assembly to be halted and a
                    jump made to the last instruction assembled. 
                     
         3.4.5     j_._ _c_o_d_e_ 
                   The directive "j." causes the SLANG assembler to stop the assem-
          bly and call a procedure in the newly translated program. When
          this procedure returns, the translation will continue (or termi-
          nate with an error message, if specified). 
           
          On "j." the reaction of the SLANG assembler is a jump (jl w3...)
          to the last stored word, with w1 and w2 pointing at the base for
          the file processor procedures (FP-BASE) and the internal varia-
          bles in the SLANG assembler (SLANG BASE), respectively. 
           
          The SLANG internal variable of most interest is the pointer which
          gives the address of the word last stored. If this pointer is al-
          tered it is possible to make the SLANG assembler store the follow-
          ing section of the program on top of the "j." code and thus avoid
          the inclusion of this in the translated program. On entry into
          the procedure, w2 will point directly at the variable which con-
          tains the memory address of the location where the next half-word
          is to be stored. 
           
          When control returns from the procedure to the SLANG assembler,
           w_0_ can be used to indicate whether a text, the start address of
          the text is in w0, is to be output by the assembler. If w_0_ = 0
          there is no output. If w_2_ ' 0 on return, the SLANG assembler
          will output the error message "jump" and stop the translation. \f

                   The directive "j." should never follow immediately after a k
          assignment. 
           
          The S_l_a_n_g_ _b_a_s_e_ is the address of a table within the assembler,
          which contains the following entities: 
           
                   slang base:          program top (first free word) 
                            +2          stack top (last free word) 
                            +4          not used 
                            +6          last k assignment 
                            +8          result name address ( -1 if noname)
                           +10          jump to insert identifiers 
           
                  The meaning of the addresses p_r_o_g_r_a_m_ _t_o_p_ and s_t_a_c_k_ _t_o_p_ is illu-
          strated by the following map of the internal store: 
      T_         
                                       assembled 
                                         code 
                         jump entry: 
                    program top: 
                     
                             free area 
                     
                    stack top:          identifier 
                                           stack 
      &_         
                 
          The l_a_s_t_ _k_ _a_s_s_i_g_n_m_e_n_t_ is the address of the word defining the va-
          lue of the last k assignment. 
           
          The r_e_s_u_l_t_ _n_a_m_e_ _a_d_d_r_e_s_s_ is the address of the first of four words
          defining the name of the catalog entry which describes the object
          program file. Identifiers may be defined or redefined inside a
          "j." code by a jump to slangbase +10. 
           
          To illustrate the use of "j." see examples 4.8 and 4.9. 
           
           
         3.5       P_r_o_g_r_a_m_s_,_ _B_l_o_c_k_s_ _a_n_d_ _S_e_g_m_e_n_t_s_ 
           
          Blocks are used in SLANG to control the scope of identifiers, in
          that all identifiers are local to the block in which they are de-
          clared. As in ALGOL, local identifiers as well all the global iden-
          tifiers (declared in an outer block and not in the local block)\f

          may be referenced from an inner block. The outer-most block
          delimits the program to be assembled. 
           
          Segments have the same characteristics as a block but also have
          the important function of controlling the output of the transla-
          ted program to backing storage. 
                   While SLANG is translating a segment it lies in primary storage.
          When the terminating "e." is reached, the complete segment is
          transferred to backing storage, where the SLANG assembler will
          not make further modifications. This means that all names used in
          a segment must be defined before "e." is reached. 
                    
          The restriction can make reference from one segment to another
          very complicated. In the majority of cases programs will consist
          of one segment only. A program will only be written in segments
          when at assembly time it is so large that there is not room in
            primary storage for the whole program. 
           
          Further it must be stressed that the concept "segment" in rela-
          tion to SLANG has nothing to do with segments of backing storage.
          As the SLANG assembler transfers program segments to backing
          storage these are placed directly after each other - without con-
          sideration to the physical format of the backing storage area. 
           
          If several segments are "nested" the inner segments are treated
          as blocks - otherwise the program elements in the inner segments
          would be transferred before the outer segment, and references
          between the levels would not be in agreement. 
           
                   E_x_a_m_p_l_e_: 
          Here is the skeleton of a program consisting of two segments
          (enclosed by delimiters s. and e.) surrounded by a global block
          to illustrate the nesting of segments and blocks: 
 
 T_        b.- - -             ;global block 
             s.- - -          ;segment 1 
                b.- - - e.    ;local blocks 
                b.- - - e.    ; 
             e. 
             s.- - -          ;segment 2 
                b.- - -       ;local blocks 
                   b.- - - e. ; 
                e.            ; 
             e.               ; 
         &_        e. \f

         3.6       C_a_l_l_i_n_g_ _t_h_e_ _S_L_A_N_G_ _a_s_s_e_m_b_l_e_r_ 
           
          The call has the following format: 
         T_                              1                                * 
                   program' =     slang  texts and parameters' 
          00 
         &_         
          program' is the name of a backing storage area where the SLANG
          assembler is to output the assembled program. If program' is not
          given in the call, output is not produced by the SLANG assembler.
           
          texts and parameters' consists of names of text files from which
          the SLANG assembler can read the program text (source program)
          and parameters controlling the assembly. 
                    
          Source files are read in the order stated in the call. If no
          source file is specified, input is taken from the current input
          medium. Parameters for the SLANG assembler begin with a keyword
          which defines the type of parameter. This is followed by one or
          more numbers or texts each starting with a period. The following
          list gives a survey of all parameter types. The underlined data
          is standard, that is, it is used where the parameter is not
          defined in the call. 
                    
          
                   message.y_e_s_         states that texts after "m." are to be output
                              during assembly. If this is not required the
                                   following is used: 
               message.no 
           
          warning.y_e_s_         specify whether warning messages are to be
          warning. no        output. A warning is given, for example, if a
                                   half-word is specified to hold too large a
                               value. 
                
          names.yes           states whether or not the directive "i" is to
          names.n_o_            cause output of identifier values. 
                
          type.yes            states whether or not the directive "t" is to
          type.n_o_             be used. 
                
          entry.y_e_s_           states whether the SLANG assembler is to de-
               entry.no            scribe the assembled program in the standard
                                   way (see the description of this in ref. 2). \f

                   remove.y_e_s_          states whether the area containing the trans-
          remove.no           lated program is to be removed in case of as-
                                   sembly error. 
                    
                   list.yes            states whether a_l_l_ source files are to be lis-
          list.n_o_             ted during assembly. The listing may be sup-
                              pressed locally, though, using the directive
                              d. and restarted using "l.". If "list.no" is 
                              specified, "d." and "l." are ignored. Each 
                              line in a program listing starts with a line 
                              number (which may be omitted) and the current
                              value of "k". Then follows the contents of
                              the line. 
           
          list.on             states whether or not the source files named
             list.o_f_f_            after this parameter are to be listed (not to
                              be listed) - "d." and "l." are obeyed after a
                              "list.on" parameter. This parameter is used 
                              when only a few of the source files for the
                              SLANG assembler are to be listed. 
           
          lines.y_e_s_           states whether line numbers are to be output 
          lines.no            on a listing, if any. 
          
          xref.yes            states whether a survey of all the identifiers
          xref.n_o_             used in the program is required. The survey 
                              relates in which lines the identifiers are
                              defined and from which lines each identifier
                              is referred to. The printout is sorted after 
                              block level and identifier. 
           
          proc."names"        described in the next section. 
           
           
         3.7       S_o_u_r_c_e_ _p_r_o_g_r_a_m_ _a_d_m_i_n_i_s_t_r_a_t_i_o_n_ 
           
          As the source files may be specified in various ways the follow-
          ing shows several examples of calling the SLANG assembler. 
           
          In all examples "prog" defines the backing storage file in which
          the assembled object program is to be stored. "text1", "text2"
          ... define the text files containing the source text (or file
          descriptors). 
           \f

          In all the examples it is assumed that the SLANG assembler is
          called directly from the terminal - examples of other call forms
          are found in the following sections. 
                    
          Example:  prog = slang text1 text2 
           
          The SLANG assembler reads in from text1; when "end medium" is
          reached, the assembler will read in from text2. 
           
          If the outer block (segment) is terminated in text1, text2 will
          not be read. 
           
          If the outer block (segment) is not terminated in either text1 or
          text2, the SLANG assembler adds "z.e." until the block is termi-
          nated ("z." is added to conclude any conditions in the program,
          extra "z." are ignored). 
           
               Example:  prog = slang 
           
          The SLANG assembler will read in from current input. This method
          should not be used, as a single keying error can cause the whole
          program to be rejected by the SLANG assembler, and as the assem-
          bler does not save the source text, the whole program must be
          rekeyed. 
                    
           
          Example: 
          Text1 contains a program text with 3 possible test outputs which
          are dependent on the values of the 3 identifiers t1, t2, and t3.
          At the beginning of the program these are initialized to "-1". 
           
          The instructions for each test output can be made conditional by
          the following method, for example: 
           
                    c.t2;     the following instructions are skipped if 
                              t20 
                    - - ;     test output 
                    - - ; 
                    z.  ;     end test output. 
           
          Immediately after the initialisation of t1, t2, and t3 the pro-
          gram contains a "t.". 
           
          If a program without test output is required, this is generated
          by the SLANG assembler call: 
                    prog = slang text1 
          As "t." is ignored unless the parameter "type.yes" is used in the
          call of the assembler, the program will be translated without any\f

          form of interruption. 
           
          If the test output is to be included in the program, the call of
          the assembler appears thus: 
                    prog = slang text1, type.yes 
          When the directive "t." is read by the assembler 
                    xxx type 
          is output on the terminal (xxx is the current k value), and t1,
          t2, and t3 may be redefined depending on the form of test output
          required. The keying in is terminated by "n.". E.g. if test 2 and
          test 3 are required, the input is as follows: 
                    t2 = 1, t3 = 1 n. 
                
          Example: 
          In the previous example there was the possibility that the
          program instructions for each test output should be included
          several times in the program. To avoid repetition of the same
          instructions in several places, the 3 sets of instructions for
          the 3 test outputs could be written in "text5", "text6", and
          "text7". 
           
          These areas can be copied using the "p." directive. The conditio-
          nal insertion of test output 2 could thus be written: 
                             c.  t2, p.:text2:'; copies test output 2 if 
                    z.                 ; t2 ' 0
          Example: 
          In all the previous examples illustrating the use of "p.", the
          text has been described using a constant. The possibility exists
          of delaying the definition of the text identifier until assembly
          time as after "p." an integer may be written which refers to a
          text parameter in the assembler call. 
           
          If the parameter 
                    proc.text6.text.7.text8 
          is given in the SLANG assembler call, "text6" may be referred to
          by writing "p.1", "text7" by writing "p.2" and "text8" by writing
          "p.3". 
           
           
     3.8       I_n_p_u_t_ _a_n_d_ _o_u_t_p_u_t_ 
           
          As input/output operations are complicated, an auxiliary system
          exists which simplifies the input and output in a SLANG program.
          This system is called "the File Processor" (FP). This consists of
          a number of routines and procedures which are each responsible\f

          for simplifying a process concerned with input/output. Some of
          these procedures, concerned with reading or writing a character,
          text or number using current input/output, are described in this
          section. 
           
          FP procedures are subroutines which all have names beginning with
          h. It is the rule, for all the procedures, that the return address
          must be found in w3. (For further information see ref. 2) 
           
T_     3.8.1     R_e_a_d_ _a_ _c_h_a_r_a_c_t_e_r_ 
          Call: 
                    jl.  w3  h25.  -2   ; read a character into w2 
          ; return 
          Result: 
                    w0      : unchanged 
                    w1,w3   : destroyed 
                    w2      : contains the value of the character read. 
&_           
          Note that the contents of w1 are lost. Care should be taken that
          information which is to be saved, is not found in the working
          registers on the call of an FP procedure. 
           
T_       3.8.2     O_u_t_p_u_t_ _a_ _c_h_a_r_a_c_t_e_r_ 
          Call: 
          jl.  w3  h26.  -2   ; outputs the character in w2 
                                        ; return 
&_                  
          Result: 
                    A character, the value of which is contained by w2
                    before the call, is output. 
           
                    w0:       unchanged 
                    w1,w2,w3: the contents are destroyed. 
         &_         
          Note that the contents of w2 also are lost. This means, if the
          same character is to be output several times in a row, the value
          for the character must be inserted in w2 before each call of h26.
           \f

         T_        Example: 
                    The character "a" is to be output: 
                     
                    al  w2  97          ; w2:= :a:' 
                    jl. w3  h26.-2 
         &_         
T_     3.8.3     O_u_t_p_u_t_ _a_ _t_e_x_t_ _s_t_r_i_n_g_ 
          Call: 
         &_                  jl.  w3  h31. -2    ; output a textstring 
         T_        Result: 
                    A text string, with the start address contained in w0,
                    is output. 
           
                    w2:       unchanged 
                    w0,w1,w3: destroyed 
         &_         
         T_        Example: 
                    The text string "I am me" is to be output: 
           
                    al.  w0  c5.        ; w0:= start address of the 
                                               text string 
                    jl.  w3  h31.-2     ; output: I am me 
                    - - - - 
                    c5: : I am me 0' :' 
         &_         
T_     3.8.4     O_u_t_p_u_t_ _a_ _n_u_m_b_e_r_ 
          Call: 
                    jl. w3  h32.-2      ; output the number contained in w0
                                         ; format 
&_                                              ; return point 
       T_        Result: 
                    The number contained by w0 is output in a format
                             defined by the constant format. 
                    
                    w2:       unchanged 
                    w0,w1,w3: destroyed 
&_         
          The constant format, which must be positioned in the word imme-
          diately after the call of h32, is constructed thus: 
           
                    sign  23 + filler  12 + positions. 
                
                   "Positions" states how many positions the number is to fill in
          the printout. The numbers are right justified. 
           \f

          "Filler" states which character is to be used in the empty po-
          sitions, in those cases where there are not as many digits in the
          number as "positions" defines. Normally the filler is a space,
          which has the value 32.  
           
          If "sign" is 1 the first position in the output is reserved for
          the sign (- for negative numbers and the filler characters for
          positive numbers). 
           
          Example: 
          The format 1  23 + 32  12 + 8 means that when the number -317
          in w0 is to be output, it will fill 8 positions, the first posi-
          tion in front of the first significant digit will contain the
          sign, and the four empty positions to the left of the digits will
          contain spaces: 
                     _ _ _ _ _ _-_3_1_7_ 
           
         T_        Example of call of h32 
                    rl.  w0  b7.        ; w0:= number 
                    jl.  w3  h32.-2     ; output number 
                    1 23 + 32  12 + 8 
                     -  -  -  -  -  - 
         &_                 b7:  -317
 
         3.8.5     E_n_d_ _p_r_o_g_r_a_m_ 
          The computer has no "stop instruction" so if a program is to be
          ended, the FP procedure h7 must be called, this ensures a suit-
          able ending. 
           
          Call: 
                    jl.      h7.        ; end of program 
                   Effect: 
                    The program is ended, and if w2 ' 0 error messages are
                    output depending on which bits in w2 are set to 1. As
                    the programmer may not define the contents of the error
                    message, w2 is usually set to 0. 
           
          Example: 
                    al  w2  0 
                    jl.     h7. 
           
          The h7 call does not necessarily have to be positioned as the
             last instruction in the program, but it must be the last the
             program executes. 
                    \f

         3.8.6     C_o_n_s_t_r_u_c_t_i_o_n_ _o_f_ _a_ _p_r_o_g_r_a_m_ _w_h_i_c_h_ _m_a_k_e_s_ _u_s_e_ _o_f_ 
          i_n_p_u_t_ _a_n_d_ _o_u_t_p_u_t_ _r_o_u_t_i_n_e_s_ 
When one or more FP procedures are to be used in a SLANG program,
          four things must be done: 
                
          1. At the start of the program k must be set to h55, thus making
             room for FP. (h55 is used instead of 1536). 
               2. The two first elements in the program must contain zero (because
             program execution starts at word 3) 
               3. The program must be supplied with an extra e. 
            Example: 
           
                    s. 
                    d.                 ; delete listing 
                   p.:fpnames:' 
                   l.                  ; reset listing 
                   k = h55
          w.  0,0
                        ..... 
                        .....program 
                        ..... 
                        al  w2  0 
                        jl. w3  h7.     ; end 
                    e. 
                    e.                  ; end for the fpnames 
                    
          4. When FP procedures are used the source file :fpnames:' must
             be assembled together with the program. 
                    
           
T_       3.9       Code Procedure 
           
          A code procedure is a special kind of external procedure which
          can be called from an ALGOL/FORTRAN program; contrary to the
          normal external procedures, the whole procedure is written in
          SLANG, either to give a faster run or to utilize possibilities
&_          which are not available in ALGOL/FORTRAN. 
           
          A code procedure can be called from an ALGOL/FORTRAN as a normal
          procedure and information can be exchanged between a code proce-
          dure and the program by means of parameters, own variables or the
          ALGOL/FORTRAN running system. Procedures of any kind may again be
          called from a code procedure. 
           
          The necessary entries in the catalog for a code procedure may be
          inserted during the SLANG translation of the procedure by means\f

          of a standardfile i_n_s_e_r_t_p_r_o_c_. The inserproc file contains an
          auxiliary code which is able to create catalog entries as speci-
          fied by the code procedure in the socalled tail part. 
           
          Three files are needed in the SLANG translation: 
           
          1.        The file f_p_n_a_m_e_s_ 
          2.        The file(s) containing the c_o_d_e_ _p_r_o_c_e_d_u_r_e_ _f_i_l_e_ 
          3.        The file i_n_s_e_r_t_p_r_o_c_. 
           
          f_p_n_a_m_e_s_:_ 
          The file fpnames is a standard file containing definitions of the
          File Processor h-names: 
           
          b. h100 w. h0=-28, h1=-18, ........... 
           
          C_o_d_e_ _p_r_o_c_e_d_u_r_e_ _f_i_l_e_:_ 
          The code procedure file must be organized as follows: 
           
          b. g1,... w.  ; Declaration of names used in the tail part and
                        ; insertproc. No h-names may be declared here. 
           s. a.... w.  ; This Slang segment contains one or more code 
                        ; procedure segments of 512 half-words each and
                        ; organized as shown in ref. 3. 
                e.           ; End of Slang segment. 
                        ; T_a_i_l_ _p_a_r_t_: Here follows a list of t_a_i_l_s_ to be 
                        ; inserted into the catalog. They describe the code
                        ; procedure entries and the corresponding parameter
                        ; specifications. The first word of the first tail
                        ; is labelled g0. The first word of the last tail
                        ; is labelled g1. 
           
          I_n_s_e_r_t_p_r_o_c_:_ 
          The file i_n_s_e_r_p_r_o_c_ contains: 
                  b. a....w. ; A piece of code which, if necessary, creates the
                        ; catalog entries describing the code procedures
                        ; and inserts the tail parts from the code proce- 
                        ; dure file. 
             e.         ; End of block for insertproc. 
            e.          ; End of block for names used in tails. 
            j.          ; Jump to insertproc 
          e.            ; End of block for fpnames. 
           
          The auxiliary code for insertproc occupies for the moment around
          600 half-words in primary storage. \f

                   T_a_i_l_:_ 
          A tail consists of 20 half-words corresponding to the words de-
          scribed in the manual of the File Processor (Ref. 3). The first
          tail will become the tail of an area entry in the catalog. The
          corresponding area holds the segments of the code procedure.
          Other tails, if any, refers then to this area. For further in-
                   formation about code procedures, see ref. 3. 
             \f

F_       4         P_r_o_g_r_a_m_m_i_n_g_ _e_x_a_m_p_l_e_s_ 
           
           
                   E_x_a_m_p_l_e_ _1_. 
          The following shows how to program a procedure. Entry is made by
          jl. w3 d18. 
           
          ;procedure read char (char) 
          ;comment: unpacks the next character from a storage 
          ;address initialized by init read. 
          ;    call:     return: 
          ;w0                 char 
          ;w1                 unchanged 
          ;w2                 unchanged 
          ;w3       link      link 
           
          b.i24               ;begin 
          w.d18: rx.w1 i1.    ; 
                 rx.w2 i2.    ; 
                 sh w1 0      ;  if readshift'0 then 
                          jl.   i0.    ;  begin 
                 al w1 -16    ;  readshift:=-16; 
                 al w2 x2+2   ;  readaddr:=readaddr+2; 
            i0:  rl w0 x2+0   ;  end; 
                 ls w0 x1+0   ;  char:=word(readaddr) shift readshift; 
                 la.w0 i3.    ;  char:=char(17.23); 
                 al w1 x1+8   ;  readshift:=readshift+8 
                   rx.w1 i1.    ; 
                 rx.w2 i2.    ; 
                 jl    x3+0   ; 
            i1:  0            ;readshift: 
           i2:  0            ;  readaddr:  
            i3:  8.177        ; 
          e.                  ;end 
           \f

T_        E_x_a_m_p_l_e_ _2_._ 
           
          ; this program will copy from current input to current output 
           
               s. a0;
          w.                     ;begin 
          d.                     ; 
          p.:fpnames:'          ;k:=first address after fp 
          l.;
          k=h55;
                 0               ; 
                 0               ; 
                                 ;entry: 
          a0:    jl. w3  h25.-2  ;loop: inchar(in,w2); 
                 jl. w3  h33.-2  ;  outend(out,w2); 
                 jl.     a0.     ;  goto  loop; 
          e.                     ;end fpnames 
          e.                     ;end program 
           
          If above slang text is stored in text2 the program is translated
          by 
                 copy=slang text2 
          and called by 
         &_               copy 
           
           
                   E_x_a_m_p_l_e_ _3_._ 
           
          ;this program will calculate and output the sum of n half-word
          ;elements in an array 
                
          s. a2                         ;begin 
          w.;
          d.;
          p.:pfnames.'; 
                                        ;  k=first address after fp 
          l.                            ; 
          k=h55                         ; 
               0                        ; 
               0                        ; 
               al  w0     0             ;entry: sum:=0; 
               al  w1     0             ;  index:=0; 
          a0:  ea. w0     x1+a1.        ;loop: sum:= sum+a(index); 
               al  w1     x1+1          ;  index:=index+1; 
               se. w1     (a2.)         ; 
               jl.        a0.           ;  if index'n then goto loop; \f

               jl. w3     h32.-2        ;  out integer(out,w0); 
               123+3212+5             ;  layout -dddd' 
               al  w2     10            ;  w2:=NL; 
               jl. w3     h33.-2        ;  outend(out,NL); 
               al  w2     0             ;  status:=ok; 
                    jl.        h7.           ;  goto end program 
          a2:  5                        ;  n 
          h.                            ;  store in half word mode 
          a1:  2                        ;  a(0) 
               3                        ;  a(1) 
               4                        ;  a(2) 
                    7                        ;  a(3) 
               9                        ;  a(4)   (is not summed) 
          e.                            ;end segment 
               e.                            ;end fpnames 
           
          E_x_a_m_p_l_e_ _4_._ 
          s.   a4 
          w. 
          d. 
            p.:fpnames:' 
          l. 
          k=h55 
          0,0 
          ;this program calculates and outputs all the Fibonacci numbers
          ;which are less than 10000 
               a4:  al  w2     10 
               jl. w3     h26.-2        ;output lineshift 
               rl. w0     a0.           ;w0:= first no. 
               rl. w1     a1.           ;w1:= second no. 
               wa  w0     2             ;w0:= first no. + second no. 
               rs. w1     a0.           ;first no.:= second no. 
               rs. w0     a1.           ;second no.:= new no. 
               ws. w0     a2. 
               sh  w0     0             ;is new no. ' 10000 
               jl.        a3.           ;no - go to continue 
               al  w2     0             ;yes - end 
               jl.        h7. 
          a3:  wa. w0     a2.           ;continue 
               jl. w3     h32.-2        ;output number 
               3212+6 
               jl.        a4. 
           
               a0:0 
               a1:1 
               a2:10000 
               e. 
              e. \f

          Output: 
                    1 
                    2 
                    3 
                    5 
                    8 
                    13 
                    21 
                    34 
                    55 
                    89 
                             144 
                    233 
                    377 
                    610 
                    987 
                    1597 
                         2584 
                    4181 
                    6765 
                     
          E_x_a_m_p_l_e_ _5_._ 
                
          s.   a2, c1 
          w. 
          d. 
          p.:fpnames:' 
l. 
          k=h55 
          0,0 
;this program reads in and outputs characters using the following
;rules: non-numeric characters are output directly, one or more 
                   ;consecutive digits are regarded as a number, and this is used as
                   ;a repetition factor for the output of the immediately following 
          ;character. 
           
               al  w0     0             ;w0:=0 
          a0   jl. w3     h25.-2        ;read a character 
                    sn  w2     25            ;= EM 
               jl.        a2.           ;yes - go to end 
               sl  w2     48            ;no 
               sl  w2     58            ;is it a digit? 
               jl.        a1.           ;no - go to write char. 
               wm. w0     c0.           ;yes - number:= number x10 
               al  w2     x2-48         ;digit:=char-48 
               wa  w0     4             ;number:=number+digit 
               jl.        a0.           ;go to read char. \f

          a1.  rs. w2     c1.           ; 
               jl. w3     h26.-2        ;write character 
               sh  w0     1             ;number=0 
               jl.        a0.-2         ;yes - go to read char. 
               es  w0     1             ;no - number:=number-1 
               rl. w2     c1.           ; 
               jl.        a1.+2         ;go to write character 
          a2:  al  w2     0             ;end 
               jl.        h7. 
          c0:  10 
          c1:  0 
          e. 
          e. 
           
                   E_x_a_m_p_l_e_ _6_._ 
           
          r=slang type.yes 
                   s.  a2, 
          w.  p.:fpnames:', k=h55, 0, 0 
                   ;The program reads a row of characters, terminated by
              ;NL. 
                   ;Each character is output, followed by its character
              ;value. 
               a0:   al   w2 10        ;start 
                jl.  w3   h26.-2    ;write NL 
                     jl.  w3   h25.-2    ;read a character 
                sn   w2   10        ;is it NL? 
                     jl.       a1.       ;yes - go to end 
                         rs.  w2   a2.       ;no - save character 
                         jl.  w3   h26.-2    ;write character 
                rl.  w0   a2.       ;fetch character 
                jl.  w3   h32.-2    ;write character value 
                32  12 + 4 
                     jl.       a0.       ;go to start 
          a1:   al   w2   0 
                jl.       h7.       ;end 
          a2:   0 
          e. 
                   e. 
          r 
          abed 123.,/ 
          finis 
           \f

          When the job is executed, the following output will appear: 
           
                         0 fpnames 0 type        output from 
                    slang ok 1/32/1              the SLANG assembler 
                      
                 
                 
                         a   97 
                b   98 
                c   99 
                d   100 

                    32    output from 
                1   49       the program 
                2   50 
                3   51 
                .   46 
                         ,   44 
&_              /   47 
 
                    
          E_x_a_m_p_l_e_ _7_._ 
          Many SLANG coded programs contain a table of am instructions,
          modifying an al instruction selecting a certain text or table. As
          an example consider the following construction: 
           
         T_                  ;texts for actions: 
                    t0: :text00':' 
                    t1: :text10':' 
                    . 
                    . 
                    . 
                    tN::textN0':' 
                   ;next action, prints some text and then continues 
                    n0:   am      t0-t1    ;w1:= addr text0 
                    n1:   am      t1-t2    ;w1:= addr text1 
                    . 
                    . 
                    . 
                    nN:   al.  w1 tN.      ;w1:= addr textN 
                    r0:   jl.  w3 d7.      ;call some procedure using the
                             ...                    ;data pointed at by w1 
         &_                  ... select next action ... 
 
                   An alternative - and often faster - solution to the same problem
          is to let a jl instruction select the table or text address: 
                     \f

                    n0:   jl. w1  r0., :text00':';w1:= addr text0 
                    n1:   jl. w1  r0., :text10':';w1:= addr text1 
                    . 
                    . 
                    . 
                    nN:   jl. w1  r0., :textN0':';w1:= addr textN 
                             ... 
                             r0:   jl. w3 d7.       ;... 
           
          E_x_a_m_p_l_e_ _8_._ 
          The following example shows a jump action that looks up and
          changes the catalog entry describing the result file. At the end
          the jump action decreases the program top with the size of the
          jump code, thus preventing it from being included in the final
                   program: 
                    
               b. a4                  ;begin 
          w. a0:   rs  w3  a3.   ;jump action: 
                   al. w1  a2.   ; 
                   rl  w3  x2+8  ; 
                   jd  111+42   ;look up entry (result name, tail, result),
                   se  w0  0     ;if result ' 0 
                   jl.     a1.   ;then terminate slang; 
                   - - - -;change tail as desired 
                   jd  111+44   ;change entry (result name, tail, result);
                   se  w0  0     ;if result ' 0 
                            jl.     a1.   ;then terminate slang; 
                   rl  w1  x2+0  ; 
                   al  w1  x1+a4 ;program top:= 
                   rs  w1  x2+0  ;program top - size of jump action; 
                   al  w2  0     ; 
          a1:      al  w0  0     ;  continue slang; 
                   jl.     (a3.) ; 
          a2:      0,  r.10      ;tail: 
          a3:      0             ;return address: 
                   jl.     a0.   ;entry point: 
          a4=a0.                 ;size of jump action: 
                   j.            ;  goto jump action; 
                                          ;end 
          k=a0 
                   e. 
                    
 
          E_x_a_m_p_l_e_ _9_._ 
          Identifiers may be defined or redefined inside a j. code by a
          jump to slangbase+10 
                \f

                         call                          return 
          w0        value                         destroyed 
          w1        id-letter12+id-index         destroyed 
          w2          -                           destroyed 
                   w3        link                          destroyed 
           
          If the identifier is undeclared, the procedure returns to link
          else to link+2 
           
                   The following example illustrates how the identifier a120 is
          defined (redefined) to the value 158, from a routine inside a
          jump code: 
           
          i0:       158                 ;value (a120) 
          i1:       9712+120           ;id:=a120; 
          i2:       0                   ;slang base, saved w2 at entry of 
                                        ;j. code, see section 3.4.5 
          ... 
                    rl.  w0  i0.        ; 
                    rl.  w1  i1.        ; 
                    rl.  w2  i2.        ; 
                    jl   w3  x2+10      ; 
                    jl.      e0.        ;error return: goto alarm 
                                        ;ok return: 
          ... \f

F_                 A_p_p_e_n_d_i_x_ _A_ 
 
          A_s_s_e_m_b_l_y_ _M_e_s_s_a_g_e_s_ 
          During assembly, certain control and error messages will be prin-
          ted on the current output medium. Most of these include the value
               of the load address k. This, in combination with a listing of iden-
          tifier values, facilitates the identification of trouble spots. 
           
          The following are normal CONTROL messages: 
           
          k' type 
                    The delimiter t. causes switching from a source file to
                    the currrent input medium. 
                
          message comment' 
                    The delimiter m. causes printing of a message comment. 
           
          ;k' id list 
          b.declaration' 
          id list' 
                    The delimiter i. causes printing of declarations and
                    identifier values local to the current block orseg- 
                         ment. 
                    
          k'no' address overflow: value' 
          k' address overflow: value' 
                    An address part has a value value' outside the range 
                    -2048 to 2047. The address part of a jd-instruction
                    can, however, lie in the range -2048 to 4095. Thus
                    monitor calls will not cause warnings during assembly. 
                            no' indicates the load address where this variable was
                    used as an erroneous address part. 
           
          k'no' half-word overflow: value' 
          k' half-word overflow: value' 
                    A half-word value is outside the range -2048 to 4095. 
                   no' indicates the load address where this variable was
                    used as an erroneous half-word. 
           
          slang ok slang segments'/half-words'/backing storage segments'
                    SLANG returns to the fp and sets the ok bit to true.
                    The size of the assembled program is expressed as the
                    number of SLANG segments, half-words, and backing
                    storage segments output. 
           \f

          During a call of the assembler the following messages can appear:
           
          ***slang param illegal parameter' 
                    Illegal parameter syntax. The parameter is ignored. 
                    
          ***slang work area connect result' 
                    The result file cannot be connected for output. Assem-
                bly is performed without binary output. 
                    
                   ***slang work area kind result' 
                    The kind of the result file is neither backing store
                    nor magnetic tape. Assembly is performed without binary
                         output. 
           
          During assembly, warnings are printed in the following cases: 
           
          k' cancel 
                    Input of a CAN character from typewriter causes all
                    previous characters on the current text line to be
                    skipped. 
           
          k' illegal character value' 
                    Input of a blind control character other than NUL, CR,
                    or DEL. 
                
          k' file mark 
                    Troubles encountered during output of final tape mark
                    on magnetic tape. 
           
          k' relative 
                    A relative identifier is used as address part in an
                    instruction without relative addressing. 
 
          k' repetition 
                    A repetition expression with a value less than 1. 
                    
          The following error messages cause everything up to next separa-
               tor to be skipped: 
           
          k' syntax 
                    Illegal structure of delimiters and operands. 
           
          k'identifier' declaration 
                    An identifier is declared twice in the same block head,
                    or a declaration index exceeds 4095. \f

               k'identifier' undeclared 
                    An identifier is used without being declared. 
           
                   k'identifier' definition 
                    An identifier that has been defined elsewhere by a
                    label or an assignment is redefined by a label within
                             the same block. 
 
                   k'identifier' undefined 
                    An identifier is undefined when an expression is eva-
                    luated; or an identifier declared outside of a segment
                         is undefined when it is used within the segment. 
                
          k' undefined at end 
                    One or more identifiers that have been used as half- 
words or words are undefined on exit from the block in
which they are declared. Each undefined identifier is
followed by the addresses at which it has been used. 
                
k' program too big 
          The binary output exceeds the capacity of the result
          file. Assembly continues without binary output. 
 
The following situations cause immediate termination of assembly:
 
k' stack 
          The size of the object code and the identifier table ex-
          ceeds the available internal store. This can be remedied
                    either by using a larger process during assembly or by
                      dividing the source program into segments. 
 
k' connect source file' 
          A source file cannot be connected for input. 
 
k' source unknown source file' 
          A source file cannot be found. 
 
k' connect source integer' 
          The SLANG parameter list does not contain a procedure
          source number integer'. 
                
k' no text source file' 
          A source file contains a character with a value ' 127. 
 \f

                   k' end source 
                    The last source file is empty before the logical pro-
                         gram end. The missing number of "z."s and "e."s are
generated by the assembler. 
          k' jump 
                    Working register 2 ' 0 on return from a jump action. 
           
          k' slang fault 
                    Caused by a programming error in the assembler. Please
                    send a listing of the source text and the assembly mes-
                         sages to Regnecentralen. 
           
          A_l_l_ error messages cause the following final assembly message: 
           
                             ***slang sorry number of errors'slang segments'/ 
                             half-words'/backing storage segments' 
           
          The ok-bit is only set to false if there was an error message.  
          If the source text is empty before a block begin (b. or s.) is
          read, the ok bit is also set to false and the assembly message
          is: 
                    ***slang no program 
           \f

F_                 A_p_p_e_n_d_i_x_ _B_ 
           
          R_C_ _8_0_0_0_ _I_n_s_t_r_u_c_t_i_o_n_ _s_e_t_ 
           
          Mne-     Nu- 
          monic                                            meric 
          C_o_d_e_                                             C_o_d_e_ 
          A_d_d_r_e_s_s_ _h_a_n_d_l_i_n_g_ 
           
                   am      Next Address, Modify                        9 
                   al      Address, Load                               11 
          ac      Address Complemented, Load                  33 
           
                  R_e_g_i_s_t_e_r_ _t_r_a_n_s_f_e_r_ 
           
          hl      Half Register, Load                         3 
          hs      Half Register, Store                        26 
          rl      Register, Load                              20 
          rs      Register, Store                             23 
          rx      Register and Memory Word, Exchange          25 
          dl      Double Register, Load                       54 
          ds      Double Register, Store                      55 
          xl      Exception Register, Load                    16 
          xs      Exception Register, Store                   27 
           
                  I_n_t_e_g_e_r_ _h_a_l_f_-_w_o_r_d_ _a_r_i_t_h_m_e_t_i_c_ 
           
          zl      Integer Half-word, Zero Load                19 
          el      Integer Half-word, Extend (and) Load        2 
          ea      Integer Half-word, Extend (and) Add         18 
          es      Integer Half-word, Extend (and) Subtract    17 
           
                  I_n_t_e_g_e_r_ _w_o_r_d_ _a_r_i_t_h_m_e_t_i_c_ 
           
          wa      Integer Word, Add                           7 
          ws      Integer Word, Subtract                      8 
          wm      Integer Word, Multiply                      10 
          wd      Integer Word, Divide                        24 
                    
                  I_n_t_e_g_e_r_ _d_o_u_b_l_e_-_w_o_r_d_ _a_r_i_t_h_m_e_t_i_c_ 
           
          aa      Integer Double-Word, Add                    56 
          ss      Integer Double-Word, Subtract               57 
           \f

F_                 Mne-     Nu- 
          monic                                             meric 
          C_o_d_e_                                             C_o_d_e_ 
                  A_r_i_t_h_m_e_t_i_c_ _c_o_n_v_e_r_s_i_o_n_ 
           
          ci      Convert Integer to Floating                 32 
                   cf      Convert Floating to Integer                 53 
           
                 F_l_o_a_t_i_n_g_-_p_o_i_n_t_ _a_r_i_t_h_m_e_t_i_c_ 
           
          fa      Floating, Add                               48 
          fs      Floating, Subtract                          49 
          fm      Floating, Multiply                          50 
          fd      Floating, Divide                            52 
           
                 L_o_g_i_c_a_l_ _o_p_e_r_a_t_i_o_n_s_ 
           
          la      Logical And                                 4 
          lo      Logical Or                                  5 
          lx      Logical Exclusive Or                        6 
           
                 S_h_i_f_t_ _o_p_e_r_a_t_i_o_n_s_ 
           
          as      Arithmetic Shift Single                     36 
          ad      Arithmetic Shift Double                     37 
          ls      Logical Shift Single                        38 
          ld      Logical Shift Double                        39 
          ns      Normalize Single                            34 
          nd      Normalize Double                            35 
           
                 S_e_q_u_e_n_c_i_n_g_ 
           
          jl      Jump with Register Link                     13 
          sh      Skip if Register High                       40 
                   sl      Skip if Register Low                        41 
          se      Skip if Register Equal                      42 
          sn      Skip if Register Not Equal                  43 
          so      Skip if Register Bits One                   44 
          sz      Skip if Register Bits Zero                  45 
          sx      Skip if No Exceptions                       46 
          sp      Skip if No Write Protection                 21 
          re      Return from Escape                          22 
           \f

F_                 Mne-     Nu- 
          monic                                             meric 
          C_o_d_e_                                             C_o_d_e_ 
                  M_o_n_i_t_o_r_ _c_o_n_t_r_o_l_ 
           
          je      Jump with Interrupt Enabled                 15 
                   jd      Jump with Interrupt Disabled                14 
          gp      General Register, Put                       47 
                 (unassigned)                                31 
          ri      Return from Interrupt                       12 
                 (unassigned)                                30 
               gg      General Register, Get                       28 
                 (unassigned)                                0 
                 (unassigned)                                51 
          do      Data Out                                    1 
          di      Data In                                     29 
                  (unassigned)                                58 
                  (unassigned)                                59 
                  (unassigned)                                60 
                  (unassigned)                                61 
                  (unassigned)                                62 
                  (unassigned)                                63 
           \f

F_                 A_p_p_e_n_d_i_x_ _C_ 
           
          R_C_ _4_0_0_0_ _I_n_s_t_r_u_c_t_i_o_n_ _s_e_t_ 
           
          Mne-     Nu- 
          monic                                            meric 
          C_o_d_e_                                             C_o_d_e_ 
          A_d_d_r_e_s_s_ _h_a_n_d_l_i_n_g_ 
                    
          am      Next Address, Modify                        9 
                   al      Address, Load                               11 
          ac      Address Complemented, Load                  33 
           
                 R_e_g_i_s_t_e_r_ _t_r_a_n_s_f_e_r_ 
           
          hl      Half Register, Load                         3 
          hs      Half Register, Store                        26 
          rl      Register, Load                              20 
          rs      Register, Store                             23 
          rx      Register and Memory Word, Exchange          25 
          dl      Double Register, Load                       54 
          ds      Double Register, Store                      55 
          xl      Exception Register, Load                    16 
          xs      Exception Register, Store                   27 
           
                I_n_t_e_g_e_r_ _h_a_l_f_-_w_o_r_d_ _a_r_i_t_h_m_e_t_i_c_ 
           
          bz      Integer Half-word, Zero Load                19 
          bl      Integer Half-word, Extend (and) Load        2 
          ba      Integer Half-word, Extend (and) Add         18 
          bs      Integer Half-word, Extend (and) Subtract    17 
           
                 I_n_t_e_g_e_r_ _w_o_r_d_ _a_r_i_t_h_m_e_t_i_c_ 
           
          wa      Integer Word, Add                           7 
          ws      Integer Word, Subtract                      8 
          wm      Integer Word, Multiply                      10 
          wd      Integer Word, Divide                        24 
                    
                I_n_t_e_g_e_r_ _d_o_u_b_l_e_-_w_o_r_d_ _a_r_i_t_h_m_e_t_i_c_ 
           
          aa      Integer Double-Word, Add                    56 
          ss      Integer Double-Word, Subtract               57 
           \f

F_          Mne-     Nu- 
          monic                                             meric 
          C_o_d_e_                                             C_o_d_e_ 
                           A_r_i_t_h_m_e_t_i_c_ _c_o_n_v_e_r_s_i_o_n_ 
           
          ci      Convert Integer to Floating                 32 
                   cf      Convert Floating to Integer                 53 
           
                 F_l_o_a_t_i_n_g_-_p_o_i_n_t_ _a_r_i_t_h_m_e_t_i_c_ 
           
          fa      Floating, Add                               48 
          fs      Floating, Subtract                          49 
          fm      Floating, Multiply                          50 
          fd      Floating, Divide                            52 
           
                 L_o_g_i_c_a_l_ _o_p_e_r_a_t_i_o_n_s_ 
           
          la      Logical And                                 4 
          lo      Logical Or                                  5 
          lx      Logical Exclusive Or                        6 
           
                 S_h_i_f_t_ _o_p_e_r_a_t_i_o_n_s_ 
           
          as      Arithmetical Shift Single                   36 
          ad      Arithmetical Shift Double                   37 
          ls      Logical Shift Single                        38 
          ld      Logical Shift Double                        39 
          ns      Normalize Single                            34 
          nd      Normalize Double                            35 
           
                 S_e_q_u_e_n_c_i_n_g_ 
           
          jl      Jump with Register Link                     13 
          sh      Skip if Register High                       40 
                   sl      Skip if Register Low                        41 
          se      Skip if Register Equal                      42 
          sn      Skip if Register Not Equal                  43 
          so      Skip if Register Bits One                   44 
          sz      Skip if Register Bits Zero                  45 
          sx      Skip if No Exceptions                       46 
          sp      Skip if No Write Protection                 21 
                   kl      Protection Key Load                         22 
           \f

F_                 Mne-     Nu- 
          monic                                             meric 
          C_o_d_e_                                             C_o_d_e_ 
                  M_o_n_i_t_o_r_ _c_o_n_t_r_o_l_ 
           
          je      Jump with Interrupt Enabled                 15 
                   jd      Jump with Interrupt Disabled                14 
          ic      Interrupt Bits Clear                        47 
                   is      Interrupt Register Store                    31 
                   ml      Mask Register Load                          12 
                   ms      Mask Register Store                         30 
                   pl      Protection Register Load                    28 
          ps      Protection Register Store                   29 
                   ks      Protection Key Store                        51 
                   io      Input Output                                1 
                   aw      Autoload Word                               0 
                  (unassigned)                                58 
                  (unassigned)                                59 
                  (unassigned)                                60 
                  (unassigned)                                61 
                  (unassigned)                                62 
                  (unassigned)                                63 
           \f

F_                 A_p_p_e_n_d_i_x_ _D_ 
            
           T_h_e_ _S_L_A_N_G_ _s_y_n_t_a_x_ 
            
           The method employed to describe the SLANG syntax is the widely 
           used Backus notation. A short description of the meaning of the
          symbols used is given in the following: 
            
           name'    the symbols "'" indicate that "name" is the name of a
                     class of marks and that in a given situation "name" is
                     replaced by a member of the name class. 
             
              /       means OR 
            
           ::=       this symbol means that, in a specific situation, that
                     to the left of the symbol should be replaced by a mem-
                     ber(s) of its class given on the right-hand side of
                     the symbol. In other words, by doing this, we go from
                     the general to the specific. 
            
           Look below at the syntax of the character set. Here digit'
           describes a class and the marks  0 1 2 3 4 5 6 7 8 9  are all
           members of this class. 
            
           This also illustrates the meaning of the ::= sign. In moving
           from left to right in the description we go from the general to
           the specific; e.g. 4 is a specific member of the digit class. 
            
           In writing instructions blanks can be used as required as SLANG
           is position independent. 
            
           1_._ _C_h_a_r_a_c_t_e_r_ _S_e_t_ 
            
                  S_y_n_t_a_x_ 

           assembly character'::= digit'/letter'/special character'/ 
                                  space'/new line' 
            digit'::= 0/1/2/3/4/5/6/7/8/9 
            
           letter'::=  
                 a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/æ//å/ 
                    A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/Æ//Å 
            \f

  T_       special character'::= 
                   "/ /</%/&//(/)/*/+/,/-/./slash'/:/;//=/'/?/@// _/ 
                  >/ /apostrophe' 
&_         
           S_e_m_a_n_t_i_c_s_ 
          SLANG accepts a subset of ISO-7 bit character set consisting of
          all grahics plus the layout character space, new line, vertical
          tabulation, and form feed. All other ISO characters are treated
          as blind symbols. 
           
          Outside a textstring, SLANG does not distinguish between small
          letters and capital letters, and all spaces are ignored. 
           
           space'::= SP' 
            
           new line'::= NL'/VT'/FF' 
            
           2_._ _N_u_m_b_e_r_s_ 
            
                   S_y_n_t_a_x_ 
   
           number'::= real number'/integer'/radix number' 
            real number'::= decimal number'/exponent'/decimal number' exponent'
           decimal number'::= integer'/fraction'/integer'fraction' 
           fraction'::= .unsigned integer' 
           exponent'::= integer' 
           radix number'::= radix'unsigned integer' 
            radix'::= unsigned integer'. 
  integer'::= unsigned integer'/+unsigned integer'/-unsigned integer' 
            unsigned integer'::= digit'/unsigned integer'digit' 
           
            S_e_m_a_n_t_i_c_s_ 
           SLANG accepts three types of numbers: real numbers, integer num-
          bers and radix numbers. R_e_a_l_ _n_u_m_b_e_r_s_ and i_n_t_e_g_e_r_ _n_u_m_b_e_r_s_ have
          their conventional meaning. The exponent part of a real number is
          expressed as an integral power of 10. R_a_d_i_x_ _n_u_m_b_e_r_s_ are expressed
          as a radix followed by a digitstring, for example, 2.110111 (a
          binary number) or 8.4357 (an octal number). The radix can be
          greater than 9, but in any case the number is converted digit by
          digit as follows: 
                     number:=radixD*Unumber+digit 
            \f

T_         E_x_a_m_p_l_e_s_ 
                   Real:     33        +4956    -0.67     +8 
           Integer:  225       +17       -588      0 
           Radix:    2.101     5.3241    8.4692 
        &_          
           3_._ _I_d_e_n_t_i_f_i_e_r_s_ 
          
        S_y_n_t_a_x_
         
          identifier'::= declared identifier'/load address' 
         declared identifier'::= identifier letter'unsigned integer' 
         identifier letter'::= a/b/c/d/e/f/g/h/i/j/l/m/n/.../v 
         load address'::= k 
            
           S_e_m_a_n_t_i_c_s_ 
           An i_d_e_n_t_i_f_i_e_r_ is a symbolic name given either to a s_t_o_r_a_g_e_ l_o_-
           c_a_t_i_o_n_ in the object program or to the value of an e_x_p_r_e_s_s_i_o_n_
           evaluated by the assembler. 
            
           L_o_a_d_ _A_d_d_r_e_s_s_ 
           The letter k is a reserved identifier for the l_o_a_d_ _a_d_d_r_e_s_s_ of the
           current half-word or word. k is initialized to zero before assemb-
          ly. 
            
        T_         E_x_a_m_p_l_e_s_ 
                     k         a0        d25       hl23 
        &_          
           4_._ _E_x_p_r_e_s_s_i_o_n_s_ 
           
            S_y_n_t_a_x_ 

            expression'::= sign'term'/expression'operator'term' 
            term'::= operand'/(:expression':) 
            operator'::= +/-/*/slash'//'/a./o. 
  sign'::= empty'/+/- 
            operand'::= unsigned integer'/radix number'/identifier'/ 
                       relative identifier' 
          relative identifier'::= declared identifier'. 
             
            S_e_m_a_n_t_i_c_s_ 
          An e_x_p_r_e_s_s_i_o_n_ specifies the computation of an integer value
          during assembly. All o_p_e_r_a_n_d_s_ and intermediate results are
          evaluated as 24-bit integers. 
             
            I_d_e_n_t_i_f_i_e_r_s_ 
            An identifier used as a computational operand must have a value
           when the expression is evaluated, i.e. it must be defined either
           by a previous expression or through its use as a label. \f

                   An identifier followed by a period is evaluated r_e_l_a_t_i_v_e_l_y_ to the
           current load address. For example the value of b2. is b2-k 
           
          O_p_e_r_a_t_o_r_s_ 
          The arithmetic o_p_e_r_a_t_o_r_s_ + - * / have their conventional meanings
          of a_d_d_i_t_i_o_n_, s_u_b_t_r_a_c_t_i_o_n_, m_u_l_t_i_p_l_i_c_a_t_i_o_n_ and d_i_v_i_s_i_o_n_. The s_h_i_f_t_
          operators  and ' shift the left-hand operand logically left or 
          right the number of bit positions specified by the right-hand
          operand. The Boolean operators a. and o. form the a_n_d_ and o_r_
          combinations of the two operands bit by bit. 
           
          P_r_e_c_e_d_e_n_c_e_ _o_f_ _O_p_e_r_a_t_o_r_s_ 
          The sequence of operations in evaluating an expression is from
          left to right subject to the following rules of p_r_e_c_e_d_e_n_c_e_ among
          the operators: 
                    first:     ' 
                    second:   * / 
                    third:    + - 
                    fourth:   a. 
                    fifth:    o. 
           
          This can be overruled, however, by the use of p_a_r_e_n_t_h_e_s_e_s_ (:and:)
             
         T_        E_x_a_m_p_l_e_s_ 
                    -a5 
                    k + 128 
                    2.101120+618+g4. 
                    (:(:c35 - c0:)/5:)3 o. 6.323 
         &_         
        5_._ _I_n_s_t_r_u_c_t_i_o_n_s_ 
         
          S_y_n_t_a_x_ 
 
        instruction'::= operation part'address part' 
        operation part'::= 
         operation code'relative mode'W register'indirect mode'Xregister'
                operation code'::= 
                       aa/ac/ad/al/am/as/ba/bl/bs/bz/cf/ci/di/dl/do/ds/RC 4000 
fa/fd/fm/fs/gg/gp/hl/hs/jd/je/jl/la/ld/lo/ls/lx/see 
nd/ns/re/ri/rl/rs/rx/se/sh/sl/sn/so/sp/ss/sx/sz/app. D 
wa/wd/wm/ws/xl/xs 
                 relative mode'::= empty'/. 
        W register'::= empty'/w0/w1/w2/w3 
        indirect mode'::= empty'/( 
          X register'::= empty'/x1/x2/x3/
         address part'::= empty'/expression' \f

          S_e_m_a_n_t_i_c_s_ 
           
                   O_p_e_r_a_t_i_o_n_ _P_a_r_t_ 
The o_p_e_r_a_t_i_o_n_ _p_a_r_t_ of an instruction is assembled as a 12-bit
half-word. It must begin with one of the m_n_e_m_o_n_i_c_ _c_o_d_e_s_ listed in
          Appendix B; m_o_d_i_f_i_c_a_t_i_o_n_s_ may follow in any order. If no modifi-
          cations are specified, w0, and direct addressing are understood. 
           
          A_d_d_r_e_s_s_ _P_a_r_t_ 
          The a_d_d_r_e_s_s_ _p_a_r_t_ of an instruction is evaluated by an e_x_p_r_e_s_s_i_o_n_
          and assembled as a 12-bit half-word. It must be confined to the
          r_a_n_g_e_: 
                    -2048= address part= 2047 
          An empty address part is loaded as a zero. 
           
          I_n_d_i_r_e_c_t_ _A_d_d_r_e_s_s_i_n_g_ 
          For aesthetic reasons, SLANG permits the programmer to terminate
          an indirect address by a right parenthesis ). This is a blind
          symbol however. 
           
          E_x_a_m_p_l_e_s_ 
          Operation parts: 
                    ac 
                    rl w0 
                    jd x3 
                    zl. w3 (x2) 
          Instructions: 
                    sz w1 2.1110 
                    jl  e55 
                    wa. w3  (x1+f15.) 
                    ls w0 24-(:c1-c1/24*24:) 
           
                   The RC 8000 will also accept the instructions bl, bs, bz, ba from
          the RC 4000 instructions set. 
           
          6_._ _T_e_x_t_s_t_r_i_n_g_s_ 
            
            S_y_n_t_a_x_ 
             
           text'::= :textstring':' 
          textstring'::= text character'/textstring'text character' 
          text character'::= assembly character'/numerical character' 
         numerical character'::= unsigned integer'' 
            \f

          S_e_m_a_n_t_i_c_s_ 
           
          I_n_t_e_r_n_a_l_ _R_e_p_r_e_s_e_n_t_a_t_i_o_n_ 
          The characters between the delimiters : and :' are stored in
          consecutive words with 3 characters per word. Each character will
          be represented by its 7-bit numerical representation defined in
          Appendix F. Unused character positions at the end of the last
          word are filled with NULL characters. 
           
          B_l_i_n_d_ _C_h_a_r_a_c_t_e_r_s_ 
          All unprintable characters are ignored by SLANG. They can, how-
          ever, be included in textstrings by means of the numerical no-
          tation described below. 
           
          N_u_m_e_r_i_c_a_l_ _C_h_a_r_a_c_t_e_r_s_ 
          An unsigned integer enclosed in the brackets  and ' is inter-
          preted as an 8-bit character with a numerical representation
          defined by the integer modulo 256. 
           
          This notation can be used to specify c_o_n_t_r_o_l_ _c_h_a_r_a_c_t_e_r_s_ in a
          textstring. For example: 
                    null         :0':' 
                    acknowledge:6':' 
          SLANG interpretes the pair :' as a text terminator, and the
          character  followed by a digit as the beginning of a numerical
          character. The numerical notation can be used to include these
          symbols in the assembled textstring: 
                   :'      :58'62':' 
                   6'     :60'6':' 
           
          E_x_a_m_p_l_e_s_ 
                   :syntax error0':' 
                   :This text includes a 
                     New Line character:' 
                   :too big10'try again:' 
           
          7_._ _D_i_r_e_c_t_i_v_e_s_ _a_n_d_ _C_o_m_m_e_n_t_s_ 
           
         directive'::= 
               m./b./s./e./h./w./f./r./c./z./i./t./n./p./u./l./d./j. 
                   end line'::= new line'/;line comment'new line'/ 
               m.line comment'new line' 
          line comment'::= any string not containing a new line' 
           \f

          S_e_m_a_n_t_i_c_s_ 
          Directives have no effect on the binary code produced but
          controls only the assembly, see 3.4.4. 
           
          Comments can be included in the program following the delimiter
          m. or a semicolon. This causes everything up to a new line to be
          ignored. 
                    
          Comments following the delimiter m. are messages which are
          displayed on the output medium during assembly. 
           \f

F_                 A_p_p_e_n_d_i_x_ _E_
                   
           D_e_b_u_g_g_i_n_g_ _o_f_ _S_L_A_N_G_-_p_r_o_g_r_a_m_s_
 
           The illegal instruction 
                     ks   address' 
           with a negative address results in test output: The interrupt is
trapped by the FP BREAK ROUTINE which issues the test output on
current output instead of the normal "break" text. After printing
the test output FP restores the registers and returns to the in-
struction following the key store instruction i.e. the program
continues as if nothing had happened. 
            
           The test output contains instruction counter, working registers
and exception registers. Not only value but also 
                     value - absolute address of FP START 
           is given. If the value in question is an absolute primary storage
          address this difference is the address relative to FP START (i.e.
          the k-value) of the location addressed. Test output inside a
                   procedure may for instance tell where the procedure was called
             from. 
            
           Warning: Test output cannot be used inside a private block
procedure in the program. 
            
           E_x_a_m_p_l_e_:_ 
                 
                     r = set 100 
                      r = slang type.yes 
                             s.w.
                      p.:fpnames:'  k=h55  0,0 
                     al  w0  0 
                     al  w1  1 
                     al  w2  2 
                     al  w3  3 
                    ks     -1 
                    al  w2  0 
                    jl.     h7. 
                     e. 
                    e. 
                    r 
             \f

T_                 This program will produce following output: 
           
                    3         0   fpnames 
                  102         0   type 
                  slang      ok   1/18/1 
           
                  * breakpoint    -1 
           
                    w0        0   -142002 
                    w1        1   -142001 
                    w2        2   -142000 
                    w3        3   -141999 
                    ex        1   -142001 
                    ic   143552      1550 
           
&_          end  4  1977.11.29   11.40.18 
           \f

F_                 A_p_p_e_n_d_i_x_ _F_ 
           
          T_h_e_ _I_S_O_ _7_-_B_i_t_ _C_h_a_r_a_c_t_e_r_ _S_e_t_ 
           
          The character set contains 128 7-bit characters. In the numerical
          representation of any one character the bits are identified by: 
      
                              b7 b6 b5 b4 b3 b2 b1 
           
          which have the following significance in the binary system: 
           
                              64 32 16  8  4  2  1 
           
          In the code table below the columns and rows are identified by
          the decimal equivalent of the following binary numbers: 
           
                    column:   b7 b6 b5  0  0  0  0 
                    row:      0  0  0  b4 b3 b2 b1 
           
          Accordingly, the decimal value of a character is the sum of the
          column and row numbers. For instance, the character H has the
          numerical representation 64 + 8 = 72. Empty positions in the code
          table specify characters that are ignored by SLANG. \f

T_           
                         0    16   32   48   64   80   96   112 
           
          0              SP   0    @    P         p 
           
               1              !    1    A    Q    a    q 
                    
               2              "    2    B    R    b    r 
           
                        3             >    3    C    S    c    s 
           
               4             <    4    D    T    d    t 
           
               5             %    5    E    U    e    u 
           
               6             &    6    F    V    f    v 
           
               7                 7    G    W    g    w 
           
               8             (    8    H    X    h    x 
           
               9        EM   )    9    I    Y    i    y 
           
              10   NL        *    :    J    Z    j    z 
           
              11   VT        +    ;    K    Æ    k    æ 
           
              12    FF        ,        L    Ø    l    ø 
           
              13              -    =    M    Å    m    å 
           
              14              .    '    N        n     
           
              15              /    ?    O    _    o 
&_                  \f

                   A_p_p_e_n_d_i_x_ _G_ 
           
          S_u_r_v_e_y_ _o_f_ _I_n_s_t_r_u_c_t_i_o_n_s_ 
           
                   In the following a short description of the common instructions
          is given. A complete description can be found in the "Reference
          Manual". 
           
                   In the description it is assumed that working register 3 (w3) is
          stated in the instruction. The effective address is stated as
          "addr". The construction word (addr) means "the contents of the
          word with address addr". 
           
          A_d_d_r_e_s_s_ _I_n_s_t_r_u_c_t_i_o_n_s_ 
           
          al   address load             w3:= addr 
          ac   address complemented     w3:= - addr 
          am   address modify           see section 2.1.3 
           
           
          T_r_a_n_s_f_e_r_ _b_e_t_w_e_e_n_ _M_e_m_o_r_y_ _a_n_d_ _R_e_g_i_s_t_e_r_s_ 
           
          rl   register load            w3:= word (addr) 
          rs   register store           word (addr):= w3 
          rx   register exchange        change (w3, word (addr)) 
          dl   double load              w2, 23:= doubleword (addr) 
          ds   double store             doubleword (addr):= w2, w3 
          hl   half load                w3 (12-23):= halfword (addr) 
          hs   half store               halfword (addr):= w3 (12-23) 
          el   extend load              w3 (12-23):= halfword (addr) 
                                        w3 (0-11):= sign (halfword(addr)) 
          zl   zero load                w3 (12=23):= halfword (addr) 
                                        w3 (0-11):= 0 
           
           
          I_n_t_e_g_e_r_ _A_r_i_t_h_m_e_t_i_c_ 
           
          wa   word add                 w3:= w3 + word (addr) 
          ws   word subtract            w3:= w3 - word (addr) 
          wm   word multiply            w2, w3:= w3 D*U word (addr) 
          wd   word divide              w3:= w2, w3// word (addr) 
                                        w2:= w2, w3 mod word (addr) 
           
          aa   double add               w2, w3:= w2, w3 + doubleword (addr)
          ss   double subtract          w2, w3:= w2, w3 - doubleword (addr)\f

                   ea   extend add               w3:= w3 + extend halfword (addr) 
          es   extend subtract          w3:= w3 - extend halfword (addr) 
           
           
          F_l_o_a_t_i_n_g_ _P_o_i_n_t_ _A_r_i_t_h_m_e_t_i_c_ 
           
          fa   floating add             w2, w3:= w2, w3 + doubleword (addr)
          fs   floating subtract        w2, w3:= w2, w3 - doubleword (addr)
          fm   floating multiply        w2, w3:= w2, w3 D*U doubleword (addr)
          fd   floating divide          w2, w3:= w2, w3/ doubleword (addr) 
          ci   convert integer          w2, w3:= float (w3 2 D**U addr) 
          cf   convert floating         w3:= round (w2, w3 D*U 2D**U addr)
           
           
          B_i_t_ _P_r_o_c_e_s_s_i_n_g_ 
           
          la   logical and              w3:= w3 and word (addr) 
          lo   logical or               w3:= w3 or word (addr) 
          lx   logical exclusive or     w3:= w3 exor word (addr) 
           
           
          S_h_i_f_t_ _O_p_e_r_a_t_i_o_n_s_ 
           
          ls   logical single           w3:= w3 shift addr 
          ld   logical double           w2, w3:= shift addr 
          as   arithmetical single      w3:= w3 D*U 2D**U addr 
          ad   arithmetical double      w2, w3:= w2, w3 D*U 2D**U addr 
           
           
          J_u_m_p_ _a_n_d_ _S_k_i_p_ _I_n_s_t_r_u_c_t_i_o_n_s_ 
           
          jl   jump with link           w3:= IC; IC:= addr 
          se   skip equal               if w3 = addr then IC:= IC + 2 
          sn   skip not equal           if w3 ' addr then IC:= IC + 2 
          sh   skip higher              if w3 ' addr then IC:= IC + 2 
          sl   skip less                if w3  addr then IC:= IC + 2 
          so   skip ones                if w3 and addr = addr then IC:= IC + 2
          sz   skip zeroes              if w3 and addr = 0 then IC:= IC + 2
                   sx   skip if no exception     if EX and addr = 0 then IC:= IC + 2
           \f

                   A_p_p_e_n_d_i_x_ _H_ 
           
          R_e_f_e_r_e_n_c_e_s_:_ 
           
           
          1.        RC 8000 MONITOR, PART 2 
                             Reference Manual 
                    RCSL No: 31-D477                       January 1978 
           
          2.        SYSTEM 3 UTILITY PROGRAMS 
                    Part Three 
                    RCSL No: 31-D379                        November 1975 
           
                   3.        CODE PROCEDURES AND 
                    RUN TIME ORGANIZATION OF ALGOL 5 PROGRAMS 
                    RCSL No: 31-D199                        August 1972 
           
                             RC 8000 COMPUTER REFERENCE MANUAL 
                    RCSL No: 31-D383                        January 1976 
           
                    RC 4000 COMPUTER REFERENCE MANUAL 
                    RCSL No: 55-D1                          June 1969 \f

                   INDEX 
           
           
          address 
                        calculation                                  1.3 
               direct                                       1.3, 3.2.1 
               effective                                    1.1, 3.2.1 
               indirect                                     1.3, 3.2.2 
               indirect relative                            1.3 
               indexed                                      3.2.3 
               relative                                     1.3, 3.2.4 
               symbolic                                     3.2.1 
                
                   arithmetic operator                               3.3.4 
                
               ' 
               * 
               / 
               + 
               - 
               a. 
               & 
               o. 
               ! 
                
                   assembly parameters                               3.6 
               entry 
               lines 
               list 
               message 
               names 
               proc 
               type 
               warning 
               xref 
                
                   assignment (see explicit definition) 
                   D-field                                           1.3 
                   data format                                       1.1 
                    
          directives 
               ;                                            3.4.4, 3.1.1 
               m.                                           3.4.4 
               b.s.e.                                       3.1.2, 3.4.4 
               h.w.f.                                       3.1.3, 3.4.4 \f

                        r.                                           3.4.4 
               c.z.                                         3.4.4 
               i.                                           3.4.4 
               t.n.                                         3.4.4 
               p.u.                                         3.4.4 
               l.d.                                         3.4.4 
               j.                                           3.4.4, 3.4.5 
                
                displacement                                      1.3 
          double register                                   1.2 
          exception register                                2.9.3 
          explicit difinition                               3.3.5, 3.4 
          exponent                                          1.1 
          F-field                                           1.3 
          file processor                                    3.8 
          fpnames                                           3.9 
          fraction                                          1.1 
          h-names                                           3.8 
          insert identifiers                                3.4.5 
          insertproc                                        3.9 
           
          Instructions 
               aa                                           2.3.5 
               ac                                           2.1.2 
               ad                                           2.6.2 
                        al                                           2.1.1 
               am                                           2.1.3 
               as                                           2.6.1 
               cf                                           2.4.6 
               ci                                           2.4.5 
               dl                                           2.2.5 
               ds                                           2.2.6 
               ea                                           2.3.7 
               el                                           2.2.2 
               es                                           2.3.8 
               fa                                           2.4.1 
                        fd                                           2.4.4 
               fm                                           2.4.3 
               fs                                           2.4.2 
               hl                                           2.2.7 
               hs                                           2.2.8 
               jd                                           2.7.2 
               jl                                           2.7.1 
               la                                           2.5.1 
               ld                                           2.6.4 \f

               lo                                           2.5.2 
               ls                                           2.6.3 
               lx                                           2.5.3 
               nd                                           2.4.8 
               ns                                           2.4.7 
               rl                                           2.2.1 
               rs                                           2.2.4 
               rx                                           2.2.9 
               se                                           2.8.1 
               sh                                           2.8.4 
               sl                                           2.8.3 
               sn                                           2.8.2 
               so                                           2.9.1 
               ss                                           2.3.6 
               sx                                           2.9.3 
               sz                                           2.9.2 
               wa                                           2.3.1 
               wd                                           2.3.4 
               wm                                           2.3.3 
ws                                           2.3.2 
               xl                                           2.2.10 
xs                                           2.2.11 
zl                                           2.2.3 
          
                   index register                                    1.2 
          instruction format                                1.3 
          jump instructions                                 1.6, 2.7.1 
          M-field                                           1.3 
          modify next address                               1.7 
          New Line                                          3.1.1 
          overflow                                          2.9.3 
          priority of operators                             3.3.4 
          program top                                       3.4.5 
          radix                                             3.3.4 
          result name address                               3.4.5 
          stack top                                         3.4.5 
          standard names                                    3.3.1 
               s0 
               s1 
               s2 
               s3 
               s4 
          tail                                              3.9 
          W-field                                           1.3 
          working register                                  1.2 
          X-field                                           1.3 \f

                                                 i 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  GENERAL DESCRIPTION ...................................   1 
              1.1  Chassis ..........................................   1 
              1.2  Cardcage SBC604 ..................................   1 
              1.3  Power Supplies ...................................   1 
              1.4  Switches etc. ....................................   1 
           
          Assembly drawing ..........................................   2 
          Multibus Chassis, Diagram .................................   3 
          Bus Signals (P1) ..........................................   4 
          Bus Signals (P2) ..........................................   5 
          Backplane Layout ..........................................   6 
           \f

                                                ii 
           \f

         1_._ _ _ _ _ _ _ _ _G_E_N_E_R_A_L_ _D_E_S_C_R_I_P_T_I_O_N_    1.1
           
1_._1_ _ _ _ _ _ _ _C_h_a_s_s_i_s_ 1.1
           
          Made of electroplated steel and aluminium, fitted with two fans
          and telescope slides. Width = 19", height = 3.5". 
           
           
1_._2_ _ _ _ _ _ _ _C_a_r_d_c_a_g_e_ _S_B_C_ _6_0_4_ 1.2
           
          Contains 4 slots for Multibus adapter cards, placed horizontally.
          The cards can be locked into position. The Multibus backplane has
          4 connectors (J2, J3, J4, and J5) connected to the bus-out edge
          connector. Connector P2 is not fitted. Should be fitted if signal
          ACLO is wanted. 
           
           
1_._3_ _ _ _ _ _ _ _P_o_w_e_r_ _S_u_p_p_l_i_e_s_ 1.3
           
          The chassis is fitted with the control module POW738 and one +5V
          power module POW729 (max. 20A). The +5V module should always be
          mounted in the top right position. 
           
          The two left positions can be used for +/-12V and -5V power
          modules.  
           
          DO NOT WORK ON POWER SUPPLIES WITH POWER ON! 
           
           
1_._4_ _ _ _ _ _ _ _S_w_i_t_c_h_e_s_ _e_t_c_. 1.4
           
          I-O: Mains Switch (Power) 
          INIT: Reset 
          LED: Power OK 
          Voltage Adj., Reset and PINT, see powersupply manual.  
           \f

                    
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
                                  Assembly Drawing. 
           
           \f

                    
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          O-R21327                  Multibus Chassis Diagram. 
           
           \f

                    
           \f

                    
           \f

                    
           \f

                                                 i 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  DESCRIPTION ...........................................   1 
           
          Power Supply for Diskette Drive, POW740 ...................   2 
          RC899 Cable Lay Out .......................................   3 
          Connection 8" Disc Drive to RC equipment ..................   4 
           \f

                                                ii 
           \f

         1_._ _ _ _ _ _ _ _ _D_E_S_C_R_I_P_T_I_O_N_ 1.
           
          This paper contains the circuit diagram for the POW740 power
          supply used to supply the RC762 Floppy disk drive to RC702
          microcomputer system.  
           
          The paper also contains a description of the cable connecting the
          floppy disk to RC702.  
           \f

                    
           \f

                    
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
                                RC899 Cable Lay Out. 
           
           \f

                    
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
                             Connection 8" Disc Drive to RC equipment. 
           
           \f

                                                 i 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
                    
          1.  INTRODUCTION ...........................................   1 
              1.1  Scope of the Manual ...............................   1 
           
          2.  AN ILLUSTRATIVE EXAMPLE ................................   2 
           
          3.  REQUESTS TO THE MASTER .................................   4 
              3.1  Block Types .......................................   4 
              3.2  Request and Answer Formats ........................   5 
                   3.2.1  Open Link ..................................   5 
                   3.2.2  Close Link .................................   5 
                   3.2.3  Open File ..................................   6 
                   3.2.4  Close File .................................   6 
                   3.2.5  Get Page ...................................   6 
                   3.2.6  Put Page ...................................   7 
                   3.2.7  Create File ................................   8 
                   3.2.8  Delete File ................................   8 
                   3.2.9  Rename File ................................   8 
           
           
          A_P_P_E_N_D_I_C_E_S_: 
           
          A.  REFERENCES .............................................   9 
           
          B.  ERROR CODES ............................................  10 
           \f

                                                 ii 
           \f

         1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_                                                     1.
           
          The RC700 Master/Slave System is used for connecting a Master
          computer with a number of (RC700) slave computers. The slaves are
          physically connected to the master through one or more LIS701
          Line Selectors 1. 
           
          The main objective of a Master/Slave configuration is the ability
          to share common resources. It should, however, be noted that
          sharing of resources is limited to sharing of resources residing
          at the Master computer. This is due to the unsymmetrical nature
          of the Line Selector. Consequently, communication between slave
          and master consists of slave requests to the master followed by
          master answers. 
           
           
    1_._1_ _ _ _ _ _ _ _S_c_o_p_e_ _o_f_ _t_h_e_ _M_a_n_u_a_l_    1.1
           
          The scope of the present manual is rather limited. It does by no
          means give complete information on Master/Slave communications. 
           
          Reasons for this are that many of the software components which
          the present Master/Slave system relies upon (file system, imple-
          mentation language, etc.) are liable (in fact certain) to be
          changed in the near future. 
           
          Therefore, descriptions are limited to data formats for requests
          (to the master) and answers (from the master), since these for-
          mats hopefully will remain unchanged. 
           
          Information concerning 
           
               - point-to-point communication protocols, 
               - interfaces to other software components of both master and
                 slave systems, 
           
          are thus not included in this description. 
           
           \f

F_       2_._ _ _ _ _ _ _ _ _A_N_ _I_L_L_U_S_T_R_A_T_I_V_E_ _E_X_A_M_P_L_E_ 2.
           
          Below is given a brief outline of the block transfers involved in
          a typical "session" between a slave and its master. The slave
          opens a file, reads a page and finally closes the file. 
           \f

F_                                   Line Selector 
                                      reserved 
                    SLAVE                              MASTER 
                                    _ _ _ _ _ _ _ _ _ _ _ _ 
             Reserve LIS 
                Open Link 
                                                     Return free link number
             Release LIS            _ _ _ _ _ _ _ _ _ _ _ _ 
                  .                      . 
                  .                      . 
                  .                      . 
                                    _ _ _ _ _ _ _ _ _ _ _ _ 
             Reserve LIS 
                Open file                             (open file in Master)
                                                     Return answer 
             Release LIS            _ _ _ _ _ _ _ _ _ _ _ _ 
                  .                      . 
                  .                      . 
                  .                      . 
                                    _ _ _ _ _ _ _ _ _ _ _ _ 
             Reserve LIS 
                Read page                             (read page on file) 
                                                     Return page 
             Release LIS            _ _ _ _ _ _ _ _ _ _ _ _ 
                  .                      . 
                  .                      . 
                  .                      . 
                                    _ _ _ _ _ _ _ _ _ _ _ _ 
             Reserve LIS 
                Close file                            (close file) 
                                                     Return answer 
             Release LIS            _ _ _ _ _ _ _ _ _ _ _ _ 
                  .                      . 
                  .                      . 
                  .                      . 
                                    _ _ _ _ _ _ _ _ _ _ _ _ 
             Reserve LIS 
                Close Link 
                                                     Return answer 
             Release LIS            _ _ _ _ _ _ _ _ _ _ _ _ 
           \f

F_       3_._ _ _ _ _ _ _ _ _R_E_Q_U_E_S_T_S_ _T_O_ _T_H_E_ _M_A_S_T_E_R_ 3.
           
          This chapter gives detailed information on the format of (1) the
          data-blocks which a slave may transmit to a master, and (2) the
          resulting answer-blocks from the master to the slave. 
           
           
3_._1_ _ _ _ _ _ _ _B_l_o_c_k_ _T_y_p_e_s_ 3.1
           
          Below a number of types are defined. They are to be used in the
          following paragraphs. Please refer to 2 for the exact memory
          layout for the individual types. 
           
          HEADERTYPE = RECORD 
                         opcode, 
                         result, 
                         unused, 
                         linkno: byte 
                       END 
           
          IOARG =      RECORD 
                         header: HEADERTYPE; 
                         path:   ARRAY (1..32) OF char; 
                         entry:  ARRAY (1..32) OF byte; 
                         access: SET OF (read, write, exclusive); 
                         unused1, 
                         amount: integer; 
                         unused2: byte 
                       END; 
           
          BUFFERHEAD = RECORD 
                         header: HEADERTYPE 
                         first, last, next: integer; 
                         pageno, 
                         unused1, 
                         amount, 
                         unused2: integer 
                       END; 
           \f

                   BUFFERTYPE = RECORD 
                         bufhead: BUFFERHEAD 
                                  data:    ARRAY (14..525) OF byte 
                                END; 
 
 
         3_._2_ _ _ _ _ _ _ _R_e_q_u_e_s_t_ _a_n_d_ _A_n_s_w_e_r_ _F_o_r_m_a_t_s_                                          3.2
           
         (Result codes may be found in appendix B). 
 
 
3_._2_._1_ _ _ _ _ _O_p_e_n_ _L_i_n_k_   3.2.1
           
          R_e_q_u_e_s_t_: 
             Blocktype is HEADERTYPE (cf. section 3.1). 
             .opcode: 10. 
           
          A_n_s_w_e_r_: 
             Blocktype is HEADERTYPE 
             .result: Result code 
             .linkno: A free link number to be used in subsequent requests.
              
              
3_._2_._2_ _ _ _ _ _C_l_o_s_e_ _L_i_n_k_ 3.2.2
              
          R_e_q_u_e_s_t_ 
             Blocktype is HEADERTYPE 
             .opcode: 11. 
             .linkno: The link number to be closed. 
              
          A_n_s_w_e_r_ 
             Blocktype is HEADERTYPE 
             .result: Result code. 
              
              \f

3_._2_._3_ _ _ _ _ _O_p_e_n_ _F_i_l_e_ 3.2.3
              
          R_e_q_u_e_s_t_ 
             Blocktype is IOARG 
             .header.opcode: 6 
             .header.linkno: The linknumber representing the file. 
             .path: The name of the file to be opened. 
             .access: Designates the wanted use-mode of the file. 
              
                   A_n_s_w_e_r_ 
             Blocktype is IOARG 
             .header.result: Result code. 
             .entry: may contain various status information concerning the
                     opened file (optional). 
              
              
3_._2_._4_ _ _ _ _ _C_l_o_s_e_ _F_i_l_e_ 3.2.4
              
          R_e_q_u_e_s_t_ 
             Blocktype is HEADERTYPE 
             .opcode: 20. 
             .linkno: The link number representing the file to be closed. 
              
          A_n_s_w_e_r_ 
             Blocktype is HEADERTYPE 
             .result: Result code. 
              
              
3_._2_._5_ _ _ _ _ _G_e_t_ _P_a_g_e_                                                            3.2.5
              
          The following information is valid for backing storage files
          only: 
              
          R_e_q_u_e_s_t_ 
             Blocktype is BUFFERHEAD 
             .header.opcode: 21. 
             .header.linkno: The link number representing the file from
                             which the page should be read. 
             .first,.last and .next: Defines the accessible area of the
                             buffer to be returned, according to the driver
                             conventions of 3. \f

             .pageno: The logical page number (within the file - pages
                             numbered from 2 and up) of the page to be
                             read. 
                              
                   A_n_s_w_e_r_ 
             Blocktype is BUFFERTYPE 
             .header.result: Result code. 
             .first, .last and .next: Defines accessible area of .data. 
             .data: The read page of data. 
              
              
3_._2_._6_ _ _ _ _ _P_u_t_ _P_a_g_e_ 3.2.6
              
          Following information is valid for backing storage files only. 
              
          R_e_q_u_e_s_t_ 
             Blocktype is BUFFERTYPE 
             .header.opcode: 22. 
             .header.linkno: The link number representing the file to be
                             written. 
             .first, .last and .next: Defines the accessible area of .data
                             (cf. 3). 
             .pageno: The logical page number (within the file - pages
                             numbered from 2 and up) of the page to be
                             written. 
             .data: The page buffer. 
                              
          A_n_s_w_e_r_ 
             Blocktype is BUFFERHEAD 
             .header.result: Result code. 
             .first, .last and.next: Defines the data actually written (cf.
                             3). 
                              
                              \f

3_._2_._7_ _ _ _ _ _C_r_e_a_t_e_ _F_i_l_e_                                                         3.2.7
                              
          R_e_q_u_e_s_t_ 
             Blocktype is IOARG 
             .header.opcode: 3. 
             .name: Name of the file to be created. 
             .amount: Requested size of file (in pages). 
              
                   A_n_s_w_e_r_ 
             Blocktype is IOARG 
             .header.result: Result code. 
             .amount: Number of actually allocated pages. 
              
              
3_._2_._8_ _ _ _ _ _D_e_l_e_t_e_ _F_i_l_e_ 3.2.8
              
          R_e_q_u_e_s_t_ 
             Blocktype is IOARG 
             .header.opcode: 4. 
             .name: Name of the file to be deleted. 
              
          A_n_s_w_e_r_ 
             Blocktype is IOARG 
             .header.result: Result code. 
             .amount: Number of actually deallocated pages. 
              
              
3_._2_._9_ _ _ _ _ _R_e_n_a_m_e_ _F_i_l_e_                                                         3.2.9
              
          Not implemented yet. 
              \f

F_       A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_ A.
           
          1  RCSL No 31-D619: 
               LIS 701, V24 Lineselector, Reference Manual 
           
          2  RCSL No 31-D618: 
               PI-1 PASCAL80, Reference Manual 
           
          3  RCSL No 31-D617: 
               PASCAL80 Driver Conventions 
           \f

F_       B_._ _ _ _ _ _ _ _ _E_R_R_O_R_ _C_O_D_E_S_ B.
           
          C_o_d_e_ _ _ _N_a_m_e_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _E_x_p_l_a_n_a_t_i_o_n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
           
           0     ok                  operation successful 
           1     not processed       hard error on device 
           2     parity              parity error on diskette 
           3     harderror           hard error on device 
           4     unintelligible      operation request unintelligible 
           5     name _exists         name already exists 
           6     name _inexistant     name does not exist 
           7 
           8     flt _overflow        no more room in the FLT 
           9     mount error         error due to wrong mount status 
          10 
          11     offline             drive offline 
          12     name error          name syntax error 
          13     directory full      no more room in volume directory 
          14     software            software error 
          15     indexlimit          file cannot be further extended
                                     (reorganize diskette) 
          16     volumelimit         no free pages on diskette 
          17     openlimit           resource problems for open files 
          18     includelimit        the maximum number of streams are
                                     connected to the file in question 
          19     writeprotect        writeprotected diskette 
          20     streamconnection    stream in wrong open status 
          21 
          22     version             wrong version of the file system 
          23     not implemented     operation not implemented yet 
          24     fragmentation       the free pages of the diskette are too
                                     fragmentated to allow sensible allo-
                                     cation. Reorganize diskette 
          25     disconnected        the drive has been offline without any
                                     dismount operation 
          26     illegal              
          27     unformatted         diskette unformatted 
          28     rejected            operation impossible in this context 
          \f

          C_o_d_e_ _ _ _N_a_m_e_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _E_x_p_l_a_n_a_t_i_o_n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
           
          29     filelimit           attempt to read or write past end of
                                     file 
          30     unauthorized        unauthorized operation 
          31     transmission        checksum or location error in asyn-
                                     chronous transmission 
          32     linklimit           slave cannot be connected to master
                                     due to shortage of links 
          33     busyline            Transmission line busy or absent 
          34     reserved            the device is reserved by somebody
                                     else 
          \f

F_                  
           \f

«eof»