*                THE FOLLOWING SYMBOL IS USED TO CONTROL MAINTENANCE
*                CONNECTION CODE IN RQC AND OGS.  THIS CODE IS
*                DELETED TO CONSERVE SPACE.  DEFINING THE SYMBOL
*                MCON WILL CAUSE THE CODE TO BE ASSEMBLED.
*MCON      EQU    1           INCLUDE MAINTENANCE CONNECTION CODE
          SPACE  4,10
***
*         THE NAD PP DRIVER (OR DRIVERS) IS LOADED WHEN THE RHFAM/VE
*         SYSTEM TASK IS ACTIVATED AND REMAINS PP RESIDENT UNTIL A
*         DEADSTART OR THE SYSTEM TASK IS DEACTIVATED.  THE DRIVERS
*         SCAN THE CORRESPONDING UNIT REQUEST QUEUES LOOKING FOR REQUESTS TO
*         PROCESS.  ONCE AN AVAILABLE REQUEST IS FOUND THE PP INTERLOCKS THE
*         REQUEST, PROCESSES THE REQUEST, AND RETURNS THE RESPONSE TO THE
*         PREDEFINED PP RESPONSE BUFFER.
          TITLE  MACRO DEFINITIONS
**        MACRO DEFINITIONS
*
*COPY IODMAC1
*COPY IODMAC4
SUBR      SPACE  4,10
**        SUBR - SUBROUTINE ENTRY/EXIT LINE.
*
*NAME     SUBR
*
*         *NAME* IS THE SUBROUTINE ENTRY POINT AND *NAMEX* IS THE
*         SUBROUTINE EXIT ADDRESS.


          PURGMAC SUBR

          MACRO  SUBR,A
 A_X    LJM    *
 A      EQU    *-1
          ENDM
LOADCM    SPACE  4,10
**        LOADCM  - LOAD CENTRAL MEMORY ADDRESS
*
*         LOADCM ADDRESS,INDEX,OFFSET
*
*         THIS MACRO IS USED TO LOAD THE *A* AND *R* REGISTERS FOR A
*         CENTRAL MEMORY READ OR WRITE OPERATION.
*
*         ENTRY
*           ADDRESS     A PP ADDRESS POINTING TO A TWO PP-WORD CENTRAL
*                         MEMORY RMA. (REQUIRED)
*           INDEX       A PP DIRECT CELL WHICH CONTAINS AN INDEX WHICH IS
*                         ADDED TO *ADDRESS* TO DETERMINE THE PP WORD
*                         ADDRESS OF THE RMA. (OPTIONAL)
*           OFFSET      A CONSTANT TO BE USED AS A CENTRAL MEMORY WORD
*                         OFFSET. (OPTIONAL).
*
*         EXIT   (R-REGISTER) = CM ADDRESS/100B.
*                (A-REGISTER) = MOD(CM ADDRESS,100B) + 400000B


          PURGMAC LOADCM

LOADCM    MACRO  ADDRESS,ADDRIND,OFFSET
          LDK    ADDRESS
A         IFC    NE,$ADDRIND$$
          ADDL   ADDRIND
A         ENDIF
          RJM    FCA
B         IFC    NE,$OFFSET$$
          ADK    OFFSET
B         ENDIF
          ENDM
LOADCB    SPACE  4,10
**        LOADCB  - LOAD CENTRAL MEMORY ADDRESS PLUS BYTE OFFSET
*
*         LOADCB ADDRESS,BYTEOFF,WORDOFF
*
*         THIS MACRO IS USED TO LOAD THE *A* AND *R* REGISTERS FOR A
*         CENTRAL MEMORY READ OR WRITE OPERATION.
*
*         ENTRY
*           ADDRESS     A PP ADDRESS POINTING TO A THREE PP-WORD CENTRAL
*                         MEMORY REFORMATTED RMA. (REQUIRED)
*                         (ADDRESS) = UPPER 11 BITS OF RMA/100B
*                         (ADDRESS+1) = LOWER 12 BITS OF RMA/100B
*                         (ADDRESS+2) = MOD(RMA,100B)
*           BYTEOFF     A DIRECT CELL CONTAINING A CENTRAL MEMORY BYTE
*                         OFFSET. (OPTIONAL).
*           WORDOFF     A CONSTANT CONTAINING A CENTRAL MEMORY WORD
*                         OFFSET. (OPTIONAL).
*
*         EXIT   (R-REGISTER) = CM ADDRESS/100B.
*                (A-REGISTER) = MOD(CM ADDRESS,100B) + 400000B


          PURGMAC LOADCB

LOADCB    MACRO  ADDRESS,BYTEOFF,WORDOFF
          LRD    ADDRESS
A         IFC    NE,$BYTEOFF$$
          LDDL   BYTEOFF
          SHN    -3
          ADDL   ADDRESS+2
A         ELSE
          LDDL   ADDRESS+2
A         ENDIF
B         IFC    NE,$WORDOFF$$
          ADK    WORDOFF
B         ENDIF
          ADC    400000B
          ENDM
ADK       SPACE  4,10
**        ADK - ADD CONSTANT.
*
*         GENERATES ADC, ADN, SBN OR NOTHING.


          PURGMAC  ADK

 ADK      MACRO  A
  IF DEF,A,9D
  IFLT A,,4
  IFGE A,-77B,7
'?SCP#BB SET A
  SBN -'?SCP#BB
  SKIP 5
  IFLE A,77B,3
  IFNE A,,3
  ADN A
  SKIP 1
  ADC A
  ENDM
LDK       SPACE  4,10
**        LDK - LOAD CONSTANT.
*
*         GENERATES LDC, LDN OR LCN.


          PURGMAC  LDK

 LDK      MACRO  A
  IF DEF,A,8D
  IFMI A,4
  IFGE A,-77B,6
'?SCP#BB SET A
  LCN -'?SCP#BB
  SKIP 4
  IFLE A,77B,2
  LDN A
  SKIP 1
  LDC A
  ENDM
LMK       SPACE  4,10
**        LMC - LOGICAL MINUS CONSTANT.
*
*         GENERATES LMC, LMN OR NOTHING.


          PURGMAC  LMK

 LMK      MACRO  A
  IF DEF,A,5
  IFPL A,4
  IFLE A,77B,3
  IFNE A,,3
  LMN A
  SKIP 1
  LMC A
  ENDM
LPK       SPACE  4,10
**        LPK - LOGICAL PRODUCT CONSTANT.
*
*         GENERATES LPC, LPN, SCN OR NOTHING.


          PURGMAC  LPK

 LPK      MACRO  A
  IF DEF,A,9D
  IFMI A,5
  IFGE A,-77B,7
  IFNE A,,7
'?SCP#BB SET A
  SCN -'?SCP#BB
  SKIP 4
  IFLE A,77B,2
  LPN A
  SKIP 1
  LPC A
  ENDM
'?SCP#DS  SPACE  4,10
**        '?SCP#DS - DEFINE SYMBOL
*
*         THIS IS AN INTERNAL MACRO USED ONLY
*         BY SBK AND SCK . ASSEMBLY OF THIS
*         MACRO WILL ONLY OCCUR WHEN THE PARAMETER
*         ON THE SBK OR SCK MACRO IS UNDEFINED .
          PURGMAC  '?SCP#DS


'?SCP#DS  MACRO  A
          LOCAL  B
  RMT
B EQU A
  RMT
'?SCP#BB  MICRO  1,,*B*
  ENDM
SBK       SPACE  4,10
**        SBK - SUBTRACT CONSTANT.
*
*         GENERATES ADC, ADN, SBN OR NOTHING.


          PURGMAC  SBK

 SBK      MACRO  A
  IF DEF,A,3
'?SCP#BB SET A
  ADK -'?SCP#BB
  SKIP 2
  '?SCP#DS A
  ADC -"'?SCP#BB"
  ENDM
SCK       SPACE  4,10
**        SCK - SELECTIVE CLEAR CONSTANT.
*
*         GENERATES LPC, LPN, SCN OR NOTHING.


          PURGMAC  SCK

 SCK      MACRO  A
  IF DEF,A,3
'?SCP#BB SET A
  LPK -'?SCP#BB
  SKIP 2
  '?SCP#DS A
  LPK -"'?SCP#BB"
  ENDM
UJK       SPACE  4,10
**        UJK - UNCONDITIONAL JUMP.
*
*         UJK    M

          PURGMAC UJK

UJK       MACRO  P
  IF DEF,P,5
'?SCP#LF SET P
  IFGT *-'?SCP#LF,-40B,3
  IFLT *-'?SCP#LF,40B,2
  UJN P
  SKIP 1
  LJM P
  ENDM
          SPACE  4,10
          TITLE  UNIT INTERFACE TABLE DEFINITIONS.
**        UNIT INTERFACE TABLE FORMAT
*
*         FOR EACH LOCAL NAD THAT IS SUCCESSFULLY DEFINED BY A DEFINE_
*         LOCAL_NAD CONFIGURATION DIRECTIVE A CORRESPONDING UNIT INTERFACE
*         TABLE ENTRY IS GENERATED.
          SPACE  4,10
**        UNIT INTERFACE TABLE.
*


 UIT      RECORD PACKED

 LUN      PPWORD             LOGICAL UNIT NUMBER
 DIS      BOOLEAN            UNIT IS ENABLED/DISABLED (SET = DISABLED)
 DOWN     BOOLEAN            UNIT IS UP/DOWN (SET = DOWN)
          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               203(16) = NAD
 RQCLK     PPWORD             REQUEST CLOCK

          ALIGN  16,64
 UCOML    PPWORD             UNIT COMMUNICATION AREA LENGTH
 UCOMB    RMA                UNIT COMMUNICATION AREA BUFFER

 ULOCK    BOOLEAN            UNIT LOCK
          ALIGN  48,64
 ULOWN    PPWORD             UNIT LOCK OWNER

 UQLOCK   BOOLEAN            UNIT REQUEST QUEUE LOCK
          ALIGN  48,64
 UQLOWN   PPWORD             UNIT REQUEST QUEUE LOCK OWNER

          ALIGN  16,64
 PVANR    STRUCT 6           PVA OF NEXT UNIT REQUEST

          ALIGN  32,64
 RMANR    RMA                RMA OF NEXT UNIT REQUEST

 UIT      RECEND

          ERRNZ  C.UIT*4-P.UIT         THIS MUST BE A MULTIPLE OF CM WORDS
          TITLE  PP INTERFACE TABLE DEFINITIONS.
**        PP INTERFACE TABLE
*
*         A PP INTERFACE TABLE ENTRY MUST BE GENERATED FOR EACH NAD PP
*         DRIVER THAT IS TO BE INITIATED.  THE NUMBER OF PP DRIVERS THAT ARE
*         INITIATED IS SPECIFIED BY THE VALUE OF THE NUMBER_OF_PP_DRIVERS
*         DIRECTIVE THAT IS SPECIFIED IN THE INSTALLED RHFAM CONFIGURATION
*         FILE.  IF NO VALUE IS SPECIFIED, RHFAM LOADS ONE PP DRIVER FOR
*         EACH LOCAL NAD THAT IS DEFINED.
          SPACE  4,10
**        PP INTERFACE TABLE.
*


 PIT      RECORD PACKED

 PPNO     PPWORD             LOGICAL PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT NUMBER
 UNITC    PPWORD             NUMBER OF UNITS
 AFLAG    PPWORD             PP ACTIVE FLAG

          ALIGN  0,64
 INTREG   RMA                INTERRUPT REGISTER
 CIT      RMA                CHANNEL INTERLOCK TABLE

          ALIGN  16,64
 PCOML    PPWORD             PP COMMUNICATION AREA LENGTH
 PCOMB    RMA                PP COMMUNICATION AREA BUFFER

 PQLOCK   BOOLEAN            PP REQUEST QUEUE LOCK
          ALIGN  48,64
 PQLOWN   PPWORD             PP REQUEST QUEUE LOCK OWNER

          ALIGN  16,64
 PVANPR   STRUCT 6           PVA OF NEXT PP REQUEST

          ALIGN  32,64
 RMANPR   RMA                RMA OF NEXT PP REQUEST

          ALIGN  16,64
 RBPVA    STRUCT 6           PVA OF RESPONSE BUFFER

 FILL1    STRUCT 8           RESPONSE BUFFER LENGTH

          ALIGN  32,64
 RBRMA    RMA                RMA OF RESPONSE BUFFER

          ALIGN  48,64
 RBIN     PPWORD             RESPONSE BUFFER *IN* POINTER

          ALIGN  48,64
 RBOUT    PPWORD             RESPONSE BUFFER *OUT* POINTER

          ALIGN  48,64
 RBLIM    PPWORD             RESPONSE BUFFER *LIMIT* POINTER

 PIT      RECEND

          ERRNZ  C.PIT*4-P.PIT         THIS MUST BE A MULTIPLE OF CM WORDS
          SPACE  4,10
**        UNIT DESCRIPTORS.
*


 UD       RECORD PACKED

 LUN      PPWORD             LOGICAL UNIT NUMBER
 PVAUIT   STRUCT 6           PVA OF UNIT INTERFACE TABLE

 CHAN     SUBRANGE 0,377B    CHANNEL NUMBER
 CNTRLR   SUBRANGE 0,377B    CONTROLLER NUMBER
 PUN      PPWORD             PHYSICAL UNIT NUMBER
 RMAUIT   RMA                RMA OF UNIT INTERFACE TABLE

 UD       RECEND

          ERRNZ  C.UD*4-P.UD           THIS MUST BE A MULTIPLE OF CM WORDS
          TITLE  PROCESSING REQUESTS.
**        PROCESSING REQUESTS
*
*         THE DRIVERS ISSUE THE NECESSARY NAD CONTROLWARE FUNCTIONS
*         TO COMPLETE THE VARIOUS REQUESTS.  IF THE CORRESPONDING REQUESTS
*         REQUIRE ANY DATA TRANSACTIONS THE DRIVER USES THE BUFFERS DEFINED
*         IN THE REQUEST AREA TO TRANSMIT DATA TO/FROM CENTRAL MEMORY FROM/TO
*         THE NAD.  IF AT ANY POINT DURING THE REQUEST PROCESSING THE DRIVER
*         ENCOUNTERS AN ERROR, THE DRIVER STOPS PROCESSING THE REQUEST AND
*         RESPONDS TO THE REQUESTOR.  THE RESPONSE PROVIDES THE REQUESTOR
*         WITH THE TYPE OF ERROR, THE POINT WITHIN THE REQUEST PROCESSING
*         THAT THE ERROR WAS ENCOUNTERED, AND ANY OTHER APPROPRIATE INFORMATION
*         TO AID IN THE PROBLEM ISOLATION/CORRECTION PROCESS.
*
*              EACH REQUEST THAT IS POSTED TO THE DRIVERS CONSISTS OF A SINGLE
*         LOGICAL COMMAND.  REQUESTS THAT REQUIRE FUNCTIONS NOT DEFINED BY THE
*         LOGICAL COMMANDS CAN BE CREATED BY USING THE PERFORM PHYSICAL
*         SUBCOMMANDS COMMAND (AC).  THE PERFORM PHYSICAL SUBCOMMANDS COMMAND
*         PROVIDES THE DRIVER WITH THE EXACT FUNCTION SEQUENCE TO PROCESS
*         THE REQUEST.  THIS FORMAT IS USED BY THE LOCAL NAD LOAD
*         AND DUMP PROCESSING AND IS ALSO AVAILABLE FOR FUTURE MAINTENANCE
*         FUNCTION CONSIDERATIONS.
          SPACE  4,10
**        SPECIAL PROCESSING NOTES
*
*         THE PP DRIVER IS DESIGNED WITH PERFORMANCE AND SIMPLICITY AS THE
*         MAJOR DRIVING FORCES IN THE DESIGN.  TO THIS END THE FOLLOWING
*         CONSTRAINTS AND FEATURES ARE EMPLOYED
*
*         1)   ALL DATA AND BUFFER ADDRESSES MUST BEGIN ON A WORD BOUNDARY.
*
*         2)   ALL DATA LENGTHS (EXCEPT FOR THE LAST ONE IN A BLOCK TRANSFER)
*              MUST BE A MULTIPLE OF TWO.
*
*         3)   NO RETRIES ON NAD ERRORS ARE MADE.  THIS MEANS THAT THE CPU
*              PROGRAMS MUST DISTINGUISH WHETHER A REQUEST IS RETRIABLE.
*
*         4)   THE SEND AND RECEIVE DATA FUNCTIONS ALLOW THE ACCESS METHOD TO
*              ADD AN OPTIONAL RETRY COUNT FOR EACH INDIVIDUAL BLOCK TRANSFER.
*              THIS REQUESTS THE DRIVER TO ATTEMPT RETRIES ON TRANSACTIONS
*              THAT ARE TEMPORARILY DELAYED BY NAD RESOURCE AVAILABILITY.
*
*         5)   THE SEND AND RECEIVE DATA FUNCTIONS USE A CIRCULAR BUFFER TO PASS
*              THE DRIVER ADDITIONAL BUFFER (OR DATA) ADDRESSES WHILE THE REQUEST
*              IS BEING PROCESSED.  THIS ALLOWS THE CPU ROUTINES TO POST
*              CONSECUTIVE REQUESTS WITHOUT GOING THROUGH MULTIPLE REQUEST/
*              RESPONSE SEQUENCES.
*
*         6)   SEVERAL OF THE COMMANDS HAVE THE ASSOCIATED BUFFER (DATA) AREAS
*              CONCATENATED TO THE REQUEST AREA.  THIS IS TO PROVIDE A BETTER
*              USE OF "REAL MEMORY" WHEN SHORT DATA TRANSACTIONS ARE PERFORMED.
          TITLE  PERIPHERAL REQUEST FORMAT.
**        PERIPHERAL REQUEST FORMAT
*
*         THIS SECTION DEFINES THE FORMAT FOR THE REQUESTS THAT THE
*         PP DRIVER PROCESSES.  EACH REQUEST HAS A STANDARD HEADER FORMAT
*         FOLLOWED BY THE ACTUAL NAD REQUEST.
*
*         STANDARD HEADER FORMAT
          SPACE  4,10
**        PERIPHERAL REQUEST.
*


 PR       RECORD PACKED

          ALIGN  16,64
 PVANPR   STRUCT 6           PVA OF NEXT PERIPHERAL REQUEST

          ALIGN  32,64
 RMANPR   RMA                RMA OF NEXT PERIPHERAL REQUEST

 RL       PPWORD             REQUEST LENGTH
 LUN      PPWORD             LOGICAL UNIT NUMBER (UNIT REQUESTS ONLY)
 RECOV    SUBRANGE 0,3       RECOVERY OPTIONS
                               0 = ATTEMPT RECOVERY
                               1 = SUPPRESS RECOVERY, RETURN ERROR
                               2 = RESERVED FOR FUTURE USE
                               3 = SUPPRESS RECOVERY, IGNORE ERRORS
 INTCPU   BOOLEAN            INTERRUPT CPU (IF SET)
 CPUP     SUBRANGE 0,31      CPU PORT TO INTERRUPT
 PRIOR    SUBRANGE 0,377B    RELATIVE PRIORITY OF REQUEST
 ALERTM   PPWORD             ALERT MASK

 SECADD   INTEGER            SECONDARY ADDRESS

          MGEN   N.CPUP      RIGHT JUSTIFIED CPU MASK
 M.CPUP   EQU    MASK$

 PR       RECEND

          ERRNZ  C.PR*4-P.PR           THIS MUST BE A MULTIPLE OF CM WORDS
          TITLE  COMMAND FORMATS
**        COMMAND FORMATS
*
*         THE FOLLOWING ARE THE DEFAULT COMMAND FORMATS FOR THE VARIOUS
*         COMMANDS THAT ARE PROCESSED BY THE PP.
          SPACE  4,10
**        PP COMMAND FORMAT
*


 CF       RECORD PACKED

 PPCMND   SUBRANGE 0,377B    PP COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
*                            REMAINING FLAGS USED ON INDIVIDUAL REQUESTS
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 CF       RECEND

          ERRNZ  C.CF*4-P.CF           THIS MUST BE A MULTIPLE OF CM WORDS
          SPACE  4,10
**        LOGICAL COMMAND FORMAT
*


 LCF      RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
*                            REMAINING FLAGS USED ON INDIVIDUAL REQUESTS
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

          ALIGN  48,64       USED FOR INDIVIDUAL REQUESTS
 PATHID   PPWORD             PATH IDENTIFIER

          MASKP  PPLOCK
 M.PPLOCK EQU    MSK
          MASKP  PPCOMP
 M.PPCOMP EQU    MSK

 LCF      RECEND

          ERRNZ  C.LCF*4-P.LCF         THIS MUST BE A MULTIPLE OF CM WORDS
          SPACE  4,10
**        PHYSICAL COMMAND FORMAT
*


 PCF      RECORD PACKED

 PCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 PCF      RECEND

          ERRNZ  C.PCF*4-P.PCF         THIS MUST BE A MULTIPLE OF CM WORDS
          TITLE  PP REQUEST FORMATS.
**        PP REQUESTS
*
*         THIS SECTION DEFINES THE COMMAND FORMATS FOR THE SUPPORTED PP
*         REQUESTS.
          SPACE  4,10
**        IDLE (4).
*
*         THE PURPOSE OF THIS REQUEST IS TO STOP THE PP FROM PROCESSING
*         ANY REQUESTS UNTIL A RESUME ACTIVITY PP REQUEST IS ENCOUNTERED.


 IDLE     RECORD PACKED

 PPCMND   SUBRANGE 0,377B    PP COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED

 IDLE     RECEND
          SPACE  4,10
**        RESUME (5).
*
*         THE PURPOSE OF THIS REQUEST IS TO HAVE THE PP LEAVE THE IDLE STATE
*         AND RESUME NORMAL PROCESSING.


 RESUME   RECORD PACKED

 PPCMND   SUBRANGE 0,377B    PP COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED

 RESUME   RECEND
          TITLE  UNIT REQUEST FORMATS.
**        UNIT REQUESTS
*
*         THIS SECTION DEFINES THE COMMAND FORMATS FOR THE SUPPORTED UNIT
*         REQUESTS.
          SPACE  4,10
**        REQUEST CONNECTION (A0).
*
*         THE PURPOSE OF THIS REQUEST IS TO INITIATE THE CONNECTION
*         ESTABLISHMENT PROCESS BY SENDING A CONNECT REQUEST MESSAGE TO THE
*         DESTINATION HOST.


 RC       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 CTYPE    BOOLEAN            CONNECTION TYPE (0 = NORMAL, 1 = MAINT.)
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

          ALIGN  48,64
 PATHID   PPWORD             PATH ID OF NAD ASSIGNED PATH (RETURN PARAMETER)

 RC       RECEND
          SPACE  4,10
**        OBTAIN CONNECTION (A1).
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE INCOMING CONNECT
*         REQUEST ASSOCIATED WITH THE CONNECTION END POINT SPECIFIED BY THE
*         'PATH ID' FIELD.


 OC       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 PHYFRM   STRUCT 4           PHYSICAL FROM (USED AS SELECTION CRITERIA)
          ALIGN  48,64
 PATHID   PPWORD             PATH IDENTIFIER

 OC       RECEND
          SPACE  4,10
**        ACCEPT CONNECTION (A2).
*
*         THE PURPOSE OF THIS REQUEST IS TO ACCEPT AN INCOMING CONNECT
*         REQUEST.


 AC       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST

          ALIGN  0,64
          ALIGN  48,64
 PATHID   PPWORD             PATH IDENTIFIER

 AC       RECEND
          SPACE  4,10
**        REJECT CONNECTION (A3).
*
*         THE PURPOSE OF THIS REQUEST IS TO REJECT AN INCOMING CONNECT
*         REQUEST.


 RJ       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST

          ALIGN  0,64
 RCODE    STRUCT 4           REJECT CODE
          ALIGN  48,64
 PATHID   PPWORD             PATH IDENTIFIER

 RJ       RECEND
          SPACE  4,10
**        SEND DATA (A4).
*
*         THE PURPOSE OF THIS REQUEST IS TO SEND BLOCKS OF DATA
*         ACROSS THE SPECIFIED CONNECTION.  THE SEND DATA COMMAND IS BROKEN
*         UP INTO SUBFUNCTIONS, WHERE EACH SUBFUNCTION REPRESENTS THE
*         TRANSMISSION OF A SINGLE NETWORK BLOCK.
*
*              THE SEND DATA COMMAND PROVIDES AN INTERFACE FOR REQUESTORS
*         TO POST ADDITIONAL SUBFUNCTIONS WHILE THE REQUEST IS BEING
*         PROCESSED.  THE PP PROVIDES THE NECESSARY INTERRUPTS TO NOTIFY
*         THE REQUESTOR WHEN ADDITIONAL SUBFUNCTIONS CAN BE POSTED.  THE
*         PP CAUSES THE INTERRUPT BY SENDING AN INTERMEDIATE RESPONSE TO THE
*         REQUESTOR.  INTERMEDIATE RESPONSES ARE SENT WHEN THE SUBFUNCTION
*         BUFFER IS LESS THAN HALF FULL.  MONITOR REFORMATS THE RESPONSE AND
*         SIGNALS THE CORRESPONDING TASK.  THE SIGNAL HANDLER DETERMINES THAT
*         THIS IS AN INTERMEDIATE RESPONSE FOR A SEND DATA COMMAND AND
*         POSTS ADDITIONAL SUBFUNCTIONS, IF APPROPRIATE.
*
*         THE SEND DATA FUNCTION ASSUMES THE REQUESTOR HAS STARTED ALL
*         BUFFERS ON A WORD BOUNDARY AND THAT ALL BUFFER LENGTHS (EXCEPT THE
*         LAST) ARE A MULTIPLE OF TWO.  THE PP DRIVER READS UP EACH BUFFER
*         IN THE SUBFUNCTION, CONCATENATING THE BUFFERS TO FORM A BLOCK, AND
*         SENDS THE DATA WITH A SINGLE TRANSACTION.  THE PP TERMINATES THE
*         REQUEST IF ONE OF THE FOLLOWING OCCURS
*
*              1)  THE IN AND OUT POINTERS ARE EQUIVALANT.  IN THIS CASE A
*                  NORMAL RESPONSE IS RETURNED.
*
*              2)  THE RETRY COUNT FOR THE CURRENT SUBFUNCTION IS ZERO AND THE
*                  CURRENT NAD RESPONSE IS RESOURCES UNAVAILABLE.  IN THIS
*                  CASE AN ABNORMAL RESPONSE IS RETURNED AND THE CONTROLWARE
*                  STATUS SHOULD REFLECT THE RESOURCE CONDITION.
*
*              3)  AN ERROR WAS ENCOUNTERED.  IN THIS CASE THE RESPONSE
*                  CONTAINS THE APPROPRIATE INFORMATION TO ALLOW THE CPU
*                  PROGRAMS TO DETERMINE THE REASON FOR THE FAILURE.


 SD       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 SINTR    BOOLEAN            SEND INTERMEDIATE RESPONSE

          ALIGN  0,64
 RESRTY   PPWORD             WAITING FOR RESOURCES RETRY COUNTER
 PREVIN   PPWORD             PREVIOUS IN POINTER
 INPTRC   PPWORD             IN POINTER CHANGE
 PATHID   PPWORD             PATH IDENTIFIER

          ALIGN  0,64
 MORDAT   BOOLEAN            CPU HAS MORE DATA TO SEND
          ALIGN  48,64
 INPTR    PPWORD             IN POINTER

          ALIGN  48,64
 OUTPTR   PPWORD             OUT POINTER

          MASKP  SINTR
 M.SINTR  EQU    MSK

 SD       RECEND


**        SEND DATA SUBFUNCTIONS.
*


 SDSF     RECORD PACKED

 SFL      PPWORD             SUBFUNCTION LENGTH
          ALIGN  48,64
 FILL     PPWORD             USED TO GET THE RIGHT BYTE SIZE
 SDSF     RECEND


**        I/O DATA BUFFERS.
*


 IODB     RECORD PACKED

          ALIGN  16,64
 LENGTH   PPWORD             BUFFER LENGTH
 BUFFER   RMA                RMA OF DATA BUFFER

 IODB     RECEND

          SPACE  4,10
**        RECEIVE DATA (A5).
*
*         THE PURPOSE OF THIS REQUEST IS TO RECEIVE BLOCKS OF DATA
*         FROM THE SPECIFIED CONNECTION.  THE RECEIVE DATA COMMAND IS BROKEN
*         UP INTO SUBFUNCTIONS, WHERE EACH SUBFUNCTION REPRESENTS THE
*         RECEIVING OF A SINGLE NETWORK BLOCK.
*
*              THE RECEIVE DATA COMMAND PROVIDES AN INTERFACE FOR REQUESTORS
*         TO POST ADDITIONAL SUBFUNCTIONS WHILE THE REQUEST IS BEING
*         PROCESSED.  THE PP PROVIDES THE NECESSARY INTERRUPTS TO NOTIFY
*         THE REQUESTOR WHEN ADDITIONAL SUBFUNCTIONS CAN BE POSTED.  THE
*         PP CAUSES THE INTERRUPT BY SENDING AN INTERMEDIATE RESPONSE TO THE
*         REQUESTOR.  INTERMEDIATE RESPONSES ARE SENT WHEN THE SUBFUNCTION
*         BUFFER IS LESS THAN HALF FULL.  MONITOR REFORMATS THE RESPONSE AND
*         SIGNALS THE CORRESPONDING TASK.  THE SIGNAL HANDLER DETERMINES THAT
*         THIS IS AN INTERMEDIATE RESPONSE FOR A RECEIVE DATA COMMAND AND
*         POSTS ADDITIONAL SUBFUNCTIONS, IF APPROPRIATE.
*
*         THE RECEIVE DATA FUNCTION ASSUMES THE REQUESTOR HAS STARTED ALL
*         BUFFERS ON A WORD BOUNDARY AND THAT ALL BUFFER LENGTHS (EXCEPT THE
*         LAST) ARE A MULTIPLE OF TWO.  THE PP DRIVER READS THE AMOUNT OF DATA
*         SPECIFIED BY THE 'TOTAL BUFFER LENGTH' FIELD INTO THE PP.  THE PP
*         TRANSFERS THE DATA INTO THE BUFFERS ACCORDING TO THE AMOUNT OF
*         DATA EACH BUFFER CAN HOLD.  NOTE, BUFFERS NOT ENDING ON A WORD
*         BOUNDARY ARE GARBAGE FILLED UP TO THE WORD BOUNDARY.  THE RECEIVE
*         DATA REQUEST IS TERMINATED WHEN ONE OF THE FOLLOWING CONDITIONS
*         OCCURS
*
*              1)  THE IN AND OUT POINTERS ARE EQUIVALANT.  IN THIS CASE A
*                  NORMAL RESPONSE IS RETURNED.
*
*              2)  THE RETRY COUNT FOR THE CURRENT SUBFUNCTION IS ZERO AND THE
*                  CURRENT NAD RESPONSE IS RESOURCES UNAVAILABLE.  IN THIS
*                  CASE AN ABNORMAL RESPONSE IS RETURNED AND THE CONTROLWARE
*                  STATUS SHOULD REFLECT THE RESOURCE CONDITION.
*
*              3)  AN ERROR IS ENCOUNTERED.  IN THIS CASE THE RESPONSE
*                  CONTAINS THE APPROPRIATE INFORMATION TO ALLOW THE CPU
*                  PROGRAMS TO DETERMINE THE REASON FOR THE FAILURE.
*
*              4)  A FILE MARK OR A BLOCK MODE SWITCH (PRU TO NON-PRU OR VICE-
*                  VERSA) IS ENCOUNTERED.


 RD       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 SINTR    BOOLEAN            SEND INTERMEDIATE RESPONSE

          ALIGN  0,64
 RESRTY   PPWORD             WAITING FOR RESOURCES RETRY COUNTER
 PREVIN   PPWORD             PREVIOUS IN POINTER
 INPTRC   PPWORD             IN POINTER CHANGE
 PATHID   PPWORD             PATH IDENTIFIER

          ALIGN  0,64
 MORDAT   BOOLEAN            CPU IS EXPECTING MORE DATA
          ALIGN  48,64
 INPTR    PPWORD             IN POINTER

          ALIGN  48,64
 OUTPTR   PPWORD             OUT POINTER

          MASKP  SINTR
 M.SINTR  EQU    MSK

 RD       RECEND


**        READ DATA SUBFUNCTIONS.
*


 RDSF     RECORD PACKED

 SFL      PPWORD             SUBFUNCTION LENGTH
 TBL      PPWORD             TOTAL BUFFER LENGTH
 NBT      PPWORD             NUMBER OF BYTES TRANSFERRED
 FILL     PPWORD             USED TO GET THE RIGHT BYTE SIZE

 RDSF     RECEND


**        I/O DATA BUFFERS.  (SAME AS SEND DATA)
*


*IODB     RECORD PACKED
*
*         ALIGN  16,64
*LENGTH   PPWORD             BUFFER LENGTH
*BUFFER   RMA                RMA OF DATA BUFFER
*
*IODB     RECEND

          SPACE  4,10
**        STATUS NAD (A6).
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE STATUS INFORMATION
*         OF THE CORRESPONDING LOCAL NAD.


 SN       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 UNCOND   BOOLEAN            UNCONDITIONALLY OBTAIN STATUS
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 SN       RECEND
          SPACE  4,10
**        SEND CONTROL MESSAGE (A7).
*
*         THE PURPOSE OF THIS REQUEST IS TO SEND A CONTROL MESSAGE TO
*         A REMOTE HOST.


 SCM      RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 SCM      RECEND
          SPACE  4,10
**        RECEIVE CONTROL MESSAGE (A8).
*
*         THE PURPOSE OF THIS REQUEST IS TO RECEIVE A CONTROL MESSAGE FROM
*         A REMOTE HOST.


 RCM      RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 CMTYPE   BOOLEAN            CONTROL MESSAGE TYPE (0=INCOMING,1=REJECTED)
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 PHYFRM   STRUCT 4           PHYSICAL FROM (USED AS SELECTION CRITERIA)

 RCM      RECEND
          SPACE  4,10
**        DISCONNECT PATHS (A9).
*
*         THE PURPOSE OF THIS REQUEST IS TO TERMINATE CONNECTIONS.


 DP       RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 ABNORM   BOOLEAN            ABNORMAL TERMINATION FLAG

          ALIGN  0,64
          ALIGN  48,64
 PATHID   PPWORD             PATH IDENTIFIER

 DP       RECEND
          SPACE  4,10
**        READ PATH STATUS TABLE (AA).
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE PATH STATUS TABLE
*         INFORMATION FOR A SPECIFIED PATH IDENTIFIER.


 RPST     RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

          ALIGN  48,64
 PATHID   PPWORD             PATH IDENTIFIER

 RPST     RECEND
          SPACE  4,10
**        OBTAIN NAD GENERAL STATUS (AB).
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE GENERAL STATUS
*         INFORMATION FOR THE CORRESPONDING NAD.


 ONGS     RECORD PACKED

 LCMND    SUBRANGE 0,377B    LOGICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST
 RNADP    BOOLEAN            REMOTE NAD PRIMED FOR GENERAL STATUS
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA/BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 RETRYC   PPWORD             RETRY COUNT
          ALIGN  48,64
 PATHID   PPWORD             PATH IDENTIFIER

 ONGS     RECEND

*         NOTE - TO OBTAIN THE REMOTE NAD GENERAL STATUS THE REQUEST
*         CONNECTION COMMAND MUST BE USED TO GENERATE A MAINTENANCE
*         CONNECTION TO THE REMOTE NAD.  ALSO, THE ABNORMAL PATH
*         DISCONNECT SHOULD BE USED TO TERMINATE THE PATH AFTER THE
*         GENERAL STATUS IS OBTAINED.
          SPACE  4,10
**        PHYSICAL COMMAND PROCESSING (AC).
*
*         THE PURPOSE OF THIS FUNCTION IS TO PROVIDE A PRIMITIVE COMMAND
*         INTERFACE FOR PHYSICAL NAD FUNCTIONS.


 PCP      RECORD PACKED

 LCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
 RESP     BOOLEAN            SEND RESPONSE
 INDADD   BOOLEAN            INDIRECT ADDRESS SPECIFIED
 PPLOCK   BOOLEAN            PP IS PROCESSING REQUEST
 PPCOMP   BOOLEAN            PP HAS COMPLETED REQUEST PROCESSING
 FLUSH    BOOLEAN            FLUSH EXCESS DATA ON INPUT REQUEST

 PCP      RECEND
          SPACE  4,10
**        ISSUE NAD FUNCTION (20).
*
*         THE PURPOSE OF THIS COMMAND IS TO ISSUE A FUNCTION TO THE NAD.


 INF      RECORD PACKED

 PCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  48,64
 FUNC     PPWORD             NAD FUNCTION TO ISSUE

 INF      RECEND
          SPACE  4,10
**        OUTPUT 8/8 DATA (23).
*
*         THE PURPOSE OF THIS COMMAND IS TO SEND DATA TO THE NAD IN AN
*         8/8 FORMAT.


 O8D      RECORD PACKED

 PCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA TO SEND
 BUFFER   RMA                RMA OF DATA BUFFER

 O8D      RECEND
          SPACE  4,10
**        INPUT 8/8 DATA (25).
*
*         THE PURPOSE OF THIS COMMAND IS TO RECEIVE DATA FROM THE NAD IN AN
*         8/8 FORMAT.


 I8D      RECORD PACKED

 PCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA BUFFER
 BUFFER   RMA                RMA OF DATA BUFFER

 I8D      RECEND
          SPACE  4,10
**        SET TRANSFER ADDRESS AND LENGTH (28)
*
*         THE PURPOSE OF THIS COMMAND IS TO SEND THE DATA TRANSFER LENGTH
*         AND ADDRESS TO THE DATA.  THE DATA MUST BE IN AN 8/16 FORMAT IN
*         CM, WHERE THE LOW ORDER 8 BITS CONTAINS THE ACTUAL DATA.


 SAL      RECORD PACKED

 PCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  16,64
 LENGTH   PPWORD             LENGTH OF DATA TO SEND
 BUFFER   RMA                RMA OF DATA BUFFER

 SAL      RECEND
          SPACE  4,10
**        OBTAIN NAD HARDWARE STATUS (29).
*
*         THE PURPOSE OF THIS COMMAND IS TO OBTAIN THE NAD HARDWARE STATUS.


 ONHS     RECORD PACKED

 PCMNC    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  32,64
 HWMASK   PPWORD             HARDWARE STATUS MASK
 HWVAL    PPWORD             HARDWARE STATUS VALUE

 ONHS     RECEND
          SPACE  4,10
**        OBTAIN NAD CONTROLWARE STATUS (2A).
*
*         THE PURPOSE OF THIS COMMAND IS TO OBTAIN THE NAD CONTROLWARE STATUS.


 ONCS     RECORD PACKED

 PCMND    SUBRANGE 0,377B    PHYSICAL COMMAND
          ALIGN  32,64
 CWMASK   PPWORD             CONTROLWARE STATUS MASK
 CWVAL    PPWORD             CONTROLWARE STATUS VALUE

 ONCS     RECEND
          TITLE  CHANNEL PASSING ALGORITHM.
**        CHANNEL PASSING
*
*         THE ABILITY TO UTILIZE THE FULL CAPACITY OF THE 170 NAD REQUIRES
*         MULTIPLE PP DRIVERS.  TO ALLOW MULTIPLE DRIVERS (INCLUDING MAINTENANCE
*         PPS) TO SHARE A SINGLE NAD, A MECHANISM FOR SHARING ACCESS
*         TO THE CHANNEL MUST BE EMPLOYED.  THE RHFAM/VE DRIVERS ONLY INTERLOCK A
*         CHANNEL FOR THE DURATION OF THE CHANNEL ACTIVITY.  ONCE THE CHANNEL
*         ACTIVITY IS COMPLETE THE CHANNEL IS RELEASED IMMEDIATELY ALLOWING
*         OTHER DRIVERS TO PROCESS REQUESTS ON THAT CHANNEL.  THE EXCEPTIONS
*         TO THIS RULE ARE THE PHYSICAL SUBCOMMANDS.  FOR THESE REQUESTS
*         THE PP HOLDS THE CHANNEL UNTIL ALL PHYSICAL SUBCOMMANDS ARE PROCESSED.
*
*              EACH TIME THAT A PP DRIVER OBTAINS THE CHANNEL, THE PP DRIVER MUST
*         RECHECK THE UNIT FLAGS FOR THE CORRESPONDING LOCAL NAD TO VERIFY THAT
*         THE NAD IS IN THE APPROPRIATE STATE FOR PROCESSING THE REQUEST.  IF
*         THE NAD STATE HAS CHANGED, THE PP CLEARS THE PROCESSING FLAG AND DOES
*         NOT POST A RESPONSE.  THE PP THEN CONTINUES WITH ITS SEARCH THROUGH
*         THE UNIT INTERFACE TABLES (STARTING WITH THE NEXT UNIT TABLE).
          TITLE   RESPONSE INTERRUPT ALGORITHM.
**        RESPONSE INTERRUPTS
*
*         THE PP DRIVERS ARE PROGRAMMED TO MINIMIZE THE NUMBER OF EXTERNAL
*         INTERRUPTS.  AS EACH RESPONSE IS POSTED TO MONITOR, THE DRIVERS SET THE
*         CORRESPONDING INTERRUPT REGISTER, WHICH IS DEFINED BY A POINTER IN THE
*         PP'S INTERFACE TABLE ENTRY.  WHEN THE RESPONSE BUFFER IS MORE THAN HALF
*         FULL THE PP CAUSES A MONITOR INTERRUPT TO PROCESS THE RESPONSES.
*         THE PP, HOWEVER, KEEPS PROCESSING REQUESTS AND POSTING RESPONSES
*         UNTIL THE RESPONSE BUFFER IS FULL.  AT THIS POINT THE PP MUST WAIT,
*         ATTEMPTING MONITOR INTERRUPTS IF NECESSARY, UNTIL THERE IS ROOM FOR
*         THE NEXT RESPONSE.
*
*              THIS ALGORITHM ASSUMES THAT THROUGH NORMAL PROCESSING MONITOR
*         SHOULD BE INVOKED OFTEN ENOUGH, WITHOUT PP INTERRUPTION, TO PROCESS
*         THE PP RESPONSES BEFORE THE BUFFER THRESHOLD IS REACHED.  THIS
*         ALGORITHM ALSO ASSUMES THAT ONCE MONITOR IS INTERRUPTED, BECAUSE
*         THE RESPONSE BUFFER THRESHOLD WAS REACHED, THAT MONITOR SHOULD
*         PROCESS THE PP RESPONSES BEFORE THE DRIVER COULD FILL THE BUFFER.
*         GIVEN THE ABOVE ASSUMPTIONS THE PP DRIVERS SHOULD ONLY CAUSE A
*         MINIMUM NUMBER OF INTERRUPTS AND THE PP DRIVER SHOULD RARELY, IF
*         EVER, SUSPEND PROCESSING BECAUSE THE PP RESPONSE BUFFER IS FULL.
          SPACE  4,10
**        PERIPHERAL RESPONSE FORMAT
*
*         THIS SECTION DEFINES THE FORMAT FOR THE PERIPHERAL REQUEST RESPONSES
*         POSTED BY PP DRIVER PROCESSES.  EACH RESPONSE HAS A STANDARD HEADER
*         FORMAT FOLLOWED BY THE DETAILED STATUS INFORMATION (IF SPECIFIED).
          SPACE  4,10
**        PERIPHERAL RESPONSE.
*


 PRS      RECORD PACKED


          ALIGN  16,64
 PVAOR    STRUCT 6           PVA OF REQUEST

          ALIGN  32,64
 RMAOR    RMA                RMA OF REQUEST

 RL       PPWORD             RESPONSE LENGTH
 LUN      PPWORD             LOGICAL UNIT NUMBER  (UNIT REQUESTS ONLY)
 RECOV    SUBRANGE 0,3       RECOVERY OPTIONS
                               0 = ATTEMPT RECOVERY
                               1 = SUPPRESS RECOVERY, RETURN ERROR
                               2 = RESERVED FOR FUTURE USE
                               3 = SUPPRESS RECOVERY, IGNORE ERRORS
 INTCPU   BOOLEAN            INTERUPT CPU (IF SET)
 CPUP     SUBRANGE 0,31      CPU PORT TO INTERRUPT
 PRIOR    SUBRANGE 0,377B    RELATIVE PRIORITY OF REQUEST
 ALERTM   PPWORD             ALERT MASK

*ABNSTA   PPWORD             ABNORMAL STATUS
 ALERT    BOOLEAN              A MASKED ALERT CONDITION OCCURRED
 INTERR   BOOLEAN              INTERFACE TABLE ERROR
          ALIGN  3,64
 CPE      BOOLEAN              CHANNEL PARITY ERROR
          ALIGN  6,64
 DTO      BOOLEAN              DATA TIMEOUT
 UTO      BOOLEAN              UNIVERSAL COMMAND TIMEOUT
 FTO      BOOLEAN              FUNCTION TIMEOUT
 FFT      BOOLEAN              FLAG FUNCTION TIMEOUT
 PTO      BOOLEAN              PRIME FLAG TIMEOUT
 HWF      BOOLEAN              HARDWARE ERROR
 CIA      BOOLEAN              CHANNEL INACTIVE AFTER ACTIVATE
 IVR      BOOLEAN              ABNORMAL CONTROLWARE RESPONSE
 ITE      BOOLEAN              CHANNEL INPUT ERROR
 OTE      BOOLEAN              CHANNEL OUTPUT ERROR
 IEC      PPWORD             INTERFACE ERROR CODE
 RTYPE    SUBRANGE 0,3       RESPONSE TYPE
                               0 = UNSOLICITED
                               1 = INTERMEDIATE
                               2 = NORMAL
                               3 = ABNORMAL
 CC       SUBRANGE 0,3       CONDITION CLARIFIER
                               0 = NO DETAILED STATUS
                               1 = DETAILED STATUS APPENDED
                               2 = NOT CURRENTLY USED
                               3 = NOT CURRENTLY USED
          ALIGN  40,64
 URC      SUBRANGE 0,377B    UNSOLICITED RESPONSE CODE
*ALERTC   PPWORD             ALERT CONDITIONS
 LIB      BOOLEAN              LONG INPUT BLOCK
 EOI      BOOLEAN              EOI MARK ENCOUNTERED
 EOF      BOOLEAN              EOF MARK ENCOUNTERED
 EOR      BOOLEAN              EOR MARK ENCOUNTERED
 PRU      BOOLEAN              PRU BLOCK ENCOUNTERED
 NONPRU   BOOLEAN              NON-PRU BLOCK ENCOUNTERED
 EOM      BOOLEAN              END OF MESSAGE

          ALIGN  0,64
 TC       STRUCT 4           TRANSFER COUNT (BYTES SENT/RECEIVED)
 RMALC    RMA                RMA OF LAST COMMAND

          MASKP  CPE
 M.CPE    EQU    MSK
          MASKP  DTO
 M.DTO    EQU    MSK
          MASKP  UTO
 M.UTO    EQU    MSK
          MASKP  FTO
 M.FTO    EQU    MSK
          MASKP  FFT
 M.FFT    EQU    MSK
          MASKP  PTO
 M.PTO    EQU    MSK
          MASKP  HWF
 M.HWF    EQU    MSK
          MASKP  CIA
 M.CIA    EQU    MSK
          MASKP  IVR
 M.IVR    EQU    MSK
          MASKP  ITE
 M.ITE    EQU    MSK
          MASKP  OTE
 M.OTE    EQU    MSK

 PRS      RECEND
          SPACE  4,10
**        RESPONSE DETAILED STATUS
*


 RDS      RECORD PACKED

 LCWF     PPWORD             LAST CONTROLWARE FUNCTION
 LCWS     PPWORD             LAST CONTROLWARE STATUS
 LHWF     PPWORD             LAST HARDWARE FUNCTION
 LHWS     PPWORD             LAST HARDWARE STATUS

 RDS      RECEND
          SPACE  4,10
**        INTERFACE ERROR CODES
*


 IEC.20A  EQU    0#20A       INVALID CHANNEL NUMBER
 IEC.211  EQU    0#211       UNIT DESCRIPTOR COUNT ERROR
 IEC.220  EQU    0#220       INVALID PP NUMBER
 IEC.301  EQU    0#301       LOGICAL UNIT NUMBERS IN *UD* AND *UIT* NOT EQUAL
 IEC.306  EQU    0#306       INVALID UNIT TYPE
 IEC.501  EQU    0#501       INVALID COMMAND CODE
 IEC.503  EQU    0#503       CIO HARDWARE ERROR
 IEC.505  EQU    0#505       INVALID LENGTH SPECIFICATION IN COMMAND
 IEC.50B  EQU    0#50B       INVALID PARAMETER SPECIFICATION
          SPACE  4,10
**        RESPONSE TYPES
*


 RT.UNS   EQU    0           UNSOLICITED RESPONSE
 RT.INT   EQU    1           INTERMEDIATE RESPONSE
 RT.NOR   EQU    2           NORMAL RESPONSE
 RT.ABN   EQU    3           ABNORMAL RESPONSE
          SPACE  4,10
**        CONDITION CLARIFIER
*


 CC.NDS   EQU    0           NO DETAILED STATUS
 CC.DSA   EQU    1           DETAILED STATUS APPENDED
          SPACE  4,10
**        UNSOLICITED RESPONSE CODES
*


 URC.IE   EQU    3           INTERFACE TABLE ERROR (SEE INTERFACE ERROR FIELD)
          SPACE  4,10
**        BLOCK HEADER FORMAT
*


 BH       RECORD PACKED

 LENGTH   PPWORD             LENGTH OF BLOCK IN BITS
          ALIGN  0,32
 DN       SUBRANGE 0,255     DESTINATION NODE
 SN       SUBRANGE 0,255     SOURCE NODE
 CN       SUBRANGE 0,255     CONNECTION NUMBER
 BSN      SUBRANGE 0,31      BLOCK SEQUENCE NUMBER
 BT       SUBRANGE 0,7       BLOCK TYPE
 PRU      BOOLEAN            PRU BLOCK FLAG
 EOI      BOOLEAN            EOI FLAG
 EOR      BOOLEAN            EOR FLAG
          ALIGN  0,4
 LEVEL    SUBRANGE 0,15      RECORD LEVEL
          ALIGN  0,16
 ABN      STRUCT 2           APPLICATION BLOCK NUMBER

          MASKP  BT
 M.BT     EQU    MSK
          MASKP  PRU
 M.PRU    EQU    MSK
          MASKP  EOI
 M.EOI    EQU    MSK
          MASKP  EOR
 M.EOR    EQU    MSK
 M.EOF    EQU    17B

 BH       RECEND
          SPACE  4,10
 BT.BLK   EQU    1           BLOCK TYPE *BLK*
 BT.MSG   EQU    2           BLOCK TYPE *MSG*
 BT.CMD   EQU    3           BLOCK TYPE *CMD*
          TITLE  UNIT REQUEST CODES
**        UNIT REQUEST, LOGICAL COMMAND CODES
*


 LC.FT    EQU    0#A0        FIRST UNIT REQUEST CODE
 LC.RC    EQU    0#A0        REQUEST CONNECTION
 LC.OC    EQU    0#A1        OBTAIN CONNECT REQUEST
 LC.AC    EQU    0#A2        ACCEPT CONNECT REQUEST
 LC.RJ    EQU    0#A3        REJECT CONNECT REQUEST
 LC.SD    EQU    0#A4        SEND DATA
 LC.RD    EQU    0#A5        RECEIVE DATA
 LC.SN    EQU    0#A6        STATUS NAD
 LC.SM    EQU    0#A7        SEND CONTROL MESSAGE
 LC.RM    EQU    0#A8        RECEIVE CONTROL MESSAGE
 LC.DP    EQU    0#A9        DISCONNECT PATHS
 LC.RS    EQU    0#AA        READ PATH STATUS TABLE
 LC.OS    EQU    0#AB        OBTAIN NAD GENERAL STATUS
 LC.PP    EQU    0#AC        PROCESS PHYSICAL COMMANDS
 LC.LT    EQU    0#AC        LAST UNIT REQUEST CODE
          TITLE  UNIT REQUEST PHYSICAL COMMAND CODES
**        UNIT REQUEST PHYSICAL COMMAND CODES
*


 PC.IF    EQU    0#20        ISSUE NAD FUNCTION
 PC.OB    EQU    0#23        OUTPUT BIT STRING DATA MODE
 PC.IB    EQU    0#25        INPUT BIT STRING DATA MODE
 PC.SA    EQU    0#28        SET TRANSFER LENGTH AND ADDRESS
 PC.HS    EQU    0#29        OBTAIN NAD HARDWARE STATUS
 PC.CS    EQU    0#2A        OBTAIN NAD CONTROLWARE STATUS
          TITLE  CONCURRENT CHANNEL HARDWARE REQUEST CODES
**        CONCURRENT CHANNEL HARDWARE REQUEST CODES
*


 F.MCLEAR EQU    100000B     MASTER CLEAR CIO ADAPTOR BOARD
 F.RDESR  EQU    112000B     READ ERROR STATUS REGISTER OF CIO ADAPTOR
 F.WRCR   EQU    111000B     WRITE CONTROL REGISTER OF CIO ADAPTOR
          TITLE  PP REQUEST COMMAND CODES
**        PP REQUEST COMMAND CODES
*


 PR.ID    EQU    4           IDLE PP DRIVER
 PR.RS    EQU    5           RESUME REQUEST PROCESSING
          TITLE  DIRECT CELL DEFINITIONS.
**        DIRECT CELL DEFINITIONS.
*
*         WARNING  -  THE DIRECT CELL DEFINITIONS ARE OVERLAPPED TO
*                     MINIMIZE CODE GENERATION.  ONE MUST BE CAREFUL WHEN
*                     MODIFYING CODE NOT TO CAUSE A DIRECT CELL CONFLICT.


 SCRATCH  EQU    1 - 6       DIRECT CELLS RESERVED FOR SCRATCH USAGE
 SPECSAV  EQU    7           SPECIAL SAVE AREA FOR SCRATCH PURPOSES
*                              USED TO PRESERVE SCRATCH INFO ACROSS CALLS
 CMADR    EQU    10B - 12B   USED FOR CM ADDRESS GENERATION
 CWSTAT   EQU    13B         CONTROLWARE STATUS
 WTOXFR   EQU    14B         WORDS TO TRANSFER
 BUFSIZE  EQU    15B         BUFFER SIZE
 TWO      EQU    16B         CONSTANT TWO
 BYTXFR   EQU    17B         BYTES ACTUALLY TRANSFERRED
 BYTCNT   EQU    20B         DATA TRANSFER BYTE COUNT
 PPSTATE  EQU    21B         CURRENT PP STATE
 CURCHAN  EQU    22B         CURRENT CHANNEL BEING FUNCTIONED
 CHANRES  EQU    23B         CHANNEL RESERVED FLAG
 NRTIMER  EQU    24B         NAD RESPONSE TIMER
 REQLGTH  EQU    25B         REQUEST LENGTH
 SUBFEA   EQU    26B         SUBFUNCTION ENTRIES AVAILABLE
 PPFRC    EQU    27B         PP FREE RUNNING CLODK

*         SEND/RECEIVE DATA SUBFUNCTION PROCESSING

 NUMREQ   EQU    30B         NUMBER OF SUBFUNCTIONS PROCESSED
 TEMPOUT  EQU    31B         TEMPORARY OUT POINTER
 SUBF     EQU    32B - 35B   SUBFUNCTION HEADER WORD
 SFPTR    EQU    36B - 40B   POINTER TO SUBFUNCTION BUFFER
 SFIN     EQU    41B         IN POINTER FOR SUBFUNCTION BUFFER
 SFOUT    EQU    42B         OUT POINTER FOR SUBFUNCTION BUFFER
 SFLIMIT  EQU    43B         LIMIT POINTER FOR SUBFUNCTION BUFFER (LWA+8)
 MDATF    EQU    44B         MORE DATA FLAG (WAIT FOR HOST BUFFERS)


*         PHYSICAL COMMAND PROCESSING

 NUMCMND  EQU    30B         NUMBER OF PHYSICAL COMMANDS PROCESSED
 CURCMND  EQU    31B         CURRENT PHYSICAL COMMAND BEING PROCESSED
 PCMND    EQU    32B - 35B   PHYSICAL COMMAND BUFFER
 TRADDR   EQU    36B - 41B   TRANSFER ADDRESS BUFFER

*         LOGICAL COMMAND PROCESSING

 LCMND    EQU    45B - 54B   LOGICAL COMMAND BUFFER

*         PP COMMAND PROCESSING

 PPCMND   EQU    45B - 50B   PP COMMAND BUFFER

*         UNIT INTERFACE TABLE POINTERS

 CURUIT   EQU    55B - 60B   CURRENT UNIT INTERFACE TABLE HEADER WORD
 UITADDR  EQU    61B - 63B   UNIT INTERFACE TABLE POINTER

*         PP INTERFACE TABLE POINTERS

 RBFIRST  EQU    64B - 66B   RMA OF FWA FOR PP RESPONSE BUFFER
 RBIN     EQU    67B         IN POINTER FOR PP RESPONSE BUFFER
 RBOUT    EQU    70B         OUT POINTER FOR PP RESPONSE BUFFER
 RBLIMIT  EQU    71B         LIMIT POINTER FOR PP RESPONSE BUFFER (LWA+8)
 PITADDR  EQU    72B - 74B   PP INTERFACE TABLE ADDRESS
*                            NOTE - THE INITIAL PIT ADDR IS A 2-BYTE RMA
*                                   THE INITIALIZATION PROCESS REFORMATS
*                                   THE ADDRESS TO 3 BYTES.


*         AVAILABLE DIRECT CELLS

 AVAIL    EQU    75B - 77B   CURRENTLY UNUSED DIRECT CELLS

          ERRNZ  PPCMND-LCMND          CODE ASSUMES THESE TWO ARE EQUAL
          ERRNZ  NUMREQ-NUMCMND        CODE ASSUMES THESE TWO ARE EQUAL
          TITLE  NAD INTERFACE DEFINITIONS.
**        NAD INTERFACE DEFINITIONS
*
          IF     DEF,NDI0
          SPACE  4,10
**        S0 C170 CONVERTER FUNCTION CODES.
*
*         NOTE   THE FOLLOWING FUNCTION CODES ARE THE FIRST
*                FOUR BITS OF THE FUNCTION CODE PASSED ON AN S0
*                CHANNEL.  THESE FUNCTION CODES ARE INTERPRETED
*                BY THE S0 ICI/C170 CONVERTER.


 S0C.SCM  EQU    110000B     SET CONVERSON MODE
 S0C.S12  EQU    120000B     SET 12 BIT MODE
 S0C.SEL  EQU    170000B     SELECT C170 CONVERTER


          ENDIF
          SPACE  4,10
**        DEVICE INTERFACE FUNCTION CODES.
*


          IF     DEF,NDI0
 DI.IB    EQU    0+S0C.SCM   INPUT IN BIT STRING MODE
          ELSE
 DI.IB    EQU    0           INPUT IN BIT STRING MODE
          ENDIF
 DI.I8    EQU    2           INPUT IN 8/12 MODE
          IF     DEF,NDI0
 DI.OB    EQU    10B+S0C.SCM   OUTPUT IN BIT STRING MODE
          ELSE
 DI.OB    EQU    10B         OUTPUT IN BIT STRING MODE
          ENDIF
 DI.O8    EQU    12          OUTPUT IN 12/8 MODE
          IF     DEF,NDI0
 DI.HS    EQU    200B+S0C.S12  OBTAIN HARDWARE STATUS
 DI.CS    EQU    201B+S0C.S12  OBTAIN CONTROLWARE STATUS
          ELSE
 DI.HS    EQU    200B        OBTAIN HARDWARE STATUS
 DI.CS    EQU    201B        OBTAIN CONTROLWARE STATUS
          ENDIF
 DI.CE    EQU    204B        CLEAR PARITY ERROR
 DI.MC    EQU    277B        INTERFACE MASTER CLEAR
          SPACE  4,10
**        NAD FUNCTION CODES.
*


 NF.FF    EQU    400B        NAD FUNCTION FLAG
 NF.PA    EQU    0           PURGE ALL PATHS
 NF.GS    EQU    1           GET NAD GENERAL STATUS
 NF.AB    EQU    3           ABORT CURRENT TRANSACTION
 NF.SC    EQU    4           SEND CONTROL MESSAGE
 NF.CP    EQU    5           CONNECT PATH
 NF.RY    EQU    10B         READY
 NF.AC    EQU    11B         ACCEPT CONNECT REQUEST
 NF.RJ    EQU    12B         REJECT CONNECT REQUEST
 NF.IC    EQU    14B         INQUIRE SELECTED CONTROL MESSAGE
 NF.DP    EQU    21B         DISCONNECT PATH
 NF.PP    EQU    22B         PURGE PATH
 NF.TD    EQU    23B         TRANSMIT DATA
 NF.PS    EQU    35B         READ PATH STATUS
 NF.IR    EQU    36B         INQUIRE SELECTED REJECTED CONTROL MESSAGE
 NF.CM    EQU    40B         CONNECT MAINTENANCE PATH
 NF.MI    EQU    42B         MAINTENANCE PATH INPUT
 NF.RR    EQU    46B         READ REMOTE STATUS
 NF.RT    EQU    50B         RESET CURRENT TRANSFER POINTERS
 NF.UC    EQU    53B         UNIVERSAL COMMAND
 NF.NS    EQU    54B         NAD STATUS
 NF.SP    EQU    200B        SELECT PATH
          SPACE  4,10
**        UNIVERSAL COMMAND SUBFUNCTIONS
*


 UC.WB    EQU    5           WRITE DATA IN BINARY MODE
 UC.RB    EQU    6           READ DATA IN BINARY MODE
 UC.OC    EQU    7           OBTAIN CONNECT REQUEST


*         NOTE   CURRENTLY THE NAD ONLY LOOKS (AT MOST) AT THE FIRST 3
*                PP WORDS PASSED FROM THE PP TO THE NAD.  HOWEVER, 6 PP
*                WORDS MUST BE PASSED TO THE NAD.  A THREE WORD UNIVERSAL
*                COMMAND BUFFER IS USED AND THE REMAINING FIELDS ARE GARBAGE.

 UC.CBLP  EQU    3           UNIVERSAL COMMAND BUFFER LENGTH (IN PP WORDS)
          IF     DEF,NDI0
 UC.CBLC  EQU    6           UNIVERSAL COMMAND BUFFER LENGTH (IN I0 CHANNEL WORDS)
          ELSE
 UC.CBLC  EQU    8           UNIVERSAL COMMAND BUFFER LENGTH (IN CHANNEL WORDS)
          ENDIF

 UCB.SF   EQU    0           UNIVERSAL COMMAND SUBFUNCTION FIELD
 UCB.PF   EQU    1 - 2       UNIVERSAL COMMAND PHYSICAL FROM FIELD
 UCB.NWC  EQU    1           UNIVERSAL COMMAND NAD WORD COUNT (16 BITS)
          SPACE  4,10
**        NAD RESPONSE CODES
*


 NR.RM    EQU    37B         RESPONSE MASK
 NR.AK    EQU    1           ACKNOWLEDGE
 NR.NK    EQU    2           NEGATIVE ACKNOWLEDGE
 NR.UA    EQU    5           UNIVERSAL COMMAND ACKNOWLEDGE
 NR.TN    EQU    17B         TRANSFER NOT READY
 NR.CP    EQU    21B         CONNECT IN PROGRESS
 NR.PI    EQU    177B        PATH ID MASK
          SPACE  4,10
**        NAD RESPONSE FLAGS
*


 NRF.OB   EQU    5           OUTPUT BELOW THRESHOLD
 NRF.IA   EQU    6           INPUT AVAILABLE
 NRF.SP   EQU    7           SELECTED PATH
 NRF.FF   EQU    10B         FUNCTION FLAG
 NRF.PF   EQU    11B         PRIMED FLAG
 NRF.HF   EQU    12B         HARDWARE FAULT FLAG
          SPACE  4,10
**        NAD RESPONSE CODES
*


 NHF.PS   EQU    1           NAD PROCESSOR STOPPED FLAG
 M.NHFPS  EQU    2           NAD PROCESSOR STOPPED MASK
 NHF.PA   EQU    2           NAD PROCESSOR ABNORMAL FLAG
 M.NHFPA  EQU    4           NAD PROCESSOR ABNORMAL MASK
          SPACE  4,10
**        NAD INTERFACE ERRORS
*
*         NOTE   THE NAD ERRORS CORRESPOND TO THE ACTUAL ABNORMAL STATUS
*                FLAGS PASSED IN THE PP RESPONSE.


 NE.CHD   EQU    0                CHANNEL DOWN (THIS IS NOT A RETURN STATUS)
 NE.CPE   EQU    /PRS/M.CPE       CHANNEL PARITY ERROR
 NE.HWF   EQU    /PRS/M.HWF       HARDWARE FAULT
 NE.UTO   EQU    /PRS/M.UTO       UNIVERSAL COMMAND TIMEOUT
 NE.FTO   EQU    /PRS/M.FTO       FUNCTION TIMEOUT
 NE.FFT   EQU    /PRS/M.FFT       FLAG FUNCTION TIMEOUT
 NE.PTO   EQU    /PRS/M.PTO       PRIME TIMEOUT
 NE.DTO   EQU    /PRS/M.DTO       DATA TIMEOUT
 NE.CIA   EQU    /PRS/M.CIA       CHANNEL INACTIVE AFTER ACTIVATE
 NE.IVR   EQU    /PRS/M.IVR       INVALID RESPONSE
 NE.ITE   EQU    /PRS/M.ITE       INPUT TRANSFER ERROR
 NE.OTE   EQU    /PRS/M.OTE       OUTPUT TRANSFER ERROR

          SPACE  4,10
**        PP STATES
*


 PP.IDLE  EQU    0           PP IS IN AN IDLE STATE
 PP.NORM  EQU    1           PP IS IN A NORMAL STATE
          SPACE  4,10
**        MISCELLANEOUS CONSTANTS
*


          IF     DEF,NDI0
 IDLEDEL  EQU    4000        IDLE DELAY TIME (1 MILLI-SECONDS)
 INTERDY  EQU    40000       INTERFACE ERROR DELAY TIME (10 MILLI-SECONDS)
 RESTO    EQU    800         RESOURCE RETRY TIME-OUT (100 MILLI_SECONDS)
          ELSE
 IDLEDEL  EQU    2000        IDLE DELAY TIME (1 MILLI-SECONDS)
 INTERDY  EQU    20000       INTERFACE ERROR DELAY TIME (10 MILLI-SECONDS)
 RESTO    EQU    400         RESOURCE RETRY TIME-OUT (100 MILLI_SECONDS)
          ENDIF
 CH       EQU    0           DEFAULT CHANNEL NUMBER
 FIRST    EQU    0           ALL BUFFER *FIRST* POINTERS = 0
 MAXUNIT  EQU    1           MAXIMUM UNITS SUPPORTED
 LCBLL    EQU    0           LOWER CHANNEL BARREL LOWER LIMIT
 LCBUL    EQU    13B         LOWER CHANNEL BARREL UPPER LIMIT
 UCBLL    EQU    20B         UPPER CHANNEL BARREL LOWER LIMIT
 UCBUL    EQU    33B         UPPER CHANNEL BARREL UPPER LIMIT
 NADTYPE  EQU    0#203       NAD HARDWARE TYPE
 TRUE     EQU    1           CONSTANT TRUE
 FALSE    EQU    0           CONSTANT FALSE
 MINRBE   EQU    20*8        MINIMUM REQUEST BUFFER ENTRIES
 MSF      EQU    60          MAXIMUM SUBFUNCTIONS PROCESSED
 MAXBYTES EQU    4128        MAXIMUM BYTES PER TRANSFER
          IF     DEF,NDI0
 MTRDEL   EQU    120         MONITOR RESPONSE DELAY TIME (30 MICRO-SECONDS)
 CHANDEL  EQU    120         CHANNEL DELAY TIME (30 MICRO-SECONDS)
          ELSE
 MTRDEL   EQU    60          MONITOR RESPONSE DELAY TIME (30 MICRO-SECONDS)
 CHANDEL  EQU    60          CHANNEL DELAY TIME (30 MICRO-SECONDS)
          ENDIF
 TRLENCH  EQU    4           XFR LENGTH AND ADDRESS SIZE (IN CHANNEL WORDS)
 TRLENC   EQU    1           XFR LENGTH AND ADDRESS SIZE (IN CM WORDS)
 TRLENB   EQU    8           XFR LENGTH AND ADDRESS SIZE (IN 8-BIT BYTES)
 .INPN    EQU    102600B
 .IAN     EQU    7000B
 .PSN     EQU    2400B
 .SBN     EQU    1700B
 .STM     EQU    5400B
 .STML    EQU    105400B

          TITLE  BUFFER AREAS
**        BUFFER AREAS
*


          ORG    100B

 INTREG   BSSZ   2                     INTERRUPT REGISTER
 UNCB     BSSZ   UC.CBLP               UNIVERSAL COMMAND BUFFER
 URQIL    BSSZ   2                     UNIT REQUEST Q INTERLOCK PTR
 PPRQIL   BSSZ   2                     PP REQUEST QUEUE INTERLOCK POINTER
 CITADDR  BSSZ   2                     CHANNEL INTERLOCK TABLE ADDRESS
 RESBUF   BSSZ   P.PRS                 RESPONSE BUFFER
 RESDS    BSSZ   P.RDS                 RESPONSE DETAILED STATUS
          ERRNZ  RESBUF+P.PRS-RESDS    THESE BUFFERS MUST BE CONTIGUOUS
MCM       TITLE  MAIN CONTROL MODULE
**        MCM    MAIN CONTROL MODULE
*
*         THE PURPOSE OF THIS ROUTINE IS TO PROVIDE THE HIGH LEVEL
*         CONTROL FOR THE PP DRIVER.
*
*         INITIALIZE PP DRIVER.
*         WHILE   TRUE  DO
*           PERFORM PP REQUESTS.
*           IF  PP IS IN AN IDLE STATE   THEN
*             DELAY FOR A WHILE.
*           ELSE
*             PERFORM UNIT REQUESTS.
*             IF   NO REQUESTS WERE PROCESSED IN LAST CYCLE    THEN
*               DELAY FOR A WHILE.
*             IFEND
*           IFEND
*         WHILEND


 MCM      BSS    0           PROGRAM ENTRY POINT
          RJM    IPD         INITIALIZE PP DRIVER
 MCM1     RJM    PPQ         PROCESS PP REQUEST QUEUE
          LDDL   PPSTATE
          LMK    PP.IDLE
          ZJN    MCM2        IF PP IS IN AN IDLE STATE
          RJM    PUQ         PROCESS UNIT REQUEST QUEUE
          LDDL   PPFRC
          NJN    MCM1        IF REQUESTS WERE PROCESSED IN LAST CYCLE

 MCM2     LDK    IDLEDEL
 MCM3     SBN    1
 MCMA     EQU    *-1         *SBN 2* IS USED IF 2XPP
          NJN    MCM3        IF DELAY NOT COMPLETE
          UJN    MCM1
PPQ       TITLE  PPQ - PROCESS PP REQUEST QUEUE.
**        PPQ    PROCESS PP REQUEST QUEUE
*
*         THE PURPOSE OF THIS ROUTINE IS TO FIND AND INTERLOCK PP REQUESTS.
*
*         ENTRY  (PITADDR - PITADDR+2) = RMA OF PP INTERFACE TABLE.
*
*         EXIT   (PPSTATE) = CURRENT PP STATE.
*
*         WHILE   PP REQUEST QUEUE IS NOT EMPTY  DO
*           ACQUIRE PP REQUEST QUEUE INTERLOCK.
*           IF  PP REQUEST QUEUE INTERLOCK OBTAINED  THEN
*             IF  PP REQUEST AVAILABLE  THEN
*               REMOVE ENTRY FROM PP QUEUE.
*               RELEASE PP REQUEST QUEUE INTERLOCK.
*               INITIALIZE RESPONE BUFFER.
*               PROCESS PP REQUEST.
*               SEND RESPONSE AND ACQUIRE PP REQUEST QUEUE INTERLOCK.
*             IFEND
*             GET NEXT REQUEST POINTER.
*           IFEND
*         WHILEND
*         RELEASE PP REQUEST QUEUE INTERLOCK.


 PPQ      SUBR               ENTRY/EXIT
          IF     DEF,NDI0
          LDN    1           930 PP DRIVERS SHOULD NOT DO CRD*S IN THE IDLE LOOP
          STDL   SCRATCH+4
          ENDIF
          LCN    0
          STDL   SCRATCH
          STDL   SCRATCH+1
          STDL   SCRATCH+2
          LDK    0#7FFF
          STDL   SCRATCH+3
          LOADCB PITADDR,,/PIT/C.AFLAG
          RDCL   SCRATCH     CLEAR PP ACTIVE FLAG
          ADK    /PIT/C.RMANPR-/PIT/C.AFLAG
          IF     DEF,NDI0
          CRML   SCRATCH,SCRATCH+4  930 PP DRIVERS SHOULD NOT DO CRD*S IN THE IDLE LOOP
          ELSE
          CRDL   SCRATCH     READ PP REQUEST QUEUE POINTER
          ENDIF
          LDDL   SCRATCH+2
          ADDL   SCRATCH+3
          ZJN    PPQX        IF NO PP REQUEST TO PROCESS
 PPQ1     LDK    PPRQIL
          RJM    ATI         ACQUIRE PP REQUEST QUEUE INTERLOCK
          NJN    PPQ1        IF INTERLOCK BUSY
 PPQ2     LOADCB PITADDR,,/PIT/C.PVANPR
          CRML   RESBUF+/PRS/P.PVAOR/4*4,TWO     PP REQUEST QUEUE POINTER
          LDML   RESBUF+/PRS/P.RMAOR
          ADML   RESBUF+/PRS/P.RMAOR+1
          NJN    PPQ3        IF PP REQUEST TO PROCESS
          LDK    PPRQIL
          RJM    RTI         RELEASE PP REQUEST QUEUE INTERLOCK
          UJK    PPQX

 PPQ3     LDN    1
          STDL   SCRATCH+1
          LOADCM RESBUF+/PRS/P.RMAOR
          CRML   BUFFER,TWO                      READ NEXT REQUEST PTRS
          CRML   RESBUF+/PRS/P.RL,SCRATCH+1      READ REQUEST OPTIONS
          ADK    C.PR-/PR/C.SECADD
          CRDL   PPCMND      READ PP REQUEST
          LOADCB PITADDR,,/PIT/C.PVANPR
          CWML   BUFFER,TWO                   REMOVE REQUEST FROM QUEUE
          LDK    PPRQIL
          RJM    RTI         RELEASE PP REQUEST QUEUE INTERLOCK
          RJM    IRB         INITIALIZE RESPONSE BUFFER
          RJM    PPR         PROCESS PP REQUEST
          LDK    PPRQIL
          RJM    SRP         SEND RESPONSE AND ACQUIRE PP REQUEST Q I/L
          UJK    PPQ2        PROCESS NEXT REQUEST
PPR       SPACE  4,25
**        PPR    PROCESS PP REQUEST
*
*         THIS ROUTINE PROCESS THE PP REQUESTS.
*
*         ENTRY  PP REQUEST LOCKED.
*                (PPCMND) = PP REQUEST TO PROCESS.
*
*         EXIT   (A) : STATUS
*                    => 0, COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         CASE  TYPE OF PP REQUEST  OF
*           = IDLE =
*             SET PP STATE TO IDLE.
*           = RESUME =
*             SET PP STATE TO NORMAL.
*         ELSE
*           SET UP ERROR RESPONSE.
*         CASEND


 PPR      SUBR               ENTRY/EXIT
          LDDL   PPCMND+/CF/P.PPCMND
          SHN    -16+/CF/L.PPCMND+/CF/N.PPCMND
          LMK    PR.ID
          NJN    PPR1        IF NOT AN IDLE REQUEST
          LDK    PP.IDLE
          STDL   PPSTATE
          UJK    PPRX        RETURN, PP IS IN AN IDLE STATE

 PPR1     LMK    PR.RS&PR.ID
          NJN    PPR2        IF NOT RESUME REQUEST
          LDK    PP.NORM
          STDL   PPSTATE
          UJN    PPRX        RETURN, PP IS IN A NORMAL STATE

 PPR2     LDK    IEC.501
          RJM    FIE         FORMAT INTERFACE ERROR
*         LCN    0           (A) < 0, INTERFACE ERROR
          UJN    PPRX        RETURN, INVALID COMMAND
PUQ       TITLE  PUQ - PROCESS UNIT REQUEST QUEUE.
**        PUQ    PROCESS UNIT REQUEST QUEUE.
*
*         THIS ROUTINE PERFORMS A CIRCULAR CHECK ON THE LOGICAL UNITS
*         THAT ARE DEFINED IN THE PP INTERFACE TABLE TO FIND A REQUEST
*         TO PROCESS.
*
*         ENTRY  (UNITTAB) = UNIT INTERFACE TABLE POINTERS AND CHANNELS.
*                (UTABL) = SIZE OF THE *UNITTAB*.
*
*
*         IF   REQUEST IS IN QUEUE   OR
*              THE PP COUNTER MUST BE UPDATED   THEN
*           ACQUIRE UNIT REQUEST QUEUE INTERLOCK.
*           WHILE  NOT END OF REQUEST CHAIN    DO
*             IF  REQUEST IS AVAILABLE   THEN
*               SET PROCESSING BIT.
*               RELEASE REQUEST QUEUE INTERLOCK.
*               PROCESS REQUEST.
*               SEND RESPONSE AND ACQUIRE UNIT REQUEST QUEUE INTERLOCK.
*               CLEAR PP PROCESSING FLAG. (PROCESSING COMPLETE MAY BE SET)
*             IFEND
*             GET NEXT REQUEST POINTER.
*           WHILEND
*           RELEASE REQUEST QUEUE INTERLOCK.
*         IFEND


 PUQ      SUBR               ENTRY/EXIT
          LDDL   PPFRC
          NJN    PUQ1        IF PP CLOCK COUNTER MUST BE UPDATED
          LOADCB UITADDR,,/UIT/C.RMANR
          CRDL   SCRATCH     READ NEXT REQUEST POINTER
          LDDL   SCRATCH+2
          ADDL   SCRATCH+3
          ZJN    PUQX        IF NO REQUEST TO PROCESS
 PUQ1     LDK    URQIL
          RJM    ATI         ACQUIRE UNIT QUEUE INTERLOCK
          NJN    PUQ1        IF INTERLOCK IS BUSY
          RJM    CFA         CHECK FOR AVAILABLE REQUEST
          NJN    PUQ4        IF REQUEST AVAILABLE
 PUQ2     LDK    URQIL
          RJM    RTI         RELEASE UNIT QUEUE INTERLOCK
 PUQ3     UJK    PUQX

 PUQ4     BSS    0
 PUQ5     LDN    1
          STDL   SCRATCH+1
          LOADCM RESBUF+/PRS/P.RMAOR,,/PR/C.RL
          CRML   RESBUF+/PRS/P.RL,SCRATCH+1      READ REQUEST HEADER
          ADK    C.PR-/PR/C.SECADD
          STDL   SCRATCH
          CRML   LCMND,TWO   READ LOGICAL COMMAND
          LDDL   LCMND+/LCF/P.PPLOCK
          SHN    17-15+/LCF/L.PPLOCK
          MJN    PUQ6        IF REQUEST IS BEING PROCESSED
          SHN    17-15+/LCF/L.PPCOMP-17+15-/LCF/L.PPLOCK
          PJN    PUQ7        IF REQUEST IS AVAILABLE
 PUQ6     LOADCM RESBUF+/PRS/P.RMAOR,,/PR/C.PVANPR
          CRML   RESBUF+/PRS/P.PVAOR/4*4,TWO     READ NEXT REQUEST POINTER
          LDML   RESBUF+/PRS/P.RMAOR
          ADML   RESBUF+/PRS/P.RMAOR+1
          NJN    PUQ5        IF NEXT REQUEST POSTED
          UJK    PUQ2        CHECK NEXT UNIT FOR REQUESTS

 PUQ7     LDDL   LCMND+/LCF/P.PPLOCK
          LMK    /LCF/M.PPLOCK
          STDL   LCMND+/LCF/P.PPLOCK
          LDDL   SCRATCH
          ADK    400000B
          CWDL   LCMND+/LCF/P.PPCOMP/4*4        SET PP REQUEST LOCK
          LDK    URQIL
          RJM    RTI         RELEASE UNIT REQUEST QUEUE INTERLOCK
          RJM    IRB         INITIALIZE RESPONSE BUFFER
          RJM    PUR         PROCESS UNIT REQUEST
          LDK    URQIL
          RJM    SRP         SEND RESPONSE AND ACQUIRE UNIT REQUEST Q I/L
          UJK    PUQ6        CHECK FOR NEXT REQUEST IN QUEUE
CFA       SPACE  4,25
**        CFA    CHECK FOR AVAILABLE REQUEST
*
*         THE PURPOSE OF THIS ROUTINE IS TO CHECK THE CURRENT UNIT
*         INTERFACE TABLE FOR AN AVAILABLE REQUEST.
*
*         ENTRY  (UTABI) = INDEX OF CURRENT UNIT BEING PROCESSED.
*
*         EXIT   (A) : STATUS
*                    <> 0, NEXT REQUEST AVAILABLE.
*                    = 0, NO REQUEST AVAILABLE OR UNIT DISABLED.
*
*         READ IN UNIT INTERFACE TABLE.
*         UPDATE THE PP CLOCK.
*         IF  UNIT DISABLED
*             OR REQUEST QUEUE EMPTY  THEN
*           RETURN NO REQUEST AVAILABLE.
*         ELSE
*           RETURN REQUEST AVAILABLE STATUS.
*         IFEND


 CFA      SUBR               ENTRY/EXIT
          LOADCB UITADDR,,/UIT/C.DIS
          CRDL   CURUIT      READ UNIT INTERFACE TABLE HEADER WORD
          STDL   SCRATCH
          ADK    /UIT/C.PVANR-/UIT/C.DIS
          CRML   RESBUF,TWO  READ PVA AND RMA OF REQUEST INTO RESPONSE BUFFER
          LDDL   PPFRC
          RADL   CURUIT+/UIT/P.RQCLK   UPDATE FREE RUNNING CLOCK
          SHN    -16
          RADL   CURUIT+/UIT/P.RQCLK   USE 1*S COMPLEMENT TO AVOID ZERO
          LDDL   SCRATCH
          ADK    400000B
          CWDL   CURUIT      REWRITE THE FREE RUNNING CLOCK FOR DUAL_PP
          LDN    0
          STDL   PPFRC
          LDDL   CURUIT+/UIT/P.DIS
          SHN    17-15+/UIT/L.DIS
          MJN    CFA1        IF UNIT IS DISABLED
          LDML   RESBUF+/PRS/P.RMAOR
          ADML   RESBUF+/PRS/P.RMAOR+1
          NJN    CFAX        IF REQUEST TO PROCESS
 CFA1     LDN    0
          UJK    CFAX        RETURN, NO REQUEST TO PROCESS
PUR       SPACE  4,35
**        PUR    PROCESS UNIT REQUEST
*
*         THE PURPOSE OF THIS ROUTINE IS TO CONTROL THE PROCESSING FOR
*         A UNIT REQUEST.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = UNIT REQUEST.
*
*         EXIT   (LCMND+/LCF/P.PPCOMP) = SET UP.
*                (RESBUF) = SET UP.
*
*
*         VALIDATE LOGICAL FUNCTION.
*         IF  THE FUNCTION IS NOT VALID   THEN
*           SET UP ERROR RESPONSE.
*           EXIT THE ROUTINE.
*         ELSE
*           CALL FUNCTION PROCESSOR.
*           RELEASE CHANNEL INTERLOCK.
*           IF  REQUEST COMPLETE
*               OR  ERROR ENCOUNTERED  THEN
*             SET LOGICAL COMMAND INTERLOCK WORD TO COMPLETE CURRENT REQUEST.
*           ELSE
*             SET RESPONSE LENGTH TO ZERO (NO RESPONSE).
*             SET LOGICAL COMMAND INTERLOCK WORD TO RELEASE REQUEST FROM PP.
*           IFEND
*         IFEND


 PUR      SUBR               ENTRY/EXIT
          LDDL   LCMND+/LCF/P.LCMND
          SHN    -16+/LCF/L.LCMND+/LCF/N.LCMND
          SBK    LC.FT
          STDL   SCRATCH     SAVE COMMAND NUMBER INDEX
          MJN    PUR1        IF INVALID COMMAND
          SBK    LC.LT+1-LC.FT
          MJN    PUR2        IF THE COMAND IS VALID
 PUR1     LDK    IEC.501
          RJM    FIE         FORMAT INTERFACE ERROR
          UJN    PUR3        INVALID COMMAND

 PUR2     LDML   CMNDTAB,SCRATCH
          STD    SCRATCH     SAVE ENTRY POINT
          SHN    -14
          STML   PEPA        SAVE ERROR PROCESSING FLAGS
          RJM    0,SCRATCH   PROCESS THE LOGICAL COMMAND
          ZJN    PUR3        IF NORMAL RESPONSE
          PJN    PUR6        IF REQUEST NOT COMPLETE
 PUR3     LDDL   LCMND+/LCF/P.PPCOMP
          LMK    /LCF/M.PPCOMP&/LCF/M.PPLOCK     CLEAR LOCK AND SET COMPLETE
 PUR4     STDL   LCMND+/LCF/P.PPCOMP
          RJM    REL         MAKE SURE THE CHANNEL IS RELEASED
          LDDL   NUMREQ
          SHN    3
          NJN    PUR5        IF DATA BLOCKS TRANSFERRED
          LDN    1
 PUR5     RADL   PPFRC       UPDATE THE FREE RUNNING CLOCK
          UJK    PURX        RETURN

 PUR6     LDN    0
          STML   RESBUF+/PRS/P.RL      SET RESPONSE LENGTH TO ZERO, NO RESP.
          LDDL   LCMND+/LCF/P.PPCOMP
          LMK    /LCF/M.PPLOCK                   CLEAR LOCK
          UJN    PUR4

*         NOTE   THIS TABLE CORRESPONDS TO THE LOGICAL COMMAND CODES
*                DEFINED IN THE DEFINITIONS SECTION.
*
*
*         THE TABLE HAS THE FOLLOWING FORMAT:
*
*         FIELD 1: ISSUE *RESET* ON FAILURE.
*         FIELD 2: ISSUE *ABORT* ON FAILURE. (1 AND 2 ARE MUTUALLY EXCLUSIVE)
*         FIELD 3: UNUSED.
*         FIELD 4: LOGICAL COMMAND PROCESSOR ENTRY POINT.



 CMNDTAB  BSS    0           COMMAND TABLE
          LOC    0
          VFD    1/0,1/1,2/0,12/RQC    REQUEST CONNECTION
          VFD    1/0,1/1,2/0,12/OCR    OBTAIN CONNECT REQUEST
          VFD    1/0,1/0,2/0,12/ACR    ACCEPT CONNECT REQUEST
          VFD    1/0,1/1,2/0,12/RCR    REJECT CONNECT REQUEST
          VFD    1/0,1/1,2/0,12/SDN    SEND DATA TO THE NAD
          VFD    1/1,1/0,2/0,12/RDN    RECEIVE DATA FROM THE NAD
          VFD    1/0,1/1,2/0,12/ONS    OBTAIN NAD STATUS
          VFD    1/0,1/1,2/0,12/SCM    SEND CONTROL MESSAGE
          VFD    1/0,1/1,2/0,12/RCM    RECEIVE CONTROL MESSAGE
          VFD    1/0,1/0,2/0,12/TCN    TERMINATE CONNECTION
          VFD    1/0,1/1,2/0,12/RPS    READ PATH STATUS
          VFD    1/0,1/1,2/0,12/OGS    OBTAIN NAD GENERAL STATUS
          VFD    1/0,1/0,2/0,12/PPC    PERFORM PHYSICAL COMMANDS
          LOC    *O
LCM       TITLE  LCM - LOGICAL COMMANDS.
**        LCM    LOGICAL COMMANDS
*
RQC       SPACE  4,35
**        RQC    REQEUST CONNECTION
*
*         THE PURPOSE OF THIS ROUTINE IS TO SEND A CONNECT REQUEST TO
*         THE NAD.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = O, COMPLETE; CONNECT REQUEST ACCEPTED BY NAD.
*                         PATH ID IS WRITTEN TO REQUEST BUFFER.
*                    > 0, OK; NO ERROR ENCOUNTERED, BUT REQUEST NOT COMPLETE.
*                    < 0, NAD ERROR; DETAILED STATUS SET UP.
*
*
*         READ CONNECT REQUEST FROM CENTRAL MEMORY.
*         ISSUE REQUEST CONNECTION FUNCTION.
*         IF  ERROR ENCOUNTERED   THEN
*           CALL THE NAD ERROR PROCESSOR.
*         ELSE
*           SEND CONNECT REQUEST TO NAD.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL THE NAD ERROR PROCESSOR.
*           ELSE
*             ISSUE READY FUNCTION.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL THE NAD ERROR PROCESSOR.
*             ELSE
*               RETURN CONNECTION NUMBER.
*             IFEND
*           IFEND
*         IFEND


 RQC      SUBR               ENTRY/EXIT
          LDDL   LCMND+/RC/P.LENGTH
          RJM    CVT         CONVERT BYTE COUNT INTO CM WORD AND CHANNEL WORD
          MJN    RQCX        IF LENGTH ERROR
          LOADCM LCMND+/RC/P.BUFFER
          CRML   BUFFER,BUFSIZE        READ IN CONNECT REQUEST
          IF     DEF,MCON
          LDDL   LCMND+/RC/P.CTYPE
          SHN    17-15+/RC/L.CTYPE
          MJN    RQC1        IF MAINTENANCE CONNECT
          ENDIF
          LDK    NF.CP
          IF     DEF,MCON
          UJN    RQC2        ISSUE CONNECT PATH FUNCTION

 RQC1     LDK    NF.CM       ISSUE CONNECT MAINTENANCE PATH FUNCTION
          ENDIF
 RQC2     RJM    ICF         ISSUE THE REQUESTED CONNECT PATH FUNCTION
          ZJN    RQC6        IF FUNCTION ACCEPTED
          MJN    RQC4        IF NAD ERROR
 RQC3     LCN    NE.IVR      INVALID NAD RESPONSE
 RQC4     RJM    PEP         PERFORM ERROR PROCESSING
 RQC5     UJN    RQCX

 RQC6     RJM    OOC         OUTPUT CONNECT MESSAGE
          MJN    RQC4        IF ERROR IN DATA TRANSMISSION
          LDK    NF.RY
          RJM    ICF         ISSUE READY FUNCTION
          MJN    RQC4        IF FUNCTION ERROR
          LDDL   CWSTAT
          SHN    17-NRF.SP
          PJN    RQC3        IF CONNECT REQUEST NOT ACCEPTED
          LDDL   CWSTAT
          LPK    NR.PI
          STDL   LCMND+/RC/P.PATHID
          LDN    0
          UJK    RQC5        RETURN, (A) = 0, CONNECTION ACCEPTED BY NAD
OCR       SPACE  4,35
**        OCR    OBTAIN CONNECT REQEUST
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN AN INCOMING CONNECT
*         REQUEST FOR THE SPECIFIED CONNECTION.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; INCOMING CONNECT REQUEST PLACED IN BUFFER.
*                    > 0, OK; NO ERROR, BUT REQUEST NOT COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         GENERATE UNIVERSAL COMMAND FUNCTION BLOCK.
*         ISSUE UNIVERSAL COMMAND SEQUENCE.
*         IF  NO ERROR ENCOUNTERED   THEN
*           IF  STATUS NOT NORMAL  THEN
*             SET ERROR TO INVALID STATUS.
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             INPUT BLOCK FROM THE CHANNEL.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               WRITE MESSAGE TO BUFFER.
*             IFEND
*           IFEND
*         IFEND


 OCR      SUBR               ENTRY/EXIT
          LDDL   LCMND+/OC/P.LENGTH
          RJM    CVT         CONVERT BYTE COUNT INTO CM WORD AND CHANNEL WORD
          MJN    OCRX        IF LENGTH ERROR
          LDK    UC.OC                 OBTAIN INCOMIN CONNECT REQUEST
          SHN    8
          ADDL   LCMND+/OC/P.PATHID    ASSIGNED TO THIS PATHID
          STML   UNCB+UCB.SF
          LDDL   LCMND+/OC/P.PHYFRM    MUST BE DESTINED FOR THIS ACCESS METHOD
          STML   UNCB+UCB.PF
          LDDL   LCMND+/OC/P.PHYFRM+1
          STML   UNCB+UCB.PF+1
          RJM    IUC         ISSUE UNIVERSAL COMMAND
          MJN    OCR1        IF NAD ERROR
          ZJN    OCR3        IF FUNCTION ACCEPTED
 OCR0     LCN    NE.IVR      INVALID NAD RESPONSE
 OCR1     RJM    PEP         PERFORM NAD ERROR PROCESSING
 OCR2     UJN    OCRX

 OCR3     LDDL   LCMND+/OC/P.LENGTH
          RJM    CVT

*         ONE CANNOT EXIT A NAD TRANSACTION AT THIS POINT.
*         THE CONNECT REQUEST LENGTH IS VALIDATED BY
*         CALLING *CVT* AT THE BEGINNING OF THIS ROUTINE.
*         THEREFORE, *CVT* SHOULD ALWAYS RETURN A NORMAL STATUS HERE.

          RJM    IFC         INPUT DATA FROM CHANNEL
          MJN    OCR1        IF DATA TRANSFER ERROR
          LDK    NF.RY
          RJM    ICF         ISSUE READY FUNCTION
          MJN    OCR1        IF FUNCTION TIME-OUT ERROR
          NJN    OCR0        IF INVALID NAD RESPONSE
          LOADCM LCMND+/OC/P.BUFFER
          CWML   BUFFER,BUFSIZE        WRITE CONNECT REQUEST TO CM BUFFER
          LDN    0
          UJK    OCR2        RETURN, (A) = 0, CONNECT REQUEST RECEIVED
ACR       SPACE  4,30
**        ACR    ACCEPT CONNECT REQUEST
*
*         THE PURPOSE OF THIS REQUEST IS TO ACCEPT AN INCOMING CONNECT
*         REQUEST FOR THE SPECIFIED CONNECTION.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; CONNECTION HAS BEEN ESTABLISHED.
*                    > 0, OK; NO ERROR, BUT REQUEST NOT COMPLETE.
*                    < 0, NAD ERROR; DETAILED STATUS SET UP.
*
*
*         ISSUE SELECT PATH CONTROLWARE FUNCTION.
*         IF  ERROR ENCOUNTERED  THEN
*           CALL NAD ERROR PROCESSOR.
*         ELSE
*           ISSUE ACCEPT CONNECT REQUEST FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           IFEND
*         IFEND


 ACR      SUBR               ENTRY/EXIT
          LDDL   LCMND+/AC/P.PATHID
          LMK    NF.SP
          RJM    ICF         ISSUE SELECT PATH FUNCTION
          MJN    ACR2        IF NAD ERROR
          LMK    NR.CP&NR.AK
          ZJN    ACR3        IF STATUS IS CONNECT IN PROGRESS
 ACR1     LCN    NE.IVR
 ACR2     RJM    PEP         PERFORM ERROR PROCESSING
          UJN    ACRX

 ACR3     LDK    NF.AC
          RJM    ICF         ACCEPT CONNECT REQUEST
          ZJN    ACRX        RETURN, (A) = 0, CONNECT REQUEST ACCEPTED
          MJN    ACR2        IF NAD ERROR ENCOUNTERED
          UJN    ACR1        PROCESS ABNORMAL RESPONSE
RCR       SPACE  4,40
**        RCR    REJECT CONNECT REQEUST
*
*         THE PURPOSE OF THIS REQUEST IS TO REJECT AN INCOMING CONNECT
*         REQUEST FOR THE SPECIFIED CONNECTION.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = FWA OF LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; CONNECTION HAS BEEN REJECTED.
*                    > 0, OK; NO ERROR, BUT REQUEST NOT COMPLETE.
*                    < 0, NAD ERROR, DETAILED STATUS SET UP.
*
*
*         ISSUE SELECT PATH CONTROLWARE FUNCTION.
*         IF  ERROR ENCOUNTERED  THEN
*           CALL NAD ERROR PROCESSOR.
*         ELSE
*           ISSUE REJECT FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             SEND REJECT REASON CODE.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               ISSUE READY FUNCTION.
*               IF  ERROR ENCOUNTERED   THEN
*                 CALL NAD ERROR PROCESSOR.
*               IFEND
*             IFEND
*           IFEND
*         IFEND


 RCR      SUBR               ENTRY/EXIT
          LDDL   LCMND+/RJ/P.PATHID
          LMK    NF.SP
          RJM    ICF         ISSUE SELECT PATH FUNCTION
          MJN    RCR2        IF ERROR ENCOUNTERED
          LMK    NR.CP&NR.AK
          NJN    RCR1        IF NOT IN CONNECT IN PROGRESS STATE
          LDK    NF.RJ
          RJM    ICF         ISSUE REJECT CONNECTION FUNCTION
          ZJN    RCR4        IF ACK RESPONSE
          MJN    RCR2        IF ERROR ENCOUNTERED
 RCR1     LCN    NE.IVR      INVALID NAD RESPONSE
 RCR2     RJM    PEP         PERFORM NAD ERROR PROCESSING
 RCR3     UJK    RCRX        RETURN, NAD ERROR ENCOUNTERED

 RCR4     LDN    /RJ/B.RCODE
          ERRZR  /RJ/B.RCODE           LENGTH CANNOT BE ZERO
          RJM    CVT         CONVERT BYTE LENGTH

*         ONE CANNOT EXIT A NAD TRANSACTION AT THIS POINT.
*         THE REJECT CODE LENGTH IS VALIDATED BY
*         USE OF AN *LDN* INSTRUCTION AND THE *ERRZR* TEST.
*         THEREFORE, *CVT* SHOULD ALWAYS RETURN A NORMAL STATUS HERE.

          LDK    LCMND+/RJ/P.RCODE
          STML   OOCA        SET FWA OF BUFFER
          RJM    OOC         SEND CONNECT REJECT MESSAGE TO THE NAD
          MJN    RCR2        IF NAD RESPONSE ERROR
          LDK    NF.RY
          RJM    ICF         ISSUE READY FUNCTION
          ZJN    RCR3        RETURN, (A) = 0, CONNECT REQUEST REJECTED
          MJN    RCR2        IF NAD ERROR
          UJN    RCR1        PROCESS ABNORMAL RESPONSE
SDN       SPACE  4,30
**        SDN    SEND DATA TO NAD
*
*         THE PURPOSE OF THIS ROUTINE IS TO CONTROL THE SENDING OF DATA
*         BLOCKS TO THE NAD.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; ALL REQUESTED DATA HAS BEEN SENT.
*                    > 0, OK; NO ERROR, BUT RESOURCES NOT AVAILABLE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         VERIFY AND INITIALIZE SUBFUNCTION POINTERS.
*         REPEAT
*           GET SUBFUNCTION HEADER.
*           READ BLOCK FROM CENTRAL MEMORY.
*           IF  NO ERRORS IN SUBFUNCTION  THEN
*             SEND BLOCK TO THE NAD.
*             IF  BLOCK SUCCESSFULLY SENT  THEN
*               UPDATE SUBFUNCTION POINTERS.
*             IFEND
*           IFEND
*         UNTIL   BUFFERS EXHAUSTED
*              OR ERROR ENCOUNTERED


 SDN0     RJM    CRT         CHECK RETRY TIMER

*         (A) > 0, IF WE ARE TO DELAY FOR DISK I/O SYNCHRONIZATION.

 SDN      SUBR               ENTRY/EXIT
          RJM    VSP         VERIFY AND INITIALIZE SUBFUNCTION POINTERS
          MJN    SDNX        IF ERROR IN INITIALIZATION
 SDN1     BSS    0
          ZJN    SDN0        IF BUFFER IS EMPTY
          LOADCB SFPTR,SFOUT
          CRDL   SUBF        READ SUBFUNCTION HEADER WORD
          LDDL   SUBFEA
          SBDL   SUBF+/SDSF/P.SFL
          MJN    SDN0        IF NO MORE ROOM IN BUFFER
          LDDL   SUBF+/SDSF/P.SFL
          SHN    -3
          SBN    C.SDSF      COMPUTE SUBFUNCTION LENGTH - HEADER
          RJM    RDC         READ DATA FROM CENTRAL MEMORY
          MJN    SDNX        IF ERROR IN CENTRAL MEMORY READ
          RJM    SBN         SEND DATA BLOCK TO THE NAD
          NJN    SDNX        IF ERROR IN DATA TRANSMISSION
*         LDN    0
          STDL   LCMND+/SD/P.RESRTY      RESET RETRY COUNTER
          RJM    USP         UPDATE SUBFUNCTION POINTERS
          PJN    SDN1        IF ROOM IN THE BUFFER
          UJK    SDNX        IF SUBFUNCTION ERROR
RDC       SPACE  4,25
**        RDC    READ DATA FROM CENTRAL MEMORY
*
*         THE PURPOSE OF THE FOLLOWING ROUTINE IS TO PASS DATA INTO THE PP
*         BUFFER FROM THE SPECIFIED CENTRAL MEMORY BUFFERS.
*
*         ENTRY  (SFOUT) = BYTE OFFSET OF SUBFUNCTION WITHIN THE BUFFER.
*                (SFPTR) = 3-WORD RMA POINTER TO BEGINNING OF *SF* BUFFER.
*                (A) = NUMBER OF BUFFER/LENGTH ENTRIES.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; ALL DATA READ INTO PP BUFFER.
*                         (TEMPOUT) = BYTE OFFSET OF NEXT SUBFUNCTION.
*                         (BYTCNT) = NUMBER OF BYTES IN BUFFER.
*                    < 0, ERROR; LENGTH ERROR, DETAILED RESPONSE SET UP.
*
*       /LOOP/
*         FOR  EACH CENTRAL MEMORY BUFFER  DO
*           IF  DATA LENGTH ERROR  THEN
*             FORMAT ABNORMAL RESPONSE.
*             EXIT /LOOP/.
*           ELSE
*             READ CORRESPONDING AMOUNT OF DATA FROM CENTRAL MEMORY.
*           IFEND
*         FOREND /LOOP/


 RDC0     LDN    0           RETURN, (A) = 0, DATA INPUT SUCCESSFULLY

 RDC      SUBR               ENTRY/EXIT
          STDL   SCRATCH     SAVE SUBFUNCTION BUFFER LENGTH
          SBK    C.IODB
          PJN    RDC2        IF AT LEAST ONE BUFFER SPECIFIED
 RDC1     LDK    IEC.505     INVALID LENGTH SPECIFICATION
          RJM    FIE         FORMAT INTERFACE ERROR
*         LCN    0
          UJN    RDCX        RETURN, (A) < 0, FATAL ERROR

 RDC2     LDK    BUFFER
          STML   RDCA        RESET FWA OF BUFFER
          LDN    0
          STDL   BYTCNT      BYTE COUNT
          LDDL   SFOUT
          ADK    B.SDSF

*         THE OUT POINTER MUST BE INCREMENTED BY 8 EACH TIME OTHERWISE
*         THIS ALGORITHM WILL FAIL WHEN THE BUFFER WRAPS AROUND.

 RDC3     STDL   TEMPOUT     POINT TO NEXT BUFFER POINTER
          SBDL   SFLIMIT
          MJN    RDC4        IF NOT BEYOND BUFFER
          LDK    FIRST
          STDL   TEMPOUT     OUT = FIRST
 RDC4     SODL   SCRATCH
          MJN    RDC0        IF ALL BUFFERS READ UP
          LOADCB SFPTR,TEMPOUT
          CRDL   SCRATCH+1
          ERRNZ  C.IODB-1    CODE ASSUMES THE I/O BUFFER DESC. ARE 1 WORD
          LDDL   SCRATCH+2
          RADL   BYTCNT      UPDATE NUMBER OF BYTES READ
          SBK    MAXBYTES+1
          PJN    RDC1        IF MAXIMUM BUFFER SIZE EXCEEDED
          LDDL   SCRATCH+2
          ADN    7
          SHN    -3
          STDL   BUFSIZE     NUMBER OF CM WORDS TO INPUT
          ZJN    RDC5        IF EMPTY BUFFER SPECIFIED
          LOADCM SCRATCH+3
          CRML   BUFFER,BUFSIZE        INPUT BLOCK OF WORDS
 RDCA     EQU    *-1         CURRENT PLACE WITHIN BUFFER
          LDDL   SCRATCH+2
          SHN    -1          CONVERT BYTES TO PP WORDS
          RAML   RDCA        UPDATE CURRENT BUFFER POSITION
 RDC5     LDDL   TEMPOUT
          ADK    B.IODB
          UJK    RDC3        PROCESS NEXT BUFFER
SBN       SPACE  4,40
**        SBN    SEND BLOCK TO THE NAD
*
*         THE PURPOSE OF THIS REQUEST IS TO INPUT A BLOCK FROM THE NAD.
*
*         ENTRY  (LCMND) = LOGICAL COMMAND.
*                (SFOUT) = OFFSET OF CURRENT SUBFUNCTION.
*                (SFPTR) = POINTER TO SUBFUNCTION BUFFER.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; BLOCK SUCCESSFULLY SENT TO NAD.
*                    > 0, OK; NO ERROR, BUT REQUEST CAN NOT BE COMPLETED.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*         GENERATE UNIVERSAL COMMAND FUNCTION BLOCK.
*         ISSUE UNIVERSAL COMMAND.
*         IF  NO ERRORS ENCOUNTERED  THEN
*           IF  STATUS NORMAL  THEN
*             SEND BLOCK ON THE CHANNEL.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             IFEND
*           ELSE
*             IF  RESOURCE LIMIT  THEN
*               IF  RESOURCE TIMER EXPRIED  THEN
*                 SET ABNORMAL STATUS.
*                 CALL NAD ERROR PROCESSOR.
*               IFEND
*             ELSE
*               SET ABNORMAL STATUS.
*               CALL NAD ERROR PROCESSOR.
*             IFEND
*           IFEND
*         IFEND
*         RELEASE THE CHANNEL.


 SBN      SUBR               ENTRY/EXIT
          LDK    UC.WB       WRITE DATA IN BINARY MODE
          SHN    8
          ADDL   LCMND+/SD/P.PATHID    ACROSS THIS PATH
          STML   UNCB+UCB.SF
          LDDL   BYTCNT                CALCULATE NAD WORD COUNT
          ADN    1                     ROUND UP TO NEAREST NAD WORD
          SHN    -1
          STML   UNCB+UCB.NWC
          RJM    IUC         ISSUE UNIVERSAL COMMAND
          ZJN    SBN4        IF FUNCTION ACCEPTED AND READY FOR I/O
          MJN    SBN3        IF NAD ERROR
          LMK    NR.TN&NR.AK
          NJN    SBN2        IF NOT *TRANSFER NOT READY* RESPONSE
          RJM    CRT         CHECK RETRY TIMER
          ZJN    SBN2        IF RETRIES EXHAUSTED
 SBN1     UJN    SBNX

 SBN2     LCN    NE.IVR      INVALID NAD RESPONSE
 SBN3     RJM    PEP         PERFORM NAD ERROR PROCESSING
          UJN    SBN1

 SBN4     LDDL   BYTCNT
          RJM    CVT         SET UP BYTE COUNT

*         ONE CANNOT EXIT A NAD TRANSACTION AT THIS POINT.
*         THE BLOCK SIZE IS VALIDATED IN ROUTINE *RDC*.
*         THEREFORE, *CVT* SHOULD ALWAYS RETURN A NORMAL STATUS HERE.

          RJM    OOC         SEND BLOCK TO THE NAD
          MJN    SBN3        IF NAD ERROR
          LDK    NF.TD
          RJM    ICF         ISSUE TRANSMIT DATA FUNCTION
          MJN    SBN3        IF NAD ERROR
          NJN    SBN2        IF ABNORMAL RESPONSE
          RJM    REL         RELEASE THE CHANNEL
*         LDN    0
          UJK    SBN1        RETURN, (A) = 0, BLOCK SUCCESSFULLY SENT
RDN       SPACE  4,40
**        RDN    RECEIVE DATA FROM NAD
*
*         THE PURPOSE OF THIS ROUTINE IS TO CONTROL THE RECEPTION OF DATA
*         BLOCKS FROM THE NAD.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; ALL REQUESTED DATA HAS BEEN SENT.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         VERIFY AND INITIALIZE SUBFUNCTION POINTERS.
*         WHILE   SPACE AVAILABLE IN THE BUFFER
*                 AND   NO ERRORS ENCOUNTERED     DO
*           READ SUBFUNCTION HEADER.
*           IF  SUBFUNCTION LENGTH ERROR  THEN
*             FORMAT AN INTERFACE ERROR RESPONSE
*           ELSE
*             INPUT BLOCK FROM THE NAD.
*             IF  BLOCK SUCCESSFULLY INPUT  THEN
*               SEND DATA TO CENTAL MEMORY.
*               UPDATE SUBFUNCTION POINTERS.
*               IF  FILE MARK IN HEADER
*                   AND FILE MARK ALERT SELECTED   THEN
*                 FORMAT AN ALERT RESPONSE.
*               IFEND
*             IFEND
*           IFEND
*         WHILEND


 RDN0     RJM    CRT         CHECK RETRY TIMER

*         (A) > 0, IF WE ARE TO DELAY FOR DISK I/O SYNCHRONIZATION.

 RDN      SUBR               ENTRY/EXIT
          RJM    VSP         VERIFY AND INITIALIZE POINTERS
          MJN    RDNX        IF ERROR IN PARAMETERS
 RDN1     LOADCB SFPTR,SFOUT
          CRDL   SUBF        READ SUBFUNCTION HEADER WORD
          LDDL   SUBFEA
          ZJN    RDN0        IF BUFFER IS EMPTY
          SBDL   SUBF+/RDSF/P.SFL
          MJN    RDN0        IF NOT ENOUGH ROOM IN THE BUFFER
          LDDL   SUBF+/RDSF/P.SFL
          SHN    -3
          SBK    C.RDSF
          MJN    RDN3        IF SUBFUNCTION LENGTH ERROR
          STDL   SPECSAV     SAVE LENGTH OF SUBFUNCTION
          RJM    IBN         INPUT BLOCK FROM THE NAD
          NJN    RDNX        IF ERROR ENCOUNTERED
*         LDN    0
          STDL   LCMND+/RD/P.RESRTY    RESET RETRY COUNTER
          RJM    SDC         SEND DATA TO CENTRAL MEMORY
          LOADCB SFPTR,SFOUT
          CWDL   SUBF        REWRITE HEADER WITH TRANSFER LENGTH
          RJM    USP         UPDATE SUBFUNCTION POINTERS
          MJN    RDN4        IF BUFFER POINTER ERROR
          LDML   BUFFER+/BH/P.BT
          LPK    /BH/M.BT
          LMK    BT.MSG
          ZJN    RDN5        IF MESSAGE BLOCK ENCOUNTERED
 RDN2     UJK    RDN1        PROCESS NEXT SUBFUNCTION

 RDN3     LDK    IEC.505     INVALID LENGTH SPECIFICATION
          RJM    FIE         FORMAT INTERFACE ERROR
*         LCN    0
 RDN4     UJK    RDNX        RETURN, (A) < 0, SUBFUNCTION LENGTH ERROR

 RDN5     LDK    TRUE
          SHN    16-/PRS/L.EOM-/PRS/N.EOM
          STML   RESBUF+/PRS/P.EOM     SET END OF MESSAGE ALERT FLAG
          LPML   RESBUF+/PRS/P.ALERTM
          ZJN    RDN7        IF END OF MESSAGE ALERT NOT SELECTED
 RDN6     RJM    FAR         FORMAT AN ALERT RESPONSE
*         LCN    0
          UJN    RDN4        RETURN (A) < 0, ALERT CONDITION ENCOUNTERED

 RDN7     LDML   BUFFER+/BH/P.EOR
          SHN    17-15+/BH/L.EOI
          PJN    RDN10       IF EOI NOT ENCOUNTERED
 RDN8     LDK    TRUE
          SHN    16-/PRS/L.EOI-/PRS/N.EOI        CHECK EOI ALERT
 RDN9     STML   RESBUF+/PRS/P.EOI     SET FILE MARK ALERT FLAG
          LPML   RESBUF+/PRS/P.ALERTM
          NJN    RDN6        IF FILE MARK ALERT SELECTED
          UJN    RDN2        NO ALERTS ENCOUNTERED

 RDN10    SHN    17-15+/BH/L.EOR-17+15-/BH/L.EOI
          PJN    RDN2        IF EOR/EOF NOT FLAG SET
          SHN    17-15+/BH/L.LEVEL-17+15-/BH/L.EOR
          SHN    -18+/BH/N.LEVEL       ISOLATE THE EOR LEVEL NUMBER
          LMK    /BH/M.EOF
          ZJN    RDN11       IF EOF ENCOUNTERED
          LDK    TRUE
          SHN    16-/PRS/L.EOR-/PRS/N.EOR
          UJN    RDN9        CHECK FOR EOR ALERT

 RDN11    LDK    TRUE
          SHN    16-/PRS/L.EOF-/PRS/N.EOF
          UJN    RDN9        CHECK FOR EOF ALERT
IBN       SPACE  4,40
**        IBN    INPUT BLOCK FROM THE NAD
*
*         THE PURPOSE OF THIS REQUEST IS TO INPUT A BLOCK FROM THE NAD.
*
*         ENTRY  (LCMND) = LOGICAL COMMAND.
*                (SFOUT) = OFFSET WITHIN BUFFER OF CURRENT SUBFUNCTION.
*                (SFPTR) = POINTER TO SUBFUNCTION BUFFER.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; BLOCK SUCCESSFULLY RECEIVED FROM NAD.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         GENERATE UNIVERSAL COMMAND FUNCTION BLOCK.
*         ISSUE UNIVERSAL COMMAND.
*         IF  NO ERRORS ENCOUNTERED  THEN
*           IF  STATUS NORMAL  THEN
*             RECEIVE BLOCK FROM THE CHANNEL.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               IF  BLOCK TYPE ALERT ENCOUNTERED  THEN
*                 RESET BLOCK POINTERS IN THE NAD.
*                 IF  ERROR ENCOUNTERED  THEN
*                   CALL NAD ERROR PROCESSOR.
*                 ELSE
*                   RETURN ALERT CONDITION.
*                 IFEND
*               IFEND
*             IFEND
*           ELSE
*             IF  RESOURCE LIMIT  THEN
*               IF  RESOURCE TIMER EXPIRED  THEN
*                 SET ABNORMAL STATUS.
*                 CALL NAD ERROR PROCESSOR.
*               IFEND
*             ELSE
*               SET ABNORMAL STATUS.
*               CALL NAD ERROR PROCESSOR.
*             IFEND
*           IFEND
*         IFEND
*         RELEASE THE CHANNEL.


 IBN      SUBR               ENTRY/EXIT
          LDK    UC.RB       READ DATA IN BINARY MODE
          SHN    8
          ADDL   LCMND+/SD/P.PATHID    ACROSS THIS PATH
          STML   UNCB+UCB.SF
          RJM    IUC         ISSUE UNIVERSAL COMMAND
          ZJN    IBN4        IF FUNCTION ACCEPTED AND READY FOR I/O
          MJN    IBN3        IF NAD ERROR
          LMK    NR.TN&NR.AK
          NJN    IBN2        IF NOT RESOURCES UNAVAILABLE RESPONSE
          RJM    CRT         CHECK RETRY TIMER
          ZJN    IBN2        IF RETRIES EXHAUSTED
 IBN1     UJN    IBNX

 IBN2     LCN    NE.IVR      INVALID NAD RESPONSE
 IBN3     RJM    PEP         PERFORM NAD ERROR PROCESSING
          UJN    IBN1

 IBN4     LDDL   SUBF+/RDSF/P.TBL
          RJM    CVT         SET TRANSFER COUNT AND ADDRESS
          MJN    IBN7        IF INVALID DATA LENGTH
          RJM    IFC         INPUT BLOCK FROM THE NAD
          MJN    IBN3        IF NAD ERROR
          STDL   SUBF+/RDSF/P.NBT      SAVE NUMBER OF BYTES TRANSFERRED
          LDML   BUFFER+/BH/P.PRU
          SHN    17-15+/BH/L.PRU
          MJN    IBN5        IF PRU FLAG SET IN THE BLOCK HEADER
          LDK    TRUE
          SHN    16-/PRS/L.NONPRU-/PRS/N.NONPRU
          UJN    IBN6        NON-PRU BLOCK ALERT ENCOUNTERED

 IBN5     LDK    TRUE
          SHN    16-/PRS/L.PRU-/PRS/N.PRU        PRU BLOCK ALERT ENCOUNTERED
 IBN6     STML   RESBUF+/PRS/P.PRU               SET ALERT CONDITION
          LPML   RESBUF+/PRS/P.ALERTM
          ZJN    IBN8        IF ALERT CONDITION NOT SELECTED
          RJM    FAR         FORMAT ALERT RESPONSE
 IBN7     LDK    NF.RT
          RJM    ICF         ISSUE RESET FUNCTION
          LCN    0
          UJN    IBN9        RETURN, (A) < 0, ALERT CONDITION ENCOUNTERED

 IBN8     RJM    REL         RELEASE THE CHANNEL
*         LDN    0
 IBN9     UJK    IBNX        RETURN, (A) = 0, BLOCK SUCCESSFULLY SENT
SDC       SPACE  4,20
**        SDC    SEND DATA TO CENTRAL MEMORY
*
*         THE PURPOSE OF THE FOLLOWING ROUTINE IS TO PASS DATA FROM THE PP
*         BUFFER INTO THE SPECIFIED CENTRAL MEMORY BUFFERS.
*
*         ENTRY  (SPECSAV) = NUMBER OF CM WORDS IN THE SUBFUNCTION.
*                (SFOUT) = BYTE OFFSET WITHIN BUFFER OF THE SUBFUNCTION.
*                (SFPTR) = 3-WORD CM ADDRESS POINTER TO *SF* BUFFER.
*
*         EXIT   (A) : STATUS
*                    = 0, ALL DATA SUCCESSFULLY SENT TO CENTRAL MEMORY.
*                    < 0, SUBFUNCTION LENGTH ERROR; DETAILED STATUS SET UP.
*                (TEMPOUT) = OFFSET WITHIN BUFFER OF THE NEXT SUBFUNCTION.
*
*
*         FOR  EACH CENTRAL MEMORY BUFFER  DO
*           WRITE CORRESPONDING AMOUNT OF DATA TO CENTRAL MEMORY.
*         FOREND


 SDC      SUBR               ENTRY/EXIT
          LDK    BUFFER
          STML   SDCA        RESET FWA OF BUFFER
          LDDL   SFOUT
          ADK    B.RDSF

*         THE OUT POINTER MUST BE INCREMENTED BY 8 EACH TIME OTHERWISE
*         THIS ALGORITHM WILL FAIL WHEN THE BUFFER WRAPS AROUND.

 SDC1     STDL   TEMPOUT     POINT TO NEXT BUFFER POINTER
          SBDL   SFLIMIT
          MJN    SDC2        IF NOT BEYOND BUFFER
          LDK    FIRST
          STDL   TEMPOUT     OUT = FIRST
 SDC2     SODL   SPECSAV
          MJN    SDCX        IF ALL BUFFERS PROCESSED
          LOADCB SFPTR,TEMPOUT
          ERRNZ  C.SD-C.RD   CODE ASSUMES THESE TWO VALUES ARE EQUAL
          CRDL   SCRATCH+1
          ERRNZ  C.IODB-1    CODE ASSUMES THE I/O BUFFER DESC. ARE 1 WORD
          LDDL   BYTXFR
          ZJN    SDC4        IF ALL BYTES TRANSFERRED
          SBDL   SCRATCH+2
          PJN    SDC3        IF MORE DATA TO SEND AFTER THIS BUFFER
          LDN    0           NO MORE DATA LEFT
 SDC3     STDL   BYTXFR      UPDATE NUMBER OF BYTES LEFT TO SEND
          LDDL   SCRATCH+2
          ADN    7
          SHN    -3
          STDL   BUFSIZE     NUMBER OF CM WORDS TO OUTPUT
          ZJN    SDC4        IF EMPTY BUFFER
          LOADCM SCRATCH+3
          CWML   BUFFER,BUFSIZE        OUTPUT BLOCK TO CENRAL MEMORY
 SDCA     EQU    *-1         CURRENT PLACE WITHIN BUFFER
          LDDL   SCRATCH+2
          SHN    -1          CONVERT BYTES TO PP WORDS
          RAML   SDCA        UPDATE CURRENT BUFFER POSITION
 SDC4     LDDL   TEMPOUT
          ADK    B.IODB
          UJK    SDC1        PROCESS NEXT BUFFER
ONS       SPACE  4,40
**        ONS    OBTAIN NAD STATUS
*
*         THE PURPOSE OF THIS ROUTINE IS TO OBTAIN THE STATUS OF THE
*         PATHS IN THE CORRESPONDING NAD.
*
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; NAD STATUS HAS BEEN UPTAINED.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETED.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         ISSUE NAD STATUS FUNCTION.
*         IF  STATUS CHANGE OCCURRED
*             OR  UNCONDITIONAL OBTAIN STATUS SELECTED   THEN
*           INPUT STATUS BLOCK FROM NAD.
*           IF  NO ERROR ENCOUNTERED  THEN
*             WRITE STATUS BLOCK TO CENTRAL MEMORY.
*           ELSE
*            CALL NAD ERROR PROCESSOR.
*           IFEND
*         ELSE
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             SET FLAG TO NOT RETURN A RESPONSE.
*           IFEND
*         IFEND


 ONS      SUBR               ENTRY/EXIT
          LDDL   LCMND+/SN/P.LENGTH
          RJM    CVT         SET UP FOR DATA TRANSFER
          MJN    ONSX        IF TRANSFER LENGTH ERROR
          LDK    NF.NS
          RJM    ICF         ISSUE OBTAIN NAD STATUS FUNCTION
          ZJN    ONS4        IF FUNCTION ACCEPTED
          MJN    ONS2        IF NAD ERROR
          LMK    NR.NK&NR.AK
          NJN    ONS1        IF UNEXPECTED RESPONSE
          LDDL   LCMND+/SN/P.UNCOND
          SHN    17-15+/SN/L.UNCOND
          MJN    ONS4        IF UNCONDITIONAL OBTAIN STATUS
          LDK    NF.AB
          RJM    ICF         ABORT TRANSACTION
          NJN    ONS1        IF NOT SUCCESSFUL
          LDN    1
          UJN    ONSX        RETURN, (A) > 0, NO ERROR BUT NOT COMPLETE

 ONS1     LCN    NE.IVR      INVALID NAD RESPONSE
 ONS2     RJM    PEP         PERFORM NAD ERROR PROCESSING
 ONS3     UJK    ONSX

 ONS4     RJM    IFC         INPUT NAD STATUS
          MJN    ONS2        IF NAD ERROR
          LDDL   BYTXFR      BYTES TRANSFERRED
          ADN    7           ROUND UP BYTES TRANSFERRED TO MULTIPLE OF CM WORD
          SHN    -3
          STDL   BUFSIZE     BYTES TO TRANSFER TO CM
          LOADCM LCMND+/SN/P.BUFFER
          CWML   BUFFER,BUFSIZE        WRITE STATUS TABLE TO CM
          LDN    0
          UJK    ONS3        RETURN (A) = 0, SUCCESSFUL
SCM       SPACE  4,35
**        SCM    SEND CONTROL MESSAGE
*
*         THE PURPOSE OF THIS REQUEST IS TO SEND A CONTROL MESSAGE ACROSS
*         THE NETWORK.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; CONTROL MESSAGE HAS BEEN SENT.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         READ MESSAGE FROM BUFFER.
*         ISSUE SEND CONTROL MESSAGE FUNCTION.
*         IF  ERROR ENCOUNTERED  THEN
*           CALL NAD ERROR PROCESSOR.
*         ELSE
*           OUTPUT BLOCK ON THE CHANNEL.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             SEND READY FUNCTION TO THE NAD.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             IFEND
*           IFEND
*         IFEND


 SCM      SUBR               ENTRY/EXIT
          LDDL   LCMND+/SCM/P.LENGTH
          RJM    CVT         CONVERT BYTE COUNT
          MJN    SCMX        IF LENGTH ERROR
          LOADCM LCMND+/SCM/P.BUFFER
          CRML   BUFFER,BUFSIZE        READ IN CONTROL MESSAGE
          LDK    NF.SC
          RJM    ICF         ISSUE SEND CONTROL MESSAGE FUNCTION
          MJN    SCM1        IF NAD ERROR
          NJN    SCM4        IF NOT ACK RESPONSE
          RJM    OOC         OUTPUT CONTROL MESSAGE
          ZJN    SCM3        IF ALL BYTES TRANSFERRED
 SCM1     RJM    PEP         PERFORM ERROR PROCESSING
 SCM2     UJK    SCMX        RETURN NAD ERROR

 SCM3     LDK    NF.RY
          RJM    ICF         ISSUE READY FUNCTION
          ZJN    SCMX        IF ACK RESPONSE, RETURN (A) = 0, MESSAGE SENT
          MJN    SCM1        IF NAD ERROR
 SCM4     LCN    NE.IVR
          UJN    SCM1        PROCESS INVALID RESPONSE
RCM       SPACE  4,45
**        RCM    RECEIVE CONTROL MESSAGE
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN AN INCOMING CONTROL
*         MESSAGE.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LDMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; CONTROL MESSAGE HAS BEEN RECEIVED.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         IF   RECEIVING INCOMING CONTROL MESSAGES  THEN
*           ISSUE INQUIRE SELECTED CONTROL MESSAGE FUNCTION.
*         ELSE
*           ISSUE INQUIRE SELECTED REJECTED CONTROL MESSAGE FUNCTION.
*         IFEND
*         IF  ERROR ENCOUNTERED  THEN
*           CALL NAD ERROR PROCESSOR.
*         ELSE
*           OUTPUT BLOCK ON THE CHANNEL.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             SEND READY FUNCTION TO THE NAD.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               INPUT BLOCK FROM THE CHANNEL
*               IF  ERROR ENCOUNTERED  THEN
*                 CALL NAD ERROR PROCESSOR.
*               ELSE
*                 ISSUE READY FUNCTION.
*                 IF  ERROR ENCOUNTERED  THEN
*                   CALL NAD ERROR PROCESSOR.
*                 ELSE
*                   WRITE MESSAGE TO BUFFER.
*                 IFEND
*               IFEND
*             IFEND
*           IFEND
*         IFEND


 RCM      SUBR               ENTRY/EXIT
          LDDL   LCMND+/RCM/P.LENGTH
          RJM    CVT         SET UP FOR TRANSFER
          MJN    RCMX        IF TRANSFER LENGTH ERROR
          LDDL   LCMND+/RCM/P.CMTYPE
          SHN    17-15+/RCM/L.CMTYPE
          MJN    RCM1        IF INPUTTING REJECTED CONTROL MESSAGE
          LDK    NF.IC
          UJN    RCM2        INQUIRE SELECTED CONTROL MESSAGE

 RCM1     LDK    NF.IR       INQUIRE SELECTED REJECTED CONTROL MESSAGE
 RCM2     RJM    ICF         ISSUE CONTROLWARE FUNCTION
          NJN    RCM5        IF UNEXPECTED REPONSE
          MJN    RCM3        IF NAD ERROR
          LDN    /RCM/B.PHYFRM
          ERRZR  /RCM/B.PHYFRM
          RJM    CVT         CONVERT BYTE COUNT

*         ONE CANNOT EXIT A NAD TRANSACTION AT THIS POINT.
*         THE LENGTH OF THE PHYSICAL FROM IS VALIDATED BY
*         USE OF AN *LDN* INSTRUCTION AND THE *ERRZR* TEST.
*         THEREFORE, *CVT* SHOULD ALWAYS RETURN A NORMAL STATUS.

          LDK    LCMND+/RCM/P.PHYFRM
          STML   OOCA        SET FWA OF BUFFER
          RJM    OOC         SEND PHYSICAL FROM TO THE NAD
          ZJN    RCM6        IF TRANSFER SUCCESSFUL
 RCM3     RJM    PEP         PERFORM NAD ERROR PROCESSING
 RCM4     UJN    RCMX

 RCM5     LCN    NE.IVR      INVALID NAD RESPONSE
          UJN    RCM3

 RCM6     LDK    NF.RY
          RJM    ICF         ISSUE READY FUNCTION
          MJN    RCM3        IF NAD ERROR
          NJN    RCM5        IF NOT ACK RESPONSE
          LDDL   LCMND+/RCM/P.LENGTH
          RJM    CVT         SET UP FOR TRANSFER

*         ONE CANNOT EXIT A NAD TRANSACTION AT THIS POINT.
*         THE CONNECT REQUEST LENGTH IS VALIDATED BY
*         CALLING *CVT* AT THE BEGINNING OF THIS ROUTINE.
*         THEREFORE, *CVT* SHOULD ALWAYS RETURN A NORMAL STATUS HERE.

          RJM    IFC         INPUT CONTROL MESSAGE
          MJN    RCM3        IF NAD ERROR
          LDK    NF.RY
          RJM    ICF         ISSUE READY FUNCTION
          MJN    RCM3        IF NAD ERROR
          NJN    RCM5        IF NOT AN ACK RESPONSE
          LOADCM LCMND+/RCM/P.BUFFER
          CWML   BUFFER,BUFSIZE        WRITE CONTROL MESSAGE TO CM BUFFER
          LDN    0
          UJK    RCM4        RETURN, (A) = 0, CONTROL MESSAGE RECEIVED
TCN       SPACE  4,40
**        TCN    TERMINATE CONNECTION
*
*         THE PURPOSE OF THIS REQUEST IS TO TERMINATE THE SPECIFIED
*         CONNECTION(S) AS SPECIFIED.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE = REQUESTED CONNECTION(S) TERMINATED.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETE.
*                    < 0, NAD ERROR; DETAILED STATUS SET UP.
*
*
*         IF  TERMINATING ALL PATHS  THEN
*           ISSUE PURGE ALL PATHS FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           IFEND
*         ELSE
*           ISSUE SELECT PATH FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             IF  NORMAL TERMINATION  THEN
*               ISSUE DISCONNECT PATH FUNCTION.
*             ELSE
*               ISSUE PURGE PATH FUNCTION.
*             IFEND
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             IFEND
*           IFEND
*         IFEND


 TCN      SUBR               ENTRY/EXIT
          LDDL   LCMND+/DP/P.PATHID
          ZJN    TCN5        IF TERMINATING ALL PATHS
          ADK    NF.SP
          RJM    ICF         ISSUE SELECT PATH FUNCTION
          MJN    TCN3        IF NAD ERROR

*         IGNORE CONTROLWARE RESPONSE

          LDDL   LCMND+/DP/P.ABNORM
          SHN    17-15+/DP/L.ABNORM
          MJN    TCN1        IF ABNORMAL TERMINATION
          LDK    NF.DP
          UJN    TCN2        ISSUE NORMAL DISCONNECT FUNCTION

 TCN1     LDK    NF.PP       ISSUE PURGE PATH FUNCTION
 TCN2     RJM    ICF
          ZJN    TCNX        IF PATH DISCONNECTED (OR PURGED)
          MJN    TCN4        IF FUNCTION NOT ACCEPTED
 TCN3     LCN    NE.IVR      PROCESS INVALID REPONSE ERROR
 TCN4     RJM    PEP         PERFORM ERROR PROCESSING
          UJK    TCNX        RETURN ERROR

 TCN5     LDK    NF.PA
          UJN    TCN2        ISSUE PURGE ALL PATHS FUNCTION
RPS       SPACE  4,35
**        RPS    READ PATH STATUS TABLE
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE PATH STATUS
*         INFORMATION FOR THE SPECIFIED CONNECTION.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; PATH STATUS RECEIVED.
*                    > 0, OK; NO ERRORS, BUT REQUEST NOT COMPLETE.
*                    < 0, NAD ERROR; DETAILED STATUS SET UP.
*
*
*         ISSUE SELECT PATH FUNCTION.
*         IF  ERROR ENCOUNTERED  THEN
*           CALL NAD ERROR PROCESSOR.
*         ELSE
*           ISSUE READ PATH STATUS FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             INPUT BLOCK FROM THE NAD.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               SEND BLOCK TO CENTRAL MEMORY.
*             IFEND
*           IFEND
*         IFEND


 RPS      SUBR               ENTRY/EXIT
          LDDL   LCMND+/RPST/P.LENGTH
          RJM    CVT         CONVERT BYTE COUNT
          MJN    RPSX        IF TRANSFER LENGTH ERROR
          LDDL   LCMND+/RPST/P.PATHID
          ADK    NF.SP
          RJM    ICF         ISSUE SELECT PATH FUNCTION
          MJN    RPS1        IF NAD ERROR

*         IGNORE CURRENT PATH STATUS

          LDK    NF.PS
          RJM    ICF         ISSUE READ PATH STATUS FUNCTION
          MJN    RPS1        IF NAD ERROR
          NJN    RPS3        IF NOT ACKNOWLEDGED TO READ THE STATUS
          RJM    IFC         INPUT FROM CHANNEL
          PJN    RPS4        IF ALL DATA TRANSFERRED
 RPS1     RJM    PEP         PERFORM NAD ERROR PROCESSING
 RPS2     UJK    RPSX

 RPS3     LCN    NE.IVR
          UJN    RPS1        PROCESS INVALID RESPONSE

 RPS4     LOADCM LCMND+/RPST/P.BUFFER
          CWML   BUFFER,BUFSIZE        PUT PATH STATUS IN BUFFER
          LDN    0
          UJN    RPSX        RETURN (A) = 0, PATH STATUS RECEIVED
OGS       SPACE  4,10
**        OGS    OBTAIN NAD GENERAL STATUS
*
*         THE PURPOSE OF THIS ROUTINE IS TO OBTAIN THE NAD GENERAL STATUS
*         INFORMATION FROM THE SPECIFIED NAD.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; GENERAL STATUS RECEIVED.
*                    > 0, OK; NO ERROR, BUT REQUEST NOT COMPLETE.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         IF  OBTAINING REMOTE NAD GENERAL STATUS  THEN
*           ISSUE SELECT PATH FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             IF  REMOTE STATUS PRIMED  THEN
*               ISSUE MAINTENANCE INPUT FUNCTION.
*             ELSE
*               ISSUE READ REMOTE STATUS FUNCTION.
*             IFEND
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               INPUT BLOCK FROM THE NAD.
*               IF  ERROR ENCOUNTERED  THEN
*                 CALL NAD ERROR PROCESSOR.
*               ELSE
*                 WRITE GENERAL STATUS DATA TO CENTRAL MEMORY.
*               IFEND
*             IFEND
*           IFEND
*         ELSE
*           ISSUE OBTAIN GENERAL STATUS FUNCTION.
*           IF  ERROR ENCOUNTERED  THEN
*             CALL NAD ERROR PROCESSOR.
*           ELSE
*             INPUT BLOCK FROM THE NAD.
*             IF  ERROR ENCOUNTERED  THEN
*               CALL NAD ERROR PROCESSOR.
*             ELSE
*               WRITE GENERAL STATUS DATA TO CENTRAL MEMORY.
*             IFEND
*           IFEND
*         IFEND


 OGS      SUBR               ENTRY/EXIT
          LDDL   LCMND+/ONGS/P.LENGTH
          RJM    CVT         CONVERT BYTE COUNT TO CM AND CHANNEL WORD COUNTS
          MJN    OGSX        IF TRANSFER LENGTH ERROR
          IF     DEF,MCON
          LDDL   LCMND+/ONGS/P.PATHID
          NJN    OGS1        IF REMOTE STATUS FUNCTION
          ENDIF
          LDK    NF.GS
          UJN    OGS7        ISSUE GENERAL STATUS FUNCTION

          IF     DEF,MCON
 OGS1     ADK    NF.SP
          RJM    ICF         ISSUE SELECT PATH FUNCTION
          ZJN    OGS5        IF PATH IN A VALID STATE
          MJN    OGS3        IF NAD ERROR
 OGS2     LCN    NE.IVR      INVALID NAD RESPONSE
          ENDIF
 OGS3     RJM    PEP         PERFORM NAD ERROR PROCESSING
 OGS4     UJN    OGSX

          IF     DEF,MCON
 OGS5     LDDL   LCMND+/ONGS/P.RNADP
          SHN    17-15+/ONGS/L.RNADP
          MJN    OGS6        IF REMOTE NAD STATUS PRIMED

*         THE FOLLOWING FLAG IS SET SO THAT SUBSEQUENT RETRIES WILL USE
*         THE MAINTENANCE PATH INPUT FUNCTION TO RETRIEVE THE GENERAL STATUS.

          LDK    TRUE
          SHN    16-/ONGS/L.RNADP-/ONGS/N.RNADP
          STDL   LCMND+/ONGS/P.RNADP   SET PRIMED FLAG
          LDK    NF.RR
          UJN    OGS7        ISSUE READ REMOTE STATUS FUNCTION

 OGS6     LDK    NF.MI       ISSUE MAINTENANCE PATH INPUT FUNCTION
          ENDIF
 OGS7     RJM    ICF         ISSUE CONTROLWARE FUNCTION
          ZJN    OGS9        IF READY FOR INPUT
          MJN    OGS3        IF NAD ERROR
          IF     DEF,MCON
          LMK    NR.TN&NR.AK
          ZJN    OGS11       IF  *TRANSFER NOT READY* STATUS
          ENDIF
 OGS8     LCN    NE.IVR
          UJN    OGS3        PROCESS INVALID RESPONSE

 OGS9     RJM    IFC         INPUT GENERAL STATUS
          MJN    OGS3        IF INPUT ERROR
          LOADCM LCMND+/ONGS/P.BUFFER
          CWML   BUFFER,BUFSIZE
          LDN    0
 OGS10    UJK    OGS4        RETURN, (A) = 0, GENERAL STATUS RETURNED

          IF     DEF,MCON
 OGS11    SODL   LCMND+/ONGS/P.RETRYC
          MJN    OGS8        IF RETRIES EXHAUSTED
          LDN    1
          UJN    OGS10       RETURN, (A) > 0, REQUEST NOT COMPLETE
          ENDIF
PPC       TITLE  PPC - PROCESS PHYSICAL COMMANDS.
**        PPC    PROCESS PHYSICAL COMMANDS
*
*         THE PURPOSE OF THIS ROUTINE IS TO PROCESS A SERIES OF PHYSICAL
*         COMMANDS.
*
*         ENTRY  UNIT REQUEST INTERLOCKED.
*                (LCMND) = LOGICAL COMMAND.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE;  PHYSICAL FUNCTIONS COMPLETED.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*
*
*         REPEAT
*           CASE   TYPE OF PHYSICAL COMMAND   OF
*             =  ISSUE CONTROLWARE FUNCTION  =
*               ISSUE THE SPECIFIED NAD FUNCTION.
*             =  OUTPUT 8/8 MODE  =
*               READ BLOCK FROM CENTAL MEMORY.
*               OUTPUT BLOCK.
*             =  SEND TRANSFER ADDRESS AND LENGTH  =
*               READ BLOCK FROM CENTAL MEMORY.
*               OUTPUT BLOCK.
*             =  INPUT 8/8 MODE  =
*               INPUT BLOCK FROM NAD.
*               WRITE DATA TO CENTRAL MEMORY.
*             =  GET CONTROLWARE STATUS  =
*               GET CONTROLWARE STATUS.
*               VERIFY STATUS WITH USER MASK.
*             =  GET HARDWARE STATUS  =
*               GET HARDWARE STATUS.
*               VERIFY STATUS WITH USER MASK.
*           ELSE
*             RETURN ILLEGAL PHYSICAL COMMAND RESPONSE.
*           CASEND
*           IF  NO ERROR ENCOUNTERED  THEN
*             INCREMENT COMMAND POINTER.
*           IFEND
*         UNTIL  END OF COMMAND LIST
*                OR  AN ERROR IS ENCOUNTERED


 PPC0     LDN    0           RETURN, (A) = 0, NORMAL COMPLETION

 PPC      SUBR               ENTRY/EXIT
          LDDL   REQLGTH
          SHN    -3
          SBK    C.PR+C.LCF
          STDL   NUMCMND     NUMBER OF COMMANDS TO PROCESS
          ERRNZ  C.PCF-1     CODE ASSUMES PHYSICAL COMMAND LENGTH = 1 CM WORD
          LDK    C.LCF*8
 PPC1     RAML   RESBUF+/PRS/P.RMALC+1           POINT TO NEXT PHYSCIAL COMMAND
          SHN    -16
          RAML   RESBUF+/PRS/P.RMALC
          SODL   NUMCMND
          MJN    PPC0        IF ALL COMMANDS PROCESSED
          LOADCM RESBUF+/PRS/P.RMALC
          CRDL   PCMND       READ PHYSICAL COMMAND
          LDDL   PCMND+/PCF/P.PCMND
          SHN    -16+/PCF/L.PCMND+/PCF/N.PCMND
          LMK    PC.IF
          NJN    PPC3        IF NOT ISSUE FUNCTION REQUEST
          LDDL   PCMND+/INF/P.FUNC
          RJM    FUN         ISSUE NAD FUNCTION
          MJN    PPC5        IF NAD ERROR
 PPC2     LDK    C.PCF*8
          UJK    PPC1        PROCESS NEXT PHYSICAL COMMAND

 PPC3     LMK    PC.OB&PC.IF
          NJN    PPC7        IF NOT OUTPUT DATA IN BIT STRING MODE
          LDDL   PCMND+/O8D/P.LENGTH
          RJM    CVT
          MJN    PPC6
          LOADCM PCMND+/O8D/P.BUFFER
          CRML   BUFFER,BUFSIZE        READ IN DATA BLOCK
          RJM    OOC         OUTPUT DATA ON CHANNEL
          ZJN    PPC2        IF ALL DATA TRANSFERRED
 PPC5     RJM    PEP         PERFORM NAD ERROR PROCESSING
 PPC6     UJK    PPCX

 PPC7     LMK    PC.SA&PC.OB
          NJN    PPC8        IF NOT SEND TRANSFER ADDRESS REQUEST
          LOADCM PCMND+/SAL/P.BUFFER
          CRDL   TRADDR      READ IN TRANSFER LENGTH AND ADDRESS
          ERRNZ  TRLENC-1    CODE ASSUMES THE LENGTH IS ONE CM WORD
          ACN    CH+40B
          LDK    TRLENCH
          OAM    TRADDR,CH   SEND TRANSFER LENGTH AND ADDRESS TO THE NAD
          IF     DEF,NDI0
          STDL   SCRATCH     SAVE WORD COUNT
          LCN    0
 PPC7.3   EJM    PPC7.5,CH   IF CHANNEL EMPTY
          SBN    1
          NJN    PPC7.3      IF TIMER HAS NOT EXPIRED
          LDC    -NE.DTO
          UJN    PPC5        RETURN, DATA TIMEOUT ERROR

 PPC7.5   LDDL   SCRATCH
          ENDIF
          DCN    CH+40B
          ZJN    PPC9        IF TRANSFER SUCCESSFUL
          LCN    NE.OTE
          UJK    PPC5        PROCESS TRANSFER ERROR

 PPC8     LMK    PC.IB&PC.SA
          NJN    PPC10       IF NOT INPUT DATA IN BIT STRING MODE
          LDDL   PCMND+/I8D/P.LENGTH
          RJM    CVT
          MJN    PPC6        IF LENGTH ERROR ENCOUNTERED
          RJM    IFC         INPUT BLOCK FROM THE NAD
          STDL   SCRATCH+1
          SHN    -16
          STDL   SCRATCH
          LOADCM PCMND+/I8D/P.BUFFER
          CWML   BUFFER,BUFSIZE        WRITE BLOCK TO CENTRAL MEMORY
          LDDL   SCRATCH
          SHN    16
          LMDL   SCRATCH+1
          MJN    PPC12       IF ERROR ENCOUNTERED
          SBDL   PCMND+/I8D/P.LENGTH
          PJN    PPC9        IF ALL EXPECTED DATA RECEIVED
          LCN    NE.ITE      IF INPUT TRANSFER ERROR
          UJN    PPC12

 PPC9     UJK    PPC2        IF NORMAL RESPONSE

 PPC10    LMK    PC.HS&PC.IB
          NJN    PPC13       IF NOT OBTAIN HARDWARE STATUS REQUEST
          RJM    OHS         OBTAIN HARDWARE STATUS
          MJN    PPC12       IF NAD ERROR
          LPDL   PCMND+/ONHS/P.HWMASK
          LMDL   PCMND+/ONHS/P.HWVAL
 PPC11    ZJN    PPC9        IF EXPECTED RESPONSE RECEIVED
          LCN    NE.IVR
 PPC12    UJK    PPC5        PROCESS INVALID NAD RESPONSE

 PPC13    LMK    PC.CS&PC.HS
          NJN    PPC14       IF NOT OBTAIN CONTROLWARE STATUS REQUEST
          RJM    OCS         OBTAIN CONTROLWARE STATUS
          MJN    PPC12       IF NAD ERROR
          LPDL   PCMND+/ONCS/P.CWMASK
          LMDL   PCMND+/ONCS/P.CWVAL
          UJN    PPC11       VALIDATE STATUS

 PPC14    LDK    IEC.501     INVALID PHYSICAL COMMAND
          RJM    FIE         FORMAT INTERFACE ERROR
*         LCN    0
          UJK    PPCX        RETURN, (A) < 0, INTERFACE ERROR
MPR       TITLE  MPR - MISCELLANEOUS PROCEDURES.
**        MPR    MISCELLANEOUS PROCECURES
*
*         THE FOLLOWING ROUTINES PERFORM COMMON PROCESSES THAT ARE UTILIZED
*         BY MORE THAN ONE ROUTINE.
ATI       SPACE  4,30
**        ACQUIRE TABLE INTERLOCK
*
*         THE PURPOSE OF THIS ROUTINE IS TO OBTAIN THE INTERLOCK FOR A
*         SPECIFIED TABLE.
*
*         ENTRY  (A) = POINTER TO INTERLOCK WORD ADDRESS.
*
*         EXIT   (A) : STATUS
*                    = 0, SET = REQUESTED INTERLOCK SET.
*                    <> 0, IN USE = INTERLOCK IS CURRENTLY IN USE.
*
*
*         REPEAT
*           SET UPPER 32 BITS OF I/L WORD TO ONE'S.
*           IF   ORIGINAL MEMORY CONTENTS ARE ZERO   THEN
*             SET INTERLOCK FOR THIS PP.
*           ELSE
*             IF  SOMEONE ELSE HAD THE INTERLOCK   THEN
*               RESTORE THE ORIGINAL CONTENTS.
*             IFEND
*           IFEND
*         UNTIL  INTERLOCK OBTAINED
*                OR SOMEONE ELSE HAS THE INTERLOCK


 ATI      SUBR               ENTRY/EXIT
          STDL   SCRATCH     SAVE INTERLOCK ADDRESS POINTER
 ATI1     RJM    SCL         SET COMPARE/SWAP LOCK
          ZJN    ATI1        IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          LDDL   SCRATCH+1
          SHN    17-15
          MJN    ATI2        IF INTERLOCK ALREADY SET (RESTORE WORD)
          LDC    100000B
          RADL   SCRATCH+1   SET INTERLOCK BIT
          LDN    **          PP NUMBER
 ATIA     EQU    *-1           (PLUGGED BY INITIALIZATION ROUTINE)
          STDL   SCRATCH+4
 ATI2     LDDL   SCRATCH+5
          ADC    400000B
          CWDL   SCRATCH+1   UPDATE INTERLOCK WORD
          LDDL   SCRATCH+4
          LMN    **          PP NUMBER
 ATIB     EQU    *-1           (PLUGGED BY INITIALIZATION ROUTINE)

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

          UJK    ATIX        RETURN, INTERLOCK SET
CBT       SPACE  4,20
**        CBT    CONVERT THE NUMBER OF BYTES TRANSFERRED
*
*         THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE NUMBER OF BYTES
*         TRANSFERRED BY A PREVIOUS CHANNEL INPUT OR OUTPUT.
*
*         ENTRY  (BYTXFR) = NUMBER OF CHANNEL WORDS NOT TRANSFERRED.
*                (WTOXFR) = NUMBER OF CHANNEL WORDS TO TRANSFER.
*
*         EXIT   (A) = (BYTXFR) = (RESBUF+/PRS/P.TC) = BYTES TRANSFERRED.
*
*         CALCULATE NUMBER OF CHANNEL WORDS TRANSFERRED.
          IF     DEF,NDI0
*         BYTES TRANSFERRED = CHANNEL WORDS TRANSFERRED * 2.
          ELSE
*         BYTES TRANSFERRED = CHANNEL WORDS TRANSFERRED * 3 / 2.
          ENDIF


 CBT      SUBR               ENTRY/EXIT
          LDDL   WTOXFR      WORDS TO TRANSFER
          SBDL   BYTXFR      WORDS NOT TRANSFERRED
          IF     DEF,NDI0
          SHN    1           CHAN WORDS * 2
          ELSE
          STDL   SCRATCH     NUMBER OF CHANNEL WORDS TRANSFERRED
          SHN    1           CHAN WORDS * 2
          ADDL   SCRATCH     CHAN WORDS * 3
          ADN    1           ROUND UP TO NEAREST BYTE
          SHN    -1          CHAN WORDS * 3 / 2
          ENDIF
          STDL   BYTXFR      SAVE NUMBER OF BYTES TRANSFERRED
          STML   RESBUF+/PRS/P.TC+1    SAVE TRANSFER COUNT FOR ERROR PROCS
          UJN    CBTX
CRT       SPACE  4,20
**        CRT    CHECK RETRY TIMER
*
*         THE PURPOSE OF THIS ROUTINE IS TO CHECK THE I/O RESOURCE
*         RETRY TIMER TO SEE IF THE REQUESTED DELAY TIME HAS BEEN
*         EXCEEDED.
*
*         ENTRY  (PPFRC) = THE PP FREE RUNNING CLOCK.
*
*         EXIT   (A) : STATUS
*                    > 0, OK; RETRY COUNT NOT EXHAUSTED.
*                    = 0, DONE; RETRIES EXHAUSTED.
*
*         IF  RETRIES REQUESTED  THEN
*           IF  FIRST TIME AT THRESHOLD  THEN
*             INITIALIZE TO CURRENT CLOCK TIME.
*           ELSE
*             CHECK CURRENT TIME VERSUS INITIAL TIME.
*             IF  100 MILLI-SECONDS ELAPSED  THEN
*               SET REQUEST TO DONE.
*             ELSE
*         IFEND


 CRT      SUBR
          LDDL   MDATF       MORE DATA COMING FLAG
          SHN    17-15+/SD/L.MORDAT
          ERRNZ  /SD/L.MORDAT-/RD/L.MORDAT       COSE ASSUMES EQUALITY
          MJN    CRT1        IF MORE DATA COMING
          LDDL   SFIN
          SBDL   SFOUT
          ZJN    CRTX        IF BUFFER IS EMPTY
 CRT1     LDDL   LCMND+/SD/P.RESRTY
          NJN    CRT2        IF NOT INITIAL RETRY
          LDDL   CURUIT+/UIT/P.RQCLK
          STDL   LCMND+/SD/P.RESRTY    INITIALIZE RETRY TIMER
          UJN    CRTX

 CRT2     SBDL   CURUIT+/UIT/P.RQCLK
          ZJN    CRTX        IF THESE TWO ARE EQUAL ASSUME TIME-OUT
          MJN    CRT3        IF COUNTER HAS NOT RAPPED
          ADC    -177777B    GET THE NEGATIVE VALUE
 CRT3     ADC    RESTO
 CRTA     EQU    *-1         CHANGED TO *RESTO/2* FOR 2XPP
          PJN    CRTX        IF > 0, TIMER NOT EXPIRED
          LDN    0
          UJK    CRTX        RETURN, TIMER EXPIRED
CVT       SPACE  4,20
**        CVT    CONVERT BYTE COUNT
*
*         THE PURPOSE OF THIS ROUTINE IS TO CONVERT A BYTE COUNT (8-BIT) INTO
          IF     DEF,NDI0
*         A CHANNEL TRANSFER COUNT (16-BIT) AND A CENTRAL MEMORY TRANSFER
          ELSE
*         A CHANNEL TRANSFER COUNT (12-BIT) AND A CENTRAL MEMORY TRANSFER
          ENDIF
*         COUNT (64-BIT).
*
*         ENTRY  (A) = BYTE COUNT.
*
*         EXIT   (A) : STATUS
*                    => 0, OK; BYTE COUNT CONVERTED AND VALID.
*                    < 0, ERROR; DETAILED STATUS SET UP.
*                (WTOXFR) = CHANNEL COUNT.
*                (BUFSIZE) = CENTRAL MEMORY COUNT.
*                (OOCA) = (IFCA) = POINTER TO BUFFER.
*
          IF     DEF,NDI0
*         CHANNEL COUNT = BYTE COUNT / 2.
          ELSE
*         CHANNEL COUNT = BYTE COUNT * 2 / 3.
          ENDIF
*         WORD COUNT = (BYTE COUNT + 7) * 8.
*         IF  COUNT = 0   OR  COUNT EXCEEDS MAXIMUM LENGTH  THEN
*           FORMAT AN INTERFACE ERROR.
*         IFEND
*
          IF     DEF,NDI0
*         NOTE   THE FOLLOWING ALGORITHM IS USED TO MULTIPY THE WORD
*                COUNT PLUS 2 BY 1/3 TO ROUND IT TO A MULTIPLE OF 3
*
*                ((10*WORDSP2) + (11*WORDSP2/16) - (21*WORDSP2/1024))/32
          ELSE
*         NOTE   THE FOLLOWING ALGORITHM IS USED TO MULTIPY THE BYTE
*                COUNT BY 2/3 TO OBTAIN THE CHANNEL COUNT
*
*                ((10*BYTES) + (11*BYTES/16) - (21*BYTES/1024))/16
          ENDIF
*
*                THE INITIAL BYTE COUNT IS INCREMENTED BY ONE PRIOR TO THE
*                COMPUTATION TO MAKE SURE THE CHANNEL COUNT IS ROUNDED UP TO
*                THE NEXT CHANNEL WORD.
*
*                THIS ALGORITHM WORKS FOR NUMBERS BETWEEN 0 AND 6000.
*                VALUES BEYOND THIS RANGE WILL NOT WORK DUE TO THE LIMITATIONS
*                OF THE A-REGISTER AND THE MEMORY LOCATIONS.
*
          IF     DEF,NDI0
*                THE COMPUTED COUNT IS ROUNDED UP TO A MULTIPLE OF 3.
*                THIS IS TO HANDLE THE CHANNEL RESIDUE PROBLEMS WHEN GOING
*                BETWEEN THE NAD, CONVERTER, AND THE 16-BIT PP MEMORY.
          ELSE
*                THE COMPUTED COUNT IS ROUNDED UP TO A MULTIPLE OF 4.
*                THIS IS TO HANDLE THE CHANNEL RESIDUE PROBLEMS WHEN GOING
*                BETWEEN THE 12-BIT CHANNEL AND THE 16-BIT PP MEMORY.
          ENDIF


 CVT      SUBR               ENTRY/EXIT
          ADN    1
          IF     DEF,NDI0
          STDL   SCRATCH+3   BYTES
          SHN    -1          BYTES / 2
          ADN    2           WORDS + 2
          STDL   SCRATCH     CHANNEL WORD COUNT + 2 (WORDSP2)
          SHN    1           2*WORDSP2
          STDL   SCRATCH+1
          SHN    2           8*WORDSP2
          ADDL   SCRATCH+1   10*WORDSP2
          STDL   SCRATCH+2
          SHN    1           20*WORDSP2
          ADDL   SCRATCH     21*WORDSP2
          SHN    -10         (21*WORDSP2/1024)
          STDL   SCRATCH+1
          LDDL   SCRATCH+2   10*WORDSP2
          ADDL   SCRATCH     11*WORDSP2
          SHN    -4          (11*WORDSP2/16)
          ADDL   SCRATCH+2   (10*WORDSP2) + (11*WORDSP2/16)
          SBDL   SCRATCH+1   (10*WORDSP2) + (11*WORDSP2/16) - (21*WORDSP2/1024)
          SHN    -5          ((10*WORDSP2)+(11*WORDSP2/16)-(21*WORDSP2/1024))/32
          STDL   SCRATCH+1   (WORDS+2)/3
          SHN    1           (WORDS+2)/3 * 2
          ADDL   SCRATCH+1   (WORDS+2)/3 * 3
          STDL   WTOXFR      CHANNEL WORDS = BYTES / 2
          ZJN    CVT2        IF TRANSFER LENGTH ZERO
          SBK    MAXBYTES/2+1
          PJN    CVT2        IF MAXIMUM BUFFER SIZE EXCEEDED
          ERRNZ  MAXBYTES/2*2-MAXBYTES    MAXBYTES NOT A MULTIPLE OF 2
          LDDL   SCRATCH+3   ORIGINAL BYTE COUNT + 1
          ELSE
          STDL   SCRATCH     BYTES
          SHN    1           2*BYTES
          STDL   SCRATCH+1
          SHN    2           8*BYTES
          ADDL   SCRATCH+1   10*BYTES
          STDL   SCRATCH+2
          SHN    1           20*BYTES
          ADDL   SCRATCH     21*BYTES
          SHN    -10         (21*BYTES/1024)
          STDL   SCRATCH+1
          LDDL   SCRATCH+2   10*BYTES
          ADDL   SCRATCH     11*BYTES
          SHN    -4          (11*BYTES/16)
          ADDL   SCRATCH+2   (10*BYTES) + (11*BYTES/16)
          SBDL   SCRATCH+1   (10*BYTES) + (11*BYTES/16) - (21*BYTES/1024)
          SHN    -4          ((10*BYTES)+(11*BYTES/16)-(21*BYTES/1024))/16
          ADN    3
          SCN    3           LENGTH MUST BE A MULTIPLE OF 4
          STDL   WTOXFR      CHANNEL WORDS = BYTES * 2 / 3
          ZJN    CVT2        IF TRANSFER LENGTH ZERO
          SBK    MAXBYTES*2/3+1
          PJN    CVT2        IF MAXIMUM BUFFER SIZE EXCEEDED
          ERRNZ  MAXBYTES/3*3-MAXBYTES           MAXBYTES NOT A MULTIPLE OF 3
          LDDL   SCRATCH     ORIGINAL BYTE COUNT + 1
          ENDIF
          ADN    6
          SHN    -3
          STDL   BUFSIZE     CM WORDS TO TRANSFER
          LDC    BUFFER
          STML   OOCA        INITIALIZE DATA BUFFER POINTERS
          STML   IFCA
 CVT1     UJK    CVTX        RETURN, (A) => 0, TRANSFER COUNTS SET UP

 CVT2     LDK    IEC.505
          RJM    FIE         FORMAT INTERFACE ERROR
*         LCN    0
          UJN    CVT1        RETURN, (A) < 0, INTERFACE ERROR
FAR       SPACE  4,20
**        FAR    FORMAT AN ALERT RESPONSE.
*
*         EXIT   (A) < 0.
*
*         SET ALERT STATUS FLAG.
*         SET ABNORMAL RESPONSE TYPE.


 FAR      SUBR               ENTRY/EXIT
          LDK    TRUE
          SHN    16-/PRS/L.ALERT-/PRS/N.ALERT
          STML   RESBUF+/PRS/P.ALERT   SET ALERT CONDITION ENCOUNTERED FLAG
          LDK    RT.ABN
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          STML   RESBUF+/PRS/P.RTYPE
          LCN    0
          UJN    FARX
FCA       SPACE  4,20
**        FCA    FORMAT CENTRAL MEMORY ADDRESS
*
*         ENTRY  (A) = POINTER TO CENTRAL MEMORY ADDRESS.
*
*         EXIT   (A) = CENTRAL MEMORY ADDRESS OFFSET + 400000B.
*                (R) = CENTRAL MEMORY ADDRESS.
*
*         SET R-REGISTER TO RMA/1000B.
*         SET A-REGISTER TO MOD(RMA/10B,100B) + OFFSET + 400000B.


 FCA      SUBR               ENTRY/EXIT
          STDL   CMADR
          LDML   1,CMADR
          SHN    -3          REMOVE BYTE OFFSET (ROUND DOWN)
          SHN    12
          STD    CMADR+1     PRESERVE LOWER 7 BITS OF  ADDR/100B
          SHN    -12
          STD    CMADR+2     CM ADDRESS OFFSET    MOD(ADDR,100B)
          LDIL   CMADR
          LPN    37B
          SHN    7
          RAD    CMADR+1     LOW ORDER 12 BITS OF  ADDR/100B
          LDIL   CMADR
          SHN    -5
          STD    CMADR       UPPER 11 BITS OF  ADDR/100B
          LRD    CMADR
          LDD    CMADR+2
          ADC    400000B     SET (A) NEGATIVE FOR R-REGISTER USAGE
          UJK    FCAX
FIE       SPACE  4,20
**        FIE    FORMAT INTERFACE ERROR
*
*         ENTRY  (A) = INTERFACE ERROR CODE.
*
*         EXIT   (A) < 0
*
*         PLUG ERROR CODE.
*         SET INTERFACE ERROR FLAG IN ABNORMAL STATUS FIELD.
*         SET ABNORMAL STATUS.


 FIE      SUBR               ENTRY/EXIT
          STML   RESBUF+/PRS/P.IEC               INTERFACE ERROR CODE
          LDN    TRUE
          SHN    16-/PRS/L.INTERR-/PRS/N.INTERR
          STML   RESBUF+/PRS/P.INTERR            INTERFACE ERROR
          LDK    RT.ABN
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          STML   RESBUF+/PRS/P.RTYPE             ABNORMAL RESPONSE
          LCN    0
          UJN    FIEX
SCL       SPACE  4,20
**        SCL    SET COMPARE SWAP LOCK
*         SET UPPER 32 BITS OF I/L WORD TO ONE'S.
*
*         ENTRY  (SCRATCH) = POINTER TO INTERLOCK WORD ADDRESS.
*
*         EXIT   (A) : STATUS
*                    = 0, IF ANOTHER INTERLOCK OPERATION IN PROCESS.
*                   <> 0, IF LOCK SET
*                   (SCRATCH - SCRATCH+4) = CONTNETS OF WORD
*                   (SCRATCH+5) = ADDRESS OFFSET OF WORD


 SCL      SUBR               ENTRY/EXIT
          LDC    177777B
          STDL   SCRATCH+1
          STDL   SCRATCH+2
          LDN    0
          STDL   SCRATCH+3
          STDL   SCRATCH+4
          LOADCM 0,SCRATCH
          STDL   SCRATCH+5
          RDSL   SCRATCH+1   SET UPPER 32 BITS OF LOCK WORD TO '1'S
          LDDL   SCRATCH+1
          ADDL   SCRATCH+2
          SBK    177777B*2
          UJN    SCLX        EXIT
IRB       SPACE  4,20
**        IRB    INITIALIZE RESPONSE BUFFER
*
*         ENTRY  (REQBUF) = REQUEST HEADER.
*                (RESBUF) = PVA AND RMA REQUEST POINTERS SET UP.
*
*         CLEAR ABNORMAL STATUS FLAGS.
*         CLEAR TRANSFER COUNT.
*         SET RESPONSE TYPE TO NORMAL.
*         SET LAST COMMAND TO CURRENT COMMAND.
*         SET NORMAL RESPONSE LENGTH.


 IRB      SUBR               ENTRY/EXIT
          LDN    0
          STML   RESBUF+/PRS/P.ALERT             CLEAR ABNORMAL STATUS FIELD
          STML   RESBUF+/PRS/P.TC                RESET TRANSFER COUNT
          STML   RESBUF+/PRS/P.TC+1
          STDL   NUMREQ
          LDK    RT.NOR
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          STML   RESBUF+/PRS/P.RTYPE             PRESET TO NORMAL RESPONSE
          LDML   RESBUF+/PRS/P.RMAOR+1
          ADK    B.PR
          STML   RESBUF+/PRS/P.RMALC+1           SET CURRENT COMMAND TO
          SHN    -16                                 LAST COMMAND COMPLETED
          ADML   RESBUF+/PRS/P.RMAOR
          STML   RESBUF+/PRS/P.RMALC
          LDML   RESBUF+/PRS/P.RL
          STDL   REQLGTH                         SAVE THE REQUEST LENGTH
          LDK    B.PRS
          STML   RESBUF+/PRS/P.RL                SET NORMAL RESPONSE LENGTH
          LDML   RESBUF+/PRS/P.CPUP              INTERRUPT INFORMATION
          SHN    -16+/PR/L.CPUP+/PR/N.CPUP
          LPN    /PR/M.CPUP
          ADK    .INPN
          STML   SRPB                            STORE PROCESSOR TO INTERRUPT
          UJK    IRBX
REL       SPACE  4,20
**        REL    RELEASE THE CHANNEL
*
*         THE PURPOSE OF THIS ROUTINE IS TO CLEAR THE INTERLOCK ON A
*         PREVIOUSLY RESERVED CHANNEL.
*
*         ENTRY  (CITADDR) = POINTER TO CHANNEL INTERLOCK WORD.
*
*         EXIT   (A) = 0.
*                (CHANRES) = FALSE.
*
*         IF  CHANNEL IS RESERVED  THEN
*           RELEASE CHANNEL INTERLOCK.
*           CLEAR CHANNEL RESERVED FLAG.
*         IFEND


 REL      SUBR               ENTRY/EXIT
          LDDL   CHANRES
          LMK    FALSE
          ZJN    RELX        IF CHANNEL NOT RESERVED
          LDK    CITADDR
          RJM    RTI         RELEASE CHANNEL INTERLOCK
          LDK    FALSE
          STDL   CHANRES
          ERRNZ  FALSE       CODE ASSUMES THE CONSTANT *FALSE* IS ZERO
          UJN    RELX        RETURN, CHANNEL RELEASED
RES       SPACE  4,30
**        RES    RESERVE THE CHANNEL
*
*         THE PURPOSE OF THIS ROUTINE IS TO RESERVE THE CHANNEL OF THE
*         CORRESPONDING NAD.
*
*         ENTRY  (UTABI) = CURRENT UNIT BEING PROCESSED.
*                (CHANRES) = FALSE.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; CHANNEL RESERVED AND READY FOR USE.
*                    < 0, ERROR; NAD NOT OPERATIONAL.
*
*
*         REPEAT
*           ACQUIRE CHANNEL INTERLOCK.
*         UNTIL  INTERLOCK ACQUIRED
*         SET CHANNEL RESERVED FLAG.
*         IF  NAD MALFUNCTIONING FLAG SET  THEN
*           RELEASE CHANNEL INTERLOCK.
*           RETURN NAD UNUSABLE STATUS.
*         IFEND


 RES      SUBR               ENTRY/EXIT
 RES2     LDK    CITADDR
          RJM    ATI         ACQUIRE CHANNEL INTERLOCK
          ZJN    RES4        IF CHANNEL INTERLOCK ACQUIRED
          LDK    CHANDEL     DELAY FOR A SHORT TIME
 RES3     SBN    1
 RESA     EQU    *-1         SET TO *SBN 2* IF 2XPP
          NJN    RES3        IF DELAY NOT COMPLETE
          UJN    RES2        RE-ATTEMPT TO ACQUIRE CHANNEL INTERLOCK

 RES4     LDK    TRUE
          STDL   CHANRES     SET CHANNEL RESERVED FLAG
          LOADCB UITADDR,,/UIT/C.DOWN
          CRDL   SCRATCH
          LDDL   SCRATCH+/UIT/P.DOWN
          SHN    17-15+/UIT/L.DOWN
          MJN    RES7        IF CHANNEL DOWN
 RES5     LDN    0
 RES6     UJK    RESX        RETURN, CHANNEL RESERVED

 RES7     RJM    REL         RELEASE CHANNEL INTERLOCK
          LCN    NE.CHD
          UJN    RES6        RETURN, CHANNEL DOWN
RTI       SPACE  4,30
**        RTI    RELEASE TABLE INTERLOCK
*
*         THE PURPOSE OF THIS ROUTINE IS TO RELEASE A PREVIOUSLY OBTAINED
*         TABLE INTERLOCK.
*
*         ENTRY  (A) = POINTER TO THE INTERLOCKED WORD ADDRESS.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; INTERLOCK CLEARED.
*                    < 0, ERROR; INTERLOCK ASSIGNMENT ERROR.
*
*
*         REPEAT
*           SET UPPER 32 BITS OF I/L WORD TO ONES.
*           IF  ORIGINAL I/L CONTENTS INTACT  THEN
*             ZERO OUT I/L WORD.
*           ELSE
*             IF  COMPARE SWAP NOT IN PROGRESS  THEN
*               RESTORE CONTENTS (ASSUME INTERLOCK NOT OBTAINED OR LOST).
*             IFEND
*           IFEND
*         UNTIL  INTERLOCK NOT OWNED BY THIS PP


 RTI      SUBR               ENTRY/EXIT
          STDL   SCRATCH     SAVE INTERLOCK ADDRESS POINTER
 RTI1     RJM    SCL         SET COMPARE/SWAP LOCK
          ZJN    RTI1        IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          LDDL   SCRATCH+1
          SHN    17-15
          PJN    RTI2        IF INTERLOCK LOST (RESTORE ORIGINAL CONTENTS)
          LDDL   SCRATCH+4
          LMN    **          PP NUMBER
 RTIA     EQU    *-1           (PLUGGED BY INITIALIZATION ROUTINE)
          NJN    RTI2        IF SOMEONE ELSE HAS GRABBED THE INTERLOCK
*         LDN    0
          STDL   SCRATCH+1   CLEAR INTERLOCK WORD
          STDL   SCRATCH+2
          STDL   SCRATCH+3
          STDL   SCRATCH+4
 RTI2     LDDL   SCRATCH+5
          ADC    400000B
          CWDL   SCRATCH+1   UPDATE INTERLOCK WORD
          UJK    RTIX        RETURN
SDD       SPACE  4,15
**        SDD    SET DEVICE DOWN
*
*         ENTRY  (UTABI) = CURRENT UNIT BEING PROCESSED.
*
*         GET UNIT INTERLOCK.
*         IF  DEVICE NOT ALREADY DOWN  THEN
*           SET UNIT DOWN BIT.
*         IFEND
*         RELEASE UNIT INTERLOCK.


 SDD      SUBR               ENTRY/EXIT
 SDD1     LDK    URQIL
          RJM    ATI         SET UNIT INTERLOCK
          NJN    SDD1        IF INTERLOCK IS BUSY
          LOADCB UITADDR,,/UIT/C.DOWN
          CRDL   CURUIT
          STDL   SCRATCH
          LDDL   CURUIT+/UIT/P.DOWN
          SHN    17-15+/UIT/L.DOWN
          MJN    SDD2        IF UNIT IS ALREADY DOWN
          LDK    TRUE
          SHN    16-/UIT/L.DOWN-/UIT/N.DOWN
          RADL   CURUIT+/UIT/P.DOWN
          LDDL   SCRATCH
          ADC    400000B
          CWDL   CURUIT      SET UNIT DOWN FLAG
 SDD2     LDK    URQIL
          RJM    RTI         RELEASE UNIT INTERLOCK
          UJK    SDDX
SRP       SPACE  4,25
**        SRP    SEND RESPONSE
*
*         THE PURPOSE OF THIS ROUTINE IS TO PLACE A RESPONSE IN THE PP
*         RESPONSE TABLE FOR MONITOR TO PROCESS.
*
*         ENTRY  (RESBUF) = RESPONSE.
*                (A) <> 0, POINTER TO INTERLOCK ADDRESS OF INTERLOCK TO
*                          PRIOR TO PLACING THE RESPONSE IN THE BUFFER.
*                    = 0, DO NOT ACQUIRE ANY INTERLOCK.
*
*
*         WHILE   NO ROOM IN RESPONSE BUFFER   DO
*           DELAY FOR A WHILE.
*         WHILEND
*         IF  INTERLOCK REQUIRED  THEN
*           REPEAT
*             ACQUIRE TABLE INTERLOCK.
*           UNTIL INTERLOCK ACQUIRED.
*         IFEND
*         WRITE RESPONSE IN BUFFER.
*         UPDATE *IN* POINTER.
*         SET INTERRUPT REGISTER.
*         EXCHANGE MONITOR.


 SRP      SUBR               ENTRY/EXIT
          STDL   SPECSAV     SAVE INTERLOCK POINTER
 SRP1     LOADCB PITADDR,,/PIT/C.RBOUT
          CRDL   SCRATCH     READ OUT POINTER
          LDDL   SCRATCH+3
          STDL   RBOUT
          SBDL   RBIN
          SBN    8           OUT - IN - 8
          PJN    SRP2        IF BUFFER HAS NOT WRAPPED
          ADDL   RBLIMIT     OUT - IN - 8 + LIMIT - FIRST
          SBK    FIRST       ALL FIRST POINTER OFFSETS ARE ZERO
 SRP2     SBML   RESBUF+/PRS/P.RL
          PJN    SRP3        IF ROOM IN BUFFER FOR DATA
          LDK    MTRDEL      WAIT FOR MONITOR TO CLEAR BUFFER
          SBN    1
 SRPA     EQU    *-1         SET TO *SBN 2* FOR 2XPP
          NJN    *-1
          UJN    SRP1

 SRP3     LDDL   SPECSAV
          ZJN    SRP5        IF NO INTERLOCK TO ACQUIRE
 SRP4     RJM    ATI         ACQUIRE REQUESTED INTERLOCK
          NJN    SRP3        IF INTERLOCK BUSY
 SRP5     LDML   RESBUF+/PRS/P.RL
          ZJN    SRP7        IF NO RESPONSE TO SEND
          RJM    WRB         WRITE TO RESPONSE BUFFER

*         NOTE   FOR PP REQUEST RESPONSES AND INTERMEDIATE RESPONSES
*                THE RE-WRITING OF THE REQUEST WORD IS A NO-OP.

          LOADCM RESBUF+/PRS/P.RMAOR,,C.PR
          CWML   LCMND,TWO             UPDATE PP REQUEST LOCK WORD
          ERRNZ  LCMND-PPCMND          THESE TWO BUFFERS MUST HAVE SAME FWA
          LOADCB PITADDR,,/PIT/C.RBIN
          CWDL   RBIN-3      UPDATE IN POINTER
          LOADCM INTREG
          CWDL   TWO-3       SET INTERRUPT REGISTER NON-ZERO
          LDN    0           SET (A)=0 FOR S0
          INPN   **          INTERRUPT PROCESSOR
 SRPB     EQU    *-1         PROCESSOR TO INTERRUPT SET BY REQUEST INIT
          CRDL   SCRATCH     ACCESS CM TO UNLOCK ADU
 SRP6     UJK    SRPX

 SRP7     LOADCM RESBUF+/PRS/P.RMAOR,,C.PR       MUST CLEAR PP PROCESSING
          CWML   LCMND,TWO                         FLAG ON NULL RESPONSES
          UJN    SRP6
USP       SPACE  4,20
**        USP    UPDATE SUBFUNCTION POINTERS
*
*         THE PURPOSE OF THIS ROUTINE IS TO ADVANCE THE SUBFUNCTION POINTERS.
*
*         ENTRY  (TEMPOUT) = POINTER TO NEXT SUBFUNCTION.
*
*         EXIT   (A) : STATUS
*                    => 0, OK; (A) = (SUBFEA)= SUBFUNCTION ENTRIES AVAILABLE
*                    < 0, ERROR; DETAILED STATUS SET UP.
*                (SFOUT) = POINTER TO NEXT SUBFUNCTION.
*
*
*         ADVANCE SUBFUNCTION *OUT* POINTER.
*         IF  BUFFER THRESHOLD
*             AND INTERMEDIATE RESPONSE FLAG SET   THEN
*           SEND INTERMEDIATE RESPONSE.
*         IFEND
*         GET NEW *IN* POINTER.


 USP      SUBR               ENTRY/EXIT
          LDDL   TEMPOUT
          STDL   SFOUT       UPDATE OUT POINTER
          LOADCB SFPTR
          ADK    /SD/C.OUTPTR-C.SD
          CWDL   SFOUT-3     UPDATE OUT POINTER
          ADK    /SD/C.INPTR-/SD/C.OUTPTR
          CRDL   SCRATCH     READ IN POINTER
          LDDL   SCRATCH
          STDL   MDATF       SAVE MORE DATA FLAG FOR RETRY ALGORITHM
          LDDL   SCRATCH+3
          STDL   SFIN
          SBDL   LCMND+/SD/P.PREVIN
          ERRNZ  /SD/P.PREVIN-/RD/P.PREVIN    THESE FIELDS MUST BE THE SAME
          ZJN    USP0        IF NO CHANGE IN THE IN POINTER
          RADL   LCMND+/SD/P.PREVIN    SET PREVIOUS IN POINTER TO CURRENT IN
          LDN    1
          STDL   LCMND+/SD/P.INPTRC    REMEMBER THAT THE POINTER CHANGED
          ERRNZ  /SD/P.INPTRC-/RD/P.INPTRC    THESE FIELDS MUST BE THE SAME
 USP0     BSS    0
          LDK    SFIN
          RJM    VIO         VERIFY I/O POINTERS
          MJN    USPX        IF POINTERS INVALID
          STDL   SUBFEA      SAVE NUMBER OF SUBFUNCTION ENTRIES
          SBK    MINRBE
          PJN    USP1        IF ENOUGH DATA REMAINING IN BUFFER
          LDDL   LCMND+/SD/P.INPTRC
          ZJN    USP1        IF IN POINTER HAS NOT CHANGED SINCE LAST INT.
          LDN    0
          STDL   LCMND+/SD/P.INPTRC  REMEMBER INTERRUPT SENT
          LDDL   MDATF       MORE DATA COMING FLAG
          SHN    17-15+/SD/L.MORDAT
          ERRNZ  /SD/L.MORDAT-/RD/L.MORDAT       COSE ASSUMES EQUALITY
          PJN    USP1        IF NO MORE DATA COMING
          LDK    RT.INT
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          STML   RESBUF+/PRS/P.RTYPE
          LDN    0
          RJM    SRP         SEND INTERMEDIATE RESPONSE
          LDK    RT.NOR
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          STML   RESBUF+/PRS/P.RTYPE             RESET TO NORMAL RESPONSE
 USP1     AODL   NUMREQ      INCREMENT NUMBER OF REQUESTS PROCESSED
          SBK    MSF
          ZJN    USP3        IF MAXIMUM SUBFUNCTIONS PROCESSED
          LDDL   SUBFEA      SUBFUNCTION ENTRIES AVAILABLE
 USP2     UJK    USPX        RETURN (A) = NUMBER OF REQUEST BUFFER ENTRIES

 USP3     STDL   SUBFEA      FAKE A BUFFER EMPTY CONDITION
          UJN    USP2
VIO       SPACE  4,25
**        VIO    VERIFY *IN* AND *OUT* POINTERS
*
*         THE PURPOSE OF THIS ROUTINE IS TO VALIDATE THE READ (OR WRITE)
*         SUBFUNCTION BUFFER POINTERS.
*
*         ENTRY  (A) = ADDRESS OF DIRECT CELL CONTAINING THE *IN* POINTER.
*                (A+1) = ADDRESS OF DIRECT CELL CONTAINING THE *OUT* POINTER.
*                (A+2) = ADDRESS OF DIRECT CELL CONTRINING THE *LIMIT* POINTER.
*
*         EXIT   (A) : STATUS
*                    = 0, OK; IN AND OUT POINTERS VALID.
*                    < 0, ERROR; INVALID BUFFER POINTERS.
*
*
*         IF *IN* .GE.  *LIMIT*  THEN
*           FORMAT INVALID REQUEST RESPONSE.
*         IFEND
*         IF *OUT* .GE.  *LIMIT*  THEN
*           FORMAT INVALID REQUEST RESPONSE.
*         IFEND


 VIO      SUBR               ENTRY/EXIT
          STDL   SCRATCH     SAVE IN POINTER
          ADN    1
          STDL   SCRATCH+1   SAVE OUT POINTER
          ADN    1
          STDL   SCRATCH+2   SAVE LIMIT POINTER
          LDIL   SCRATCH
          SBIL   SCRATCH+2
          PJN    VIO2        IF OUT .GE. LIMIT
          LDIL   SCRATCH+1
          SBIL   SCRATCH+2
          PJN    VIO2        IF IN .GE. LIMIT
          LDIL   SCRATCH
          SBIL   SCRATCH+1   IN - OUT
          PJN    VIOX        RETURN, (A) = AMOUNT OF DATA IN THE BUFFER
          ADIL   SCRATCH+2   ADD LIMIT - FIRST
          SBK    FIRST
          UJN    VIOX        RETURN, (A) = AMOUNT OF DATA IN THE BUFFER

 VIO2     LDK    IEC.50B     INVALID PARAMETER SPECIFICATION
          RJM    FIE         FORMAT INTERFACE ERROR
*         LCN    0
          UJN    VIOX        RETURN, (A) < 0, BUFFER POINTERS INVALID
VSP       SPACE  4,20
**        VSP    VERIFY AND INITIALIZE SUBFUNCTION POINTERS
*
*         THE PURPOSE OF THIS ROUTINE IS TO GENERATE THE SUBFUNCTION BUFFER
*         POINTERS AND VALIDATE THEM.
*
*         ENTRY  (LCMND) = LOGICAL COMMAND.
*                (REQBUF) = CURRENT REQUEST.
*
*         EXIT   (A) : STATUS
*                    => 0, OK; (A) = (SUBFEA) = SUBFUNCTION ENTRIES AVAILABLE
*                    < 0, ERROR; SUBFUNCTION POINTERS INVALID.
*                (SFPTR - SFPTR+2) = POINTER TO SUBFUNCTION BUFFER.
*                (SFOUT) = POINTER TO FWA OF CURRENT SUBFUNCTION.
*
*
*         DETERMINE LIMIT AND FIRST.
*         INITIALIZE IN AND OUT.
*         VERIFY IN AND OUT.
*
*         NOTE   THE BUFFER OFFSET PRESERVED IN *SFPTR+2* IS LARGE
*                ENOUGH SUCH THAT */SD/C.INPTR* AND */SD/C.OUTPTR* CAN
*                BE ACCESSED BY SUBTRACTING THE APPROPRIATE VALUE FROM
*                THE OFFSET.


 VSP      SUBR               ENTRY/EXIT
          LDDL   REQLGTH
          SBK    B.PR+B.SD
          STDL   SFLIMIT     LIMIT = TOTAL LENGTH - REQ. HDR. - SD. HDR.
          LOADCM RESBUF+/PRS/P.RMAOR,,/SD/C.INPTR+C.PR
          STDL   SCRATCH+4   PRESERVE ADDRESS
          CRDL   SCRATCH     READ IN POINTER
          LDDL   SCRATCH
          STDL   MDATF       SAVE MORE DATA FLAG FOR RETRY ALGORITHM
          LDDL   SCRATCH+3
          STDL   SFIN
          LDDL   SCRATCH+4
          ADK    400000B+/SD/C.OUTPTR-/SD/C.INPTR
          CRDL   SCRATCH     READ OUT POINTER
          ADK    C.SD-/SD/C.OUTPTR
          STDL   SFPTR+2     SAVE OFFSET OF POINTER TO SUBFUNCTION BUFFER
          SRD    SFPTR       SAVE R-REGISTER CONTENTS
          LDDL   SCRATCH+3
          STDL   SFOUT
          LDK    SFIN
          RJM    VIO         VERIFY *IN* AND *OUT* POINTERS
          STDL   SUBFEA      SAVE THE NUMBER OF SUBFUNCTION ENTRIES
          UJN    VSPX        RETURN, (A) FROM *VIO* IS THE RETURN STATUS
WRB       SPACE  4,25
**        WRB    WRITE RESPONSE BUFFER
*
*         THE PURPOSE OF THIS ROUTINE IS TO WRITE A PP RESPONSE INTO THE
*         SPECIFIED RESPONSE BUFFER.
*
*         ENTRY  (A) = REPONSE LENGTH IN BYTES.
*                (RBIN) = CURRENT BUFFER IN POINTER.
*                (RBLIMIT) = CURRENT LIMIT POINTER.
*
*         EXIT   (RBIN) = POINTER TO LOCATION FOR NEXT PP RESPONSE.
*
*
*         DETERMINE IF THERE IS A BUFFER WRAP.
*         WRITE FIRST HALF OF RESPONSE INTO THE BUFFER.
*         IF  BUFFER WRAP  THEN
*           WRITE SECOND HALF OF RESPONSE INTO THE BUFFER.
*         IFEND
*         UPDATE THE IN POINTER.


 WRB      SUBR               ENTRY/EXIT
          STDL   SCRATCH     SAVE BUFFER SIZE
          STDL   SCRATCH+3   SAVE BUFFER SIZE FOR WRAP CASE
          LDN    0
          STDL   SCRATCH+1   ASSUME NO WRAP CASE
          LDK    RESBUF
          STML   WRBA        SET WRITE BUFFER TO BEGINNING OF RESPONSE
          LDDL   RBLIMIT
          SBDL   RBIN
          SBDL   SCRATCH     LIMIT - IN - SIZE
          PJN    WRB1        IF NO WRAP CASE
          RADL   SCRATCH     LIMIT - IN
          STDL   SCRATCH+1   SET WRAP CASE FLAG
 WRB1     LDDL   SCRATCH
          SHN    -3
          STDL   SCRATCH+2   SET NUMBER OF CM WORDS TO TRANSFER
          LOADCB RBFIRST,RBIN
          CWML   RESBUF,SCRATCH+2      WRITE RESPONSE TO CENTRAL MEMORY
 WRBA     EQU    *-1
          LDDL   SCRATCH+1
          ZJN    WRB2        IF NOT WRAP CASE
          SHN    -1          CHANGE BYTE COUNT TO PP WORD COUNT
          RAML   WRBA        UPDATE BUFFER POINTER
          LDK    FIRST
          STDL   RBIN        UPDATE IN POINTER
          ERRNZ  FIRST       CODE ASSUMES THE CONSTANT FIRST IS ZERO
          STDL   SCRATCH+1   CLEAR WRAP FLAG
          LDDL   SCRATCH+3
          SBDL   SCRATCH
          STDL   SCRATCH     NUMBER OF BYTES LEFT TO TRANSFER
          UJK    WRB1

 WRB2     LDDL   SCRATCH
          RADL   RBIN        UPDATE IN POINTER
          SBDL   RBLIMIT
          MJN    WRB3        IF NOT END OF BUFFER
          LDK    FIRST
          STDL   RBIN        IN = FIRST
 WRB3     UJK    WRBX
GIO       TITLE  GENERAL I/O ROUTINES
**        GENERAL I/O ROUTINES
*
*         THE FOLLOWING ROUTINES PERFORM THE VARIOUS I/O FUNCTIONS THAT ARE
*         UTILIZED BY THE VARIOUS ROUTINES.
FAI       SPACE  4,30
**        FAI    FUNCTION THE CHANNEL AND INPUT DATA
*
*         THE PURPOSE OF THIS ROUTINE IS TO FUNCTION THE NAD AND INPUT
*         A STATUS BYTE WHEN THE CHANNEL GOES FULL.
*
*         ENTRY  (A) = NAD FUNCTION TO ISSUE.
*
*         EXIT   (A) : STATUS
*                    => 0, COMPLETE; (A) = DATA READ FROM CHANNEL.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*         ISSUE NAD FUNCTION.
*         IF  FUNCTION ACCEPTED  THEN
*           ACTIVATE CHANNEL.
*           REPEAT
*             TEST CHANNEL FULL FLAG.
*           UNTIL  CHANNEL FULL
*                OR TIMER EXPIRED
*           IF  TIMER EXPIRED  THEN
*             IF  CHANNEL INACTIVE  THEN
*               RETURN, CHANNEL INACTIVE AFTER ACTIVATE ERROR.
*             ELSE
*               RETURN, DATA TIMEOUT ERROR.
*             IFEND
*           ELSE
*             INPUT BYTE FROM CHANNEL INTO A-REGISTER.
*           IFEND
*         IFEND


 FAI      SUBR               ENTRY/EXIT
          RJM    FUN         ISSUE NAD FUNCTION
          MJN    FAIX        IF ERROR ENCOUNTERED
          ACN    CH+40B
          LCN    0
 FAI1     FJM    FAI3,CH     IF CHANNEL FULL
          SBN    1
          NJN    FAI1        IF TIMER NOT EXPIRED
          IJM    FAI2,CH     IF CHANNEL IS INACTIVE
          LDC    -NE.DTO
          UJN    FAIX        RETURN, DATA TIMEOUT ERROR

 FAI2     LCN    NE.CIA
          UJN    FAIX        RETURN, CHANNEL INACTIVE AFTER ACTIVATE ERROR

 FAI3     IAN    CH+40B      INPUT STATUS BYTE
          DCN    CH+40B
          SFM    FAI4,CH     IF CHANNEL ERROR DURING TRANSFER
          UJN    FAIX        RETURN, (A) = DATA INPUT FROM CHANNEL

 FAI4     LDC    -NE.CPE
          UJN    FAIX        RETURN, CHANNEL PARITY ERROR
FUN       SPACE  4,30
**        FUN    FUNCTION NAD
*
*         THE PURPOSE OF THIS ROUTINE IS TO ISSUE A FUNCTION TO THE NAD
*         AND WAIT FOR THE NAD TO ACCEPT THE FUNCTION.
*
*         ENTRY  (A) = FUNCTION TO ISSUE.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; FUNCTION ACCEPTED.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*
*         IF  CHANNEL NOT RESERVED  THEN
*           RESERVE CHANNEL.
*         IFEND
*         IF  NAD IS AVAILABLE FOR USE   THEN
*           ISSUE FUNCTION TO NAD.
*           REPEAT
*             CHECK CHANNEL ACTIVE FLAG.
*           UNITL  CHANNEL INACTIVE (FUNCTION ACCEPTED)
*               OR TIMER EXPIRED
*           IF  NAD ACCEPTED THE FUNCTION  THEN
*             RETURN NORMAL STATUS.
*           ELSE
*             RETURN FUNCTION TIMEOUT STATUS.
*           IFEND
*         IFEND


 FUN      SUBR               ENTRY/EXIT
          IF     DEF,NDI0
          STML   FUNA        PLUG NAD AND S0 CONVERTER FUNCTION
          ELSE
 FUNB     STM    FUNA        PLUG NAD FUNCTION
*         STML   FUNA        PLUG NAD AND CIO CONVERTER FUNCTION
          ENDIF
          LDDL   CHANRES
          LMK    FALSE
          NJN    FUN1        IF CHANNEL ALREADY RESERVED
          RJM    RES         RESERVE NAD CHANNEL
          MJN    FUNX        IF CHANNEL WAS DECLARED DOWN
 FUN1     DCN    CH+40B      MAKE SURE CHANNEL IS DISCONNECTED
          FNC    **,CH+40B
 FUNA     EQU    *-1         USED TO PLUG NAD FUNCTION
          LCN    0
 FUN2     IJM    FUN3,CH     IF NAD FUNCTION ACCEPTED
          SBN    1
          NJN    FUN2        IF TIMER HAS NOT EXPIRED
          LDC    -NE.FTO
          UJK    FUNX        RETURN, FUNCTION TIMEOUT ERROR

 FUN3     LDN    0
          UJK    FUNX        RETURN, FUNCTION ACCEPTED
ICF       SPACE  4,25
**        ICF    ISSUE CONTROLWARE FUNCTION
*
*         THE PURPOSE OF THIS ROUTINE IS TO ISSUE A NAD CONTROLWARE FUNCTION
*         AND OBTAIN THE NAD CONTROLWARE RESPONSE.
*
*         INPUT  (A) = CONTROLWARE FUNCTION TO ISSUE.
*
*         OUTPUT (A) : STATUS
*                    => 0, COMPLETE; (A) = CONTROLWARE RESPONSE  .LMK.  N
*                                    (CWSTAT) = CURRENT CONTROLWARE STATUS.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*
*         FUNCTION NAD.
*         IF  FUNCTION ACCEPTED  THEN
*           REPEAT
*             GET CONTROLWARE STATUS.
*           UNTIL  CONTROLWARE HAS RESPONDED
*                  OR TIME LIMIT EXCEEDED
*                  OR ERROR ENCOUNTERED
*         IFEND


 ICF      SUBR               ENTRY/EXIT
          LMK    NF.FF       SET CONTROLWARE FUNCTION FLAG
          STM    ICFA        PRESERVE LAST CONTROLWARE FUNCTION
          RJM    FUN         ISSUE CONTROLWARE FUNCTION
          MJN    ICFX        IF NAD ERROR
          LCN    0
          STDL   NRTIMER
 ICF1     RJM    OCS         OBTAIN CONTROLWARE STATUS
          MJN    ICFX        IF NAD ERROR
          SHN    17-NRF.HF
          MJN    ICF3        IF NAD HARDWARE FAULT
          SHN    17-NRF.FF-17+NRF.HF
          PJN    ICF4        IF CONTROLWARE RESPONSE AVAILABLE
          SODL   NRTIMER
          NJN    ICF1        IF TIMER HAS NOT EXPIRED
          LDC    -NE.FFT
 ICF2     UJN    ICFX        RETURN, FLAG FUNCTION TIMEOUT

 ICF3     LCN    NE.HWF
          UJN    ICF2        RETURN, NAD HARDWARE FAULT

 ICF4     LDDL   CWSTAT      RETURN CONTROLWARE STATUS
          LPK    NR.RM       MASK OUT RESPONSE FLAGS
          LMK    NR.AK
          UJN    ICF2        RETURN, FUNCTION RESPONSE AVAILABLE

 ICFA     CON    0           LAST CONTROLWARE FUNCTION ISSUED
IFC       SPACE  4,30
**        IFC    INPUT FROM CHANNEL
*
*         THE PURPOSE OF THIS ROUTINE IS TO INPUT A BLOCK OF DATA FROM THE
*         NAD.
*
*         ENTRY  (WTOXFR) = AMOUNT OF DATA TO RECEIVE.
*                (IFCA) = FWA OF BUFFER TO RECEIVE DATA.
*
*         EXIT   (A) : STATUS
*                    > 0, COMPLETE; (A) = (BYTXFR) = AMOUNT OF DATA RECEIVED.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED ERROR CODE.
*                (WTOXFR) = AMOUNT OF DATA TO RECEIVE.
*
*
*         WAIT FOR PRIMED.
*         IF   PRIMED BIT SET   THEN
*           SET DI ASSEMBLY/DISASSEMBLY FUNCTION.
*           IF  FUNCTION ACCEPTED  THEN
*             INPUT DATA FROM CHANNEL.
*             GET FINAL CONTROLWARE STATUS.
*           IFEND
*         IFEND


 IFC      SUBR               ENTRY/EXIT
          RJM    WFP         WAIT FOR PRIMED
          MJN    IFCX        IF NAD ERROR
          LDK    DI.IB
          RJM    FUN         SELECT BIT STRING ASSEMBLY/DISASSEMBLY MODE
          MJN    IFCX        IF NAD ERROR
          ACN    CH+40B
          LCN    0
 IFC1     FJM    IFC4,CH     IF CHANNEL IS FULL
          SBN    1
          NJN    IFC1        IF TIMER HAS NOT EXPIRED
          IJM    IFC2,CH     IF CHANNEL IS INACTIVE
          LDC    -NE.DTO
          UJN    IFCX        RETURN, DATA TIMEOUT ERROR

 IFC2     LCN    NE.CIA
 IFC3     UJN    IFCX        RETURN, CHANNEL INACTIVE AFTER ACTIVATE ERROR

 IFC4     LDDL   WTOXFR
          IF     DEF,NDI0
          IAM    *,CH        INPUT BLOCK FROM CHANNEL
          ELSE
          IAPM   *,CH        INPUT BLOCK FROM CHANNEL
          ENDIF
 IFCA     EQU    *-1         FWA OF DATA BUFFER
          STDL   BYTXFR      SAVE NUMBER OF BYTES NOT RECEIVED
          LDDL   LCMND+/LCF/P.FLUSH
          SHN    17-15+/LCF/L.FLUSH
          PJN    IFC6        IF FLUSH FLAG NOT SET
 IFC5     IJM    IFC6,CH     IF CHANNEL IS INACTIVE
          IF     DEF,NDI0
          LDN    3
          IAM    SCRATCH+1,CH          REMOVE EXCESS DATA
          ELSE
          LDN    4
          IAPM   SCRATCH+1,CH          REMOVE EXCESS DATA
          ENDIF
          ZJN    IFC5        IF FLUSH NOT DONE
 IFC6     DCN    CH+40B
          SFM    IFC9,CH     IF CHANNEL ERROR DURING TRANSFER
          RJM    OHS         OBTAIN HARDWARE STATUS
          MJN    IFC3        IF HARDWARE STATUS WAS NOT OBTAINED
          SCN    M.NHFPS+M.NHFPA      IGNORE PROCESSOR STOPPED AND ABNORMAL
          NJN    IFC7        IF HARDWARE FAULT ENCOUNTERED
          RJM    CBT         COMPUTE THE NUMBER OF BYTES TRANSFERRED
          NJN    IFC3        RETURN, (A) = AMOUNT OF DATA RECEIVED
          LCN    NE.ITE
          UJN    IFC3        RETURN, INPUT TRANSFER ERROR

 IFC7     RJM    CBT         COMPUTE THE BYTES TRANSFERRED FOR ERROR PROCS
          LCN    NE.HWF
 IFC8     UJK    IFC3        RETURN, NAD HARDWARE FAULT

 IFC9     LDC    -NE.CPE
          UJK    IFC8        RETURN, CHANNEL PARITY ERROR
IUC       SPACE  4,30
**        IUC    ISSUE UNIVERSAL COMMAND.
*
*         ENTRY  (UNCB) = UNIVERSAL COMMAND BLOCK.
*
*         EXIT   (A) : STATUS
*                    => 0, NORMAL; (A) = NAD RESPONSE .LMK. NR.AK.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*         ISSUE UNIVERSAL COMMAND.
*         IF  COMMAND ACCEPTED  THEN
*           SEND COMMAND BLOCK TO THE NAD.
*           IF  COMMAND BLOCK SENT SUCCESSFULLY  THEN
*             REPEAT
*               GET CONTROLWARE STATUS.
*             UNTIL   RESPONSE AVAILABLE
*                  OR TIMER EXPIRED
*             IF  TIMER EXPIRED  THEN
*               RETURN ERROR STATUS
*             IFEND
*           IFEND
*         IFEND


 IUC      SUBR               ENTRY/EXIT
          LDK    NF.UC
          RJM    ICF         ISSUE UNIVERAL COMMAND
          MJN    IUCX        IF NAD ERROR
          LMK    NR.UA&NR.AK
          ZJN    IUC2        IF COMMAND ACCEPTED
          LCN    NE.IVR      INVALID NAD RESPONSE
 IUC1     UJN    IUCX

 IUC2     LDK    UC.CBLC
          STDL   WTOXFR      CHANNEL WORDS TO TRANSFER
          LDML   UNCB+UCB.SF
          SHN    -8
          STML   ICFA        SAVE SUB-FUNCTION FOR ERROR PROCESSING
          LDC    UNCB
          STML   OOCA        FWA OF BUFFER
          RJM    OOC         OUTPUT DATA ON CHANNEL
          MJN    IUCX        IF TRANSFER ERROR
          LCN    0
          STDL   NRTIMER
 IUC3     RJM    OCS         OBTAIN CONTROLWARE STATUS
          MJN    IUCX        IF NAD ERROR
          LPK    NR.RM
          LMK    NR.UA
          NJN    IUC4        IF RESPONSE AVAILABLE
          SODL   NRTIMER
          NJN    IUC3        IF TIMER HAS NOT EXPIRED
          LDC    -NE.UTO
          UJN    IUC1        RETURN, UNIVERSAL COMMAND TIMEOUT

 IUC4     LMK    NR.AK&NR.UA
          UJK    IUC1        RETURN, (A) = NAD RESPONSE  .LMK.  NR.AK.
OCS       SPACE  4,25
**        OCS    OBTAIN NAD CONTROLWARE STATUS
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE CURRENT NAD CONTROLWARE
*         STATUS.
*
*         EXIT   (A) : STATUS
*                    => 0, COMPLETE; (A) = (CWSTAT) = CONTROLWARE STATUS.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*         ISSUE NAD CONTROLWARE STATUS FUNCTION AND INPUT DATA.
*         IF  NO ERROR  THEN
*           SAVE CONTROLWARE STATUS.
*         IFEND



 OCS      SUBR               ENTRY/EXIT
          LCN    0
          STDL   CWSTAT      (-0) IS AN INVALID STATUS
          LDK    DI.CS       OBTAIN CONTROLWARE STATUS
          RJM    FAI         FUNCTION CHANNEL AND INPUT DATA
          MJN    OCSX        IF NAD ERROR OR CHANNEL IS NOT USABLE
          STDL   CWSTAT      SAVE CONTROLWARE STATUS
          UJN    OCSX        RETURN, CONTROLWARE STATUS OBTAINED
OHS       SPACE  4,25
**        OHS    OBTAIN NAD HARDWARE STATUS
*
*         THE PURPOSE OF THIS REQUEST IS TO OBTAIN THE CURRENT NAD HARDWARE
*         STATUS.
*
*         EXIT   (A) : STATUS
*                    => 0, COMPLETE; (A) = HARDWARE STATUS.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*         ISSUE NAD HARDWARE STATUS FUNCTION AND WAIT FOR DATA.
*         IF  NO ERROR  THEN
*           SAVE HARDWARE STATUS.
*         IFEND


 OHS      SUBR               ENTRY/EXIT
          LCN    0
          STML   RESDS+/RDS/P.LHWS     (-0) IS AN INVALID STATUS
          LDK    DI.HS       OBTAIN HARDWARE STATUS
          RJM    FAI         FUNCTION CHANNEL AND INPUT DATA
          MJN    OHSX        IF NAD ERROR OR CHANNEL IS NOT USABLE
          STML   RESDS+/RDS/P.LHWS
          UJN    OHSX        RETURN, HARDWARE STATUS OBTAINED
OOC       SPACE  4,30
**        OOC    OUTPUT ON CHANNEL
*
*         THE PURPOSE OF THIS ROUTINE IS TO SEND A BLOCK OF DATA ACROSS THE
*         CHANNEL TO THE NAD.
*
*         ENTRY  (WTOXFR) = AMOUNT OF DATA TO SEND.
*                (OOCA) = FWA OF BUFFER CONTAINING THE DATA.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; ALL DATA SUCCESSFULLY SENT.
*                    < 0, NAD ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*                (WTOXFR) = AMOUNT OF DATA TO SEND.
*
*
*         WAIT FOR PRIMED.
*         IF   PRIMED BIT SET   THEN
*           SET DI ASSEMBLY/DISASSEMBLY FUNCTION.
*           IF  FUNCTION ACCEPTED  THEN
*             OUTPUT DATA ON CHANNEL.
*             GET FINAL CONTROLWARE STATUS.
*           IFEND
*         IFEND


 OOC      SUBR               ENTRY/EXIT
          RJM    WFP         WAIT FOR PRIMED
          MJN    OOCX        IF NAD ERROR
          LDK    DI.OB
          RJM    FUN         SELECT BIT STRING ASSEMBLY/DISASSEMBLY MODE
          MJN    OOCX        IF NAD ERROR
          ACN    CH+40B
          LDDL   WTOXFR
          IF     DEF,NDI0
          OAM    *,CH        OUTPUT BLOCK ON CHANNEL
          ELSE
          OAPM   *,CH        OUTPUT BLOCK ON CHANNEL
          ENDIF
 OOCA     EQU    *-1         FWA OF DATA BUFFER
          STDL   BYTXFR      SAVE NUMBER OF WORDS NOT SENT
          IF     DEF,NDI0
          LCN    0
 OOC0.3   EJM    OOC0.5,CH   IF CHANNEL EMPTY
          SBN    1
          NJN    OOC0.3      IF TIMER HAS NOT EXPIRED
          LDC    -NE.DTO
 OOC0.4   UJN    OOCX        RETURN, DATA TIMEOUT ERROR

 OOC0.5   DCN    CH+40B      MAKE SURE CHANNEL IS DISCONNECTED
          ELSE
          DCN    CH+40B      MAKE SURE CHANNEL IS DISCONNECTED
          ENDIF
          SFM    OOC3,CH     IF CHANNEL ERROR DURING TRANSFER
          RJM    OHS         OBTAIN HARDWARE STATUS
          MJN    OOCX        IF HARDWARE STATUS UNAVAILABLE
          SCN    M.NHFPS+M.NHFPA       IGNORE PROCESSOR STOPPED AND ABNORMAL
          NJN    OOC2        IF HARDWARE FAULT ENCOUNTERED
          LDDL   BYTXFR
          IF     DEF,NDI0
          ZJK    OOC0.4      IF TRANSFER SUCCESSFUL
          ELSE
          ZJK    OOCX        IF TRANSFER SUCCESSFUL
          ENDIF
          RJM    CBT         COMPUTE BYTES TRANSFERRED FOR ERROR PROCS
          LCN    NE.OTE      RETURN, OUTPUT TRANSFER ERROR
 OOC1     UJK    OOCX

 OOC2     RJM    CBT         COMPUTE BYTES TRANSFERRED FOR ERROR PROCS
          LCN    NE.HWF
          UJN    OOC1        RETURN, HARDWARE FAULT ERROR

 OOC3     LDC    -NE.CPE
          UJN    OOC1        RETURN, CHANNEL PARITY ERROR
PEP       SPACE  4,25
**        PEP    PERFORM ERROR PROCESSING
*
*         THE PURPOSE OF THIS ROUTINE IS TO OBTAIN THE NECESSARY DATA FOR
*         ERROR LOGGING AND RETRY PROCESSING.
*
*         ENTRY  (A) = ERROR ENCOUNTERED.
*
*         EXIT   DETAILED STATUS SET UP.
*
*
*         IF  NAD IS NOT FLAGGED AS UNUSABLE  THEN
*           PRESERVE LAST CONTROLWARE FUNCTION.
*           PRESERVE LAST HARDWARE FUNCTION.
*           IF  NOT ABNORMAL RESPONSE  THEN
*             OBTAIN CONTROLWARE STATUS.
*           IFEND
*           IF  CONTROLWARE STATUS SHOWS A HARDWARE FAULT  THEN
*             OBTAIN THE HARDWARE STATUS.
*             SET NAD UNUSABLE FLAG.
*           IFEND
*         IFEND
*
*         NOTE   IF THE CONTROLWARE STATUS OR THE HARDWARE STATUS IS
*                UNAVAILABLE, A VALUE OF 177777B IS RETURNED IN THE
*                CORRESPONDING DETAILED STATUS FIELD.


 PEP      SUBR               ENTRY/EXIT
          LMK    777777B
          STML   RESBUF+/PRS/P.FTO     SET ABNORMAL STATUS FLAG
          IF     DEF,NPDR
          LMK    NE.CPE
          NJN    PEP0.2     IF NOT CHANNEL PARITY ERROR
 PEPB     UJN    PEP0.2     IF NOT CIO TYPE OF CHANNEL
*         PSN               IF CIO TYPE OF CHANNEL

          LDK    .STML      SET FOR 16 BIT FUNCTIONS
          STML   FUNB
          LDC    F.RDESR    READ ERROR STATUS REGISTER
          RJM    FUN
          ZJN    PEP0.0     IF NO ERROR ON FUNCTION
          LCN    0
          UJN    PEP0.1

 PEP0.0   ACN    CH+40B
          IAN    CH
          DCN    CH+40B
 PEP0.1   STM    RESBUF+/PRS/P.IEC    RETURN CIO STATUS
          LDK    .STM       SET FOR 12 BIT FUNCTIONS
          STML   FUNB
          UJN    PEP1

 PEP0.2   LMC    NE.CHD&NE.CPE

          ELSE
          LMK    NE.CHD
          ENDIF

          NJN    PEP1        IF NOT CHANNEL DOWN ERROR
          LJM    PEP10       SEND ABNORMAL RESPONSE TO CLEAR REQUEST

 PEP1     LDML   ICFA
          STML   RESDS+/RDS/P.LCWF     LAST CONTROLWARE FUNCTION
          LDML   FUNA
          STML   RESDS+/RDS/P.LHWF     LAST NAD FUNCTION
          LMK    DI.CS
          ZJN    PEP2        IF LAST FUNCTION WAS GET CONTROLWARE STATUS
          RJM    OCS         OBTAIN CONTROLWARE STATUS
 PEP2     LDDL   CWSTAT
          STML   RESDS+/RDS/P.LCWS     LAST CONTROLWARE STATUS
          SHN    17-NRF.HF
          PJN    PEP6        IF NO HARDWARE FAULT ENCOUNTERED
          LDML   RESDS+/RDS/P.LHWF     LAST NAD FUNCTION
          LMK    DI.HS
          ZJN    PEP5        IF LAST FUNCTION WAS GET HARDWARE STATUS
          RJM    OHS         OBTAIN HARDWARE STATUS
 PEP5     LDML   RESDS+/RDS/P.LHWS
          SHN    17-NHF.PS
          PJN    PEP6        IF NAD PROCESSOR STILL RUNNING
          RJM    SDD         SET DEVICE DOWN
          UJN    PEP9        RETURN DEVICE UNAVAILABLE

 PEP6     LDK    DI.MC
          RJM    FUN         MASTER CLEAR INTERFACE
          LDK    DI.CE
          RJM    FUN         CLEAR PARITY ERROR
          LDC    **          CLEAN-UP REQUEST (IF ANY)
 PEPA     EQU    *-1         SET WHEN FUNCTION IS DETERMINED
          ZJN    PEP9        IF NO CLEAN-UP REQUEST TO ISSUE
          LMN    2
          ZJN    PEP7        IF RESET REQUEST IS NEEDED
          LDK    NF.AB       ISSUE ABORT FUNCTION TO NORMALIZE THE NAD
          UJN    PEP8        ABORT CURRENT TRANSFER

 PEP7     LDK    NF.RT       RESET CURRENT BUFFER POINTERS
 PEP8     RJM    ICF         ISSUE CONTROLWARE FUNCTION
 PEP9     LDK    B.RDS
          RAML   RESBUF+/PRS/P.RL      SET LENGTH TO INCLUDE DETAILED STATUS
          LDK    CC.DSA*10000B         SET DETAILED STATUS RETURNED FLAG
 PEP10    ADK    RT.ABN*40000B         ABNORMAL RESPONSE
          STML   RESBUF+/PRS/P.RTYPE
          LCN    0
          UJK    PEPX        RETURN, (A) < 0 DETAILED STATUS SET UP
WFP       SPACE  4,20
**        WFP    WAIT FOR PRIMED
*
*         THE PURPOSE OF THIS REQUEST IS TO WAIT FOR THE NAD TO PRIME THE
*         CHANNEL FOR A DATA TRANSFER.
*
*         ENTRY  AN I/O REQUEST HAS BEEN SUCCESSFULLY ISSUED.
*
*         EXIT   (A) : STATUS
*                    = 0, COMPLETE; NAD PRIMED FOR INPUT.
*                    < 0, ERROR; (A) = COMPLEMENTED NAD ERROR CODE.
*
*         REPEAT
*           OBTAIN NAD CONTROLWARE STATUS.
*         UNTIL   AN ERROR IS ENCOUNTERED
*              OR THE PRIMED TIMER EXPIRED
*              OR THE NAD IS PRIMED FOR I/O


 WFP      SUBR               ENTRY/EXIT
          LCN    0
          STDL   NRTIMER
 WFP1     RJM    OCS         OBTAIN CONTROLWARE STATUS
          MJN    WFPX        IF CONTROLWARE ERROR
          SHN    17-NRF.PF
          MJN    WFP2        IF PRIMED FLAG IS SET
          SODL   NRTIMER
          PJN    WFP1        IF TIMER HAS NOT EXPIRED
          LCN    NE.PTO
          UJN    WFPX        RETURN, PRIME TIMEOUT ERROR

 WFP2     LDN    0
          UJN    WFPX        RETURN, PRIMED FOR I/O
          SPACE  4,10
 BUFFER   EQU    *
          ERRMI  7777B-BUFFER-MAXBYTES/2-3
IPD       TITLE  IPD - INITIALIZE PP DRIVER.
**        IPD    INITIALIZE PP DRIVER
*
*         THE PURPOSE OF THIS ROUTINE IS TO FIND THE CORRESPONDING CENTRAL
*         MEMORY TABLES AND INTIALIZE THE INTERNAL PP DRIVER POINTERS.
*
*         ENTRY  (PITADDR - PITADDR+1) = FWA OF PP INTERFACE TABLE.
*
*         EXIT   ALL STATIC POINTERS ARE SET UP.
*                ALL STATIC VARIABLES ARE SET UP.
*                ALL REQUIRED DYNAMIC VARIABLES ARE INITIALIZED.
*                (PPSTATE) = PP.IDLE.
*
*         REPEAT
*           SET UP RESPONSE BUFFER POINTERS.
*           IF  RESPONSE POINTERS ARE VALID   THEN
*             SET UP PP INTERFACE TABLE POINTERS.
*             IF  INVALID PP INTERFACE TABLE  THEN
*               POST ERROR RESPONSE.
*             ELSE
*               SET UP UNIT INTERFACE TABLE POINTERS.
*               IF  INVALID UNIT INTERFACE TABLE  THEN
*                 POST ERROR RESPONSE.
*               ELSE
*                 INITIALIZE MISCELLANEOUS VARIABLES.
*               IFEND
*             IFEND
*           IFEND
*           IF  ANY ERROR WAS ENCOUNTERED   THEN
*             DELAY TO ALLOW THE CPU PROGRAMS TO CORRECT THE PROBLEM.
*           IFEND
*         UNTIL   ALL POINTERS ARE INITIALIZED
*         SET PP STATE TO *IDLE*.


 IPD      SUBR               ENTRY/EXIT
          IF     DEF,NPDR
          RJM    ILC         INITIALIZE LOOP COUNTERS
          ENDIF
 IPD1     RJM    SRB         SET UP PP RESPONSE BUFFER POINTERS
          NJN    IPD3        IF INVALID (OR BUFFER NOT EMPTY)
          RJM    SPT         SET UP PP INTERFACE TABLE POINTERS
          NJN    IPD2        IF PP INTERFACE TABLE INVALID
          RJM    SUT         SET UP UNIT INTERFACE TABLE POINTERS
          NJN    IPD2        IF INVALID UNIT INTERFACE TABLE ENCOUNTERED
*         LDN    0
          STDL   PPFRC       INITIALIZE THE PP FREE RUNNING CLOCK
          LDK    FALSE
          STDL   CHANRES     NO CHANNEL RESERVED
          LDN    2
          STDL   TWO         CONSTANT TWO
          LDK    PP.IDLE
          STDL   PPSTATE     SET INITIAL PP STATE TO IDLE
          IF     DEF,NPDR
          RJM    ICH         INITIALIZE CIO/IOU HARDWARE
          MJN    IPD2        IF CIO HARDWARE INITIALIZATION ERROR
          ENDIF
          RJM    CPR         CHECK FOR PP RELOAD
          UJN    IPDX

 IPD2     LDN    0           NO INTERLOCK TO OBTAIN
          RJM    SRP         SEND PP RESPONSE
 IPD3     LDK    INTERDY     DELAY FOR A WHILE
 IPD4     SBN    1
 IPDA     EQU    *-1         CHANGED TO *SBN 2* FOR 2XPP
          NJN    IPD4
*
*         WHEN MORE FAULT TOLERANT CODE IS EMPLOYED IN THE CPU,
*         RETRYING MAY BE A VIABLE OPTION.  FOR NOW THE PP IS HUNG.
*
*         UJK    IPD1        RECHECK VALIDITY OF PP TABLES
*
          UJN    IPD3
          IF     DEF,NPDR
ICH       SPACE  4,10
**        ICH    INITIALIZE IOU HARDWARE BASED ON IOU HARDWARE TYPE
*
*         THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE THE CONCURRENT CHANNEL
*         HARDWARE.  OTHER TYPES DO NOT NEED INITIALIZATION.
*
*         ENTRY  INTPIT MUST BE VALID
*                CURCHAN MUST BE INITIALIZED
*
*         EXIT   (A) >= 0, IF NO ERROR
*                (A) < 0, IF ERROR
*
*         SAVE FLAG TO INDICATE CONCURRENT CHANNEL IOU.
*         INITIALIZE THE CONCURRENT CHANNEL HARDWARE
*


 ICH      SUBR
          LOADCM INTPIT+/PIT/P.CIT
          ADDL   CURCHAN     CURRENT CHANNEL
          ADN    32
          CRDL   SCRATCH     READ CHANNEL TYPE TABLE
          LDDL   SCRATCH
          SHN    17-15
          PJN    ICHX        IF NOT CIO TYPE CHANNEL
          LDK    .PSN        PASS INSTRUCTION
          STML   PEPB        SET CONCURRENT CHANNEL HARDWARE TYPE FLAG
          LDK    .STML       STML INSTRUCTION
          STML   FUNB        SET CONCURRENT CHANNEL HARDWARE TYPE FLAG
          LDK    F.MCLEAR    MASTER CLEAR ERROR STATUS REGISTERS
          RJM    FUN
          ZJN    ICH2        IF NO ERROR ON FUNCTION
 ICH1     LDK    IEC.503     CIO HARDWARE ERROR
          STML   RESBUF+/PRS/P.IEC               INTERFACE ERROR CODE
          LDK    B.PRS
          STML   RESBUF+/PRS/P.RL                RESPONSE LENGTH
          LDN    1
          SHN    16-/PRS/L.INTERR-/PRS/N.INTERR
          STML   RESBUF+/PRS/P.INTERR            ABNORMAL STATUS
          LDK    RT.UNS
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          ADK    URC.IE
          STML   RESBUF+/PRS/P.URC               UNSOLICITED RESPONSE
          RJM    REL
          LDK    .STM        STM  INSTRUCTION
          STML   FUNB
          LCN    0           RETURN, INTERFACE ERROR
          UJN    ICH3

 ICH2     LDK    F.WRCR      WRITE CONTROL REGISTERS
          RJM    FUN
          NJN    ICH1        IF CHANNEL ERROR
          ACN    CH+40B
          LDK    ICHC        CIO INITIALIZE FUNCTION
          OAN    CH
          DCN    CH+40B
          RJM    REL
          LDK    .STM        STM INSTRUCTION
          STML   FUNB        SET CONCURRENT CHANNEL HARDWARE TYPE FLAG
          LDN    0
 ICH3     LJM    ICHX        EXIT

 ICHC     EQU    400B        VALUE FOR CONTROL REGISTER (CIO ONLY)

ILC       SPACE  4,10
**        ILC    INITIALIZE LOOP COUNTERS BASED ON PP SPEED.
*
*         THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE ALL
*         TIMERS IN THE PP TO PROVIDE CONSISTENT TIMING BETWEEN
*         2XPP AND 4XPP.
*
*         ENTRY  NONE.
*
*         EXIT
*
*         DETERMINE PP SPEED
*         IF  2XPP  THEN
*           SET COUNTERS TO DECREMENT BY 2 INSTEAD OF 1.
*         IFEND
*
*         NOTE   12-BIT STORE AND LOAD INSTRUCTIONS ARE USED
*                IN THIS ROUTINE TO SUPPORT BOTH 12-BIT AND 16-BIT
*                MICROSECOND CLOCK CHANNELS.


 ILC      SUBR
          IAN    14B         GET MICROSECOND CLOCK
          STD    SCRATCH
          LDC    500
 ILC1     SBN    1
          NJN    ILC1        IF TIMER NOT COMPLETE
          IAN    14B         GET CURRENT TIME
          STD    SCRATCH+1
          LDD    SCRATCH+1
          SBD    SCRATCH

*         THESE TIMES SHOULD NEVER BE EQUAL.

          PJN    ILC2        IF CLOCK DID NOT WRAP
          ADC    7777B       COMPUTE THE ACTUAL CLOCK DIFFERENCE
 ILC2     ADC    -400
          MJN    ILCX        IF THE TIME < 400 MICS THEN SHOULD BE 4XPP
          LDK    .SBN+2      SWITCH TO DECREMENT BY 2 FOR 2XPP
          STML   MCMA
          STML   RESA
          STML   SRPA
          STML   IPDA
          LDC    RESTO/2
          STML   CRTA        CHANGE CLOCK TIMER
          UJK    ILCX
          ENDIF
SRB       SPACE  4,25
**        SRB    SET UP RESPONSE BUFFER POINTERS
*
*         THE PURPOSE OF THIS ROUTINE IS TO VERIFY THAT THE PP RESPONSE
*         BUFFER POINTERS ARE VALID AND THEN INITIALIZE THE CORRESPONDING
*         VARIABLES.
*
*         ENTRY  (PITADDR - PITADDR+1) = FWA OF PP INTERFACE TABLE.
*
*         EXIT   (A) : STATUS
*                    > 0, RESPONSE BUFFER NOT EMPTY
*                    = 0, RESPONSE POINTERS VALID AND VARIABLES
*                         INITIALIZED.
*                    < 0, RESPONSE POINTERS INVALID.
*                (INTPIT) = PP INTERFACE TABLE.
*
*
*         OBTAIN *FIRST* AND *LIMIT* POINTERS.
*         IF  *LIMIT* IS VALID  THEN
*           OBTAIN *IN* AND *OUT* POINTERS.
*           VERIFY *IN* AND *OUT* POINTERS.
*         IFEND


 SRB      SUBR               ENTRY/EXIT
          LDK    C.PIT
          STDL   SCRATCH     LENGTH OF PP INTERFACE TABLE
          LDDL   PITADDR+1
          ADK    /PIT/C.PQLOCK*8
          STML   PPRQIL+1    PP REQUEST QUEUE INTERLOCK POINTER
          SHN    -16
          ADDL   PITADDR
          STML   PPRQIL
          LOADCM PITADDR
          STDL   PITADDR+2
          CRML   INTPIT,SCRATCH        READ RESPONSE BUFFER POINTERS
          SRD    PITADDR               SAVE THE REFORMATTED PIT ADDRESS
          LOADCM INTPIT+/PIT/P.RBRMA   FORMAT CM ADDRESS POINTER
          STDL   RBFIRST+2             SAVE ADDRESS OFFSET
          SRD    RBFIRST               SAVE R-REGISTER CONTENTS
          LDML   INTPIT+/PIT/P.RBLIM
          STDL   RBLIMIT
          SBK    P.PRS+8
          MJN    SRBX        IF RESPONSE BUFFER SIZE INADEQUATE
          LDML   INTPIT+/PIT/P.RBIN
          STDL   RBIN
          LDML   INTPIT+/PIT/P.RBOUT
          STDL   RBOUT
          LDK    RBIN
          RJM    VIO         VERIFY IN AND OUT POINTERS

*         RETURN THE RESPONSE FROM *VIO*

          UJK    SRBX
SPT       SPACE  4,30
**        SPT    SET UP PP INTERFACE POINTERS
*
*         THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE THE VARIABLES WHICH
*         POINT TO THE STATIC TABLES POINTED TO BY THE PP INTERFACE TABLE.
*
*         ENTRY  (INTPIT) = PP INTERFACE TABLE.
*
*         EXIT   (A) : STATUS
*                    =  0, ENTRIES VALID AND VARIABLES INITIALIZED.
*                    <  0, THE PPIT IS NOT VALID AND AN ABNORMAL
*                          RESPONSE HAS BEEN CREATED.
*
*
*         INITIALIZE INTERRUPT REGISTER POINTER.
*         INITIALIZE CHANNEL INTERLOCK TABLE POINTER.
*         INITIALIZE PP REQUEST QUEUE POINTER.
*         INITIALIZE NUMBER OF UNITS.
*         IF  PHYSICAL DESCRIPTOR VALID  THEN
*           SAVE CHANNEL NUMBER.
*           SAVE UIT POINTER.
*           CONSTRUCT CHANNEL INTERLOCK TABLE POINTER.
*           PLUG CHANNEL NUMBER.
*         ELSE
*           SET UP ERROR RESPONSE.
*         IFEND


 SPT      SUBR               ENTRY/EXIT
          LDML   INTPIT+/PIT/P.INTREG
          STML   INTREG                     POINTER TO PP INTERRUPT REGISTER
          LDML   INTPIT+/PIT/P.INTREG+1
          STML   INTREG+1
          LDML   INTPIT+/PIT/P.PPNO
          ZJN    SPT1        PP NUMBER CAN NOT BE ZERO
          RAML   ATIA        PLUG LOGICAL PP NUMBER
          LDML   INTPIT+/PIT/P.PPNO
          RAML   ATIB
          STML   RTIA
          LDML   INTPIT+/PIT/P.UNITC
          ZJN    SPT0        IF NO UNITS TO FUNCTION
          SBK    MAXUNIT+1
          ERRNZ  MAXUNIT-1   CODE ONLY SUPPORTS ONE UNIT
          MJN    SPT2        IF MAXIMUM UNITS NOT EXCEEDED
 SPT0     LDK    IEC.211     UNIT DESCRIPTOR LENGTH ERROR
          LJM    SPT6

 SPT1     LDK    IEC.220     INVALID PP NUMBER
          LJM    SPT6

 SPT2     ADK    MAXUNIT+1
          STDL   SCRATCH+2   NUMBER OF UNITS
          SHN    1
          ERRNZ  C.UD/2-1    CODE ASSUMES C.UD = 2
          STDL   SCRATCH     LENGTH OF UNIT DESCRIPTOR AREA
          LOADCB PITADDR,,C.PIT
          CRML   INTPIT+P.PIT,SCRATCH            READ UNIT DESCRIPTORS
          LDN    0
          STDL   SCRATCH+1
 SPT3     LDML   INTPIT+P.PIT+/UD/P.CHAN,SCRATCH+1
          SHN    -16+/UD/L.CHAN+/UD/N.CHAN
          STDL   CURCHAN     SAVE CHANNEL
          SBK    LCBUL+1
          MJN    SPT4        IF CHANNEL IS IN LOWER BARREL
          SBK    UCBLL-LCBUL-1
          MJN    SPT5        IF CHANNEL IS NOT IN UPPER BARREL
          SBK    UCBUL+1-UCBLL
          PJN    SPT5        IF CHANNEL IS NOT IN UPPER BARREL
 SPT4     LDML   INTPIT+P.PIT+/UD/P.RMAUIT,SCRATCH+1
          STDL   UITADDR     SAVE UNFORMATTED UIT RMA
          LDML   INTPIT+P.PIT+/UD/P.RMAUIT+1,SCRATCH+1
          STDL   UITADDR+1
          LOADCM UITADDR     LOAD UIT TO FORMAT THE ADDRESS
          STDL   UITADDR+2   SAVE FORMATTED UIT RMA
          SRD    UITADDR
          LDDL   CURCHAN     CURRENT CHANNEL
          SHN    3           (CHANNEL * 8) = INTERLOCK WORD OFFSET
          ADML   INTPIT+/PIT/P.CIT+1
          STML   CITADDR+1   CURRENT CHANNEL INTERLOCK POINTER
          SHN    -16
          ADML   INTPIT+/PIT/P.CIT
          STML   CITADDR
          UJN    SPT8        PLUG CHANNEL INTO DRIVER CODE

 SPT5     LDK    IEC.20A     INVALID CHANNEL
 SPT6     STML   RESBUF+/PRS/P.IEC               INTERFACE ERROR CODE
          LDK    B.PRS
          STML   RESBUF+/PRS/P.RL                RESPONSE LENGTH
          LDN    1
          SHN    16-/PRS/L.INTERR-/PRS/N.INTERR
          STML   RESBUF+/PRS/P.INTERR            ABNORMAL STATUS
          LDK    RT.UNS
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          ADK    URC.IE
          STML   RESBUF+/PRS/P.URC               UNSOLICITED RESPONSE
          LCN    0           RETURN, INTERFACE ERROR
 SPT7     LJM    SPTX


 SPT8     LDC    CHANTAB
          STDL   SCRATCH     LIST OF INSTRUCTIONS TO PLUG
 SPT9     LDIL   SCRATCH
          ZJN    SPT7        IF ALL INSTRUCTIONS PLUGGED, RETURN 0 = OK
          STD    SCRATCH+1
          LDIL   SCRATCH+1   FETCH INSTRUCTION
          SCN    37B         CLEAR OLD CHANNEL NUMBER
          LMDL   CURCHAN     STORE NEW CHANNEL NUMBER
          STIL   SCRATCH+1
          AODL   SCRATCH
          UJN    SPT9        PLUG NEXT LOCATION
SUT       SPACE  4,30
**        SUT    SET UP UNIT INTERFACE TABLE POINTERS
*
*         THE PURPOSE OF THIS ROUTINE IS TO INTITIALIZE THE VARIABLES WHICH
*         DEFINE THE ACCESSABLE UNIT INTERFACE TABLES.
*
*         ENTRY  (INTPIT) = UNIT DESCRIPTORS FOR THE CORRESPONDING UNITS.
*                (UNITTAB) = RMA POINTERS TO THE UITS.
*                (UTABL) = LENGTH OF UNITTAB.
*
*         EXIT   (A) : STATUS
*                    = 0, OK; ENTRIES VALID AND VARIABLES INITIALIZED.
*                    < 0, ERROR; AN INVALID UIT WAS ENCOUNTERED AND AN
*                                ABNORMAL RESPONSE HAS BEEN CREATED.
*
*         IF  UNIT INTERFACE TABLE INVALID  THEN
*           SET UP ERROR RESPONSE.
*         ELSE
*           SAVE UIT REQUEST QUEUE LOCK POINTER.
*         IFEND


 SUT      SUBR               ENTRY/EXIT
          LDK    C.UIT
          STDL   SCRATCH     LENGTH OF UNIT INTERFACE TABLE
          LDN    0
          STDL   SCRATCH+1   CURRENT UNIT DESCRIPTOR POINTER
 SUT1     LOADCB UITADDR
          CRML   INTUIT,SCRATCH        READ UNIT INTERFACE TABLE ENTRY
          LDML   INTPIT+P.PIT+/UD/P.LUN,SCRATCH+1
          LMML   INTUIT+/UIT/P.LUN
          NJN    SUT3        LOGICAL UNIT NUMBER MISMATCH

*         THE FOLLOWING LINES OF CODE ARE CURRENTLY COMMENTED
*         OUT BECAUSE THERE IS NO UNIT TYPE FOR A NAD.
*
*         LDML   INTUIT+/UIT/P.UTYPE
*         LMK    NADTYPE
*         NJN    SUT4        UNIT TYPE IS NOT A NAD TYPE

          LDML   INTPIT+P.PIT+/UD/P.RMAUIT+1,SCRATCH+1
          ADK    /UIT/C.UQLOCK*8
          STML   URQIL+1
          SHN    -16
          ADML   INTPIT+P.PIT+/UD/P.RMAUIT,SCRATCH+1
          STML   URQIL
          LDN    0
 SUT2     UJK    SUTX

 SUT3     LDK    IEC.301     LOGICAL UNIT NUMBER OF *UD* <> LUN OF *UIT*
          UJN    SUT5

 SUT4     LDK    IEC.306     INVALID UNIT TYPE
 SUT5     STML   RESBUF+/PRS/P.IEC               INTERFACE ERROR CODE
          LDK    B.PRS
          STML   RESBUF+/PRS/P.RL                RESPONSE LENGTH
          LDN    1
          SHN    16-/PRS/L.INTERR-/PRS/N.INTERR
          STML   RESBUF+/PRS/P.INTERR            ABNORMAL STATUS
          LDK    RT.UNS
          SHN    16-/PRS/L.RTYPE-/PRS/N.RTYPE
          ADK    URC.IE
          STML   RESBUF+/PRS/P.URC               UNSOLICITED RESPONSE
          LCN    0           RETURN, INTERFACE ERROR
          UJK    SUT2

** CPR CHECK FOR PP RELOAD
*
* THE PURPOSE OF THIS ROUTINE IS TO DETERMINE WHETHER OR NOT
* THE PP IS BEING RESTARTED BECAUSE THE PP WAS RE-LOADED DURING
* THE PROCESSING OF AN I/O REQUEST.
*
* NOTE    IF THE PP WAS PROCESSING A PP REQUEST AT THE POINT OF
*  RELOAD, THE CORRESPONDING INFORMATION FROM THAT
*  REQUEST IS LOST.  HOWEVER, THIS SHOULD NOT HANG
*  ANY CPU SOFTWARE.
*
* ENTRY (UITADDR) = UNIT INTERFACE TABLE POINTER
*
* EXIT (PPSTATE) = PP.NORM, IF THIS IS A RELOAD
*       PP.IDLE, IF THIS IS A REGULAR PP LOAD
*
* IF   THIS IS NOT AN INITIAL LOAD    THEN
*   CLEAR ANY OUTSTANDING LOCKS.
*   ACQUIRE UNIT INTERFACE TABLE LOCK.
*   FOR   EACH ENTRY IN THE QUEUE   DO
*     CLEAR PP PROCESSING FLAGS.
*   FOREND
*   SET UNIT STATE TO *DOWN*.
*   SET PP STATE TO NORMAL TO CLEAR QUEUES.
*   RELEASE UNIT INTERFACE TABLE LOCK
* IFEND


 CPR      SUBR               ENTRY/EXIT
          LOADCB UITADDR,,/UIT/C.RQCLK
          CRDL   CURUIT      READ PP REQUEST QUEUE LOCK
          LDDL   CURUIT+/UIT/P.RQCLK
          ZJN    CPRX        IF NO REQUESTS HAVE BEEN PROCESSED
          LDK    URQIL
          RJM    RTI         RELEASE UNIT REQUEST INTERLOCK
          LDK    PPRQIL
          RJM    RTI         RELEASE PP REQUEST QUEUE INTERLOCK
          LDK    CITADDR
          RJM    RTI         RELEASE CHANNEL INTERLOCK
          LDK    URQIL
          RJM    ATI         ACQUIRE UNIT INTERFACE TABLE
          LOADCB UITADDR,,/UIT/C.PVANR
          CRML   RESBUF,TWO  READ UP THE UNIT REQUEST LIST POINTER
          LDML   RESBUF+/PRS/P.RMAOR
          ADML   RESBUF+/PRS/P.RMAOR+1
          NJN    CPR1        RELOAD WITH OUTSTANDING I/O
          UJK    CPR2        RELOAD WITH NO REQUESTS IN QUEUE

 CPR1     LOADCM RESBUF+/PRS/P.RMAOR
          CRML   RESBUF,TWO
          ADK    C.PR-2
          CRDL   LCMND       READ COMMAND WORD
          STDL   SCRATCH     SAVE ADDRESS FOR RE-WRITE
          LDDL   LCMND+/LCF/P.PPLOCK
          LPK    -/LCF/M.PPLOCK-/LCF/M.PPCOMP
          STDL   LCMND+/LCF/P.PPLOCK CLEAR PP LOCK FLAGS
          LDDL   SCRATCH
          ADK    400000B
          CWDL   LCMND       RE-WRITE COMMAND WITH PP FLAGS CLEARED
          LDML   RESBUF+/PRS/P.RMAOR
          ADML   RESBUF+/PRS/P.RMAOR+1
          NJN    CPR1        MORE REQUESTS IN QUEUE
          LOADCB UITADDR,,/UIT/C.DOWN
          CRDL   CURUIT      READ UNIT INTERFACE TABLE HEADER
          STDL   SCRATCH     SAVE ADDRESS FOR RE-WRITE
          LDDL   CURUIT+/UIT/P.DOWN
          SHN    17-15+/UIT/L.DOWN
          MJN    CPR2        IF UNIT IS ALREADY DOWN
          LDK    TRUE
          SHN    16-/UIT/L.DOWN+/UIT/N.DOWN
          RADL   CURUIT+/UIT/P.DOWN SET DEVIDE DOWN FLAG
          LDDL   SCRATCH
          ADK    400000B
          CWDL   CURUIT      REWRITE DOWN FLAG TO CLEAR REQUESTS
 CPR2     LDK    PP.NORM
          STDL   PPSTATE     SET PP STATE TO RESUME PROCESSING
          LDK    URQIL
          RJM    RTI         RELEASE UNIT INTERFACE TABLE LOCK
          UJK    CPRX
          SPACE  4,10
 CHANTAB  BSS    0
 TCH+40B  HERE
 T40B+CH  HERE
 TCH      HERE
          CON    0           END OF CHANNEL TABLE
          SPACE  4,10
 INTPIT   BSSZ   P.PIT+MAXUNIT*P.UD
 INTUIT   BSSZ   P.UIT
          ERRPL  *+3-7777B


