          TITLE  NETWORK DRIVER COMMON ROUTINES.
**        CCK - CLEAR CHANNEL LOCK.
*
*         CLEAR THE CHANNEL LOCK IN THE CM CHANNEL TABLE.
*
*         ENTRY  (CM.CHAN) = THE START OF 3 WORDS
*                 THAT CONTAIN A REFORMATTED CM ADDRESS
*                 POINTING TO THE CHANNEL TABLE.
*                (CHAN) = THE CHANNEL NUMBER.
*
*         EXIT    THE CHANNEL IS UNLOCKED.
*
*         USES   T5, T7.
*
*         CALLS  CLK.
          SPACE  4,10
CCK       SUBR               ENTRY/EXIT
          LDK    CM.CHAN
          STD    T7          SET POINTER TO CHANNEL TABLE
          LDML   CHAN
          STD    T5          SET CHANNEL NUMBER AS INDEX
          RJM    CLK         CLEAR THE LOCK ON THAT CM WORD
          NJN    *           ERROR LOCK CAN NOT BE CLEARED
          STML   CHLOCK      CLEAR CHANNEL LOCKED FLAG
          UJK    CCKX        EXIT

          SPACE  4,10
**        CDA - CHECK IF DATA AVAILABLE.
*
*         THIS ROUTINE OBTAINS THE GENERAL STATUS AND, IF
*         NO ERRORS, CHECKS FOR DATA AVAILABLE.
*
*         EXIT   (A) < 0, IF DATA AVAILABLE.
*
*         CALLS  GST.
          SPACE  4,10
 CDA      SUBR               ENTRY/EXIT
          RJM    CSC
          ZJN    CDA10       IF NO ERROR
          LDN    0
          UJN    CDAX        EXIT, IF CAN NOT READ STATUS

 CDA10    LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.DATAV
          UJN    CDAX        EXIT
          SPACE  4,14
**        CLK - CLEAR LOCK.
*
*         THIS ROUTINE CLEARS THE LOCK AT THE SPECIFIED
*         CM ADDRESS.
*
*         ENTRY  (T7) = CM TABLE ADDRESS.
*                (T5) = WORD OFFSET OF LOCKWORD.
*
*         EXIT   (A) = 0, IF LOCK CLEARED,
*                (A) <> 0, IF LOCK COULD NOT BE CLEARED.
*
*         USES   T1, T2, T3, T4, T5, T6, T7.
*
*         MACROS LOADR.
          SPACE  2,10
 CLK      SUBR               ENTRY/EXIT
 CLK10    LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          IFEQ   DRTYP,1
          LOADR  0,T7        UNIT/PP INTERFACE TABLE ADDRESS
          ENDIF
          IFEQ   DRTYP,2
          LRIL   T7
          LDML   1,T7        UNIT/PP INTERFACE TABLE ADDRESS
          ENDIF
          ADDL   T5          ADD LOCKWORD OFFSET
          STDL   T6
          RDSL   T1          SET UPPER 32 BITS OF LOCK WORD TO '1'S
          LDDL   T1
          ADDL   T2
          ADC    400001B
          ZJN    CLK10       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          AODL   T5          INSURE T5 NON ZERO
          LDDL   T1
          SHN    17-15
          PJN    CLK20       IF INTERLOCK LOST (RESTORE ORIGINAL CONTENTS)
          LDDL   T4
          LMDL   PPNO        PP NUMBER
          NJN    CLK20       IF SOMEONE ELSE HAS GRABBED THE INTERLOCK
*         LDN    0
          STDL   T1          CLEAR INTERLOCK WORD
          STDL   T2
          STDL   T3
          STDL   T4
          STDL   T5
 CLK20    LDDL   T6
          ADC    400000B
          CWDL   T1          UPDATE INTERLOCK WORD
          LDDL   T5
          UJK    CLKX        RETURN
          SPACE  4,10
**        CPL - CLEAR PP INTERFACE QUEUE LOCK.
*
*         THIS ROUTINE CLEARS THE PP QUEUE LOCK IN THE PP
*         INTERFACE TABLE.
*
*         USES   T5, T7.
*
*         CALLS  CLK.
          SPACE  4,10
 CPL      SUBR               ENTRY/EXIT
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    CLK         CLEAR THE LOCKWORD
          UJK    CPLX
 CSW      SPACE  4,16
**        CSW - COMPARE-SWAP ROUTINE.
*
*         THIS ROUTINE DOES A COMPARE-SWAP OF A SPECIFIED LOCK.
*         A PSEUDO-LANGUAGE COMPARABLE CALL WOULD BE
*            CALL COMPARE-SWAP(LOCK, OLD, NEW, ACTUAL, STATUS)
*            WHERE
*                LOCK   = (T7) + (T5) = ADDRESS OF THE LOCK
*                OLD    = ((P5)) = EXPECTED VALUE OF THE LOCK
*                NEW    = ((A)) UPON ENTRY = REPLACEMENT VALUE OF THE LOCK
*                ACTUAL = (P1 - P4) RETURNED BY ROUTINE *SLR* = ORIGINAL VALUE
*                         OF THE LOCK
*                STATUS = (A) UPON EXIT = SUCCESS/FAILURE OF THE COMPARE-SWAP
*
*         ENTRY  (A)  = ADDRESS OF NEW (REPLACEMENT) VALUE FOR LOCK.
*                (P5) = ADDRESS OF OLD (EXPECTED) VALUE IN LOCK.
*                (T5) = WORD OFFSET OF LOCKWORD.
*                (T7) = CM ADDRESS OF TABLE.
*
*         EXIT   (A) = 0, IF THE COMPARE-SWAP WAS SUCCESSFUL.  (IF THE CONTENTS
*                         OF THE LOCK WERE REPLACED BY *NEW*).
*                (A) <> 0, IF THE COMPARE-SWAP FAILED.  (IF THE ORIGINAL
*                          CONTENTS REMAIN IN THE LOCK).
*                (P5) = UNDEFINED.
*
*         USES   P1 - P4, T2, T6.
*
*         CALLS  SLR.


*         OLD VALUE WAS NOT IN THE LOCK.  RESTORE ORIGINAL VALUE.

 CSW40    BSS    0
          LDDL   T6          OFFSET TO CM WORD
          ADC    400000B
          CWDL   P1          UPDATE INTERLOCK WORD WITH ORIGINAL VALUE

 CSW      SUBR               ENTRY/EXIT
          STML   CSWA        PLANT PP ADDRESS OF *NEW*

 CSW20    BSS    0
          RJM    SLR         SET LOCK RESERVATION

*         IF ACTUAL=OLD  (IF (P1) - (P1+2) = ((OLD)) - ((OLD+2))).

          LDN    2           CHECK 3 PP WORDS (0..2) (PVA SIZE IS 3 PP WORDS)
          STDL   T2          STARTING OFFSET FOR *ACTUAL*
          RADL   P5          STARTING INDIRECT VALUE FOR *OLD*

 CSW30    BSS    0
          LDIL   P5          A PORTION OF *OLD*
          LMML   P1,T2       COMPARE WITH CORRESPONDING PORTION OF *ACTUAL*
          NJK    CSW40       IF DIFFERENT
          SODL   P5          NEXT INDIRECT VALUE FOR *OLD*
          SODL   T2          NEXT OFFSET FOR *ACTUAL*
          PJK    CSW30       IF MORE TO CHECK

          LDN    1           SIZE OF *NEW* (CM WORDS)
          STDL   WC
          LDDL   T6          OFFSET TO CM WORD
          ADC    400000B
          CWML   **,WC       UPDATE INTERLOCK WORD WITH *NEW*
 CSWA     EQU    *-1         PP ADDRESS OF *NEW*

          LDN    0           CM WORD CONTENTS WERE REPLACED BY *NEW*
          UJK    CSWX        EXIT
 IRP      SPACE  4,10
**        IRP - INITIALIZE REQUEST PROCESSING.
*
*         INITIALIZES A PERIPHERAL RESPONSE TEMPLATE, AND ESTABLISHES
*         THE ENVIRONMENT FOR REQUEST PROCESSING.  TERMINATION MAY BE
*         REFLECTED THROUGH A PERIPHERAL RESPONSE AFTER THE RESPONSE
*         IS INITIALIZED.
*
*         ENTRY  (RQ) = PERIPHERAL REQUEST BEING PROCESSED.
*
*         EXIT   (RS) = RESPONSE AREA FOR RESPONSE.
          SPACE  4,10
 IRP      SUBR           ENTRY/EXIT
          LDML   RQ+/RQ/P.RECOV  RECOVER, INTERRUPT, PORT, PRIORITY
          LPC    177400B
          LMML   DEVID
          STML   RS+/RS/P.RECOV
          LDML   RQ+/RQ/P.ALRT   ALERT MASK
          STML   RS+/RS/P.ALRT
          LDML   RS+/RS/P.REQ+1
          ERRNZ  /RQ/C.CMND-/URQ/C.CODE   COMMAND CODES NOT THE SAME
          ADN    /RQ/C.CMND*8  DETERMINE RMA OF COMMAND
          STML   RS+/RS/P.LASTC+1  PUT RMA OF COMMAND IN RESPONSE BUFFER
          SHN    -16
          ADML   RS+/RS/P.REQ
          STML   RS+/RS/P.LASTC
          UJK    IRPX        EXIT
          SPACE  4,13
**        IGS - INCLUDE GENERAL STATUS.
*
*         THIS ROUTINE SETS GENERAL STATUS INTO THE
*         RESPONSE BUFFER AND SETS THE GENERAL
*         STATUS INCLUDED BIT IN THE RESPONSE.
*
*         ENTRY  (GNSTAT) = COPY OF GENERAL STATUS.
*
*         USES   T9, T10.
          SPACE  4,10
 IGS      SUBR               ENTRY/EXIT
          LDC    /RS/K.LGS
          STDL   T9
          LMC    -0
          STDL   T10
          LDML   LRS+/RS/P.LGS  STATUS FLAGS
          LPDL   T10
          ADDL   T9          ADD GENERAL STATUS
          STML   LRS+/RS/P.LGS
          LDDL   GNSTAT
          STML   LRS+/RS/P.GENST
          UJN    IGSX        EXIT
          SPACE  4,10
**        PIE - PROCESS INTERFACE ERROR.
*
*         THIS ROUTINE SETS UP THE INTERFACE ERROR CODE
*         AND THE INTERFACE ERROR BIT IN THE RESPONSE.  THE
*         RESPONSE CODE IS ALSO SET TO ABNORMAL.  IF THE
*         RESPONSE IS TO BE UNSOLICITED THEN THE RESPONSE CODE
*         WILL BE CHANGED BY ROUTINE *USR*.
*
*         ENTRY  (A) = INTERFACE ERROR CODE.
*
*         EXIT   (A) > 0.
          SPACE  4,10
 PIE      SUBR               ENTRY/EXIT
          STML   IERC        INTERFACE ERROR CODE
          LDML   ABSC        ABNORMAL STATUS
          LPC    /RS/K.INTERR
          NJN    PIE10       IF INTERFACE ERROR BIT ALREADY SET
          LDC    /RS/K.INTERR
          RAML   ABSC        SET INTERFACE ERROR BIT
 PIE10    LDN    R.ABN       ABNORMAL RESPONSE CODE
          STDL   RESPC
          UJN    PIEX        EXIT
          SPACE  4,10
**        PPR - PROCESS PP REQUESTS.
*
*         THIS ROUTINE PROCESSES ALL THE REQUESTS IN THE
*         PP QUEUE.
*
*         EXIT   PP REQUEST QUEUE EMPTY.
*
*         CALLS  GPR, PPC, STR.
          SPACE  4,10
 PPR      SUBR               ENTRY/EXIT
          LDN    0
          STML   REQTYP      SET REQUEST TYPE = PP
 PPR10    BSS    0
          IFEQ   BRK,1
          RJM    BKPM
          ENDIF
          RJM    GPR         GET PP REQUEST
          ZJN    PPRX        IF NO REQUESTS - EXIT
          RJM    PPC         PROCESS PP COMMAND
          RJM    STR         SEND TERMINATION RESPONSE
          UJN    PPR10
          SPACE  4,10
**        PRC - PUT RESPONSE CODES IN RESPONSE.
*
*         THIS ROUTINE SETS UP THE RESPONSE AND ERROR CODE
*         FIELDS IN THE PP RESPONSE BUFFER.
*
          SPACE  6
 PRC      SUBR               ENTRY/EXIT
          LDDL   RESPC       RESPONSE CODE
          SHN    /RS/L.RCON-/RS/L.RC+/RS/N.RCON-/RS/N.RC
          ADML   RCON        RESPONSE CONDITION
          SHN    /RS/L.URC-/RS/L.RCON+/RS/N.URC-/RS/N.RCON
          ERRNZ  /RS/P.URC-/RS/P.RCON
          ERRNZ  /RS/P.RC-/RS/P.URC
          ADDL   UNSC        UNSOLICITED RESPONSE CODE
          STML   RS+/RS/P.URC
          LDML   ABSC        ABNORMAL STATUS CODE
          STML   RS+/RS/P.INTERR
          LDML   IERC        INTERFACE ERROR CODE
          STML   RS+/RS/P.IEC
          UJK    PRCX
          SPACE  4,10
**        PRD - PROCESS READ.
*
*         THIS ROUTINE PERFORMS A READ IF THE
*         NETWORK DEVICE DATA IS AVAILABLE.
*
*         CALLS  CDA, PFR.
          SPACE  4,10
 PRD      SUBR               ENTRY/EXIT
          LDML   NUMBP       NUMBER OF BUFFER POOLS
          ZJN    PRDX        IF NO BUFFER DESCRIPTORS
          RJM    CDA         CHECK IF DATA AVAILABLE
          PJN    PRDX        IF NO DATA AVAILABLE
          RJM    PFR         PERFORM READ
          UJK    PRDX        EXIT
          SPACE  4,10
**        PUC - PROCESS UNIT COMMAND.
*
*         THIS ROUTINE PROCESSES A WRITE COMMAND.
*         MULTIPLE WRITE COMMANDS PER REQUEST ARE
*         NOT ALLOWED.
*
*         ENTRY  (CM) = COMMAND.
*                (RQ) = REQUEST.
*
*         EXIT   (STBI) = REQUEST CODE.
*
*         CALLS  PIE, STR, WRP.
          SPACE  4,10
 PUC      SUBR               ENTRY/EXIT
          ERRNZ  /RQ/C.CMND-/URQ/C.CODE   COMMAND CODES NOT THE SAME
          LDML   CM+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          STML   STBI
          LMK    C.WRTR      COMPARE WITH WRITE RECORD
          NJN    PUC10       IF BAD COMMAND CODE

*         PROCESS VALID COMMAND.

          RJM    WRP         WRITE RECORD PROCESSOR
          UJK    PUCX        EXIT

*         PROCESS INVALID COMMAND.

 PUC10    BSS    0
          LDC    E501        INTERFACE ERROR CODE
          RJM    PIE         PROCESS INTERFACE ERROR
          RJM    STR         SEND TERMINATION RESPONSE
          UJK    PUCX        EXIT
          SPACE  4,20
**        PUR - PROCESS UNIT REQUEST.
*
*         THIS ROUTINE PROCESSES ONE UNIT REQUEST FROM A UNIT QUEUE.  IF NORMAL
*         FLOW CONTROL IS ON ONLY PRIORITY REQUESTS ARE PROCESSED.  IF NORMAL
*         FLOW CONTROL IS OFF THEN A PRIORITY REQUEST WILL BE SELECTED IF
*         AVAILABLE, IF NOT A NORMAL REQUEST WILL BE SELECTED.  NOT MORE THAN
*         *MAXPR* CONSECUTIVE PRIORITY REQUESTS WILL BE SELECTED WITHOUT A
*         NORMAL REQUEST BEING SELECTED IF NORMAL FLOW CONTROL IS OFF.
*
*         ENTRY  (CM.URQ) = REFORMATTED R REGISTER PORTION OF
*                           THE MASTER CONTROL TABLE ADDRESS.
*                (CM.MCT) = REFORMATTED A REGISTER PORTION OF THE
*                           MASTER CONTROL TABLE ADDRESS.
*                (NUMPRI) < OR = MAXPR IF FLOW CONTROL OFF,
*                         > MAXPR IF FLOW CONTROL ON.
*
*         EXIT   (CM.URQ+2) = REFORMATTED A REGISTER PORTION OF THE FIRST WORD
*                             ADDRESS OF THE MASTER CONTROL TABLE DEFINITION
*                             OF THE QUEUE BEING SERVICED (NORMAL OR PRIORITY).
*
*         CALLS  GUR, PUC.
*
          SPACE  4,10
 PUR      SUBR               ENTRY/EXIT
          LCN    0
          STML   REQTYP      SET REQUEST TYPE = UNIT
          LDML   WRRTY
          LMN    FTRY
          ZJN    PUR03       IF NOT IN RECOVERY
          LDML   NUMPRI
          ZJN    PUR20       IF NORMAL REQUEST
          UJN    PUR07       PRIORITY REQUEST

 PUR03    LDML   NUMPRI
          LMN    MAXPR
          ZJN    PUR10       IF TIME TO SERVICE NORMAL
 PUR05    LDML   CM.MCT
          ADN    /MCT/C.PRI  PRIORITY QUEUE
          IFEQ   DRTYP,1
          STDL   CM.URQ+2
          ENDIF
          IFEQ   DRTYP,2
          STDL   CM.URQ+1
          ENDIF
 PUR07    RJM    GUR         GET PRIORITY UNIT REQUEST
          NJN    PUR30       IF REQUEST FOUND
          LDN    MAXPR
          SBML   NUMPRI
          MJN    PURX        IF ONLY PRIORITY ALLOWED
 PUR10    LDML   CM.MCT
          ADN    /MCT/C.NOR  NORMAL QUEUE
          IFEQ   DRTYP,1
          STDL   CM.URQ+2    NORMAL REQUEST QUEUE
          ENDIF
          IFEQ   DRTYP,2
          STDL   CM.URQ+1
          ENDIF
 PUR20    RJM    GUR         GET NORMAL UNIT REQUEST
          ZJN    PUR60       IF NO REQUESTS
          LDN    0
          STML   NUMPRI
          IFEQ   DRTYP,1     IF MDI
          LOADF  MCT+/MCT/P.NOR+/UQD/P.TAIL   UNIT NORMAL QUEUE TAIL POINTER
          ENDIF
          IFEQ   DRTYP,2     IF ICA
          LRML   MCT+/MCT/P.NOR+/UQD/P.TAIL   UNIT NORMAL QUEUE TAIL POINTER
          LDML   MCT+/MCT/P.NOR+/UQD/P.TAIL+1
          ENDIF
          UJN    PUR40       PROCESS UNIT REQUESTS

 PUR30    LDML   WRRTY
          LMN    FTRY
          NJN    PUR35       IF IN RECOVERY
          AOML   NUMPRI
 PUR35    BSS    0
          IFEQ   DRTYP,1     IF MDI
          LOADF  MCT+/MCT/P.PRI+/UQD/P.TAIL   UNIT PRIORITY QUEUE TAIL PTR
          ENDIF
          IFEQ   DRTYP,2     IF ICA
          LRML   MCT+/MCT/P.PRI+/UQD/P.TAIL   UNIT PRIORITY QUEUE TAIL PTR
          LDML   MCT+/MCT/P.PRI+/UQD/P.TAIL+1
          ENDIF
 PUR40    BSS    0
          IFEQ   DRTYP,1     IF MDI
          SRD    CM.QT
          STDL   CM.QT+2     UNIT QUEUE TAIL POINTER
          ENDIF
          IFEQ   DRTYP,2     IF ICA
          SRDL   CM.QT
          SHN    -3
          STDL   CM.QT+1     UNIT QUEUE TAIL POINTER
          ENDIF
          RJM    PUC         PROCESS UNIT COMMAND
 PUR50    UJK    PURX        EXIT

 PUR60    LDN    MAXPR
          SBML   NUMPRI
          NJN    PUR50       IF PRIORITY SEARCHED
          STML   NUMPRI
          UJK    PUR05       TRY PRIORITY
          SPACE  4,16
**        SBL - SET BUFFER POOL DESCRIPTOR LOCK.
*
*         THIS ROUTINE INTERLOCKS THE SPECIFIED WORD IN THE
*         BUFFER POOL DESCRIPTOR.
*
*         ENTRY  (A) = ARRAY INDEX OF POOL DESCRIPTOR TO LOCK.
*
*         EXIT   (A) = 0, TO SHOW THAT THE CM WORD IS INTERLOCKED.
*
*         USES   T5, T7.
*
*         CALLS  SLR.
          SPACE  4,10
 SBL      SUBR               ENTRY/EXIT
          STDL   T5
          LDK    CM.BPD      FIRST BUFFER POOL DESCRIPTOR
          STDL   T7
          RJM    SLR         SET LOCK RESERVATION
          UJK    SBLX
          IFEQ   DRTYP,2     IF ICA
          SPACE  4,10
**        SIT - SET INCOMPLETE TRANSFER.
*
*         THIS ROUTINE SETS AN INCOMPLETE TRANSFER
*         IN THE RESPONSE.
*
*         ENTRY  (A) = OPERATION TYPE MASK.
*
*         CALLS  SSC.
          SPACE  4,10
 SIT      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.OPTP  STORE OPERATION TYPE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LSIT
          RJM    SSC         SET SYMPTOM CODE
          UJN    SITX        EXIT
          ENDIF
          SPACE  4,10
**        SIU - SET INTERMEDIATE UNRECOVERED.
*
*         THIS ROUTINE SETS THE RECOVERY STATUS INTO THE
*         RESPONSE BUFFER.  RECOVERY IS EITHER INTERMEDIATE OR
*         UNRECOVERED.
*
*         ENTRY  (A) = 0 IF UNRECOVERED ERROR.
*                    <> 0 = NUMBER OF RETRIES REMAINING.
*
*         USES   T4.
          SPACE  4,10
 SIU10    LDN    REC.I
 SIU20    STML   LRS+/RS/P.RETSUC
          LDN    FTRY
          SBDL   T4
          STML   LRS+/RS/P.RETCT  STORE RETRY COUNT

 SIU      SUBR               ENTRY/EXIT
          STDL   T4
          NJN    SIU10       IF RECOVERED
          LDN    REC.U
          UJN    SIU20       STORE UNRECOVERED ERROR
          SPACE  4,10
**        SLK - SET LOCK.
*
*         THIS ROUTINE SETS THE LOCK AT THE SPECIFIED
*         CM ADDRESS.
*
*         ENTRY  (T5) = WORD OFFSET OF LOCKWORD.
*                (T7) = CM ADDRESS OF TABLE.
*
*         EXIT   (A) = 0, IF LOCK SET.
*                (A) <> 0, IF LOCK COULD NOT BE SET.
*
*         CALLS  SLR, SLW.
          SPACE  2,10
 SLK      SUBR               ENTRY/EXIT
          RJM    SLR         SET LOCK RESERVATION
          RJM    SLW         SET LOCK WORD
          UJK    SLKX        EXIT
          SPACE  4,10
**        SLR - SET LOCK RESERVATION.
*
*         THIS ROUTINE INTERLOCKS THE COMPARE/SWAP WORD AT THE SPECIFIED
*         CM ADDRESS.  IT PLACES 0FFFFFFFF(16) IN THE UPPER PORTION OF THE
*         WORD TO RESERVE IT.
*
*         ENTRY  (T5) = WORD OFFSET OF CM WORD TO INTERLOCK.
*                (T7) = CM ADDRESS OF TABLE.
*
*         EXIT   (A) = 0, INDICATES LOCK HAS BEEN RESERVED.
*                (P1 - P4) = ORIGINAL CONTENTS OF CM WORD.
*                (T6) = (A) PORTION OF ADDRESS OF CM WORD.
*
*         USES   T1, T2, T3, T4, T5, T6, T7, T8.
*
*         MACROS LOADR.
          SPACE  2,10
 SLR      SUBR               ENTRY/EXIT
 SLR10    LDC    177777B
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          IFEQ   DRTYP,1
          LOADR  0,T7        UNIT/PP INTERFACE/ETC TABLE ADDRESS
          ENDIF
          IFEQ   DRTYP,2
          LRIL   T7
          LDML   1,T7        UNIT/PP INTERFACE/ETC TABLE ADDRESS
          ENDIF
          ADDL   T5          ADD INTERLOCK WORD OFFSET
          STDL   T6
          RDSL   T1          SET UPPER 32 BITS OF LOCK WORD TO '1'S
          LDDL   T1
          ADDL   T2
          ADC    400001B
          ZJN    SLR10       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS

*         SAVE ORIGINAL CONTENTS OF CM WORD IN (P1 - P4).

          LDN    3           STARTING (AND HIGH) OFFSET OF INTERLOCK WORD (0..3)
          STDL   T8

 SLR15    BSS    0
          LDML   T1,T8       ORIGINAL CONTENTS OF CM WORD
          STML   P1,T8
          SODL   T8          NEXT OFFSET
          PJK    SLR15       IF MORE TO DO

          LDN    0           INTERLOCK RESERVED
          UJK    SLRX        EXIT, INTERLOCK RESERVED
          SPACE  4,10
**        SLW - SET LOCK WORD.
*
*         THIS ROUTINE SETS THE LOCK WORD AT THE SPECIFIED
*         CM ADDRESS.
*
*         ENTRY  (P1 - P4) = ORIGINAL CONTENTS OF LOCK.
*                (R) = R-REGISTER PORTION OF LOCK ADDRESS.
*                (T1 - T4) = ORIGINAL CONTENTS OF LOCK.
*                (T6) = A-REGISTER PORTION OF LOCK ADDRESS (LOCK OFFSET).
*
*         EXIT   (A) = 0, IF LOCK SET.
*                (A) <> 0, IF LOCK COULD NOT BE SET.
*                (P1 - P4) = ORIGINAL CONTENTS OF LOCK.
*
*         USES   T1, T2, T3, T4, T6.
          SPACE  2,10
 SLW      SUBR               ENTRY/EXIT
          LDDL   T1
          SHN    17-15
          MJN    SLW20       IF INTERLOCK ALREADY SET (RESTORE WORD)
          LDC    100000B
          RADL   T1          SET INTERLOCK BIT
          LDDL   PPNO        PP NUMBER
          STDL   T4

 SLW20    LDDL   T6
          ADC    400000B
          CWDL   T1          UPDATE INTERLOCK WORD
          LDDL   T4
          LMDL   PPNO        PP NUMBER

*         (A) = 0, IF THE INTERLOCK IS OWNED BY THIS PP

          UJK    SLWX        EXIT
          SPACE  4,10
**        SPL - SET PP INTERFACE QUEUE LOCK.
*
*         THIS ROUTINE SETS THE PP REQUEST QUEUE LOCK IN THE
*         PP INTERFACE TABLE.
*
*         EXIT   (A) = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    <> 0, IF LOCK COULD NOT BE SET.
*
*         USES   T5, T7.
*
*         CALLS  SLK.
 SPL      SUBR               ENTRY/EXIT
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    SLK         SET THE LOCKWORD
          UJK    SPLX
          SPACE  4,10
**        SRU - SET RECOVERED UNRECOVERED.
*
*         THIS ROUTINE SETS THE RECOVERY STATUS INTO THE
*         RESPONSE BUFFER.  RECOVERY IS EITHER RECOVERED OR
*         UNRECOVERED.
*
*         ENTRY  (A) = 0 IF UNRECOVERED ERROR.
*                    <> 0 = NUMBER OF RETRIES REMAINING.
*
*         USES   T4.
          SPACE  4,10
 SRU10    LDN    REC.R
 SRU20    STML   LRS+/RS/P.RETSUC
          LDN    FTRY
          SBDL   T4
          STML   LRS+/RS/P.RETCT  STORE RETRY COUNT

 SRU      SUBR               ENTRY/EXIT
          STDL   T4
          NJN    SRU10       IF RECOVERED
          LDN    REC.U
          UJN    SRU20       STORE UNRECOVERED ERROR
          SPACE  4,10
**        SSC - SET SYMPTOM CODE.
*
*         THIS ROUTINE SETS THE SYMPTOM CODE INTO THE
*         RESPONSE BUFFER. IF SYMPTOM CODE IS CHANNEL ERROR
*         RETURN ERROR REGISTER FROM *GERT* IN RESPONSE BUFFER.
*
*         ENTRY  (A) = VALUE TO SET INTO SYMPTOM CODE FIELD.
*                ((GERT)) = ERROR REGISTER IF CHANNEL ERROR.
*
*         USES   T9, T10.
          SPACE  4,10
 SSC      SUBR               ENTRY/EXIT
          STDL   T9
          LMC    -0
          STDL   T10
          LDML   LRS+/RS/P.LSGSE  SYMPTOM CODES
          LPDL   T10
          ADDL   T9          ADD SYMPTOM CODE
          STML   LRS+/RS/P.LSGSE
          IFEQ   DRTYP,1
          LPC    /RS/K.LSCEF
          ZJN    SSCX        IF NOT CHANNEL ERROR
          SOML   GERT
          ADN    1
          STDL   T10
          LDIL   T10         RETURN ERROR REGISTER
          STML   LRS+/RS/P.ERRW1
          ENDIF
          UJN    SSCX        EXIT
          SPACE  4,10
**        STB - SEARCH TABLE.
*
*         THIS ROUTINE WILL PERFORM A TABLE SEARCH ON
*         THE SPECIFIED TABLE.  THE TABLE MUST HAVE TWO
*         WORDS PER ENTRY.
*
*         ENTRY  (A) = ADDRESS - 2 OF TABLE TO SEARCH.
*                (STBI) = KEY FOR SEARCH.
*
*         EXIT   (A) = 0, IF NO MATCH FOUND.
*                (A) = ADDRESS OF PROCESSOR OR FUNCTION TO
*                      ISSUE TO MCI.
*
*         USES   T2.
          SPACE  4,10
 STB      SUBR               ENTRY/EXIT
          STDL   T2
 STB10    LDN    2
          RADL   T2
          LDIL   T2          GET NEXT ENTRY
          ZJN    STBX        IF END OF TABLE
          LMML   STBI
          NJN    STB10       IF NOT A MATCH
          AODL   T2
          LDIL   T2          GET FUNCTION CODE OR PROCESSOR ADDRESS
          UJK    STBX        EXIT WITH ADDRESS
          SPACE  4,10
**        STR - SEND TERMINATION RESPONSE.
*
*         THIS ROUTINE TERMINATES A PERIPHERAL REQUEST BY SENDING
*         A SOLICITED RESPONSE AND DELINKING THE REQUEST.
*
*         CALLS  DLR, PRC, UIP, WRB, ZRE.
          SPACE  4,10
 STR      SUBR               ENTRY/EXIT
          RJM    PRC         PUT RESPONSE CODES IN RESPONSE
          LDC    RS          RESPONSE BUFFER
          RJM    WRB         WRITE RESPONSE BUFFER
          RJM    DLR         DELINK REQUEST
          RJM    UIP         UPDATE IN POINTER
          RJM    ZRE         ZERO OUT RESPONSE BUFFER
          UJN    STRX        RETURN
          SPACE  4,10
**        USR - SEND UNSOLICITED RESPONSE.
*
*         THIS ROUTINE SENDS AN UNSOLICITED RESPONSE TO THE CP.
*
*         CALLS  PRC, UIP,WRB, ZRE.
          SPACE  4,10
 USR      SUBR               ENTRY/EXIT
          LDN    R.UNS
          STDL   RESPC       UNSOLICITED RESPONSE
          RJM    PRC         PUT RESPONSE CODES IN RESPONSE
          LDC    RS          RESPONSE TO WRITE
          RJM    WRB         WRITE RESPONSE BUFFER
          RJM    UIP         UPDATE IN POINTER
          RJM    ZRE         ZERO OUT RESPONSE BUFFER
          UJK    USRX        EXIT
          SPACE  4,10
**        ZRE - ZERO OUT RESPONSE BUFFER.
*
*         USES   T1.
          SPACE  4,10
 ZRE      SUBR               ENTRY/EXIT
          LDN    0
          STDL   UNSC        UNSOLICITED RESPONSE CODE
          STML   IERC        INTERFACE ERROR CODE
          STML   ABSC        ABNORMAL STATUS CODE
          STML   RCON        RESPONSE CONDITION
          LDK    MAXRS*4     MAX RESPONSE BUFFER SIZE (PP WORDS)
          STDL   T1
 ZRE10    LDN    0
          STML   RS-1,T1     ZERO OUT RESPONSE BUFFER
          SODL   T1
          NJN    ZRE10
          LDN    /RS/C.XFER*8+8  SET RESPONSE LENGTH FOR NORMAL RESPONSE
          STML   RS+/RS/P.RESPL
          LDML   UNIT
          STML   RS+/RS/P.LU  SET UP LOGICAL UNIT NUMBER
          LDN    R.NRM       SET RESPONSE CODE = NORMAL
          STDL   RESPC
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC  PUT RESPONSE CODE IN RESPONSE
          LDML   DEVID
          STML   RS+/RS/P.DEVID
          UJK    ZREX
          SPACE  4,10
          IFEQ   BRK,1
          SPACE  4,10
*         BKP - ROUTINE TO DYNAMICALLY SET UP BREAK POINTS IN PP ROUTINE
*
*         THIS ROUTINE USES 20 CM WORDS IN THE NETWORK WIRED
*         SEGMENT, POINTED TO BY  NAV$NETWORK_PP_BKPT_AREA
*
*         TO OBTAIN THE RMA OF THIS BUFFER TYPE IN THE FOLLOWING
*                SYSDEBUG 0
*                DISOSS NAV$NETWORK_PP_BKPT_AREA
*                DM   (PVA RETURNED FROM DISOSS)
*                RUN
*         THEN THE FOLLOWING MDD COMMANDS:
*                DM (PVA RETURNED FROM DM ABOVE) MPS
*                DB
*         FOR EXAMPLE PURPOSES ASSUME RMA = 22A080(16).
*
*         22A080(16) = 16/BKP SWITCH, 48/0.
*                          1= BREAKPOINTING ON.
*         22A088(16) = 16/FNC CODE, 32/A REGISTER, 16/P REGISTER.
*
*         FOUR DIFFERENT FUNCTIONS CAN BE CALLED
*
*                0 - END THIS BREAKPOINT
*
*                1 - WAIT MODE, PP WILL LOOP UNTIL FUNCTION CODE IS
*                    CHANGED
*
*                2 - READ PP MEMORY, BYTES 0 AND 1 OF WORD 22A090(16) CONTAIN
*                    STARTING ADDRESS FOR READING. *BALEN* - 3 IS THE NUMBER
*                    OF CM WORDS TO READ INTO THE BUFFER STARTING AT
*                    WORD 22A098(16). AFTER READ IT WILL GO INTO WAIT MODE.
*
*                3 - CHANGE PP MEMORY, BYTES 2 AND 3 OF WORD 22A090(16) CONTAIN
*                    PP ADDRESS TO CHANGE CONTENTS OF. WORD 22A090(16),
*                    BYTES 4 AND 5 HOLD NEW CONTENTS OF THAT ADDRESS.
*                    AFTER WRITE GOES INTO WAIT MODE.
*
*                4 - SET BREAKPOINT, WORD 22A090(16), BYTES 6 AND 7 CONTAIN
*                    PP ADDRESS AT WHICH TO SET BREAKPOINT.
*                    AFTER THIS YOU ARE IN WAIT MODE.
*
*                ANY FUNCTION CODE GREATER THAN 4 PUTS YOU IN
*                WAIT MODE.
*
          SPACE  4
 BKP      SUBR
          STML   TEMP+2            SAVE A REGISTER
          STML   TSAV4
          SHN    -16
          STML   TEMP+1
          STML   TSAV3
          LDN    1
          STML   TEMP              SET INITIAL FUNCTION = WAIT
          LDML   BKP
          SBN    2
          STML   TEMP+3            CURRENT VALUE OF P REGISTER
          STML   BKP1
          STML   BKP19
          ADN    1
          STML   BKP2
          LDML   BKPFLG
          NJN    BKP.1
          LDML   BKP19
          ADN    2
          STML   BKP19
          UJN    BKP2.1
 BKP.1    LDN    0
          STML   BKPFLG
          LDML   TSAV1             RESTORE BREAK POINTED INSTRUCTIONS
          STML   **
 BKP1     EQU    *-1
          LDML   TSAV2
          STML   **
 BKP2     EQU    *-1
 BKP2.1   LOADF  BRMA
          ADN    1
          CWML   TEMP,ONE          WRITE OUT CT. WORD 1
 BKP3     LOADF  BRMA
          ADN    1
          CRML   TEMP,ONE          READ CT. WORD 1
          LDML   TEMP              CHECK FUNCTION CODE
          NJN    BKP3.1            IF NOT END FUNCTION
          LJM    BKP18             TERMINATE THIS BREAK POINT

 BKP3.1   SBN    1
          ZJN    BKP3              IF FUNCTION = WAIT (1)
          SBN    1
          ZJN    BKP4        IF DISPLAY MEMORY FUNCTION
          UJK    BKP8

*         FUNCTION CODE 2 - READ PP MEMORY
 BKP4     LOADF  BRMA
          ADN    2
          CRML   TEMPA,ONE
          LDML   TEMPA             FWA IN PP MEMORY
          STML   BKP5
          LDML   BALEN       NUMBER OF WORDS TO READ
          SBN    3
          STDL   ONE
          LOADF  BRMA
          ADN    3
          CWML   BKP5,ONE
 BKP5     EQU    *-1
          LDN    1
          STDL   ONE         RESTORE ONE
 BKP6     LDN    1                 SET FUNCTION CODE = WAIT
          STML   TEMP
          LOADF  BRMA
          ADN    1
          CWML   TEMP,ONE
          LJM    BKP3

 BKP8     SBN    1
          NJN    BKP12             IF NOT CHANGE MEMORY FUNCTION
*         FUNCTION CODE 3 - CHANGE PP MEMORY
          LOADF  BRMA
          ADN    2
          CRML   TEMPA,ONE
          LDML   TEMPA+1           FIRST LOCATION TO BE CHANGED
          STML   BKP10
          LDML   TEMPA+2           NEW CONTENTS
          STML   **
 BKP10    EQU    *-1
          UJN    BKP6
 BKP12    SBN    1
          NJN    BKP6              IF NOT SET BKP FUNCTION
*         FUNCTION CODE 4 - SET BREAKPOINT
          LOADF  BRMA
          ADN    2
          CRML   TEMPA,ONE
          LDML   TEMPA+3
          STML   BKP14
          STML   BKP16
          ADN    1
          STML   BKP15
          STML   BKP17
          LDML   **
 BKP14    EQU    *-1
          STML   TSAV1
          LDML   **
 BKP15    EQU    *-1
          STML   TSAV2
          LDC    0200B
          STML   **
 BKP16    EQU    *-1
          LDC    BKP
          STML   **
 BKP17    EQU    *-1
          LDN    1
          STML   BKPFLG
          LJM    BKP6
 BKP18    LDML   TSAV3
          SHN    16
          ADML   TSAV4       RESTORE A REGISTER
          LJM    **
 BKP19    EQU    *-1
*
 TSAV1    BSSZ   1
 TSAV2    BSSZ   1
 TSAV3    BSSZ   1
 TSAV4    BSSZ   1
 BKPFLG   BSSZ   1
 BALEN    BSSZ   1           BREAKPOINT AREA LENGTH
 TEMP     BSSZ   4
 TEMPA    BSSZ   4
 BRMA     CON    45B
 BRMA1    CON    20200B
 SBKP     CON    7777B
          SPACE  4,10
 BKPM     SUBR
          LDML   SBKP
          NJN    BKPMX       IF SEGMENT NOT INITIALIZED
          LDML   BKPFLG
          NJN    BKPMX             IF BKP ALREADY SET
          LOADF  BRMA
          CRML   TEMPA,ONE
          LDML   TEMPA
          ZJN    BKPMX
          RJM    BKP
          UJN    BKPMX
          ENDIF
