ASMB,R,Q,C
      HED <#MAST> MASTER REQUEST INTERFACE * (C) HEWLETT-PACKARD CO. 1980*
      NAM #MAST,7 91750-1X019 REV 2013 801010 ALL 
      ENT #MAST,#RQB,#TILT,#MSTC,#TTOV
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
* 
* 
* 
* 
      EXT .ENTR,EXEC,RNRQ,CLRQ,XLUEX
      EXT #NRVS,#MAAS,#GET,#RSAX
      EXT #MSSM,PGMAD,DSERR 
* 
      EXT #WAIT,#NODE,#QRN,#GRPM,#TBRN,#LEVL
      EXT #BREJ,$OPSY,#OTCV,#MHCT 
* 
*    NAME:   #MAST
*    SOURCE: 91750-18019
*    RELOC:  91750-1X019
*    PGMR:   TOM MILNER APR 1979
*    REVISED: CLARK JOHNSON 801010   CORRECT CLEANUP OF TCBS AND CLASSES
* 
* 
* 
* 
*  #MAST CALLING SEQUENCE:   (NOTE: FOR WRITE W/O 
*     WAITING FOR REPLY, INCLUDE THE FOLLOWING CODE 
*     BEFORE THE #MAST CALL). 
* 
*     EXT #MSTC     NO WAIT FLAG AND REPLY CLASS #
*     LDA CLASS     PRE-ALLOCATED CLASS # FOR REPLY 
*     STA #MSTC     SET NO WAIT FLAG
*      .
*      .
*     JSB #MAST 
*     DEF *+7 OR 8
*     DEF CONWD     CONTROL WORD/ERROR-RETURN FLAG (BIT#15).
*     DEF RQLEN     REQUEST LENGTH. 
*     DEF DABUF     OUTGOING DATA BUFFER ADDRESS
*     DEF DLWRT     OUTGOING BUFFER LENGTH (OR ZERO)
*     DEF DLRED     INCOMING BUFFER LENGTH (OR ZERO)
*     DEF RPLEN     MAX REPLY LENGTH
*     DEF INBUF     (OPTIONAL) INCOMING DATA BUFFER ADDRESS 
*  <ERROR RETURN >  A & B HAVE ASCII ERROR CODE (ALSO IN REPLY 5 & 6) 
*  <NORMAL RETURN>  A= RCVD REQ LEN, B= RCVD DATA LEN (OR 0)
* 
* 
* 
*    CONWD DESCRIPTION: 
* 
*     BIT#15      - ERROR-RETURN FLAG (RETURN W/ ERRORS IF SET) 
*     BIT#14      -NO TIMEOUT (IF SET)
*     BIT#0       - NO-REPLY OPTION (IF SET)
* 
      SKP 
* 
* 
*  #MAST PERFORMS THE FOLLOWING FUNCTIONS:
*     1. RETURNS DS00 TO CALLER IF SYSTEM IS QUIESCENT. 
*     2. ALLOCATES A CLASS NUMBER FOR THE REQUEST.
*     3. DOES A LOCK/WAIT ON THE "RES" TABLE ACCESS RN. 
*     4. CREATES A MASTER TCB 
*     5. CONVERTS DESTINATION NODE TO LU
*     6. SENDS THE REQUEST(/DATA) 
*     6. CALLS "#GET" TO AWAIT THE REPLY(/DATA) 
*     8. IF REPLY WAS A "QUIESCENT-REJECT", PUTS SELF IN TIME-LIST. 
*     9. IF ERROR FLAG IN 7TH REPLY WORD = 1, DOES ERROR RETURN.
*    10. CLEARS THE MASTER CLASS # AND TCB. 
*    11. IF REPLY OK, GIVES RETURN WITH RCVD LENGTHS IN A & B.
* 
*  #MAST ERROR PROCESSING:
* 
*   1. IF SIGN BIT(#15) OF CONWD PARAMETER IS SET, ASCII ERROR CODES
*      ARE SUPPLIED TO THE CALLER IN THE <A>&<B> REGISTERS, UPON
*      RETURN TO THE <ERROR RETURN> POINT IN THE CALLING SEQUENCE.
*   2. IF THE SIGN BIT IS NOT SET, THEN THE CALLER'S PROGRAM IS 
*      ABORTED, AFTER PRINTING AN ERROR MESSAGE ON THE SYSTEM 
*      CONSOLE. 
* 
*  #MAST ERROR MESSAGES:
* 
*    "DS00" - DS1000 IS SHUT-DOWN!
*             (1) #GRPM = 0 
*             (2) #QRN  = 0 
*             (3) SYSTEM QUIESCENING
*    "DS02" - DRIVER DETECTED ERROR (PARITY, ETC.)
*    "DS03" - REQUEST LENGTH ERROR
*             (2) REQUEST LENGTH TOO SMALL
*             (3) REQUEST LENGTH TOO LARGE
*    "DS04" - LOGICAL UNIT INVALID OR NO CLCT ENTRY.
*    "DS05" - MASTER REQUEST TIMEOUT (COURTESY OF 'UPLIN'). 
*             (1) MASTER REQUEST ACKNOWLEDGED BY MA 
*    "DS07" - 'RES' TABLE-ACCESS ERROR. 
*             (1) NO LEVEL CONVERTERS 
*    "DS08" - REMOTE BUSY FAILURE - NO SAM, ETC 
*    "DS09" - PARAMETER ERROR.
*             (1) NOT ENOUGH PARAMETERS 
*             (2) NEGATIVE WRITE DATA LENGTH
*             (3)     "    READ    "     "
*             (4)     "    MAX REPLY DATA LENGTH
*    "IOXX" - \ 
*              - RTE SYSTEM DETECTED ERRORS.
*    "RNXX" - / 
* 
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2001 790531      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  DINIT, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*         DSTIO, LUMAP, #MSTN                                    *
******************************************************************
* 
***!!!!! THE ORDER OF THE FIRST 7 WORDS (#STR THRU #ENO) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     AND ERROR CODES ALWAYS BE IN THE SAME PLACE,        *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS MAKES STORE-AND-*
***!!!!!     FORWARD CODE MUCH SIMPLER.                          *
#STR  EQU 0         STREAM WORD.
#SEQ  EQU #STR+1    SEQUENCE NUMBER.
#SRC  EQU #SEQ+1    SOURCE NODE #.
#DST  EQU #SRC+1    DEST. NODE #. 
#EC1  EQU #DST+1    REPLY ECOD1.
#EC2  EQU #EC1+1    REPLY ECOD2.
#ENO  EQU #EC2+1    NUMBER OF NODE REPORTING ERROR. 
* 
#ECQ  EQU #ENO+1    ERROR CODE QUALIFIER (BITS 4 TO 7)
#LVL  EQU #ECQ      MESSAGE FORMAT LEVEL (BITS 0 TO 3)
#MAS  EQU #LVL+1    MA "SEND" SEQ. #
#MAR  EQU #MAS+1    MA "RECV" SEQ. #
#MAC  EQU #MAR+1    MA "CANCEL" FLAGS 
#HCT  EQU #MAC+1    HOP COUNT 
#SID  EQU #HCT+1    SESSION ID WORD 
* 
#EHD  EQU #SID      LAST ITEM OF HEADER 
#MHD  EQU #EHD+1    MINIMUM HEADER SIZE 
#REQ  EQU #MHD      START OF REQUEST SPECIFIC AREA
#REP  EQU #MHD      START OF REPLY SPECIFIC AREA
* 
#MXR  EQU #MHD+24   <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>>
#LSZ  EQU 2         <<< SIZE OF LOCAL APPENDAGE AREA >>>
* 
******************************************************************
* 
* GLBLK-END 
      SPC 1 
A     EQU 0 
B     EQU 1 
      SKP 
#MSTC NOP           NO WAIT CLASS NUMBER PLUGGED HERE 
#MAST NOP 
      LDB #MSTC 
      LDA K2
      SZB           NO WAIT?
      LDA K14       . YES GET NO WAIT CODE
      STA GETCB     SET #RSAX CONTROL WORD TO GET TCB 
      CLA           INITIALIZE BEFORE RUN 
      STA RPLEN 
      STA INBUF 
      STA MA.ID 
      LDA CONWX 
      STA LU+1      INITIALIZE CONTROL WORD 
      LDB #MAST 
      STB ENTRY     SETUP FOR .ENTR 
      JMP ENTRY+1 
      SPC 1 
CONWD NOP           CONTROL WORD ADDRESS. 
RQLEN NOP           REQUEST BUFFER LENGTH.
DABUF NOP           OUTGOING DATA BUFFER ADDRESS OR DUMMY PARAMETER.
DLWRT NOP           WRITE DATA LENGTH (OR ZERO) 
DLRED NOP           READ DATA LENGTH (OR ZERO)
RPLEN NOP           MAX EXPECTED REPLY LENGTH 
INBUF NOP           INCOMING DATA BUFFER ADDRESS
      SPC 2 
ENTRY NOP           (ARTIFICAL?) ENTRY/EXIT 
      JSB .ENTR     OBTAIN DIRECT ADDRESSES 
       DEF CONWD       FOR PARAMETERS & RETURN POINT. 
      LDB RPLEN 
      SZB,RSS       FIRST 6  PARAMETERS PASSED? 
      JMP DS091     NO, GIVE ILLEGAL REQUEST
* 
      LDA DLWRT,I   CHECK PARAMETERS FOR POSITIVE LENGTH
      SSA 
      JMP DS092 
      LDA DLRED,I 
      SSA 
      JMP DS093 
      LDA RPLEN,I 
      SSA 
      JMP DS094 
* 
      LDB INBUF 
      SZB,RSS 
      LDB DABUF     SET 7TH PARM TO 3TH IF NOT GIVEN
      STB INBUF 
* 
*     CLEAR OUT REQUEST BUFFER
* 
      CLB,INB 
      ADB @RQB
      ADB RQLEN,I   <B> --> 2ND APPENDAGE WORD
      CLA 
      STA B,I       CLEAR 2ND WORD (INCLUDES RETRY COUNT) 
      STA RQB+#EC1
      STA RQB+#EC2
      STA RQB+#ENO
      STA RQB+#ECQ
      STA RQB+#MAS
      STA RQB+#MAR
      STA RQB+#MAC
      STA RQB+#SID
* 
*     FILL IN HOP COUNT FROM 'RES'
* 
      LDA #MHCT 
      STA RQB+#HCT
* 
*  CHECK FOR NO-REPLY OPTION
* 
      LDB BIT15 
      LDA CONWD,I   GET CONWD 
      SLA           TEST FOR NO-REPLY BIT (BIT 0) 
      STB RQB+#ECQ  IF SET, SET BIT15 IN ECQ
* 
* 
*  CHECK FOR LOCAL SYSTEM SHUT-DOWN OR QUIESCENT STATUS.
* 
START EQU * 
      CLB 
      STB SEQN      CLEAR SEQ # ALLOCATED FLAG
      STB CLSFG     CLEAR CLASS # ALLOCATED FLAG
      CPB #GRPM     IS THE DS/1000 SYSTEM SHUT-DOWN?
      JMP DS001       YES. GO TELL CALLER THE SAD NEWS. 
* 
*  REQUESTS WILL BE FORCED TO WAIT HERE, IF LOCAL SYSTEM HAS BEEN QUIESCED. 
* 
      LDA #QRN      CHECK IF #QRN IS VALID
      SZA,RSS 
      JMP DS002 
* 
      JSB RNRQ      GO TO RTE TO CHECK FOR SYSTEM QUIESCENCE. 
       DEF *+4
       DEF LCGNW
       DEF #QRN      CHECK SYSTEM-QUIESCENCE RESOURCE NUMBER. 
       DEF TEMP      SAVE RN STATUS 
       JMP PASER     * RTE ERROR - PASS CODE TO CALLER *
      CLA,INA       IS RN CLEAR?
      CPA TEMP
      RSS 
      JMP DS003     . NO, TELL USER SYSTEM QUIESCENED/ING 
* 
      LDA #MSTC     CHECK IF CLASS # ALREADY ASSIGNED 
      STA CLASN 
      SZA 
      JMP S1        BYPASS CLASS REQUEST
* 
*  REQUEST A CLASS NUMBER ALLOCATION FROM RTE.
* 
      JSB CLRQ      REQUEST CLASS NUMBER
       DEF *+4
       DEF CLRQ1     ALLOCATION CONTROL WORD
       DEF CLASN     CLASS NUMBER 
       DEF ZERO      INDICATE NO OWNERSHIP
       JMP DS085     ERROR! CANNOT ALLOCATE CLASS NUMBER! 
      LDA CLASN     INDICATE CLASS NUMBER HAS BEEN ALLOCATED
      STA CLSFG 
* 
S1    EQU * 
      LDA CONWD,I 
      RAL,ELA       MOVE TIMEOUT SUPPRESS FLAG (BIT14)
      LDA CLASN        TO BIT15 
      RAL,ERA             OF CLASS WORD 
      STA TEMP
* 
      LDA #NODE     LOCAL NODE NUMBER 
      STA RQB+#SRC     SET ORIGINATOR NODE (US) 
      LDA RQB+#DST     GET DESTINATION NODE 
      CPA N1        ALWAYS LOCAL? 
      LDA #NODE     YES! GET LOCAL NODE # 
      STA RQB+#DST  SET DESTINATION FIELD 
* 
*  CONVERT DESTINATION NODE TO LU 
* 
      JSB #NRVS     SEARCH NRV (LU RETURNED IN <A>) 
       DEF *+6
       DEF RQB+#DST  (NODE NUMBER FOR SEARCH) 
       DEF TMOUT     MASTER TIME-OUT
       DEF UPLVL     UPGRADE LEVEL OF DEST. NODE
       DEF NABOR     NEIGHBOR FLAG (IGNORED)
       DEF RQB+#DST  NODE # FROM NRV (NEEDED IF -LU USED) 
       JMP GETDS     ERROR RTN - NODE NOT IN NRV
      STA LU        SAVE COMMUNICATIONS LINK LU 
* 
      LDA #TTOV     GET TRANSACTION T/O OVERRIDE
      SZA           IS IT SPECIFIED (NON-ZERO)? 
      STA TMOUT     .YES, OVERRIDE THE T/O VALUE
* 
*  WAIT FOR AVAILABILITY OF LIST-ENTRY SPACE IN 'RES'; ADD NEW ENTRY. 
* 
      LDA #MSTC     CHECK NO WAIT FLAG
      SZA 
      JMP MAAS      BYPASS WAIT CODE
* 
      JSB RNRQ      WAIT FOR TCB AVAILABLE (#MAST ONLY) 
       DEF *+4
       DEF LGW       LOCK GLOBAL RN/WAIT FOR IT/NO ABORT. 
       DEF #TBRN     TABLE-ACCESS SPACE-AVAILABLE RN. 
       DEF CLNUP     (DUMMY PARAMETER). 
       JMP PASER     * RTE ERROR - PASS ERROR CODE TO USER *
* 
MAAS  LDA UPLVL     CHECK UPGRADE LEVEL - CANNOT
      SZA,RSS          HAVE MA TO LEVEL ZERO! 
      JMP ALLOC           THIS TURNS OFF MA TO THIS NODE. 
* 
*     GET MESSAGE ACCOUNTING (MA) SEQUENCE NUMBER 
* 
      JSB #MAAS     MA ASSIGNMENT 
       DEF *+3
       DEF RQB       (REQUEST BUFFER) 
       DEF RQLEN,I   (REQUEST LENGTH) 
       JMP MAERR     ERROR - RETURN W/ DS08 
      STA MA.ID     UNIQUE MA IDENTIFIER
* 
ALLOC JSB #RSAX     ALLOCATE TCB
       DEF *+6
       DEF GETCB     ADD MASTER TCB 
       DEF TEMP      PASS CLASS # & TIMEOUT FLAG
       DEF MA.ID     UNIQUE (MA) MESSAGE IDENTIFIER 
       DEF RQB+#DST  PASS DESTINATION NODE
       DEF TMOUT     MASTER TIME-OUT
      SSB           ANY ERRORS? 
      JMP RESER     * ERROR: "DS07" (NOT LIKELY)
      STA RQB+#SEQ  STORE SEQ # IN REQUEST
      STA SEQN         SAVE LOCALLY, BECAUSE IT CAN BE CLOBBERED IN RQST
* 
*  VERIFY REQUEST LENGTH
* 
      LDA MINLN     CHECK REQUEST LENGTH
      CMA,INA 
      ADA RQLEN,I   MUST BE AT LEAST THE MINIMUM
      SSA 
      JMP DS032     GIVE DS03 IF < MINIMUM
      LDA MAXLN 
      CMA 
      ADA RQLEN,I 
      SSA,RSS 
      JMP DS033     GIVE DS03 IF > MAXIMUM
* 
*     ASSIGN REMOTE SESSION ID (IN REQUEST) 
* 
      CLA 
      JSB #MSSM     <A>=0 
       JMP PASER     ERROR RETURN 
* 
*  NOW SEND THE REQUEST(/DATA)
* 
      LDA LU        LOAD COMMUNICATIONS LINK LU 
      IOR BIT15     BYPASS SESSION SST
      STA LU        DESTINATION LU W/ CONTROL BITS
      LDB #GRPM     GRPM'S CLASS NUMBER 
      STB CLASS 
* 
      LDA RQB+#LVL  GET LEVEL NUMBER (IN HEADER)
      AND UPMSK     MASK UPPER BYTE 
      IOR #LEVL     INCLUDE IN THIS SYSTEM'S UPGRADE LEVEL
      STA RQB+#LVL
* 
      LDA RQB+#STR  GET STREAM WORD 
      AND B77       CLEAR THE RETRY COUNTERS
      IOR #BREJ     INITIALIZE TO REQUIRED VALUE
      IOR BIT12     SET "> LEVEL 0" INDICATOR 
      STA RQB+#STR
* 
*     CHECK DESTINATION NODE UPGRADE LEVEL - IF LESS THAN 
*     "ME" (LOCAL NODE LEVEL) SEND TO REQUEST/REPLY CONVERTER 
*     FOR TRANSMISSION. 
      LDA #LEVL     IS MY UPGRADE LEVEL 
      CMA,INA         HIGHER THAN 
      ADA UPLVL        THAT OF DESTINATION
      SSA,RSS            NODE?
      JMP WRITE     . NO, MESSAGE DOESN'T NEED CONVERSION.
* 
*     DESTINATION NODE'S UPGRADE LEVEL IS LOWER THAN LOCAL NODE.
*     PASS THIS MESSAGE THROUGH OUT-BOUND MESSAGE CONVERTER 
*     BEFORE TRANSMISSION.
* 
      LDA #OTCV     CLASS # OF OUTPUT CONVERTER 
      SZA,RSS       CONVERTERS AVAILABLE? 
      JMP DS071     . NO BADO BADO ...
      STA CLASS 
      LDA BIT15     BYPASS SESSION SST
      STA LU
* 
WRITE EQU * 
      LDA RQLEN,I 
      ADA C#LSZ     BUMP LENGTH FOR LOCAL BUFFER
      STA LEN 
      CCB 
      ADB @RQB
      ADB A         <B> --> LAST WORD OF REQUEST
      LDA B,I 
      IOR BIT8      SET "DS STATUS" BIT 
      STA B,I 
* 
      JSB XLUEX     DO CLASS WRITE/READ TO DEST. LU 
       DEF *+8
       DEF CLS20     NO ABORT 
       DEF LU        DESTINATION LU 
       DEF DABUF,I
       DEF DLWRT,I   DATA BUFFER LENGTH OR ZERO 
@RQB   DEF RQB       REQUEST ADDRESS
       DEF LEN       REQUEST LENGTH 
       DEF CLASS
       JMP PASER     DO ERROR RETURN
* 
      LDA RQB+#SEQ  RETURN SEQUENCE NUMBER TO CALLER
      STA REG 
      LDA #MSTC     CHECK FOR NO WAIT CALL
      SZA 
      JMP RTN          AND RETURN 
      SKP 
* 
*  DO A CLASS GET TO WAIT FOR A REPLY FOR THIS TRANSACTION. 
* 
      JSB #GET      WAIT FOR REPLY
       DEF *+6
       DEF CLASN     SPECIFY MASTER CLASS NO.--NO RELEASE.
       DEF RQB       REPLY ADDRESS
       DEF RPLEN,I   SPECIFY MAXIMUM REPLY LENGTH.
       DEF INBUF,I   DATA BUFFER ADDR 
       DEF DLRED,I   DATA LENGTH OR ZERO
       JMP PASER     * GET ERROR: GO TO PROCESS * 
      DST REG       SAVE REGS FOR RETURN
* 
*  CHECK FOR PROPER REPLY.
* 
      SZA,RSS       CHECK FOR ZERO REPLY LENGTH.
      JMP DS05      * ZERO LENGTH: GO PROCESS TIMEOUT ERROR * 
      CPA K1        MA RETRY REQUEST? 
      JMP RETRY     . YES, RESEND MESSAGE 
      DLD RQB+#EC1  CHECK FOR DS05 RETURNED 
      CPA "DS"         BY MA AND PERFORM NORMAL 
      RSS                 TIMEOUT PROCESSING (MA
      JMP *+3                WILL HAVE SET QUALIFIER) 
      CPB "05"
      JMP DS05
      CLA,INA       <A>=1 
      JSB #MSSM     LOG RETURNED SESSION ID (IF ANY)
      LDB RQB+#ENO  GET NODE REPORTING ERROR
* 
*  CHECK THAT REPLY DOESN'T CONTAIN ERROR 
      SSB,RSS       IS SIGN BIT SET (IN ERROR NODE)?
      JMP GOODX     . NO, NO ERROR
      DLD RQB+#EC1  CHECK FOR REMOTE BUSY ("DS08")
      CPA "DS"      DS TYPE ERROR?
      RSS           . YES CHECK MORE
      JMP ERPLY     . NO CORN-TINUE 
      CPB "08"      "DS08"? 
      JMP SUSPD     . YES, GO SUSPEND AWHILE
      JMP ERPLY     ELSE DO ERROR EXIT
* 
GOODX JSB CLNUP     GO TO CLEAN UP BEFORE EXITING.
* 
*  RETURN TO USER AT NORMAL RETURN POINT. 
* 
RTN   DLD REG       <A&B> = RCVD REQUEST & DATA LENGTHS 
      ISZ ENTRY     SET EXIT POINTER FOR NORMAL RETURN. 
      JMP ENTRY,I   RETURN TO THE CALLER. 
      SKP 
* 
SUSPD CLB 
      CPB #WAIT     DO WE DELAY OR RETURN ERROR DS08? 
      JMP ERPLY     NO WAIT SPEC'D, GIVE DS08 TO CALLER 
*            DELAY AWHILE THEN TRY AGAIN
      JSB CLNUP     RETURN MASTER CLASS # & TCB 
* 
      JSB EXEC      GO TO THE RTE 'EXEC'
       DEF *+6        IN ORDER TO PLACE 
       DEF K12         INTO THE TIME-LIST,
       DEF ZERO         THIS PROGRAM, FOR A PERIOD
       DEF K2            OF DELAY IN SECONDS, 
       DEF ZERO           (ONCE-ONLY) AS DETERMINED BY A
       DEF #WAIT           NEGATIVE VALUE <#WAIT> IN 'RES'. 
* 
      JMP START      NOW, RE-SUBMIT THE REQUEST.
* 
RETRY EQU *          BEFORE RETRY,
      JSB CLNUP        RELEASE THE TCB AND CLASS NUMBERS ALLOCATED
      JMP START        THEN, RE-SUBMIT THE REQUEST. 
* 
      SKP 
* 
*  SUBROUTINE TO RELEASE THE MASTER CLASS & CLEAR THE MASTER TCB
* 
CLNUP NOP           ENTRY/EXIT
      LDA CLSFG     CHECK IF CLASS ALLOCATED
      SZA,RSS       IF CLASS NEVER ASSIGNED,
      JMP CLTCB       TRY THE TCB...
* 
      JSB CLRQ      RELEASE CLASS NUMBER & PENDING BUFS 
       DEF *+3
       DEF CLRQ2     FUNCTION 2 
       DEF CLASN     CLASS NUMBER 
ZERO   NOP
* 
CLTCB EQU * 
      LDA SEQN     CHECK IF TCB ALLOCATED,
      SZA,RSS        AND IF 
      JMP CLNUP,I    NOT, RETURN
*                    ELSE ... 
      JSB #RSAX     CLEAR MASTER TCBS 
       DEF *+3
       DEF K6        CLEAR MASTER TCB CODE
       DEF SEQN      PASS SEQ # 
      JMP CLNUP,I   RETURN. 
      SPC 2 
* 
*  ERROR PROCESSING SECTION.
* 
MAERR STB TEMP
      JSB RNRQ      UNLOCK TCB LOCK 
       DEF *+4
       DEF ULGW 
       DEF #TBRN
       DEF CLNUP    (DUMMY) 
       NOP
      LDB TEMP
      JMP GETDS 
DS001 LDA Q1        #GRPM = 0 
      RSS 
DS002 LDA Q2        #QRN = 0
      RSS 
DS003 LDA Q3        SYSTEM QUIESCENING
      LDB "00"      SYSTEM IS SHUT-DOWN: "DS00".
      JMP STQLF     STORE QUALIFIER IN (A)
DS032 LDA Q2        DS03/2 - RECORD LENGTH TOO SMALL
      RSS 
DS033 LDA Q3        DS03/3 - RECORD LENGTH TOO BIG
      LDB "03"
      JMP STQLF     STORE QUALIFIER IN (A)
DS05  JSB #RSAX     TEST 'REQUEST ACKED' BIT
       DEF *+3
       DEF K16
       DEF SEQN 
      LDB Q1
      SZA           DID REQUEST MAKE IT TO OTHER SIDE?
      STB RQB+#ECQ  . YES OVERRIDE QUALIFIER
      LDB "05"      DS05 - MASTER REQUEST TIMEOUT 
      JMP GETDS 
DS071 LDA Q1        DS07/1 - NO LEVEL CONVERTERS
      LDB "07"
      JMP STQLF 
RESER EQU * 
      CPB N3
      JMP DS08
      LDA Q3        DS07/3 - #RSAX ERROR
      LDB "07"
      JMP STQLF 
DS085 LDA Q5        DS08(5) - CANNOT ALLOCATE 
      STA RQB+#ECQ     CLASS NUMBER!
DS08  LDB "08"
      JMP GETDS 
DS091 LDA Q1
      RSS 
DS092 LDA Q2
      RSS 
DS093 LDA Q3
      RSS 
DS094 LDA Q4
      LDB "09"      DS09 - BAD PARAMETERS 
* 
STQLF EQU * 
      STA RQB+#ECQ  STORE QUALIFIER IN (A)
* 
*     LOCAL ERRORS HAVE NODE NUMBER INSERTED INTO RQB 
* 
GETDS LDA "DS"      GET FIRST HALF OF ERROR MESSAGE "DS". 
* 
PASER DST RQB+#EC1  SAVE ERROR MESSAGE IN REPLY (NO MATTER WHAT)
      LDB RQB+#ENO
      LDA #NODE     LOCAL NODE REPORTING ERROR
      IOR BIT15     SET ASCII ERROR BIT 
      SZB,RSS       THEN, DONT OVERLAY IF SOME NODE # IS ALREADY THERE
      STA RQB+#ENO
* 
ERPLY JSB CLNUP     GO TO CLEAN UP BEFORE EXITING.
      LDA CONWD,I   GET ERROR-RETURN FLAG.
      ELA           POSITION TO <E> FOR TESTING.
      DLD RQB+#EC1     GET ERROR CODES
      SEZ           ABORT OR RETURN TO CALLER?
      JMP ENTRY,I   . RETURN TO CALLER
* 
*     ABORT THE CURRENT PROGRAM 
* 
#TILT NOP 
      CLA 
      STA ABMSG     INDICATE CURRENT PGM NAME WANTED
      JSB PGMAD 
       DEF *+2
       DEF ABMSG
* 
      JSB DSERR     EXPAND ERROR CODES
       DEF *+2
       DEF RQB       (OVERLAY TO SAVE SPACE)
* 
      JSB EXEC
       DEF *+5
       DEF K2 
       DEF K1 
       DEF ABMSG
       DEF K32
* 
      JSB EXEC      BYE BYE...
       DEF *+2
       DEF K6 
      SKP 
*-----------------------------------------------------
*               CONSTANTS 
*-----------------------------------------------------
Q1    OCT 000020
Q2    OCT 000040
Q3    OCT 000060
Q4    OCT 000100
Q5    OCT 000120
BIT8  OCT 000400
BIT12 OCT 010000
BIT15 OCT 100000
CLRQ1 OCT 140001    ALLOCATE CLASS FUNCTION 
CLRQ2 OCT 140002    DEALLOCATE CLASS FUNCTION 
B77   OCT 77
UPMSK OCT 177400
CONWX OCT 010100
CLS20 DEF 20,I      CLASS WRITE/READ--NO ABORT
LCGNW OCT 140006    GLOBAL RN LOCK/CLEAR/NO WAIT/NO-ABORT.
LGW   OCT 040002    GLOBAL RN LOCK/WAIT/NO ABORT. 
ULGW  OCT 040004    UNLOCK
K1    DEC 1 
K2    DEC 2 
K6    DEC 6 
K12   DEC 12
K14   DEC 14
K16   DEC 16
K32   DEC 32
N1    DEC -1
N3    DEC -3
"00"  ASC 1,00
"03"  ASC 1,03
"05"  ASC 1,05
"07"  ASC 1,07
"08"  ASC 1,08
"09"  ASC 1,09
"DS"  ASC 1,DS
* 
C#LSZ ABS #LSZ      REQUEST APPENDAGE SIZE
MINLN ABS #MHD      MINIMUM REQUEST LENGTH
MAXLN ABS #MXR      MAXIMUM REQUEST LENGTH
*-----------------------------------------------------
*               STORAGE 
*-----------------------------------------------------
      SUP 
SEQN  NOP           SEQUENCE NUMBER 
#TTOV NOP           TRANSACTION T/O OVERRIDE WORD 
* 
*        NOTE: ABMSG MUST IMMEDIATELY PRECEDE #RQB BUFFER 
*               DO NOT DISTURB THIS ORDER!
* 
ABMSG ASC 8,XXXXX ABORTED!
#RQB  EQU * 
RQB   BSS #MXR+#LSZ 
REG   BSS 2         RETURN REGISTER INFORMATION.
MA.ID BSS 1         UNIQUE (MA) MESSAGE IDENTIFIER
GETCB BSS 1         RSAX COMMAND WORD TO GET A TCB
LU    BSS 2         DESTINATION LU
TMOUT BSS 1         MASTER TIME-OUT VALUE 
UPLVL BSS 1         DESTINATION UPGRADE LEVEL 
NABOR BSS 1         NEIGHBOR FLAG FOR #NRVS CALL (IGNORED)
TEMP  BSS 1         TEMPORARY STORAGE.
CLASN BSS 1         CLASS NUMBER STORAGE. 
CLASS BSS 1 
CLSFG BSS 1         CLASS ALLOCATED FLAG
LEN   BSS 1 
SIZE  EQU * 
      END 
                                                                                                                                                                                            