Source file: J#IMP       Compiled: 30-MAY-1984  15.06.31
Object file: J#REL

         Edinburgh IMP77 Compiler - Version 8.2 release 3

     1  
     2  !**********************************************************
     3  !*                                                        *
     4  !*           Transport Service Bridge Module              *
     5  !*                                                        *
     6  !*                         TSB                            *
     7  !*                                                        *
     8  !*           Version      9.20 24 May  1984               *
     9  !*                                                        *
    10  !**********************************************************
    11  
    12  !*
    13  %control 1 ;!No record checking.
    14  !*
    15  %begin
    16  ! Options used:T#B,J#IMP,M,G,CLEAN
    17  !*
    18  !**************************
    19  !*                        *
    20  !*    Declarations        *
    21  !*                        *
    22  !**************************
    23  
    24  !****** Constintegers ******
    25  !*
    26  !*State Values. Some are used by number e.g. %if STATE < 6 %then ...
    27  %constinteger idle                     =  1
    28  %constinteger wait param buffer        =  4
    29  %constinteger wait for accredit        =  5
    30  %constinteger wait accredit 2          =  6
    31  %constinteger wait for accept          =  8
    32  %constinteger wait server data         =  9
    33  %constinteger wait server disc         = 10
    34  %constinteger wait user data           = 11
    35  %constinteger wait user disc           = 12
    36  %constinteger wait server disc 2       = 13
    37  %constinteger wait bill 2              =  14
    38  %constinteger wait for bill            = 15 ;!Value fixed
    39  %constinteger estb                     =  0
    40  
    41  
    42  %include "ercm06.inc_configglas"
&    0  ! Configuration file for Glasgow
&    1  
&    2  ! Options used:INC_CONFIGGEN,TEMP,G,CLEAN
&    3  %conststring (8) datestring="25/04/84"
&    4  
&    5  !Versions required:
&    6  
&    7  
&    8  ! System            Name  Accred Nets  Procs*    Disc Drv Prep
&    9  
&   10  ! P PSSE            PSSE  Yes    2+1   16  6 10  RL01 0     P
&   11  ! M XGATE           XGATE  No    1+1   37 20 40  RL01 0     M
&   12  ! K Kent            GATE  Yes    1+1   16  6 10  RL02 0     K
&   13  ! U Kent #2         SGATE Yes    1+2   ?? ?? ??  RK05 0     U
&   14  ! G Glasgow         GGATE  No    1+2   16  6 31  RX02 1     G
&   15  ! F FEP (GATEX)     -      No     +2   60 20 40  -    -     H
&   16  
&   17  !Disc Configuration Information
&   18  !Define first and last user blocks to prevent us overwriting directory
&   19  !etc. Ranges for various discs are:
&   20  !RK05: 400 - 10767.    RL01: 400 - 21757. RX02:  241 - 1750. (octal)
&   21  
&   22  %constinteger drive                    = 0
&   23  %constinteger fsys                     = 8_33
&   24  %constinteger lub                      = 8_241
&   25  %constinteger hub                      = 8_1750
&   26  %constinteger blocksize                = 512
&   27  %constinteger maxblocks                = 128 
&   28  !maxblocks is largest Acct/Help/Alert/Name/Mnemonic file
&   29  
&   30  !NSI ports and facility numbers
&   31  !Set Gateport 2 = Gateport 1 if only 1 ring/NSI gateway
&   32  !Nothing terrible will happen if you get these wrong - Source addresses
&   33  !will not be correctly interpreted in the USERS ALL command etc is all
&   34  
&   35  %constinteger gate port 1              = 11 ;!Ring port of Ring - NSI Gateway
&   36  %constinteger gate port 2              = 12 ;!2nd ring/NSI Gateway 
&   37  
&   38  !X25 Level 3 options
&   39  
&   40  %constinteger max l3 packet            = 256 ;!Max Level 3 packet size in bytes
&   41  
&   42  !Procs, TSB procs, LCNs
&   43  
&   44  %constinteger no of procs              = 16 ;!No of simultaneous users
&   45  %constinteger no of tsb procs          = 6
&   46  %constinteger no of lcns               = 31 ;!No of X25 LCNs subscribes to
&   47  
&   48  %constinteger no of nets             = 2
&   49  %constinteger no of x25 nets         = 1
&   50  %constinteger sercline               = 0
&   51  %constinteger pssline                = 1
&   52  %constinteger rcoline                = 2
&   53  %constinteger no of rco nets         = 1
&   54  %conststring (5) sysname              = "GGATE"
&   55  %conststring (7) syspass             = "YAHOO"
&   56  %conststring (4) %array longnetname(-1:2) = "????","X25 ","????","RCO "
&   57  %conststring (1) %array shortnetname(-1:2) = "?","X","?","R"
&   58  
&   59  !                                               
&   60  !     Other things that need to be altered      
&   61  !                                               
&   62  
&   63  ! The text "RCONET" in the welcome message in BRIDGE
&   64  ! The text "PSSE/"  in the Command: prompt in BRIDGE
&   65  
&   66  %endoffile
    43  %include "ercm06.INC_VARIOUS"
&    0  !Various useful consts etc
&    1  
&    2  %CONSTINTEGER TRUE                     =  1
&    3  %CONSTINTEGER FALSE                    =  0
&    4  %CONSTINTEGER CR                       = 13
&    5  %CONSTINTEGER LF                       = 10
&    6  
&    7  !Buffer Manager Consts
&    8  
&    9  %CONSTINTEGER LONG                     =  0
&   10  %CONSTINTEGER SHORT                    =  1
&   11  %CONSTINTEGER REQUEST BUFFER           =  0
&   12  %CONSTINTEGER RELEASE BUFFER           =  1
&   13  
&   14  %CONSTBYTENAME TT SER                  == K'160061'
&   15  %constbytename id                      == k'160030'
&   16  %CONSTBYTENAME OWN ID                  == K'160030'
&   17  %CONSTBYTENAME INT                     == K'160060'
&   18  %CONSTINTEGERNAME NO OF BUFF           == K'100112'
&   19  %CONSTINTEGERARRAYNAME BMS             == K'100112' ;!Buffer Manager Statistics
&   20  %CONSTBYTENAME CHANGE OUT ZERO         == K'160310'
&   21  
&   22  !*Standard stream numbers
&   23  !
&   24  %CONSTINTEGER DOC INPUT CR             = 12
&   25  %CONSTINTEGER DOC INPUT PR             = 13
&   26  %CONSTINTEGER LP STREAM                =  4
&   27  %CONSTINTEGER ITP STREAM               = 18
&   28  %CONSTINTEGER INFO STREAM              = 21
&   29  %CONSTINTEGER TIME STREAM              = 22
&   30  %CONSTINTEGER FTP STREAM               = 16
&   31  
&   32  %ENDOFFILE
    44  %include "ercm06.INC_XGTFNS"
&    0  !New X-25 Gate to task Interface - extended set to include Accounting
&    1  !Functions:
&    2  
&    3  !Accounting Functions:
&    4  %constinteger accredit user pass       = 40
&    5  %constinteger process command          = 41
&    6  %constinteger accredit reply           = 42
&    7  %constinteger command reply            = 43
&    8  %constinteger log call start           = 44
&    9  %constinteger checkpoint               = 45
&   10  %constinteger log call end             = 46
&   11  %constinteger end call reply           = 46
&   12  %constinteger hello                    = 47
&   13  %constinteger abort session            = 48
&   14  %constinteger broadcast                = 49
&   15  %constinteger goodbye                  = 50
&   16  %constinteger log session end          = 51
&   17  %constinteger noticeboard              = 52
&   18  
&   19  !Transport Functions:
&   20  %constinteger connect                  =  1
&   21  %constinteger accept call              =  2
&   22  %constinteger disconnect               =  3
&   23  %constinteger enable input             =  4
&   24  %constinteger enable output            =  4
&   25  %constinteger put output               =  5
&   26  %constinteger input here               =  5
&   27  %constinteger expedited data           =  6
&   28  %constinteger reset                    =  7
&   29  %constinteger datagram                 =  8
&   30  %constinteger datagram reply           =  9
&   31  
&   32  %constinteger enable facility          = 10
&   33  %constinteger disable facility         = 11
&   34  %constinteger put control output       = 12
&   35  %constinteger control input here       = 12
&   36  %constinteger control data             = 12
&   37  
&   38  %constinteger ack                      =  4
&   39  %constinteger data                     =  5
&   40  %constinteger prod                     = 21
&   41  %constinteger poke                     = 22
&   42  %constinteger no goaheads              = 23
&   43  
&   44  %endoffile
    45  %include "ercm06.INC_ITPBITS"
&    0  !Value of control bits used in ITP
&    1  
&    2  %CONSTBYTEINTEGER CONTROLBIT           =  1
&    3  %CONSTBYTEINTEGER GOAHEADBIT           =  2
&    4  %CONSTBYTEINTEGER GOODBYEBIT           =  4
&    5  %CONSTBYTEINTEGER HELLOBIT             =  8
&    6  %CONSTBYTEINTEGER BREAKINBIT           =  1
&    7  %CONSTBYTEINTEGER SETMODEBIT           =  2
&    8  %CONSTBYTEINTEGER KILLRXBIT            =  4
&    9  %CONSTBYTEINTEGER KILLTXBIT            =  8
&   10  %CONSTBYTEINTEGER BINCHARBIT           =  1
&   11  %CONSTBYTEINTEGER TERMINATEBIT         =  2
&   12  %CONSTBYTEINTEGER PROMPTBIT            =  4
&   13  %CONSTBYTEINTEGER MARKERBIT            =  8
&   14  %CONSTBYTEINTEGER SEQVALIDBIT          = 32
&   15  %CONSTBYTEINTEGER SEQNOBITS            =192
&   16  %CONSTBYTEINTEGER BINARY               =  1
&   17  %CONSTBYTEINTEGER CHARACTER            =  0
&   18  
&   19  %ENDOFFILE
    46  %include "ercm06.INC_DISCQUALS"
&    0  !*Disconnect qualifiers
&    1  !*From PSS:
&    2  %constinteger pss prot not supported   = x'43'
&    3  
&    4  !*Transport Service
&    5  !
&    6  %constinteger ts ok                    = 0
&    7  %constinteger ts response              = 1
&    8  %constinteger ts no connection         = 16
&    9  %constinteger ts numberbusy            = 17
&   10  %constinteger ts out of order          = 18
&   11  %constinteger ts invalid address       = 19
&   12  %constinteger ts access barred         = 20
&   13  %constinteger ts incompatible facilities=21
&   14  %constinteger ts no reverse charging   = 22
&   15  %constinteger ts network congestion    = 23
&   16  %constinteger ts message too long      = 24
&   17  %constinteger ts protocol apology      = 32
&   18  %constinteger ts protocol accusation   = 33
&   19  %constinteger ts timeout               = 34
&   20  %constinteger ts connection lost       = 35
&   21  %constinteger ts flow control error    = 36
&   22  %constinteger ts congestion            = 37
&   23  %constinteger ts network failure       = 38
&   24  %constinteger ts application failure   = 39
&   25  %constinteger ts transport service fail= 40
&   26  %constinteger ts operator abort        = 41
&   27  %constinteger ts transport service abor= 42
&   28  %constinteger ts going out of service  = 43
&   29  %constinteger ts disconnect after reset= 44
&   30  %constinteger ts reset before accept   = 45
&   31  
&   32  !*Internally generated
&   33  %constinteger reply                    = x'80'
&   34  %constinteger invalid user             = x'81'
&   35  %constinteger invalid pass             = x'82'
&   36  %constinteger cause unknown            = x'83'
&   37  %constinteger shutdown imminent        = x'84'
&   38  %constinteger prot not supported       = x'85'
&   39  %constinteger no loopback              = x'86'
&   40  %constinteger softly softly            = x'87'
&   41  %constinteger no free lcns             = x'88'
&   42  %constinteger gateway full             = x'89'
&   43  %constinteger conversation terminated  = x'8A'
&   44  %constinteger call cleared             = x'8B'
&   45  %constinteger facility unavailable     = x'8C'
&   46  %constinteger process running          = x'8D'
&   47  %constinteger no user service          = x'8E'
&   48  !%CONSTINTEGER NO FUNDS                 = X'8F'
&   49  %constinteger accounting failure       = x'90' ;!Account or Mnemonic file full or non-existant
&   50  %constinteger bad param                = x'91'
&   51  %constinteger session level error      = x'92'
&   52  %constinteger network down             = x'93'
&   53  %constinteger call collision           = x'94'
&   54  %constinteger far end hung             = x'95'
&   55  %constinteger packet level error       = x'96'
&   56  %constinteger lcn conflict             = x'97'
&   57  %constinteger call reset               = x'98'
&   58  %constinteger operator abort           = x'99'
&   59  %constinteger timed out                = x'9A'
&   60  %constinteger user abort               = x'9B'
&   61  %constinteger call restarted           = x'9C'
&   62  %constinteger facs not negotiable      = x'9D'
&   63  %constinteger spurious clear req       = x'9E'
&   64  %constinteger bad interface params     = x'9F'
&   65  %constinteger unknown failure          = x'A0'
&   66  %constinteger short call accepted      = x'A1'
&   67  %constinteger short interaction        = x'A2'
&   68  %constinteger short interaction fails  = X'A3'
&   69  
&   70  %endoffile
    47  %include "ercm06.INC_SERS"
&    0  !PSS Gateway Service Numbers
&    1  
&    2  !DEIMOS hardware driver sers etc
&    3  ! 1 tty #1
&    4  ! 2 CLI
&    5  ! 3 DK
&    6  ! 4 DIRT
&    7  ! 5 LOAD
&    8  ! 6 TU16 (-5) & MOTH
&    9  ! 8 Big disc #1 - ERTE Big disc handler BDKH
&   10  ! 9 Big Disc #1 DIR
&   11  !11 DQS11S (KMC/DU11)
&   12  !12 LP
&   13  !13 LP #2 ?
&   14  !17 Spool
&   15  !18 SPCI
&   16  !19 tty #2
&   17  !20 CLI #2
&   18  !21 tty #3
&   19  !22 CLI #3
&   20  !23 CR
&   21  !24 GP
&   22  !25 PR
&   23  !28 Big Disc #2 (DIRT)
&   24  !29 Big Disc #2 DIR
&   25  
&   26  !Globally accepted Services:
&   27  %constinteger buffer manager           = 17
&   28  %constinteger t3 ser                   = 21 ;!Buffered tty I/O
&   29  %constinteger gate ser                 = 16 ;!NSI Level 3 handler
&   30  !%CONSTINTEGER FROM PROT               = 10 ;!HDLC level 2 handler (No. Used by Gate)
&   31  
&   32  !Gateway Specials:
&   33  %constinteger test ser                 = 23 ;!Not a DEIMOS Ser. Note clash with pcmc
&   34  %constinteger tsb ser                  = 19 ;!Transport Service Bridge
&   35  !! %constinteger ftp ser                  = 19
&   36  %constinteger gatex ser                = 24
&   37  %constinteger kernel ser               = 11
&   38  %constinteger from xprot               = 11
&   39  %constinteger loop ser                 = 20
&   40  %constinteger loopb ser                = 18 ;!Not a DEIMOS Ser.
&   41  %constinteger rloop ser                = loop ser
&   42  %constinteger glue ser                 = 26
&   43  %constinteger pcma ser                 = 22
&   44  %constinteger pcmb ser                 = 25
&   45  %constinteger pcmc ser                 = 23
&   46  %constinteger pcmd ser                 = 23 ;!Note clash with pcmc
&   47  %constinteger bridge ser               = 29
&   48  %constinteger account ser              = 27
&   49  %constinteger time ser                 = 28 ;!Not a DEIMOS Ser
&   50  %constinteger pftp ser                 = 21 ;!Not a DEIMOS Ser
&   51  
&   52  %endoffile
    48  
    49  !Monitor Calls
    50  %constinteger grotted 1                =  1
    51  %constinteger bad process              =  2
    52  %constinteger bad fn                   =  3
    53  %constinteger from user                =  4
    54  %constinteger from server              =  5
    55  %constinteger full up                  =  6
    56  %constinteger mon to server            =  7
    57  %constinteger grotted 4                =  8
    58  %constinteger mon to acct              =  9
    59  %constinteger mon to user              = 10
    60  %constinteger mon from acct            = 11
    61  %constinteger mon out of bounds        = 12
    62  %constinteger grotted 2                = 13
    63  %constinteger grotted 3                = 14
    64  %constinteger query                    = 15
    65  %constinteger block no req             = 16
    66  %constinteger zero block               = 17
    67  %constinteger mon control data         = 18
    68  
    69  %constinteger go window                =  3 ;!Max. Goaheads we will send him
    70  %constinteger max go                   =  4 ;!Max. goaheads we will accept from far end
    71  %constinteger window                   =  2
    72  
    73  !*
    74  !****** End of Constintegers ******
    75  !*
    76  !*
    77  !****** Recordformats ******
    78  !*
    79   %include "ercm06.INC_FORMATS"
&    0  %constinteger hdrl = 8 ;!Length of dummy area before data field
&    1  %recordformat qf(%record (qf) %name link, %integer count)
&    2  %recordformat ts29f(%string (255) s %or %byte octet1 %or %bytearray a(0:255))
&    3  %recordformat itpf(%byte cnsl, hb2, hb3, (%string(255) s %or %bytearray a(0:255)))
&    4  %recordformat x25f(%byte octet1, lcn, fn, %bytearray a(0:255))
&    5  %recordformat mef(%record (mef) %name link, %byte l,type, %c
&    6+        (%bytearray a(0:251) %c
&    7+    %or (%string(4) padding, %byte octet1, lcn, fn ,(%bytearray data(0:243) %or %record (itpf) itp %or %record (ts29f) ts29)) %c
&    8+    %or %string(250) s ))
&    9  %recordformat pf(%byte ser, reply, %c
&   10+    ((%byte fn, (%byte s1 %or %byte process), ((%record (mef) %name m, (%byte gate port %or %byte len), %byte task port) %or %string(3) facility)) %c
&   11+ %or (%byte a1, a2, b1, b2, c1, c2) %or (%integer a, b, c)))
&   12  
&   13  %recordformat cvf((%byte l, (%byte reason, cause, diags, %bytearray our ct(0:3), our segs(0:7),pss ct(0:3), pss segs(0:7)) %c
&   14+                          %or %bytearray a(0:26)) %c
&   15+                %or %string(27) s)
&   16  
&   17  %endoffile
    80  %recordformat sidef(%record (qf) inq, outq, %byte ser, proc, br flag,
    81+ %integer inputs, outputs)
    82  %recordformat procf(%record (procf) %name link, %byte procno,  ls,state, %c
    83+ quiettime, %record (mef) %name connblk, %record (sidef) user, server)
    84  
    85  !*
    86  !****** Monitoring Information ******
    87  !
    88  %constinteger maxmon = 18
    89  %constbytearray monaction(0:maxmon) = %c
    90+ 0, 3, 3, 3, 1, 1, 2, 1, 3, 1, 1, 1, 2, 3, 3, 0, 3, 3, 2
    91  %ownintegerarray moncount(0:maxmon) = 0(maxmon+1)
    92  %ownbyte monbyte = 3
    93  %owninteger mon cons = 0
    94  %owninteger buffers held, shutters up = 0
    95  !*
    96  !****** Integers ******
    97  !*
    98  %owninteger i,j,l,procno = 0
    99  %bytename c
   100  !*
   101  !****** Names ******
   102  !*
   103  %ownrecord (procf) %name process
   104  %ownrecord (sidef) %name user
   105  %ownrecord (sidef) %name server
   106  %ownrecord (sidef) %name this side
   107  %ownrecord (sidef) %name other side
   108  !*
   109  !****** Records and Recordarrays ******
   110  !*
   111  %constrecord (qf) %name null == 0
   112  %ownrecord (qf) busy q,free q = 0
   113  %ownrecord (pf) p = 0
   114  %ownrecord (procf) %array proctab(1:no of tsb procs)
   115  !*
   116  !****** Routine Specs ******
   117  !*
   118  %include "ercm06.INC_EXTS"
&    0  !Commonly Used Externals
&    1  
&    2  %externalroutinespec alarm(%integer ticks)
&    3  %externalroutinespec linkin(%integer ser)
&    4  %externalintegerfnspec dup addr(%integer seg)
&    5  %externalintegerfnspec map abs(%integer adr, len, req id)
&    6  %externalroutinespec map hwr(%integer seg)
&    7  %externalintegerfnspec get id
&    8  %externalroutinespec map virt(%integer ser,seg1,seg2)
&    9  %externalroutinespec set prio(%integer n)
&   10  %externalroutinespec pon(%record (*) %name p)
&   11  %externalroutinespec ponoff(%record (*) %name p)
&   12  %externalroutinespec poff(%record (*) %name p)
&   13  
&   14  %endoffile
   119  
   120  %routinespec abort(%integer reason)
   121  %routinespec ask for buffer
   122  %routinespec buffer arrived
   123  %routinespec free buffer(%record (mef) %name mes) ;!EXT
   124  %routinespec handle account
   125  %routinespec handle clock tick
   126  %routinespec handle inq
   127  %routinespec handle interrupt
   128  %routinespec handle outq(%record (sidef) %name side)
   129  %routinespec handle ts packet(%byte ser)
   130  %routinespec query processes
   131  %routinespec monitor(%record (pf) %name p, %integer type)
   132  %routinespec move(%integer len, from, to)
   133  %routinespec packchar(%byte char, %record (mef) %name mes)
   134  %routinespec packstring(%string (255) s, %record (mef) %name mes)
   135  %record (qf) %mapspec pop(%record (qf) %name q) ;!EXT
   136  %routinespec pull(%record (qf) %name q,item) ;!EXT
   137  %routinespec push(%record (qf) %name q,item) ;!EXT
   138  %routinespec reject connect(%byte reason)
   139  %routinespec release process
   140  %routinespec stop(%integer reason) ;!EXT
   141  %integerfnspec sublength(%%%%record (mef) %name mes, %integer n)
   142  %string (255) %fnspec substring(%record (mef) %name mes, %integer n)
   143  %routinespec to account(%record (mef) %name mes,%integer fn)
   144  %routinespec to lower(%record (mef) %name mes, %c
   145+ %integer fn,%record (sidef) %name side)
   146  !*
   147  !****** Others ******
   148  !*
   149  !************************
   150  !*                      *
   151  !*    Main Program      *
   152  !*                      *
   153  !************************
   154  !*
   155  change out zero = t3 ser
   156  printstring("TSB Version      9.20 24 May  1984 (Min,Large)
   157+ ")
   158  
   159  map virt(buffer manager, 5, 4)
   160  map virt(buffer manager, 6, 5)
   161  linkin(tsb ser)
   162  
   163  %for procno = 1,1,no of tsb procs %cycle
   164     process == proctab(procno)
   165     push(free q,process) ;!Put everything on Free queue
   166     process_procno = procno
   167     process_state = idle ;!For safety
   168  %repeat
   169  
   170  poff(p) ;!Wait for instructions from loader
   171  monbyte = p_s1
   172  
   173  ask for buffer
   174  p_ser = 0
   175  poff(p)
   176  
   177  !Set up facility enables. INFO, RJE, FTP, RTP to X25 side - FTP to NSI side
   178  p_m_s = "INFO"
   179  p_fn = enable facility
   180  p_s1 = 1
   181  p_reply = tsb ser
   182  
   183  p_ser = gatex ser
   184  pon(p)
   185  
   186  p_s1 = 0
   187  p_facility = "FTP"
   188  pon(p)
   189  
   190  p_ser = glue ser
   191  pon(p)
   192  
   193  p_ser = gatex ser
   194  p_facility = "RJE"
   195  pon(p)
   196  
   197  p_facility = "RTP"
   198  pon(p)
   199  
   200  alarm(100)
   201  
   202  %cycle ;!Main Loop
   203     p_ser = 0 ;!Accept anything
   204     poff(p) ;!Wait for something
   205     %unless p_m == null %or p_reply = 0 %start
   206        buffers held = buffers held + 1
   207        stop(grotted 1) %if 0 # p_m_type # 64
   208     %finish
   209     %if int # 0 %then handle interrupt
   210  
   211     %if p_reply = buffer manager %start
   212        buffer arrived
   213  
   214     %elseif p_reply = account ser %and accredit user pass <= p_fn <= noticeboard
   215        handle account
   216  
   217     %elseif p_reply = 0
   218        handle clock tick
   219  
   220     %else
   221        handle ts packet(p_reply)
   222  
   223     %finish
   224  %repeat
   225  
   226  !*********************
   227  !*                   *
   228  !*    Routines       *
   229  !*                   *
   230  !*********************
   231  
   232  %routine abort(%integer reason)
   233     %if process_state = estb %or process_state = wait for accept %start
   234        to lower(null, disconnect, process_server)
   235        process_state = wait server disc 2
   236  
   237     %elseif process_state = wait for accredit %or process_state = wait param buffer
   238  
   239     %finish
   240  %end ;
?REASON unused
   241        ;!of Abort
   241  
   242  
   243  
   244  %routine ask for buffer
   245     %record (pf) p
   246  
   247     p_ser = buffer manager ;p_reply = own id
   248     p_fn = request buffer
   249     p_process = process_procno
   250     p_len = long
   251     pon(p)
   252  
   253  %end ;!of ask for buffer
   254  
   255  %routine buffer arrived
   256     %string (63) source, dest, s, t, u, pass
   257  
   258     %record (mef) %name mes
   259     process == proctab(p_process)
   260     user == process_user ;server == process_server
   261  
   262     mes == p_m
   263     %if process_state = estb %start
   264        %if user_br flag = 1 %start
   265           this side == user ;other side == server
   266     
   267        %elseif server_br flag = 1
   268           this side == server ;other side == user
   269     
   270        %else
   271           monitor(null, block no req)
   272           free buffer(mes)
   273           %return
   274     
   275        %finish
   276     
   277        mes_l = 0
   278        this side_br flag = 0
   279        mes_fn = data
   280        push(other side_outq, mes)
   281        handle inq
   282        handle outq(other side)
   283  
   284     %elseif process_state = wait param buffer
   285        dest = process_connblk_s
   286        source = substring(process_connblk,2)
   287        %if mon cons # 0 %start
   288           printstring("TSB") ;write(process_procno, 1) ;printstring(" Conn ")
   289           printstring(source) ;printstring(" -> ")
   290           printstring(dest) ;newline
   291        %finish
   292        %unless dest -> ("(").s %and s -> t.(").").s %start ;!No User, Pass?
   293           length(dest) = 63 %if length(dest) > 63
   294           s = dest
   295           t = "," ;!to satisfy next resolution and generate null user, pass
   296        %finish
   297        %if t -> u.(",").pass %start ;!Extract Username and Password
   298           mes_l = 0
   299           packstring(source, mes)
   300           packstring(s, mes)
   301           packstring(u, mes)
   302           packstring(pass, mes)
   303           to account(mes, accredit user pass)
   304           process_state = wait for accredit
   305        %else
   306           reject connect(bad param)
   307           free buffer(mes)
   308           release process
   309        %finish
   310        %return
   311  
   312     %finishelse free buffer(mes)
   313  
   314  %end ;!of Buffer Arrived
   315  
   316  
   317  %routine free buffer(%record (mef) %name mes)
   318     %integer type
   319     %record (pf) p
   320     %if mes == null %then %return ;!No buffer to free
   321     p_ser = buffer manager ;p_reply = own id
   322     p_fn = release buffer
   323     p_m == mes
   324     buffers held = buffers held - 1
   325     stop(grotted 4) %if 0 # mes_type # 64
   326     pon(p)
   327  %end ;
?TYPE unused
   328        ;!of Free Buffer
   328  
   329  %routine handle account
   330     %record (mef) %name mes
   331     %string (31) s
   332  
   333     mes == p_m
   334  
   335     monitor(p, mon from acct)
   336  
   337  %if p_task port < 1 %or p_task port > no of tsb procs %start
   338     monitor(p,bad process)
   339     selectoutput(0)
   340     write(1,2)
   341     write(p_task port,2)
   342     newline
   343     -> free it
   344  %finish
   345  
   346  !   monitor(p, bad process) %and -> free it %unless 1 <= p_task port <= no of tsb procs
   347  
   348     process == proctab(p_task port)
   349     user == process_user
   350     server == process_server
   351  
   352     %if p_fn = accredit reply %start
   353        %if process_state = wait for accredit %start
   354           %if mon cons # 0 %start
   355              printstring("TSB") ;write(process_procno, 1) ;printstring(" Account") ;write(p_s1, 1)
   356              newline
   357           %finish
   358           %if 0 < p_s1 < 128 %start
   359              !The connect parameters we receive may be for interactive calls.
   360  
   361              !OK.  Some nasty fudging code coming up. In order to make life easier for TCPs,
   362              !we will allow certain classes of loopback.  If we get calls from GATEX heading
   363              !apparently for PCMA we will stick a N0T0 on the front to tell GLUE to loop it
   364              !and will pass it on.    If we get any other classes of call we will point them
   365              !at the loop module directly.
   366              
   367              %if user_ser = gatex ser %and (p_s1 = pcma ser %or p_s1 = pcmb ser) %start
   368                 server_ser = glue ser
   369                 mes_l = 0 ;!Ignore supplied parameters altogether
   370                 s = "N0T0.".process_connblk_s
   371                 packstring(s, mes)
   372                 packstring(substring(process_connblk, 2), mes)
   373  
   374              %elseif p_s1 = user_ser
   375                 server_ser = loop ser
   376                 packstring(process_connblk_s, mes)
   377                 packstring(substring(process_connblk, 2), mes)
   378              
   379              %else
   380                 server_ser = p_s1
   381  
   382              %finish
   383  
   384              !Discard supplied CUDF and facilities
   385              mes_l = mes_l - sublength(mes, 4) - sublength(mes, 3)
   386              packstring(substring(process_connblk, 3), mes)
   387              packstring(substring(process_connblk, 4), mes)
   388              p_s1 = 0 ;!T.S.
   389              to lower(mes, connect, server)
   390              process_state = wait for accept
   391              mes == null
   392           %else
   393              to lower(null, disconnect, user)
   394              release process
   395           %finish
   396  
   397        %elseif process_state = wait accredit 2
   398           %if p_s1 < 128 %start ;!Call parameters OK. Better tell Account we've
   399              !Scratched the session.
   400              to account(null, log session end)
   401           %finish
   402           to lower(null, disconnect, user)
   403           release process
   404  
   405        %finish
   406        free buffer(process_connblk); process_connblk == null
   407  
   408     %elseif p_fn = abort session
   409        %if p_task port = 0 %start ;!Abort ALL processes
   410  
   411        %else
   412           abort(operator abort)
   413        %finish
   414  
   415     %elseif p_fn = end call reply
   416        !Charging record comes back with disconnect/charging info. in field 1.
   417        !Location and explanatory text fields are lost. d/c field is in correct
   418        !place for disconnect so pass it on.
   419        to lower(mes, disconnect, user)
   420        mes == null
   421        %if process_state = wait for bill %start
   422           process_state = wait user disc
   423  
   424        %elseif process_state = wait bill 2
   425           to account(null, log session end)
   426           release process
   427        %finish
   428  
   429     %finish
   430     free it:
   431     free buffer(mes)
   432  
   433  %end ;!of Handle Account
   434  
   435  %routine handle clock tick
   436     %if int # 0 %then handle interrupt
   437     alarm(100)
   438  %end ;!of Handle Clock Tick
   439  
   440  
   441  %routine handle inq
   442  
   443     %record (mef) %name inb, outb
   444     %bytename inptr, outptr
   445     %integer inll, outll, lt
   446     %return %unless process_state = estb
   447  
   448     %while this side_inq_count # 0 %cycle
   449        !No buffer available for packing into. Go and get one.
   450        %if other side_outq_count = 0 %then -> go get buffer
   451  
   452        inb == this side_inq_link_link ;!Point at top of Inq
   453        inptr == inb_a(1)
   454        outb == other side_outq_link ;!Bottom of Outq
   455        outptr == outb_l
   456  
   457        !Now find out how much data we can move across.
   458        inll = inb_l - inptr ;!Data left in input block
   459        outll = 128 - outptr ;!Space left in output block
   460  
   461        %if inll > outll %then lt = outll %else lt = inll
   462  
   463        move(lt, addr(inb_data(inptr)), addr(outb_data(outptr)))
   464        inptr = inptr + lt ;outptr = outptr + lt
   465  
   466        %if lt = inll %then free buffer(pop(this side_inq)) ;!We've finished with input buffer
   467        %if lt = outll %then -> go get buffer ;!We filled up out buffer - get another
   468     %repeat
   469     %return
   470  
   471  go get buffer:
   472     ask for buffer %if this side_br flag = 0
   473     this side_br flag = 1
   474     %return
   475  
   476  %end ;!of Handle Inq
   477  
   478  
   479  %routine handle interrupt
   480     %if int = '?' %start
   481        query processes
   482        monitor(null, query)
   483  
   484     %elseif int = 'C'
   485        mon cons = 1 - mon cons
   486  
   487     %elseif int = 'D'
   488        shutters up = 1 - shutters up
   489  
   490     %elseif int = 'N'
   491        selectoutput(1); close output
   492  
   493     %elseif int = 'V'
   494        printstring("TSB Version      9.20 24 May  1984 (Min,Large)
   495+ ")
   496  
   497     %elseif int = 'Z'
   498        %stop
   499  
   500     %elseif '0' <= int <= '9'
   501        monbyte = int - '0'
   502  
   503     %finish
   504  
   505     int = 0
   506  %end ;!of Handle Interrupt
   507  
   508  %routine handle outq(%record (sidef) %name side)
   509     %record (mef) %name mes
   510     %if process_state = estb %start
   511        %while side_outputs < window %and side_outq_count # 0 %cycle
   512           mes == side_outq_link_link ;!Peek at top buffer on Q
   513           %if mes_l = 0 %start
   514              %return %if side_outq_count = 1 ;!OK - Null buffer waiting to be filled
   515              monitor(null, zero block)
   516              free buffer(pop(side_outq))
   517           %else
   518              mes == pop(side_outq)
   519              p_s1 = 0
   520              to lower(mes, mes_fn, side) ;side_outputs = side_outputs + 1
   521           %finish
   522        %repeat
   523     %finish
   524  %end ;!of Handle Outq
   525  
   526  
   527  %routine handle ts packet(%byte ser)
   528     !This routine fields all TS packets
   529     %record (mef) %name mes
   530     %integer i
   531     %bytename state
   532     
   533     mes == p_m
   534     
   535     process == null
   536     %if p_fn = connect %start
   537        monitor(p, from user)
   538        %if shutters up = 0 %start
   539           !User = this side only
   540           !Check for process busy ++++ (Not yet implemented)
   541           !Try to find a process, initialise it if we can, and reject the call if not
   542           process == pop(free q)
   543           %unless process == null %start ;!Success
   544              i = process_procno ;process = 0 ;process_procno = i
   545              !NB: assumes ready = 0 %and Null == 0
   546              push(busy q,process) ;!Put it on queue of active processes
   547              !Set up global pointers
   548        
   549              user == process_user ;server == process_server
   550        
   551              %unless mes == null %start ;!We must have SOME parameters!
   552                 process_connblk == mes
   553                 user_ser = ser
   554                 user_proc = p_gate port
   555                 ask for buffer
   556                 process_state = wait param buffer
   557                 mes == null
   558              %finishelse reject connect(bad param) %and release process
   559     
   560           %finishelse reject connect(gateway full)
   561        %finishelse reject connect(ts going out of service)
   562        free buffer(mes)
   563  
   564     %elseif p_fn = poke
   565        p_c1 = busy q_count ;p_c2 = buffers held
   566        i = p_ser ;p_ser = p_reply ;p_reply = i
   567        pon(p)
   568  
   569     %else
   570     
   571        !If he supplied our process number, then just do a look-up
   572        %if p_task port # 0 %then process == proctab(p_task port) %elsestart
   573        
   574           !Otherwise we have to look through all active processes for it
   575           %if busyq_count # 0 %start
   576              process == busy q
   577              %for i = 1,1,busy q_count %cycle
   578                 process == process_link
   579                 %if (ser = process_user_ser %and process_user_proc = p_gate port) %c
   580+                %or (ser = process_server_ser %and process_server_proc = p_gate port) %c
   581+                %thenexit
   582              %repeat
   583           %finish
   584        %finish
   585        
   586        %if (%not process == null) %and ser = process_user_ser %then %c
   587+       monitor(p, from user) %else monitor(p, from server)
   588        !If we failed to find it then monitor it and ignore the message
   589        %if process == null %or process_state = idle %start
   590           monitor(p, bad process)
   591  
   592           selectoutput(0)
   593           write(2,2)
   594           write(p_task port,2)
   595           newline
   596  
   597           free buffer(mes)
   598           %return
   599        %finish
   600        
   601        state == process_state
   602        user == process_user
   603        server == process_server
   604        %if ser = user_ser %start ;!Message from USER
   605           this side == user
   606           other side == server
   607        %else ;!Message from server
   608           this side == server
   609           other side == user
   610        %finish
   611     
   612        !All non-established states have a finite time limit irrespective
   613        !of data transferred. Stata estb will only be chopped if there is
   614        !no data being moved.
   615        process_quiettime = 0
   616  
   617  
   618        %if p_fn = data %or p_fn = control data %start
   619           %if state = estb %start
   620  !ERTE fudges
   621              %if mes_l > 128 %and other side_ser = gatex ser %start
   622                 %for i = 0,1,3 %cycle ;mes_data(124+i) = mes_data(mes_l-4+i); %repeat
   623                 mes_l = 128
   624              %finish
   625  !end of ERTE fudges
   626              to lower(mes, data, other side)
   627           %finishelse free buffer(mes)
   628  
   629        %elseif p_fn = ack
   630           %if state = estb %then to lower(null, ack, other side)
   631  
   632        %elseif p_fn = expedited data
   633           %if state = estb %then to lower(null, expedited data, other side)
   634  
   635        %elseif p_fn = reset
   636  
   637        printstring("Reset for TSB")   ;! 24/5/84
   638        newline
   639        write(user_proc,1)
   640        write(server_proc,1)
   641        newline
   642  
   643           to lower(mes, reset, this side)
   644           abort(reset)
   645  
   646        %elseif p_fn = disconnect
   647           %if this side == user %start ;!User has issued disconnect
   648              %if mon cons # 0 %start
   649                 printstring("TSB") ;write(process_procno, 1) ;printstring(" UDisc") ;write(p_s1, 1) ;newline
   650              %finish
   651              %if state = estb %or state = wait for accept %start
   652                 to lower(null, disconnect, server)
   653                 state = wait server disc
   654        
   655              %elseif state = wait for accredit %or process_state = wait param buffer
   656                 state = wait accredit 2
   657        
   658              %elseif state = wait for bill
   659                 to lower(null, disconnect, server)
   660                 state = wait bill 2
   661        
   662              %elseif state = wait user disc
   663                 to lower(null, disconnect, server)
   664                 to account(null, log session end)
   665                 release process
   666        
   667              %finish
   668              free buffer(mes) ;!Free any buffer he may have sent
   669  
   670           %else ;!Server has issued disconnect
   671              %if mon cons # 0 %start
   672                 printstring("TSB") ;write(process_procno, 1) ;printstring(" SDisc") ;write(p_s1, 1) ;newline
   673              %finish
   674              p_s1 = p_s1 ! X'80' ;!Flag that we want a bill back
   675              %if state = estb %start
   676                 state = wait for bill
   677                 to account(mes, log call end)
   678        
   679              %elseif state = wait server disc %and process_ls = 1
   680                 to account(mes, log call end)
   681                 state = wait bill 2
   682        
   683              %elseif state = wait for accept %or state = wait server disc %or %c
   684+             state = wait server disc 2 ;!(and process_ls therefore = 0)
   685                 to lower(mes, disconnect, user)
   686                 to account(null, log call end) %if process_ls = 1
   687                 to account(null, log session end)
   688                 release process
   689              %finish
   690           %finish
   691  
   692        %elseif p_fn = accept call
   693           !This is Server accepting call. User = other side
   694           server_proc = p_gate port
   695           %if mon cons # 0 %start
   696              printstring("TSB") ;write(process_procno, 1) ;printstring(" Accept") ;newline
   697           %finish
   698           %if state = wait for accept %start
   699              state = estb
   700              !Perform address mapping
   701              to account(null, log call start) ;process_ls = 1
   702              to lower(mes, accept call, other side)
   703           %finishelse free buffer(mes)
   704  
   705        %else
   706  
   707           monitor(p, bad fn)
   708           stop(bad fn)
   709        %finish
   710     %finish
   711  %end ;!of Handle TS
   712  
   713  
   714  %routine monitor(%record (pf) %name p,%integer type)
   715     %recordformat pfa(%bytearray a(0:27))
   716     %record (pfa) %name pa
   717     %integer i,j,k
   718     %record (mef) %name mes
   719     
   720     moncount(type) = moncount(type) + 1
   721     k = monaction(type)
   722     %if k = 0 %or monbyte = 255 %start
   723        %return
   724  
   725     %elseif k = 1
   726        i = monbyte & 2 ;j = 0
   727  
   728     %elseif k = 2
   729        i = 1 ;j = monbyte & 1
   730  
   731     %else
   732        query processes
   733        i = 1 ;j = 1
   734  
   735     %finish
   736  
   737     %if j # 0 %start ;!Log to .TT
   738        printstring("*TSB") ;write(type,1) ;newline
   739     %finish
   740     %if i # 0 %start
   741        selectoutput(1)
   742        %if p == null %start
   743           printsymbol(2) ;printsymbol(tsb ser) ;printsymbol(type)
   744        %else
   745           pa == p
   746           printsymbol(10) ;printsymbol(tsb ser) ;printsymbol(type)
   747           %for i = 0,1,7 %cycle
   748              printsymbol(pa_a(i))
   749           %repeat
   750           %unless p_m == null %start
   751              pa == p_m
   752              j = p_m_l+4 ;j = j+8 %if p_fn = data
   753              j = 28 %unless 1 <= j <= 28
   754              printsymbol(j)
   755              %for i = 0,1,j-1 %cycle
   756                 printsymbol(pa_a(i))
   757              %repeat
   758           %finish
   759        %finish
   760        selectoutput(0)
   761     %finish
   762     %return
   763  %end ;
?MES unused
   764        ;!of Monitor
   764  
   765  
   766  %routine move(%integer len,from,to)
   767  !
   768  ! 'Assembler Routine' to emulate EMAS MOVE.
   769  ! Note: 1. No action if LEN<=0
   770  !       2. Registers 1,2 and 3 used.
   771  !
   772  %label loop, return
   773  !
   774        *mov_len,1          ;! Load the length
   775        *ble_return         ;! Return if less than or equal to zero
   776        *mov_from,2         ;! Load the FROM address
   777        *mov_to,3           ;! Load the TO address
   778  !
   779  !     Loop to move LEN bytes FROM -> TO
   780  !
   781  loop: *movb_(2)+,(3)+     ;! Move the byte
   782        *sob_1,loop         ;!Decrement length count: Continue if length not exhausted       
   783  return:
   784        %return
   785  %end
   786  
   787  
   788  %routine packchar(%byte char, %record (mef) %name mes)
   789     mes_a(mes_l) = char
   790     mes_l = mes_l + 1
   791  %end ;!of Pack Char
   792  
   793  
   794  %routine pack string(%string (255) s,%record (mef) %name mes)
   795     !Add string S as a substring to MES_A, taking the end of MES_A
   796     !From a length supplied in MES_L
   797     
   798     string(addr(mes_a(mes_l))) = s
   799     mes_l = mes_l + length(s) + 1
   800     
   801  %end ;!of Packstring
   802  
   803  %routine push(%record (qf) %name q,new)
   804     %if q_link == null %start
   805        q_link == new
   806        new_link == new
   807     %else
   808        new_link == q_link_link
   809        q_link_link == new
   810        q_link == new
   811     %finish
   812     q_count = q_count + 1
   813  %end
   814  
   815  
   816  %record (qf) %map pop(%record (qf) %name q)
   817     %record (qf) %name old
   818     %if q_link == null %then old == null %elsestart
   819        %if q_link_link == q_link %start ;!One element only on Q
   820           old == q_link
   821           q_link == null
   822        %else
   823           old == q_link_link
   824           q_link_link == old_link
   825        %finish
   826        q_count = q_count - 1
   827     %finish
   828     %result == old
   829  %end
   830  
   831  
   832  %routine pull(%record (qf) %name q,item)
   833     !Pulls the specified item off a circular queue with header at Q
   834     %record (qf) %name p
   835  
   836     %if q_link == null %then %return ;!No elements (Why??)
   837     q_count = q_count - 1
   838     %if q_link_link == q_link %then q_link == null %and %return ;!One element on Q
   839  
   840     p == q
   841     %cycle
   842        p == p_link
   843     %repeatuntil p_link == item
   844     p_link == item_link
   845     %if q_link == item %then q_link == p ;!If we remove Q head, reposition it
   846  %end ;!of Pull
   847  
   848  
   849  %routine query processes
   850     %record (procf) %name pr
   851     %integer i
   852     %routinespec monside(%record (sidef) %name side)
   853     printstring(" BH=") ;write(buffers held, 1)
   854     newline
   855     %for i=1,1,no of tsb procs %cycle
   856        pr == proctab(i)
   857        %if pr_state # idle %start
   858           write(i,2) ;printsymbol('/')
   859           printstring("ST=") ;write(pr_state,1)
   860           printstring(" QU=") ;write(pr_quiettime,3)
   861           newline 
   862           printstring("    USER:") ;monside(pr_user)
   863           printstring(" SRVR:") ;monside(pr_server)
   864           newline
   865        %finish
   866     %repeat
   867     %routine monside(%record (sidef) %name side)
   868        %integer i
   869        printstring(" SR.PR, BF, I, O=")
   870        write(side_ser,1) ;printsymbol('.') ;write(side_proc,1)
   871        write(side_br flag, 1) ;write(side_inputs, 1) ;write(side_outputs, 1)
   872     %end ;
?I unused
   873           ;!of Monside
   873  %end ;!of Query processes
   874  
   875  %routine reject connect(%byte reason)
   876     !Reject the connect but dont use To lower (No process)
   877     monitor(null,full up)
   878     p_ser = p_reply ;!Send it back where it came from
   879     p_reply = own id
   880     p_fn = disconnect
   881     p_m == null
   882     p_s1 = reason
   883     !No change to Buffers held as P_M == NULL
   884     pon(p)
   885  %end ;!of Reject Connect
   886  
   887  %routine release process
   888  
   889     process_state = idle ;!For safety and Monitor routine
   890     free buffer(process_connblk); process_connblk == null
   891     pull(busy q, process)
   892     push(free q,process)
   893  %end ;!of Release Process
   894  
   895  
   896  %routine stop(%integer reason)
   897     printstring("*TSB Stopped ") ;write(reason, 1) ;newline
   898     %cycle
   899     %repeat
   900  %end ;!of Stop
   901  
   902  
   903  %integerfn sublength(%record (mef) %name mes, %integer no)
   904     %integer i,l
   905     %unless mes == null %or mes_l <= 0 %or no <= 0 %start
   906        l = 0
   907        %while no > 1 %cycle
   908           l = l + mes_a(l) + 1
   909           %result = 0 %if l >= mes_l
   910           no = no - 1
   911        %repeat
   912        %result = mes_a(l) + 1 ;! Include the length byte
   913     %finishelseresult = 0 ;!Field absent altogether
   914  %end ;
?I unused
   915        ;!of Sublength
   915  
   916  
   917  %string (255) %fn sub string(%record (mef) %name mes, %integer no)
   918     %integer i,l
   919     %unless mes == null %or mes_l<=0 %start
   920        l=0
   921        %while no>1 %cycle
   922           l=l+mes_a(l)+1
   923           %result = "" %if l >= mes_l
   924           no = no - 1
   925        %repeat
   926        %if l>251 %or l+mes_a(l) > 251 %then stop(mon out of bounds)
   927        !Out of bounds
   928        %if mes_a(l) > 63 %then %result = "Err/Too Long" %else %result = string(addr(mes_a(l)))
   929     %finishelse %result = ""
   930  %end ;
?I unused
   931        ;!of Sub String
   931  
   932  
   933  %routine to account(%record (mef) %name mes, %integer fn)
   934     !Sends record to ACCOUNT process. Concerned with accrediting and keeping
   935     !Accounts and statistics
   936     
   937     p_ser = account ser ;p_reply = tsb ser
   938     p_fn = fn
   939     p_m == mes
   940     p_gate port = tsb ser
   941     p_task port = process_procno
   942     
   943     monitor(p, mon to acct)
   944     %unless p_m == null %start
   945        buffers held = buffers held - 1
   946        stop(grotted 2) %if 0 # p_m_type # 64
   947     %finish
   948     pon(p)
   949  
   950  %end ;!of To Account
   951  
   952  %routine to lower(%record (mef) %name mes, %integer fn,%record (sidef) %name side)
   953     %byte q
   954     p_ser = side_ser ;p_reply = tsb ser
   955     p_gate port = side_proc
   956     p_fn = fn
   957     p_m == mes
   958     p_task port = process_procno
   959     %if side == process_user %then monitor(p, mon to user) %else %c
   960+    monitor(p, mon to server)
   961     %unless p_m == null %start
   962        buffers held = buffers held - 1
   963        stop(grotted 3) %if 0 # p_m_type # 64
   964     %finish
   965     pon(p)
   966     %return
   967  %end ;
?Q unused
   968        ;!of To Lower
   968  
   969  
   970  %endofprogram
?PACKCHAR unused
?PONOFF unused
?SETPRIO unused
?GETID unused
?MAPHWR unused
?MAPABS unused
?DUPADDR unused
?C unused
?L unused
?J unused
?I unused
?CVF unused
?X25F unused
?HDRL unused
?MAXGO unused
?GOWINDOW unused
?MONCONTROLDATA unused
?PFTPSER unused
?TIMESER unused
?BRIDGESER unused
?PCMDSER unused
?PCMCSER unused
?RLOOPSER unused
?LOOPBSER unused
?FROMXPROT unused
?KERNELSER unused
?TESTSER unused
?GATESER unused
?SHORTINTERACTIONFAILS unused
?SHORTINTERACTION unused
?SHORTCALLACCEPTED unused
?UNKNOWNFAILURE unused
?BADINTERFACEPARAMS unused
?SPURIOUSCLEARREQ unused
?FACSNOTNEGOTIABLE unused
?CALLRESTARTED unused
?USERABORT unused
?TIMEDOUT unused
?CALLRESET unused
?LCNCONFLICT unused
?PACKETLEVELERROR unused
?FARENDHUNG unused
?CALLCOLLISION unused
?NETWORKDOWN unused
?SESSIONLEVELERROR unused
?ACCOUNTINGFAILURE unused
?NOUSERSERVICE unused
?PROCESSRUNNING unused
?FACILITYUNAVAILABLE unused
?CALLCLEARED unused
?CONVERSATIONTERMINATED unused
?NOFREELCNS unused
?SOFTLYSOFTLY unused
?NOLOOPBACK unused
?PROTNOTSUPPORTED unused
?SHUTDOWNIMMINENT unused
?CAUSEUNKNOWN unused
?INVALIDPASS unused
?INVALIDUSER unused
?REPLY unused
?TSRESETBEFOREACCEPT unused
?TSDISCONNECTAFTERRESET unused
?TSTRANSPORTSERVICEABOR unused
?TSOPERATORABORT unused
?TSTRANSPORTSERVICEFAIL unused
?TSAPPLICATIONFAILURE unused
?TSNETWORKFAILURE unused
?TSCONGESTION unused
?TSFLOWCONTROLERROR unused
?TSCONNECTIONLOST unused
?TSTIMEOUT unused
?TSPROTOCOLACCUSATION unused
?TSPROTOCOLAPOLOGY unused
?TSMESSAGETOOLONG unused
?TSNETWORKCONGESTION unused
?TSNOREVERSECHARGING unused
?TSINCOMPATIBLEFACILITIES unused
?TSACCESSBARRED unused
?TSINVALIDADDRESS unused
?TSOUTOFORDER unused
?TSNUMBERBUSY unused
?TSNOCONNECTION unused
?TSRESPONSE unused
?TSOK unused
?PSSPROTNOTSUPPORTED unused
?CHARACTER unused
?BINARY unused
?SEQNOBITS unused
?SEQVALIDBIT unused
?MARKERBIT unused
?PROMPTBIT unused
?TERMINATEBIT unused
?BINCHARBIT unused
?KILLTXBIT unused
?KILLRXBIT unused
?SETMODEBIT unused
?BREAKINBIT unused
?HELLOBIT unused
?GOODBYEBIT unused
?GOAHEADBIT unused
?CONTROLBIT unused
?NOGOAHEADS unused
?PROD unused
?CONTROLINPUTHERE unused
?PUTCONTROLOUTPUT unused
?DISABLEFACILITY unused
?DATAGRAMREPLY unused
?DATAGRAM unused
?INPUTHERE unused
?PUTOUTPUT unused
?ENABLEOUTPUT unused
?ENABLEINPUT unused
?GOODBYE unused
?BROADCAST unused
?HELLO unused
?CHECKPOINT unused
?COMMANDREPLY unused
?PROCESSCOMMAND unused
?FTPSTREAM unused
?TIMESTREAM unused
?INFOSTREAM unused
?ITPSTREAM unused
?LPSTREAM unused
?DOCINPUTPR unused
?DOCINPUTCR unused
?BMS unused
?NOOFBUFF unused
?ID unused
?TTSER unused
?SHORT unused
?LF unused
?CR unused
?FALSE unused
?TRUE unused
?SHORTNETNAME unused
?LONGNETNAME unused
?SYSPASS unused
?SYSNAME unused
?NOOFRCONETS unused
?RCOLINE unused
?PSSLINE unused
?SERCLINE unused
?NOOFX25NETS unused
?NOOFNETS unused
?NOOFLCNS unused
?NOOFPROCS unused
?MAXL3PACKET unused
?GATEPORT2 unused
?GATEPORT1 unused
?MAXBLOCKS unused
?BLOCKSIZE unused
?HUB unused
?LUB unused
?FSYS unused
?DRIVE unused
?DATESTRING unused
?WAITUSERDATA unused
?WAITSERVERDATA unused
