          TITLE  MACRO DEFINITIONS.
*         LIST   -$
*copyc IODMAC1
*copyc IODMAC2
*copyc IODMAC4
*copyc DSI$PP_MACROS
          LIST   B,L,N,R
          TITLE  TABLE DEFINITIONS.
          SPACE  4,10
**        PP INTERFACE TABLE.
 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS (ALWAYS 1)

          ALIGN  0,64
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)

          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH (NOT USED)
 CBUF     RMA                COMMUNICATION BUFFER (RMA)(NOT USED)

 LOCK     BOOLEAN            PP REQUEST QUEUE LOCK
          ALIGN  48,64
 LOCKPP   PPWORD             PP REQUEST QUEUE LOCK OWNER

          ALIGN  16,64
 PPQPVA   STRUCT 6           NEXT QUEUED PP REQUEST (PVA)

          ALIGN  32,64
 PPQ      RMA                NEXT QUEUED PP REQUEST (RMA)

          ALIGN  16,64
 RSPVA    STRUCT 6           RESPONSE BUFFER (PVA)

          ALIGN  48,64
 RSLEN    PPWORD             RESPONSE BUFFER LENGTH

          ALIGN  32,64
 RSBUF    RMA                RESPONSE BUFFER (RMA)

          ALIGN  48,64
 IN       PPWORD             IN POINTER

          ALIGN  48,64
 OUT      PPWORD             OUT POINTER

          ALIGN  48,64
 LIMIT    PPWORD             LIMIT POINTER

 PIT      RECEND
          SPACE  4,10
**        UNIT DESCRIPTORS.

 UD       RECORD PACKED

 LU       PPWORD             LOGICAL UNIT (ALWAYS SAME AS *PIT.FLU*)
 UQTPVA   STRUCT 6           UNIT INTERFACE TABLE (PVA)

 CHAN     SUBRANGE 0,377B    CHANNEL NUMBER
 PORT     SUBRANGE 0,3       CHANNEL PORT NUMBER
 CNTRLR   SUBRANGE 0,77B     CONTROLLER NUMBER
 UNIT     PPWORD             PHYSICAL UNIT NUMBER
 UQT      RMA                UNIT INTERFACE TABLE (RMA)

 UD       RECEND
          SPACE  4,10
**        UNIT INTERFACE TABLE.

 UIT      RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 STATUS   BOOLEAN            UNIT STATUS (NOT USED)
          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
 QCNT     PPWORD             QUEUE COUNT (NOT USED)

          ALIGN  16,64
 MBUFL    PPWORD             MASTER CONTROL TABLE LENGTH
 MBUF     RMA                MASTER CONTROL TABLE (RMA)

 ULOCK    BOOLEAN            UNIT IS RESERVED FOR EXCLUSIVE USE (NOT USED)
          ALIGN  48,64
 ULOCKP   PPWORD             UNIT LOCK OWNER (NOT USED)

 QLOCK    BOOLEAN            UNIT QUEUE LOCK (NOT USED)
          ALIGN  48,64
 QLOCKP   PPWORD             UNIT QUEUE LOCK OWNER (NOT USED)

          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA) (NOT USED)

          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA) (NOT USED)

 UIT      RECEND
          SPACE  4,10
**        PP REQUESTS.

 RQ       RECORD PACKED

          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)

          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)

 LEN      PPWORD             REQUEST LENGTH
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS (NOT USED)
 INT      BOOLEAN            INTERRUPT CPU (SHOULD BE SET)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    PRIORITY (NOT USED)
 ALRT     PPWORD             ALERT MASK (NOT USED)

 SECADR   STRUCT 8           SECONDARY ADDRESS (NOT USED)

 REQCOD   SUBRANGE 0,377B    REQUEST CODE
 STOR     BOOLEAN            STORE RESPONSE (IF SET)
 INDIR    BOOLEAN            INDIRECT ADDRESS (IF SET)
          ALIGN  16,64
 CMDLEN   PPWORD             LENGTH OF LENGTH/ADDRESS WORD PAIR LIST
 CMDRMA   RMA                ADDRESS OF CM AREA

          MASKP  INT
 K.INT    EQU    MSK
          MGEN   N.PORT
 M.PORT   EQU    MASK$

 RQ       RECEND
          SPACE  4,10
**        UNIT REQUESTS.
*

 URQ      RECORD PACKED

          ALIGN  16,64
 THISPV   STRUCT 6           THIS REQUEST ON UNIT QUEUE (PVA)
          ALIGN  0,64
 NEXTLN   PPWORD             LENGTH OF NEXT UNIT REQUEST
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)
 URQLEN   PPWORD             UNIT REQUEST LENGTH
 LU       PPWORD             LOGICAL UNIT
          ALIGN  0,128       SKIP 6 PP WORDS (128=64*2)
 CODE     SUBRANGE 0,377B    COMMAND CODE
 STOR     BOOLEAN            STORE RESPONSE (IF SET)
 INDIR    BOOLEAN            INDIRECT ADDRESS (IF SET)

*         THERE CAN BE 0, 1, OR MORE LENGTH/ADDRESS PAIRS.

          ALIGN  0,64
 MBLEN    PPWORD             MESSAGE BUFFER LENGTH (LENGTH/ADDRESS PAIR LIST)
          ALIGN  32,64
 MBRMA    RMA                MESSAGE BUFFER ADDRESS (LENGTH/ADDRESS PAIR LIST)

 URQ      RECEND
          SPACE  4,10
**        TRACE - DEFINE TRACE MACRO.
*
*         TRACE  (LIST OF ADDRESSES OF DATA TO SAVE WITH TRACE DATA)


 TRACE    MACRO  D
          LOCAL  L
*.TR      IFEQ   DEBUG,1
          RJM    STD
 .T       IFC    EQ, D
          CON    0
 .T       ELSE
          CON    L
 TRACE    RMT
 L        BSS    0
          IRP    D
          CON    D
          IRP
          CON    0
          RMT
 .T       ENDIF
*.TR      ENDIF
 TRACE    ENDM
 SREC     SPACE  4,10
** SREC MACRO
** THIS MACRO WILL UPDATE THE RECOVERY AND RETRY FIELDS OF A LOG RESPONSE.
** THE ADDR PARAMETER IS THE ADDRESS OF THE LOG BLOCK.
** THE RTC PARAMETER IS THE ADDRESS OF THE RECOVERY COUNTER WHOSE VALUE
** IS ZERO IF THIS IS AN UNRECOVERED ERROR, 1 OR 2 IF A RECOVERED OR
** INTERMEDIATE ERROR.
** THE REC PARAMETER IS EITHER REC.R OR REC.I.


 SRU      MACRO  ADDR,RTC,REC
          LOCAL  SRU10
 A        IFLE   RTC,77B
          LDDL   RTC
          ELSE
          LDML   RTC
 A        ENDIF
          ZJN    SRU10
          LDN    REC
          STML   ADDR+/ILD/P.ERRK,T0
 SRU10    LDN    RRL
 B        IFLE   RTC,77B
          SBDL   RTC
          ELSE
          SBML   RTC
 B        ENDIF
          STML   ADDR+/ILD/P.RETCNT,T0
 SRU      ENDM
 DPM      SPACE  4,10
** DPM MACRO
** THIS MACRO WILL DECREMENT A PP MEMORY LOCATION BY ONE.
** CARE IN TAKEN TO ASSURE THAT 0 - 1 = 177777(8).
** THE ADDR PARAMETER IS THE ADDRESS OF THE PP LOCATION TO DECREMENT.

 DPM      MACRO  ADDR
          LOCAL  DPM10
          SOML   ADDR
          PJN    DPM10
          AOML   ADDR
 DPM10    BSS    0
 DPM      ENDM
 LOGRES   SPACE  4,10
 LOGRES   MACRO
*         WORD 6 - LOG MESSAGE (RESPONSE CODE 9)
          ALIGN  0,64
 SCODE    PPWORD             SYMPTOM CODE
 OPCD     PPWORD             OPERATION CODE
 MSTAT    PPWORD             MASTER STATUS
 SSTAT    PPWORD             SLAVE STATUS
*         WORD   7
 ERRK     PPWORD             ERROR KIND
*                            0 = RECOVERED ERROR
*                            1 = UNRECOVERED ERROR
*                            2 = INTERMEDIATE ERROR
*                            3 = INFORMATIVE MESSAGE
 RETCNT   PPWORD             RETRY COUNT
 LMS      BOOLEAN            MASTER STATUS INCLUDED
 LSS      BOOLEAN            SLAVE STATUS INCLUDED
 DIVB     BOOLEAN            DOWN IVB
 LREG     BOOLEAN            ADAPTOR REGISTERS INCLUDED
 P.FLAGS  EQU    P.LMS
          ALIGN  48,64
 PID      PPWORD             PARAMETER ID
*         WORDS  8 AND 9
 FHIST    STRUCT 16          FUNCTION HISTORY
*         WORD   10
 CR       PPWORD             CONTROL REGISTER
 OSR      PPWORD             OPERATIONAL STATUS REGISTER
 DMAER    PPWORD             DMA ERROR REGISTER
 STREG    PPWORD             IPI CHIP STATUS REGISTER
*         WORD   11
 ERREG    PPWORD             IPI CHIP ERROR REGISTER
 EDATA    PPWORD             EXPECTED DATA
 ADATA    PPWORD             ACTUAL DATA
 RES0     STRUCT 2           RESERVED FOR PP
*         WORD   12
          STRUCT 8           RESERVED FOR PP



*         OPERATION CODES.
*
*  NOTE:  THESE CODES FOLLOW A CONVENTION WHERE
*         READ OPERATIONS HAVE AN EVEN VALUE WHILE
*         WRITE OPERATIONS HAVE AN ODD VALUE.

 K.WRT    EQU    1           WRITE
 K.READ   EQU    2           READ
 K.WRTC   EQU    3           WRITE COMMAND
 K.RDR    EQU    4           READ RESPONSE
          MASKP  LMS
 K.LMS    EQU    MSK
          MASKP  LSS
 K.LSS    EQU    MSK
          MASKP  DIVB
 K.DIVB   EQU    MSK
          MASKP  LREG
 K.LREG   EQU    MSK
          ENDM


**        PP RESPONSE.
*

 RS       RECORD PACKED

*         WORD 1.
          ALIGN  16,64
 PVA      STRUCT 6           PVA OF REQUEST

*         WORD 2.
          ALIGN  32,64
 REQ      RMA                RMA OF REQUEST  (NOT USED)

*         WORD 3.
 RESPL    PPWORD             RESPONSE LENGTH  (8-BIT BYTES)
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS (FROM REQUEST) (NOT USED)
 INT      BOOLEAN            INTERRUPT CPU (IF SET)  (NOT USED)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS  (NOT USED)
          ALIGN  40,64
 DEVID    SUBRANGE 0,377B    DEVICE INDENTIFIER
          ALIGN  48,64
 ALERT    PPWORD             ALERT MASK

*         WORD 4.
          ALIGN  0,64
 ABALRT   BOOLEAN            ABNORMAL ALERT CONDITION DETECTED  (NOT USED)
 INTERR   BOOLEAN            LOGICAL INTERFACE ERROR (NOT USED)
 FORC     BOOLEAN            FORCED TERMINATION (NOT USED)
 CHERR    BOOLEAN            CHANNEL PARITY ERROR (NOT USED)
 DATOV    BOOLEAN            DATA OVERRUN. (NOT USED)
 DATERR   BOOLEAN            UNCORRECTABLE PARITY OR CHECKWORD ERROR (NOT USED)
 HDWR     BOOLEAN            UNCORRECTABLE HARDWARE MALFUNCTION (NOT USED)
 NRDY     BOOLEAN            INTERVENTION REQUIRED BY OPERATOR (NOT USED)
 FTO      BOOLEAN            FUNCTION TIMEOUT (NOT USED)
 CHERO    BOOLEAN            CHANNEL OUTPUT PARITY ERROR (NOT USED)
          ALIGN  16,64
 IEC      PPWORD             INTERFACE ERROR CODE
 RC       SUBRANGE 0,3       RESPONSE CODE
                               0 - UNSOLICITED RESPONSE
                               1 - INTERMEDIATE RESPONSE
                               2 - NORMAL REQUEST TERMINATION
                               3 - ABNORMAL REQUEST TERMINATION
 RCON     SUBRANGE 0,3       ADDITIONAL RESPONSE CONDITIONS
                             (= 0 FOR UNSOLICITED RESPONSE)
                               0 - NO DETAILED STATUS
                               1 - DETAILED STATUS INCLUDED
          ALIGN  40,64
 URC      SUBRANGE 0,377B    UNSOLICITED RESPONSE CODE  (NOT USED)
                               1 - UNIT CHANGED FROM READY TO NOT READY
                               2 - UNIT CHANGED FROM NOT READY TO READY
                               3 - ABNORMAL CONDITION DURING HOUSEKEEPING CYCLE,
                                   (CHECK ABNORMAL STATUS OR INTERFACE ERROR CODE)
                               8 - DEVICE ERROR
                               9 - LOG PP MESSAGE
                               13 - CHANNEL CONNECTION READ
                               14 - DEVICE OPERATIONAL
          ALIGN  49,64       ALERT CONDITIONS
 COMPRC   BOOLEAN            COMPARE NOT SATISFIED (NOT USED)

*         WORD 5.
          ALIGN  0,64
 XFER     STRUCT 4           TRANSFER COUNT
 LASTC    RMA                LAST COMMAND (RMA)(NOT USED)

*         CONTENTS OF WORD 6 AND BEYOND ARE DEPENDENT ON THE
*         SPECIFIC RESPONSE BEING SENT.

*         WORD 6 - BUFFER RETURN (RESPONSE CODES 8 AND 13)
          ALIGN  0,64
 BP1ST    PPWORD             BUFFER POOL 1 STATUS
 BP2ST    PPWORD             BUFFER POOL 2 STATUS
 PSEND    PPWORD             PRIORITY SEND STATE (GLOBAL FLOW CONTROL)
 NSEND    PPWORD             NORMAL SEND STATE (GLOBAL FLOW CONTROL)

*         THERE CAN BE 0, 1 OR MORE LENGTH/ADDRESS PAIRS

          ALIGN  0,64
 DLEN     PPWORD             LENGTH OF DATA IN BUFFER
 BUFPVA   STRUCT 6           PVA OF DATA BUFFER

*         WORD 6 - DEVICE OPERATIONAL (RESPONSE CODE 14)
 BITC     SET    P.LASTC*16  WORD 6
          ALIGN  0,64
 PROV     PPWORD             CHANNEL PROTOCOL VERSION

          ALIGN  32,64
 MAXRS    STRUCT 4           MAXIMUM RECORD SIZE
 SYSID    STRUCT 6           SYSTEM ID
 BITC     SET    P.LASTC*16  WORD 6

          LOGRES

 RS       RECEND


**        INTERMEDIATE LOGGING DATA
*

 ILD      RECORD PACKED

          LOGRES

 ILD      RECEND
          SPACE  4,10
**        UNIT QUEUE DESCRIPTOR.
*

 UQD      RECORD PACKED

 LEN      PPWORD             LENGTH OF THE HEAD OF THE SEND QUEUE
          ALIGN  32,64
 HEAD     RMA                ADDRESS OF HEAD OF THE SEND QUEUE (RMA)
          ALIGN  32,64
 TAIL     RMA                ADDRESS OF TAIL POINTER OF THE SEND QUEUE (RMA)

 UQD      RECEND
*copyc nai$define_ipi_registers
          SPACE  4,15
**        IPI HEADER.

 IP       RECORD PACKED

 LEN      PPWORD             COMMAND/RESPONSE HEADER LENGTH

 REFNO    PPWORD             COMMAND REFERENCE NUMBER

 OPCODE   PPWORD             OPCODE AND MODIFIER

 ADDR     PPWORD             SLAVE AND FACILITY ADDRESSES

 IP       RECEND
          SPACE  4,10
**        IPI HEADER PARAMETERS
*
*         THE FOLLOWING RECORD DEFINITIONS ARE FOR THE
*         IPI HEADER PARAMETERS DEFINED FOR THE IVB.

*         DIAGNOSTICS PARAMETERS - 52(16)

 DIAGP    RECORD PACKED

 PARML    STRUCT 1           LENGTH OF THE REMAINDER OF THE PARAMETER
 PARMID   STRUCT 1           PARAMETER ID
 RPTCNT   PPWORD             OPERATION REPEAT COUNT
 FECODE   PPWORD             FORCE ERROR CODE
 DATLEN   PPWORD             DATA LENGTH

 DIAGP    RECEND

*         GLOBAL FLOW CONTROL STATUS - 56(16)

 STATP    RECORD PACKED

 PARML    STRUCT 1           LENGTH OF THE REMAINDER OF THE PARAMETER
 PARMID   STRUCT 1           PARAMETER ID
 STATUS   STRUCT 1           STATUS, GLOBAL FLOW CONTROL
 FILL     STRUCT 1           FILL

*         STATUS FIELD BIT DEFINITIONS.

 SUC      EQU    7           SUCCESS
*         BITS 4-6 ARE RESERVED FOR FUTURE USE.
 SNDOK    EQU    3           SEND OK
 INPOK    EQU    2           INPUT OK
*         BITS 0-1 ARE RESERVED FOR FUTURE USE.

          BMGEN  SUC
 K.SUC    EQU    MASK$
          BMGEN  SNDOK
 K.SNDOK  EQU    MASK$
          BMGEN  INPOK
 K.INPOK  EQU    MASK$

 STATP    RECEND

*         MASTER/SLAVE DATA STATUS - 53(16)

 MSDS     RECORD PACKED

 PARML    STRUCT 1           LENGTH OF THE REMAINDER OF THE PARAMETER
 PARMID   STRUCT 1           PARAMETER ID
 REFNO    PPWORD             REFERENCE NUMBER
 STATUS   STRUCT 1           STATUS
 FILL     STRUCT 1           FILL

 MSDS     RECEND

*         IVB VERSION PARAMETER - 55(16)

 VERP     RECORD PACKED

 PARML    STRUCT 1           LENGTH OF THE REMAINDER OF THE PARAMETER
 PARMID   STRUCT 1           PARAMETER ID
 IVBTYP   PPWORD             IVB TYPE
 SNO      BOOLEAN            SEND NOOP BIT
 IPIVER   SUBRANGE 0,77777B  REQUESTED IPI PROTOCOL VERSION
 CCVER    PPWORD             REQUESTED CC PROTOCOL VERSION
 MAXPDU   STRUCT 4           MAXIMUM CCPDU SIZE
 K.SNOB   EQU    15          SEND NOOP BIT
 K.SNOM   EQU    100000B     SEND NOOP MASK
 K.VERM   EQU    77777B      VERSION MASK

 VERP     RECEND

*         CHANNEL CONNECTION (CC) PARAMETER - 51(16)

 CCP      RECORD PACKED

 PARML    STRUCT 1           LENGTH OF THE REMAINDER OF THE PARAMETER
 PARMID   STRUCT 1           PARAMETER ID
 KIND     STRUCT 1           CCPDU KIND
 PAD      STRUCT 3           PAD TO 32 BIT OFFSET
 LEN1     PPWORD             UPPER 16 BITS OF PDU LENGTH
 LEN2     PPWORD             LOWER 16 BITS OF PDU LENGTH
 CCREM    STRUCT 8           REMAINDER OF CCPDU (KIND DEPENDENT)

 CCP      RECEND
          SPACE  4,15
**        MASTER CONTROL TABLE.

 MCT      RECORD PACKED

 FLAGS    PPWORD             FLAGS WORD
          ALIGN  48,64
 DEVID    PPWORD             DEVICE IDENTIFIER

 NOR      STRUCT B.UQD       NORMAL QUEUE
 PRI      STRUCT B.UQD       PRIORITY QUEUE

          ALIGN  32,64
 BPDESC   RMA                BUFFER POOL DESCRIPTOR POINTER (RMA)

 INIT     EQU    15          UNIT INITIALIZED (BIT POSITION IN 'FLAGS' FIELD)

 MCT      RECEND
          SPACE  4,10
**        BUFFER POOL DESCRIPTOR
*
 BPD      RECORD PACKED

          ALIGN  32,64
 BPRMA    RMA                RMA OF BUFFER POOL

          ALIGN  48,64
 IN       PPWORD             IN POINTER

          ALIGN  48,64
 CPUOUT   PPWORD             CPU OUT POINTER

          ALIGN  48,64
 PPOUT    PPWORD             PP OUT POINTER

 LEN      STRUCT 4           LENGTH OF EACH POOL BUFFER (CM BYTES)
 THRESH   PPWORD             BUFFER POOL THRESHOLD, CPU WILL BE NOTIFIED IF
*                            POOL SIZE GOES BELOW THIS VALUE
 LIMIT    PPWORD             LENGTH OF CIRCULAR BUFFER (CM BYTES)

 BPD      RECEND
          SPACE  4,10
**        BUFFER POOL.
*

 BP       RECORD PACKED

          ALIGN  16,64
 PVA      STRUCT 6           PVA OF BUFFER DESCRIPTOR (PVA)
          ALIGN  32,64
 RMA      RMA                RMA OF BUFFER (RMA)

 BP       RECEND
          SPACE  4,10
**        INTERNAL BUFFER CACHE
*
*         THE PP MAINTAINS A BUFFER CACHE INTERNALLY. THE
*         CACHE CONTAINS ENOUGH BUFFERS TO HOLD A MAXIMUM
*         SIZED CCPDU. THE CACHE IS STRUCTURED AS AN ARRAY
*         OF RECORDS OF THE FOLLOWING TYPE. THE RECORD IS
*         DEFINED TO BE EQUIVALENT TO NLT$PP_BUFFER_POOL_ENTRY.


 IBC      RECORD PACKED

          ALIGN  16,64
 PVA      STRUCT 6           BUFFER PVA

          ALIGN  32,64
 RMA      STRUCT 4           BUFFER RMA

 IBC      RECEND

          SPACE  4,10
**        BUFFER POOL RMA ARRAY
*
*         THIS RECORD CONSISTS OF AN ADDRESS/LENGTH PAIR
*         WHICH DESCRIBES THE NUMBER OF BYTES TO READ INTO
*         A BUFFER AT THE SPECIFIED ADDRESS. THE RECORD IS
*         DEFINED FOR EASY USE WHEN PERFORMING DMA'S ON AN I4.
*

 BPR      RECORD PACKED

 FILL     PPWORD
 LENGTH   PPWORD
 RMA      STRUCT 4

 BPR      RECEND
          TITLE  ASSEMBLY CONSTANTS.
          SPACE  4,10
**        INSTRUCTION CODES.


 RJMI     EQU    0200B
 LDCI     EQU    2000B
 ADCI     EQU    2100B
 LPCI     EQU    2200B
 LMCI     EQU    2300B
 IAMI     EQU    7100B
 OAMI     EQU    7300B
 FNCI     EQU    7700B
 LPMLI    EQU    102400B
 CRMLI    EQU    106100B
 CWMLI    EQU    106300B
 CHCMI    EQU    107000B
 CMCHI    EQU    107200B
          SPACE  4,10
**        PP STATES.

 PS.NRM   EQU    0           NORMAL
 PS.IDL   EQU    1           IDLE
 PS.HLT   EQU    2           HALTED
          SPACE  4,10
**        DEVICE STATES.

 DS.IS    EQU    0           IN SERVICE
 DS.NRDY  EQU    1           NOT READY
 DS.CV    EQU    2           CHANNEL VERIFICATION
 DS.WOA   EQU    3           WAITING FOR DEVICE OPERATIONAL ACK
 DS.WNR   EQU    4           WAITING FOR DEVICE NOT READY ACK
 DS.ILR   EQU    5           ISSUE LOGICAL RESET
          SPACE  4,10
**        INTERNAL BUFFER CACHE INDEXES.
*

 SMINDX   EQU    0           SMALL BUFFER CACHE INDEX
 LGINDX   EQU    1           LARGE BUFFER CACHE INDEX
          SPACE  4,10
**        IPI ADAPTER FUNCTIONS.

 H0000    EQU    0#0000      MASTER CLEAR ADAPTER
 H0009    EQU    0#0009      SET SELECT OUT
 H0022    EQU    0#0022      FORCE ERROR IN IPI ADAPTER
 H0029    EQU    0#0029      SELECT OUT, FULL WHEN SLAVE IN IS 1
 H0039    EQU    0#0039      SELECT OUT, FULL WHEN SLAVE IN IS 1
 H005B    EQU    0#005B      SET SYNC OUT
 H0062    EQU    0#0062      PORT A SELECT
 H0069    EQU    0#0069      DROP SYNC OUT
 H0071    EQU    0#0071      FULL WHEN SLAVE IN IS 0
 H00E1    EQU    0#00E1      READ STATUS REGISTER
 H00F1    EQU    0#00F1      READ ERROR REGISTER
 H0100    EQU    0#0100      CLEAR DMA ERRORS
 H0111    EQU    0#0111      DROP MASTER OUT
 H0115    EQU    0#0115      REQUEST CLASS 1 INTERRUPTS
 H0122    EQU    0#0122      IPI BUS A OUTPUT PARITY ERROR
 H0200    EQU    0#0200      READ CONTROL REGISTER
 H0222    EQU    0#0222
 H0281    EQU    0#0281      STREAM, READ
 H0300    EQU    0#0300      WRITE CONTROL REGISTER
 H0322    EQU    0#0322      IPI BUS A INPUT PARITY ERROR
 H0381    EQU    0#0381      STREAM, WRITE
 H0422    EQU    0#0422
 H0600    EQU    0#0600      READ DMA ERROR REGISTER
 H0700    EQU    0#0700      READ OPERATIONAL STATUS
 H0800    EQU    0#0800      DMA TERMINATE
 H0A00    EQU    0#0A00      READ T REGISTER
 H0A81    EQU    0#0281      STREAM, READ
 H0B00    EQU    0#0B00      WRITE T PRIME REGISTER
 H0C00    EQU    0#0C00      DMA READ
 H0C22    EQU    0#0C22      ICI OUTPUT PARITY ERROR
 H0D00    EQU    0#0D00      DMA WRITE
 H7E42    EQU    0#7E42      IPI CHANNEL TRANSFER RATE
 H8025    EQU    0#8025      MASTER OUT, FULL WHEN SLAVE IN IS 1
 H8215    EQU    0#8215      SET MASTER OUT, LOGICAL RESET
 H8415    EQU    0#8415      SET MASTER OUT, PHYSICAL RESET
 H9211    EQU    0#9211      DROP SYNC OUT
 H9213    EQU    0#9213      SET SYNC OUT
          SPACE  4,10
**        MISCELLANEOUS EQUATES.

 CH       EQU    15B         CHANNEL NUMBER
 FHT      EQU    8           FUNTION HISTORY TABLE SIZE
 FTOLEN   EQU    100         FUNCTION TIMEOUT IN MILLSECONDS
 IDLD     EQU    4000        IDLE DELAY TIME
 IVBUT    EQU    519         IVB UNIT TYPE
 MAXBPD   EQU    2           MAXIMUM SUPPORTED BUFFER POOLS
 MAXLBUF  EQU    8           MAXIMUM NUMBER OF LARGE BUFFERS NEEDED

*         ALLOW FOR 9 BUFFERS PER MESSAGE. IF THIS IS CHANGED, A CORRESPONDING
*         CHANGE MUST BE MADE IN NAM$INTRANET_LAYER_MGMT_R3, PROCEDURE
*         PROCESS_UNSOLICITED_RESPONSE.

 MAXBUFS  EQU    MAXLBUF+1   MAXIMUM NUMBER OF BUFFERS USED FOR A SINGLE READ
 MAXPR    EQU    3           MAXIMUM CONSECUTIVE PRIORITY REQUESTS
 MAXURQ   EQU    14          MAXIMUM UNIT REQUEST SIZE
 MS50     EQU    777777B     TIMEOUT FOR CERTAIN LOOPS (WAS 50 MILLISECONDS)
 RRL      EQU    3           REQUEST RETRY LIMIT
 SRT      EQU    300         PHYISCAL RESET TIMEOUT (SECONDS)
 RLIE     EQU    49*8        RESPONSE LENGTH IF ERROR
 RPL      EQU    0#10        READ, WRITE COMMAND PACKET LENGTH
 MAXRS    EQU    5+1+MAXBUFS  MAX SIZE OF STANDARD RESPONSE (CM WORDS)
 .INPN    EQU    102600B     INTERRUPT INSTRUCTION
          SPACE  4,10
**        BUS CONTROL EQUATES.
*

 CMDOUT   EQU    0           COMMAND (OUT)
 RSPIN    EQU    1           RESPONSE (IN)
 DATAOUT  EQU    2           DATA OUT
 DATAIN   EQU    3           DATA IN
          SPACE  4,10
**        MASTER/SLAVE DATA STATUS BIT DEFINITIONS.
*

 S.INBUF  EQU    2           INPUT BUFFER AVAILABLE
 S.OUTBUF EQU    3           DATA READY TO SEND
 S.SUC    EQU    7           SUCCESS
          SPACE  4,10
**        IPI HEADER OPCODES.
*
*         THE FIRST 2 DIGITS ARE THE OPCODE. THE LAST 2 DIGITS ARE THE
*         MODIFIER. THE DEFINITIONS ARE THE VALUES FOR RESPONSES. THE
*         CORRESPONDING COMMAND IS THE RESPONSE VALUE + 80H.

 O.NOOP   EQU    0#0000      (CMD/RSP) NO-OP
 O.RSDS   EQU    0#0300      (CMD/RSP) REQUEST/REPORT SLAVE DATA STATUS
 O.RSTAT  EQU    0#0301      (CMD/RSP) REPORT STATUS
 O.ABRT   EQU    0#0800                ABORT OPERATION:
 O.ALC    EQU    0#0801      (CMD)     ABORT LAST COMMAND
 O.ACR    EQU    0#0802      (CMD)     ABORT CURRENT RESPONSE
 O.DIAG   EQU    0#8000                DIAGNOSTIC MESSAGES:
*         EQU    0#8000      (CMD/RSP) DIAGNOSTIC: ECHO RESPONSE
*         EQU    0#8001      (CMD/RSP) DIAGNOSTIC: READ DATA
*         EQU    0#8002      (CMD/RSP) DIAGNOSTIC: WRITE DATA
*         EQU    0#8003      (CMD/RSP) DIAGNOSTIC: LOOPBACK
 O.SL     EQU    0#A700      (CMD/RSP) SUSPEND LINK
 O.RL     EQU    0#A800      (CMD/RSP) RESUME LINK
 O.READ   EQU    0#B000      (RSP)     PACKET READ
 O.WR     EQU    0#B100      (CMD)     PACK WRITE


**        IPI COMMAND/RESPONSE PARAMETER IDS.
*

 PID.CC   EQU    0#51        CHANNEL CONNECTION
 PID.DIAG EQU    0#52        DIAGNOSTIC
 PID.MSDS EQU    0#53        MASTER/SLAVE DATA STATUS
 PID.VER  EQU    0#55        IVB VERSION
 PID.GFC  EQU    0#56        GLOBAL FLOW CONTROL STATUS


**        DIAGNOSTIC RESPONSES
*

 DR.ECHO  EQU    0           ECHO
 DR.READ  EQU    1           READ DATA
 DR.WRT   EQU    2           WRITE DATA
 DR.LOOP  EQU    3           READ/WRITE LOOPBACK
          SPACE  4,10
**        CPU COMMAND CODES.
*

 C.ACK    EQU    0           ACKNOWLEDGE REQUEST
 C.IDLE   EQU    4           STOP PROCESSING UIT REQUESTS
 C.RESUME EQU    5           START PROCESSING UIT REQUESTS
 C.RPM    EQU    6           READ PP MEMORY
 C.PPAD   EQU    9           SELECT PP ADDRESS
 C.WPM    EQU    10          WRITE PP MEMORY
 C.WRTR   EQU    81          WRITE CHANNEL CONNECTION RECORD
 C.DNRACK EQU    117         ACKNOWLEDGMENT OF DEVICE NOT READY STATUS
 C.GFC    EQU    119         CHANGE GLOBAL FLOW CONTROL STATUS
 C.DBUG   EQU    120         DEBUG MODE
 C.RESET  EQU    121         RESET THE LOGICAL LINK
          SPACE  4,10
**        CPU RESPONSE CODES.
*

 R.UNS    EQU    0           UNSOLICITED RESPONSE
 R.INT    EQU    1           INTERMEDIATE RESPONSE
 R.NRM    EQU    2           NORMAL REQUEST TERMINATION
 R.ABN    EQU    3           ABNORMAL REQUEST TERMINATION
          SPACE  4,10
**        LOG RESPONSE TYPES
*
 REC.R    EQU    0           RECOVERED ERROR
 REC.U    EQU    1           UNRECOVERED ERROR
 REC.I    EQU    2           INTERMEDIATE ERROR
 REC.IM   EQU    3           INFORMATIVE MESSAGE
          SPACE  4,10
**        CPU RESPONSE CONDITION CODES.
*

 RC.NODS  EQU    0           NO DETAILED STATUS
 RC.DS    EQU    1           DETAILED STATUS INCLUDED
          SPACE  4,10
**        BUFFER POOL STATUS.
*

 BP.EMPTY EQU    0           BUFFER POOL EMPTY
 BP.THRSH EQU    1           BUFFER COUNT HAS FALLEN BELOW THRESHOLD
 BP.GOOD  EQU    2           BUFFER POOL STATUS GOOD
          SPACE  4,10
**        SEND STATUS (GLOBAL FLOW CONTROL).
*

 SS.CLOSE EQU    0           SEND GLOBAL FLOW CONTROL WINDW IS CLOSED (DATA CANNOT BE SENT)
 SS.OPEN  EQU    1           SEND GLOBAL FLOW CONTROL WINDOW IS OPEN  (DATA MAY BE SENT)
          SPACE  4,10
**        UNSOLICITED RESPONSE CODES
*

 URC.NRDY EQU    1           DEVICE HAS BECOME UNAVAILABLE FOR USE
 URC.RDY  EQU    2           DEVICE HAS BECOME AVAILABLE FOR USE
 URC.IE   EQU    3           INTERNAL OR INTERFACE ERROR
 URC.DE   EQU    8           DEVICE ERROR
 URC.LOG  EQU    9           LOG PP MESSAGE
 URC.CC   EQU    13          CHANNEL CONNECTION READ
 URC.OPER EQU    14          DEVICE OPERATIONAL


**        PROTOCOL VERSIONS SUPPORTED
*

 MAXCC    EQU    1           CHANNEL CONNECTION PROTOCOL
 MAXIPI   EQU    1           IPI CHANNEL PROTOCOL VERSION
 MINCC    EQU    1           CHANNEL CONNECTION PROTOCOL
 MINIPI   EQU    1           IPI CHANNEL PROTOCOL VERSION
          SPACE  4,10
**        SYMPTOM CODES.
*

 E00      EQU    0           CP MUST DECODE STATUS IN RESPONSE PACKET
 E01      EQU    1           FUNCTION TIMEOUT
 E02      EQU    2           CHANNEL EMPTY WHEN ACTIVATED
 E03      EQU    3           PERIOD COUNTER PARITY
 E04      EQU    4           UPPER ICI PARITY
 E05      EQU    5           LOWER ICI PARITY
 E06      EQU    6           IOU ERROR
 E07      EQU    7           INCOMPLETE TRANSFER
 E08      EQU    8           CHANNEL NOT EMPTY
 E09      EQU    9           CENTRAL MEMORY ERROR
 E10      EQU    10          INVALID CM RESPONSE CODE
 E11      EQU    11          CM RESPONSE CODE PARITY ERROR
 E12      EQU    12          CMI READ DATA PARITY ERROR
 E13      EQU    13          JY DATA ERROR
 E14      EQU    14          BAS PARITY ERROR
 E15      EQU    15          LZ ERROR
 E16      EQU    16          JY ERROR
 E17      EQU    17          LX ERROR
 E20      EQU    20          CANT SELECT
 E21      EQU    21          BIT SIGNIFICANT RESPONSE ERROR
 E22      EQU    22          NO SYNC IN
 E23      EQU    23          SYNC IN DID NOT DROP
 E24      EQU    24          IPI SEQUENCE ERROR
 E25      EQU    25          UPPER IPI CHANNEL PARITY
 E26      EQU    26          LOWER IPI CHANNEL PARITY
 E27      EQU    27          SLAVE IN NOT SET
 E28      EQU    28          SLAVE IN DID NOT DROP
 E29      EQU    29          CEF READING REGISTERS
 E30      EQU    30          CHANNEL STAYED ACTIVE
 E31      EQU    31          BUFFER COUNTER PARITY
 E32      EQU    32          SYNC COUNTER PARITY
 E33      EQU    33          LOST DATA
 E34      EQU    34          BUS PARITY
 E35      EQU    35          COMMAND REJECT
 E36      EQU    36          SYNC OUT NOT EQUAL SYNC INS
 E37      EQU    37          BUS B ACKNOWLEDGE INCORRECT
 E39      EQU    39          ENDING STATUS WRONG
 E40      EQU    40          DEVICE AVALIABLE
 E41      EQU    41          DEVICE RESET
 E70      EQU    70          INTERNAL ERROR
 E100     EQU    100         FORCED ERROR DID NOT OCCUR
          SPACE  4,20
**        PROTOCOL ERROR CODES.
*
*         THE FOLLOWING ERROR CODES ARE USED WHEN THE IVB DRIVER
*         DETECTS A PROTOCOL ERROR. PROTOCOL ERRORS ARE DETECTED
*         FOR BOTH THE IPI CHANNEL PROTOCOL AS WELL AS THE CPU-PP
*         INTERFACE PROTOCOL. ERROR CODES IN THE RANGE E200 - E299,
*         DENOTE IPI CHANNEL PROTOCOL ERRORS. THESE ERRORS WILL RESULT
*         IN THE IVB BEING RESET. ERROR CODES IN THE RANGE E300 - E399,
*         DENOTE CPU-PP INTERFACE PROTOCOL ERRORS AND WILL RESULT IN THE
*         PP/DEVICE BEING DOWNED. ERROR CODES GREATER THAN E399 DENOTE
*         CPU-PP INTERFACE TABLE ERRORS AND WILL RESULT IN THE PP HANGING.


*         IPI CHANNEL PROTOCOL ERROR CODES (E200 - E299)

 E200     EQU    200         INVALID IPI READ RESPONSE
 E201     EQU    201         INVALID IPI PARAMETER LENGTH
 E202     EQU    202         RESPONSE SEQUENCE NUMBERS OUT OF SYNC
 E203     EQU    203         MASTER/SLAVE STATUS MISMATCH
 E205     EQU    205         ILLEGAL IPI RESPONSE OPCODE
 E206     EQU    206         INVALID IPI RESPONSE LENGTH
 E207     EQU    207         ILLEGAL READ RESPONSE PARAMETER
 E221     EQU    221         INVALID DIAGNOSTIC SUB-RESPONSE
 E229     EQU    229         TRANSFER SIZE EXCEEDS MAX CCPDU SIZE
 E230     EQU    230         BUFFER REQUIREMENTS EXCEED MAXIMUM

*         CPU-PP INTERFACE PROTOCOL ERROR CODES (E300 - E399)

 E300     EQU    300         RMA NOT A WORD BOUNDARY
 E301     EQU    301         CCPDU LENGTH ERROR
 E302     EQU    302         INVALID UNIT REQUEST COMMAND
 E303     EQU    303         MAXIMUM BURST LENGTH EXCEEDED
 E320     EQU    320         IVB PROTOCOL NEGOTATION FAILED
 E321     EQU    321         INVALID PP REQUEST COMMAND CODE
 E322     EQU    322         CPU - PP ACK REQUEST UNEXPECTED
 E323     EQU    323         UNABLE TO CLEAR CHANNEL LOCK
 E324     EQU    324         INVALID BUFFER POOL DESCRIPTOR
 E325     EQU    325         UNSUPPORTED MAXIMUM CCPDU SIZE

*         CPU-PP INTERFACE TABLE ERROR CODES (E400 - E499)

 E400     EQU    400         PP COMMUNICATION BUFFER NOT A WORD BOUNDARY
 E401     EQU    401         PP COMMUNICATION BUFFER RMA ZERO
 E402     EQU    402         RESERVED FIELD OF THE PP REQUEST QUEUE
                              DESCRIPTOR IS NOT ZERO
 E404     EQU    404         LOGICAL UNIT OF UNIT DESCRIPTOR NOT
                              IN SEQUENCE OR NOT IN RANGE
 E405     EQU    405         RMA OF UNIT INTERFACE TABLE INVALID
 E406     EQU    406         INVALID CHANNEL NUMBER SPECIFIED
                              IN UNIT DESCRIPTOR
 E407     EQU    407         COMMUNICATION BUFFER LENGTH NOT A
                              MULTIPLE OF WORDS OR NOT LONG ENOUGH
 E411     EQU    411         RMA OF INTERRUPT WORD NOT A WORD
                              BOUNDARY
 E412     EQU    412         RMA OF CHANNEL TABLE NOT A WORD
                              BOUNDARY
 E413     EQU    413         LOGICAL UNIT NUMBER NOTEQUAL TO LOGICAL
                              UNIT OF UNIT DESCRIPTOR
 E414     EQU    414         RMA OF UNIT COMMUNICATION BUFFER
                              NOT A WORD BOUNDARY
 E417     EQU    417         RESERVED FIELD OF UNIT REQUEST QUEUE
                              DESCRIPTOR IS NOT ZERO
 E418     EQU    418         INVALID UNIT TYPE
 E419     EQU    419         MASTER CONTROL TABLE TOO SMALL
          TITLE  STORAGE LOCATIONS.
**        DIRECT CELLS.

 T0       CON    IPD-1
 T1       BSSZ   1
 T2       BSSZ   1
 T3       BSSZ   1
 T4       BSSZ   1
 T5       BSSZ   1
 T6       BSSZ   1
 T7       BSSZ   1
 T8       BSSZ   1

*         BC AND RMA ARE T REGISTER PARAMETERS USED FOR DMA.

 BC       BSSZ   3           BYTE COUNT TO READ/WRITE
 RMA      EQU    BC+1        RMA FOR DMA TRANSFER

 BCSFC    BSSZ   1           FUNCTION CODE SAVE FOR BUS CONTROL
 BCSRC    BSSZ   1           BUS CONTROL RETRY COUNT
 BPINDX   BSSZ   1           BUFFER POOL INDEX
 BUFLEN   BSSZ   1           CM BUFFER LENGTH IN PP WORDS
 BYTS     BSSZ   1           BYTES TO MOVE
 CLCUR    BSSZ   1           CHANNEL 14 CLOCK CURRENT VALUE
 CLMCS    BSSZ   1           CLOCK, MICROSECOND
 CLMLS    BSSZ   1           CLOCK, MILLISECOND
 CLSEC    BSSZ   1           CLOCK, SECOND
 CMADR    BSSZ   3           CM ADDRESS
 CML      BSSZ   1           ORDINAL OF LENGTH/ADDRESS PAIRS
 CM.BPD   BSSZ   3           CM ADDRESS OF BUFFER POOL DESCRIPTOR (REFORMATTED)
 CM.MCT   BSSZ   1           A REGISTER OF REFORMATTED MASTER CONTROL TABLE ADDRESS
 CM.QT    BSSZ   3           CM ADDRESS OF UNIT QUEUE TAIL POINTER (REFORMATED)
 CM.RS    BSSZ   3           CM ADDRESS OF RESPONSE BUFFER (REFORMATTED)
 CM.URQ   BSSZ   3           CM ADDRESS OF UNIT REQUEST QUEUE (REFORMATTED)
 DSTATE   CON    DS.NRDY     DEVICE STATE
 FI       BSSZ   1           INDEX TO FUNCTION HISTORY BUFFER
 INN      BSSZ   1           RESPONSE BUFFER 'IN' POINTER
 INPNT    BSSZ   1           WORKING PPIT 'IN' POINTER
 INPOK    BSSZ   1           PP ABLE TO ACCEPT INPUT,0=FALSE
 IP       BSSZ   1           INPUT PENDING FLAG
 LF       BSSZ   1           LAST FUNCTION TO IPI ADAPTER
 LIM      BSSZ   1           LIMIT OF RESPONSE BUFFER (IN 8-BIT BYTES)
 PPNO     BSSZ   1           LOGICAL PP NUMBER
 PPSTATE  CON    PS.IDL      PP STATE

*         P1 AND P2 ARE MOVED TO LOCATION 100B AND 101B AT INITIALIZATION.

 P1       DATA   H*IV*
 IVB0     IF     DEF,IVB0
 P2       DATA   H*B0*
          ENDIF
 IVB4     IF     DEF,IVB4
 P2       DATA   H*B4*
          ENDIF
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
 SNDOK    BSSZ   1           SEND OK, 0= GLOBAL FLOW CONTROL ON, 1=OFF
 STATUS   BSSZ   1           IPI CHANNEL STATUS
 TBYTS    BSSZ   1           TOTAL BYTES TO TRANSFER
 WC       BSSZ   1           WORD COUNT

          ORG    72B
 CM.PIT   BSSZ   3           ADDRESS OF PP INTERFACE TABLE
                             BEFORE INITIALIZATION, (72 - 73) = PPIT RMA
                             AFTER INITIALIZATION, (72 - 74) =
                                REFORMATTED PPIT ADDRESS
 TWO      CON    2           CONSTANT 2
          ORG    100B
 DRNAME   LJM    IPD         INITIALIZE PP DRIVER


 ADATA    BSSZ   1           ACTUAL DATA ACUMULATOR
 AVAIL    BSSZ   1           =0, IF CPU LAST TOLD DEVICE WAS UNAVAILABLE
 BPCNT    BSSZ   2           NUMBER OF BUFFERS NEEDED FROM EACH POOL (INDEXED VIA *BPINDX*)
 BPSIZE   BSSZ   2           BUFFER POOL LENGTHS (INDEXED VIA *BPINDX*)
 BUFCNT   BSSZ   1           BUFFER COUNT
 BYTCNT   BSSZ   1
 CACHE    BSSZ   1           PP INTERNAL BUFFER CACHE ADDRESS
 CCVER    BSSZ   1           CC PROTOCOL VERSION
 CHAN     BSSZ   1           CHANNEL NUMBER
 CHLOCK   BSSZ   1           <> 0, IF CHANNEL LOCKED
 CLOCK    BSSZ   1           CLOCK
 CMLISTL  BSSZ   1
 CM.INT   BSSZ   3           ADDRESS OF INTERRUPT WORD
 CM.CHAN  BSSZ   3           ADDRESS OF CHANNEL INTERLOCK TABLE
 DBUGM    CON    1           0 IF DEBUG MODE ON
*                            1 IF DEBUG MODE OFF
 DEVID    BSSZ   1           DEVICE IDENTIFIER
 EDATA    BSSZ   1           EXPECTED DATA
 EMPBUF   BSSZ   2           EMPTY BUFFER POOL COUNTER
 INTRRPT  BSSZ   1           CPU INTERRUPT INTERVAL
 IPIVER   BSSZ   1           IPI PROTOCOL VERSION
 MAXLRG   BSSZ   1           MAXIMUM NUMBER OF LARGE BUFFERS NEEDED FOR INPUT
 MAXPDU   BSSZ   1           MAXIMUM CCPDU SIZE (ONLY SUPPORT SIZE < 65K)
 MSTAT    BSSZ   1           MASTER STATUS SENT TO IVB
 NIL      VFD    48/0#FFFF80000000,16/0  CYBIL NIL POINTER
 NUMPRI   BSSZ   1           NUMBER OF CONSECUTIVE PRIORITY REQUESTS
 OPSTAT   BSSZ   1           DMA OPERATIONAL STATUS REGISTER
 RCON     BSSZ   1           RESPONSE CONDIION CODE
 RESPC    BSSZ   1           RESPONSE CODE
 RPSEQ    BSSZ   1           NEXT EXPECTED RESPONSE SEQUENCE NUMBER
 RPTCNT   BSSZ   1           DIAGNOSTIC REPEAT COUNT
 RSEQ     BSSZ   1           RECOVERING SEQUENCE NUMBER
 RSTAT    BSSZ   1           RECOVERY STATUS
 RTCNT    BSSZ   1           RETRY COUNT

*         SBUFC AND LBUFC MUST BE CONTIGUOUS
 SBUFC    BSSZ   P.IBC       SMALL BUFFER CACHE (HOLDS 1 BUFFER)
 LBUFC    BSSZ   P.IBC*8     LARGE BUFFER CACHE (HOLDS 8 BUFFERS - 32K)

 SLREC    BSSZ   1           =1, IF *SUSPEND LINK* RECEIVED
 STBI     BSSZ   1           KEY FOR TABLE SEARCH
 TIMEX    BSSZ   1           MULTIPLIER FOR TIMING LOOPS
 UNSC     BSSZ   1           UNSOLICITED RESPONSE CODE
          TITLE  MAIN ROUTINES.
          LIST   F
**        MCL - MAIN CONTROL LOOP.
*
*         THIS ROUTINE IS THE MAIN CONTROL LOOP FOR
*         THE PP. IT DETERMINES THE CURRENT STATE OF THE
*         PP AND CALLS THE CORRESPONDING PP STATE PROCESSOR.
*         THE PP CAN BE IN EITHER IDLE OR NORMAL STATES.
*         IF THE PP IS IN NORMAL STATE DEVICE PROCESSING
*         WILL BE INITIATED WITH A CALL TO THE APPROPRIATE
*         DEVICE STATE PROCESSOR.
*
*         CALLS  ISP, CPS, CVP, DIS, DNR.
*
*         USES   T1.


 MCL      BSS    0
          RJM    IML         INITIALIZE
          LDDL   PPSTATE     PP STATE
          ERRNZ  PS.NRM      NORMAL STATE NOT ZERO
          ZJN    MCL10       IF NOT IN IDLE STATE OR HALTED
          RJM    ISP         IDLE STATE PROCESSOR

*         PP IS IN NORMAL STATE

 MCL10    LDML   TDSP,DSTATE
          STDL   T1
          RJM    0,T1        CALL DEVICE STATE PROCESSOR
          UJN    MCL         LOOP
 TDSP     SPACE  4,10
**        TDSP - DEVICE STATE PROCESSOR TABLE.
*
*         THIS IS A TABLE OF DEVICE STATE PROCESSOR ADDRESSES,
*         INDEXED VIA DEVICE STATE.

 TDSP     BSS    0
          VFD    16/DIS      DEVICE IN SERVICE PROCESSOR
          VFD    16/DNR      DEVICE NOT READY PROCESSOR
          VFD    16/CVP      CHANNEL VERIFICATION PROCESSOR
          VFD    16/CPS      CPU TO PP SYNC PROCESSOR
          VFD    16/CPS      CPU TO PP SYNC PROCESSOR
          VFD    16/ILR      ISSUE LOGICAL RESET
 CPS      SPACE  4,10
**        CPS - CPU TO PP SYNCHRONIZATION.
*
*         THIS ROUTINE AWAITS A CPU TO PP SYNCHRONIZATION
*         REQUEST FROM THE CPU. THIS ROUTINE IS THE STATE
*         PROCESSOR FOR BOTH THE 'WAITING FOR NOT READY ACK'
*         AND THE 'WAITING FOR OPERATIONAL ACK' STATES.
*
*         ENTRY  (DSTATE) = EITHER DS.WOA OR DS.WNR.
*
*         EXIT   STATE CHANGE HAS OCCURRED.
*
*         CALLS  PPR
*

 CPS      SUBR               ENTRY/EXIT
          LDDL   DSTATE      INITIAL DEVICE STATE
          STML   CPSA
 CPS10    PAUSE  2000        PAUSE 2 MILLISECONDS
          RJM    PPR         PROCESS PP REQUESTS
          LDC    **          INITIAL STATE
 CPSA     EQU    *-1
          LMDL   DSTATE      CURRENT DEVICE STATE
          ZJN    CPS10       IF NO STATE CHANGE
          UJN    CPSX        EXIT
 CVP      SPACE  4,10
**        CVP - CHANNEL VERIFICATION PROCESSOR
*
*         THIS ROUTINE WILL RUN THE CHANNEL VERIFICATION
*         TESTS WITH THE IVB.


 CVP      SUBR               ENTRY/EXIT
 CVP10    RJM    PPR         PROCESS PP REQUESTS
          LDDL   PPSTATE     PP STATE
          LMN    PS.NRM
          NJN    CVPX        IF STATE CHANGE - EXIT
          LDDL   DSTATE      DEVICE STATE
          LMN    DS.CV
          NJN    CVPX        IF STATE CHANGE - EXIT
          LDDL   INPOK
          NJN    CVP30       IF BUFFERS ALREADY OBTAINED
          RJM    GRB         GET BUFFERS
          NJN    CVP30       IF ENOUGH BUFFERS OBTAINED
          RJM    RCB         RETURN BUFFERS
          RJM    SEL         SELECT IVB
          RJM    SNO         SEND *NO-OP* COMMAND
 CVP20    RJM    DCM         DESELECT DEVICE
          UJN    CVP10

 CVP30    RJM    CFI         CHECK FOR MESSAGE
          LDDL   IP
          ZJK    CVP10       IF NO INPUT
          RJM    SEL         SELECT IVB
          RJM    RRP         READ RESPONSE
          NJK    CVP150      IF ERROR OR *SUSPEND LINK* READ
          LDML   RPBF+/IP/P.OPCODE
          LMK    O.NOOP
          ZJN    CVP20       IF *NO-OP* RESPONSE
 CVP40    LMK    O.RL&O.NOOP
          ZJN    CVP60       IF *RESUME LINK* RESPONSE
          LMK    O.DIAG&O.RL
          SHN    -8
          ZJN    CVP80       IF *SLAVE DIAGNOSTIC* RESPONSE
          LDC    E205        ILLEGAL IPI RESPONSE
          STDL   T7
          LDML   RPBF+/IP/P.OPCODE
 CVP50    STML   LRS+/RS/P.OPCD  SAVE ERROR INFO IN LOG MESSAGE
          LDDL   T7          ERROR CODE
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

*         *RESUME LINK* RESPONSE RECEIVED

 CVP60    RJM    SRL         SEND *RESUME LINK* COMMAND
          NJK    CVP20       IF UNABLE TO SEND *RESUME LINK* COMMAND
          RJM    SRS         REPORT GLOBAL FLOW CONTROL WINDOW OPEN
          NJN    CVP70       IF ERRORS EXIT
          RJM    DCM         DESELECT IVB
          NJK    CVP10       IF ERRORS
          RJM    SDO         SEND DEVICE OPERATIONAL RESPONSE
 CVP70    RJM    RIC         RESET INTERNAL CACHE BUFFER COUNT
          UJK    CVPX        EXIT

*         PROCESS *SLAVE DIAGNOSTIC* RESPONSE

 CVP80    BSS    0
          LDML   RPBF+/IP/P.OPCODE  DETERMINE DIAGNOSTIC TYPE
          LPC    0#FF
          STDL   T1          DIAGNOSTIC SUB-RESPONSE
          SBN    TDSRL       NUMBER OF VALID DIAGNOSTIC SUB-RESPONSES
          MJN    CVP90       IF VALID DIAGNOSTIC
          LDC    E221        INVALID DIAGNOSTIC SUB-RESPONSE
          STDL   T7          SAVE ERROR CODE
          LDDL   T1          DIAGNOSTIC SUB-RESPONSE
          UJK    CVP50

 CVP90    LDML   RPBF+P.IP+/DIAGP/P.RPTCNT
          STML   RPTCNT      SAVE REPEAT COUNT
          LDML   TDSR,T1
          STDL   T2
          LJM    0,T2        PROCESS DIAGNOSTIC

*         ECHO RESPONSE.

 CVP100   RJM    RRP         READ RESPONSE PACKET
          NJK    CVP150      IF ERROR OR *SUSPEND LINK* RESPONSE
 CVP110   LDC    O.DIAG+DR.ECHO
          RJM    VDR         CHECK RESPONSE
          NJN    CVP130      IF RESPONSE BAD
          RJM    CRC         COPY RESPONSE TO COMMAND
          RJM    SCP         RETURN COMMAND
          NJK    CVP200      IF ERRORS
 CVP120   SOML   RPTCNT
          PJK    CVP100      IF MORE REPETITIONS
 CVP130   RJM    RIC         RESET INTERNAL CACHE BUFFER COUNT
          UJK    CVP20

*         READ DATA.

 CVP140   RJM    RRP
          ZJN    CVP160      IF NO ERRORS
 CVP150   LDDL   DSTATE
          LMN    DS.CV
          NJN    CVP130      IF STATE CHANGE
          LDN    DS.ILR
          STDL   DSTATE
          UJK    CVP70       EXIT

 CVP160   LDC    O.DIAG+DR.READ
          RJM    VDR         CHECK RESPONSE
          NJN    CVP130      IF RESPONSE BAD
          RJM    CDR         READ CHANNEL VERIFICATION DATA
          NJN    CVP170      IF ERROR DURING READ
          SOML   RPTCNT
          PJN    CVP140      IF MORE REPETITIONS
          RJM    CRC         COPY RESPONSE TO COMMAND
          RJM    SCP         RETURN COMMAND
          NJK    CVP200      IF ERRORS
 CVP170   UJK    CVP130

*         WRITE DATA.

 CVP180   LDC    O.DIAG+DR.WRT
          RJM    VDR         CHECK RESPONSE
          NJN    CVP170      IF RESPONSE BAD
          RJM    CRC         COPY RESPONSE TO COMMAND
 CVP190   RJM    SCP         RETURN COMMAND
          ZJN    CVP210      IF NO ERRORS
 CVP200   LDN    DS.ILR      RESET
          STDL   DSTATE
          UJK    CVP70       ERROR EXIT

 CVP210   LDML   RPBF+P.IP+/DIAGP/P.DATLEN  LENGTH OF TRANSFER
          RJM    CDW         WRITE THE DATA FROM CM
          NJN    CVP220      IF ERRORS
          SOML   RPTCNT
          PJN    CVP190      IF MORE REPETITIONS
 CVP220   UJK    CVP170

*         READ/WRITE LOOPBACK.

 CVP230   RJM    RRP         READ RESPONSE PACKET
          NJK    CVP150      IF ERROR OR *SUSPEND LINK* RESPONSE
 CVP240   LDC    O.DIAG+DR.LOOP  CHECK RESPONSE
          RJM    VDR         VALIDATE RESPONSE
          NJN    CVP220      IF RESPONSE BAD
          RJM    CDR         READ THE DATA TO CM
          NJN    CVP220      IF ERROR DURING READ
          RJM    CRC         COPY RESPONSE TO COMMAND
          RJM    SCP         RETURN COMMAND
          NJK    CVP200      IF ERRORS
          LDML   RPBF+P.IP+/DIAGP/P.DATLEN  LENGTH OF TRANSFER
          RJM    CDW         WRITE THE DATA FROM CM
          NJK    CVP220      IF ERRORS
          SOML   RPTCNT
          PJK    CVP230      IF MORE REPETITIONS
          UJK    CVP220

 TDSR     BSS    0           DIAGNOSTIC PROCESSORS
          LOC    0
          CON    CVP110      ECHO RESPONSE
          CON    CVP160      READ DATA
          CON    CVP180      WRITE DATA
          CON    CVP240      LOOPBACK
          LOC    *O
 TDSRL    EQU    *-TDSR      NUMBER OF DIAGNOSTICS
 DIS      SPACE  4,15
**        DIS - DEVICE IN SERVICE.
*
*         THIS ROUTINE IS ENTERED WHEN THE IVB IS
*         IN THE 'IN SERVICE' STATE. THIS ROUTINE
*         INITIATES ALL INPUT/OUTPUT FROM/TO THE IVB.
*         THIS ROUTINE ALSO ISSUES A *NOOP* COMMAND TO
*         THE IVB EVERY FIVE SECONDS IF NO OTHER I/O
*         HAS OCCURRED. UPON ENTRY THE PP INTERNAL BUFFER
*         CACHE IS FULL AND CAPABLE OF SUPPORTING AN
*         INPUT OF MAX CCPDU SIZE.
*
*         ENTRY  (DSTATE) = DS.IS (IN SERVICE),
*
*         EXIT   PP OR DEVICE STATE HAS CHANGED.
*

 DIS      SUBR               ENTRY/EXIT
 DIS10    RJM    PPR         PROCESS PP REQUESTS
          LDDL   PPSTATE
          LMK    PS.NRM
          NJN    DISX        EXIT - PP STATE HAS CHANGED
          LDDL   DSTATE      DEVICE STATE
          LMK    DS.IS
          NJN    DISX        EXIT - DEVICE NO LONGER IN SERVICE
          LDDL   IP
          NJN    DIS20       IF INPUT PENDING
          RJM    CFI         CHECK FOR INPUT
 DIS20    RJM    SEL         SELECT THE IVB
          RJM    URT         UPDATE REAL TIME CLOCK
          LDDL   INPOK
          NJN    DIS30       IF ENOUGH BUFFERS IN CACHE
          RJM    GRB         GET READ BUFFERS
          ZJN    DIS30       IF STILL UNABLE TO GET ENOUGH BUFFERS
          RJM    SRS         SEND REPORT STATUS COMMAND
          NJK    DISX        IF ERRORS
 DIS30    LDDL   IP
          ZJN    DIS40       IF NO INPUT PENDING
          RJM    PIM         PROCESS INPUT
          NJN    DIS70       IF ERROR
 DIS40    RJM    PUR         PROCESS UNIT REQUESTS
          LDD    CLSEC       CHECK TIME SINCE LAST MESSAGE
          SBML   CLOCK
          PJN    DIS50       IF CLOCK HAS NOT WRAPPED
          ADC    10000B
 DIS50    SBN    5           APPROXIMATELY 5 SECOND TIMEOUT
          MJN    DIS70       IF NOT TIME FOR NO-OP COMMAND
          LDC    0
 DISA     EQU    *-1
          NJN    DIS60       IF NOT SENDING NOOPS
          RJM    SNO         ISSUE NO-OP COMMAND
 DIS60    LDD    CLSEC
          STM    CLOCK
 DIS70    RJM    DCM         DESELECT IVB
          UJK    DIS10       LOOP
 DNR      SPACE  4,10
**        DNR - DEVICE NOT READY.
*
*         THIS ROUTINE IS THE 'DEVICE NOT READY' STATE
*         PROCESSOR. THIS ROUTINE IS ENTERED WHEN EITHER:
*         THE DRIVER HAS DETECTED THE IVB NOT RESPONDING,
*         THE DRIVER HAS ISSUED A LOGICAL RESET TO RESET
*         THE IVB, OR A *SUSPEND LINK* RESPONSE HAS BEEN
*         RECEIVED.
*
*         ENTRY  (DSTATE) = DS.NRDY
*                (SLREC) = 0, IF DRIVER NEEDS TO WAIT FOR *SUSPEND LINK*,
*                       <> 0, IF *SUSPEND LINK* HAS ALREADY BEEN
*                             RECEIVED.
*

 DNR      SUBR               ENTRY/EXIT
          LDN    0
          STML   DNRA
          STDL   SNDOK
          STDL   IP
 DNR10    PAUSE  IDLD        DELAY
          RJM    PPR         PROCESS PP REQUESTS
          LDDL   PPSTATE
          LMN    PS.NRM
          NJN    DNRX        EXIT - PP STATE HAS CHANGED
          LDDL   DSTATE
          LMN    DS.NRDY
          NJN    DNRX        EXIT IF DEVICE STATE CHANGED

*         CHECK FOR *SUSPEND LINK* RESPONSE.

          LDML   SLREC       SUSPEND LINK RECEIVED
          NJN    DNR30       IF SUSPEND LINK ALREADY RECEIVED
          RJM    CFI         CHECK FOR INPUT FROM IVB
          LDDL   IP
          ZJN    DNR10       IF NO INPUT READY
          RJM    SEL         SELECT THE IVB
          RJM    RRP         READ RESPONSE PACKET
          ZJN    DNR20       IF NOT SUSPEND LINK
          LDML   SLREC
          NJN    DNR40       IF SUSPEND LINK
          LDN    DS.ILR
          STDL   DSTATE
          UJK    DNRX        EXIT IF CANT READ RESPONSE
 DNR20    LDML   RPBF+/IP/P.OPCODE  IPI HEADER OPCODE/MODIFIER
          STML   LRS+/RS/P.OPCD  PLACE IN LOG MESSAGE
          LDC    E205        ILLEGAL RESPONSE
          RJM    PPE         PROCESS PROTOCOL ERROR

 DNR30    RJM    SEL         SELECT IVB
 DNR40    LDN    0
          STML   SLREC       CLEAR SUSPEND LINK RECEIVED FLAG
          LDML   RPBF+P.IP+/VERP/P.SNO  SEND NOOP FLAG
          SHN    -/VERP/K.SNOB
          STML   DISA        SET SWITCH
          LDML   RPBF+P.IP+/VERP/P.IPIVER  IPI CHANNEL PROTOCOL VERSION
          LPC    /VERP/K.VERM
          STML   IPIVER      SAVE IPI PROTOCOL VERSION
          SHN    8
          ADML   RPBF+P.IP+/VERP/P.CCVER  CC PROTOCOL VERSION
          STML   LRS+/RS/P.ADATA  PROTOCOL VERSIONS PROPOSED BY IVB
          LDML   IPIVER      PROPOSED IPI PROTOCOL
          ADC    -MINIPI
          MJN    DNR43       IF PROPOSED LESS THAN MINIMUM
          SBN    MAXIPI-MINIPI+1
          MJN    DNR47       IF PROPOSED PROTOCOL OK
          ZJN    DNR45       IF PROPOSED + 1 EQUAL MAXIPI
 DNR43    LDC    E320        ERROR CODE
          STM    DNRA
 DNR45    LDML   RPBF+P.IP+/VERP/P.IPIVER  IPI CHANNEL PROTOCOL VERSION
          LPC    /VERP/K.SNOM
          ADN    MAXIPI
          STML   RPBF+P.IP+/VERP/P.IPIVER  IPI CHANNEL PROTOCOL VERSION
          LDN    MAXIPI
          STML   IPIVER
 DNR47    LDML   RPBF+P.IP+/VERP/P.CCVER  CC PROTOCOL VERSION
          STML   CCVER       SAVE CC PROTOCOL VERSION
          ADC    -MINCC
          MJN    DNR50       IF PROPOSED LESS THAN MINIMUM
          SBN    MAXCC-MINCC+1
          MJN    DNR57       IF VERSION OK
          ZJN    DNR54       PROPOSED - 1 EQUALS MAXCC
 DNR50    LDC    E320
          STM    DNRA
 DNR54    LDN    MAXCC
          STML   RPBF+P.IP+/VERP/P.CCVER  CC PROTOCOL VERSION
          STML   CCVER
 DNR57    LDML   RPBF+P.IP+/VERP/P.MAXPDU
          ZJN    DNR60       IF CCPDU SIZE SUPPORTED
          LDC    E325        UNSUPPORTED MAX CCPDU SIZE
          STM    DNRA
          LCN    0
          STML   RPBF+P.IP+/VERP/P.MAXPDU+1
          LDN    0
          STML   RPBF+P.IP+/VERP/P.MAXPDU
          UJN    DNR65       SEND SUSPEND LINK


 DNR60    LDML   RPBF+P.IP+/VERP/P.MAXPDU+1
          STML   MAXPDU      SAVE MAXIMUM CCPDU SIZE (ONLY SUPPORT SIZE < 65K)
          RJM    IBC         INITIALIZE BUFFER CACHE
 DNR65    RJM    SSL         SEND *SUSPEND LINK* COMMAND
          LDML   DNRA
          NJN    DNR80       IF PROTOCOL ERROR
          RJM    DCM         DESELECT DEVICE
          LDML   DSTATE
          LMN    DS.NRDY
          NJN    DNR70       EXIT IF STATE CHANGING
          LDN    DS.CV       SET DEVICE STATE TO CHANNEL VERIFICATION
          STDL   DSTATE
 DNR70    UJK    DNRX        EXIT

 DNR80    LDN    MAXIPI      MAXIMUM SUPPORTED IPI PROTOCOL
          SHN    8
          ADN    MAXCC       MAXIMUM CC SUPPORTED PROTOCOL
          STML   LRS+/RS/P.EDATA  SUPPORTED PROTOCOL VERSIONS
          LDC    0           PROTOCOL NEGOTIATION FAILURE
 DNRA     EQU    *-1         SYMPTOM CODE IF ERROR
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 ISP      SPACE  4,10
**        ISP - IDLE STATE PROCESSOR.
*
*         THIS ROUTINE IS ENTERED WHEN THE PP HAS
*         BEEN IDLED VIA A PP REQUEST.
*
*         ENTRY  (PPSTATE) = PS.IDL.
*
*         EXIT   (PPSTATE) <> PS.IDL.
*
*         CALLS  CCL, PPR, SCL.
*

 ISP      SUBR               ENTRY/EXIT
          LDML   CHLOCK
          ZJN    ISP10       IF CHANNEL NOT LOCKED
          RJM    CCL         CLEAR CHANNEL LOCK
 ISP10    RJM    PPR         PROCESS PP REQUESTS
          LDDL   PPSTATE     PP STATE
          ERRNZ  PS.NRM      NORMAL STATE NOT ZERO
          NJN    ISP10       IF STILL IDLE STATE OR HALTED
 ISP20    RJM    SCL         SET CHANNEL LOCK
          NJN    ISP20       IF NOT LOCKED, RETRY
          LCN    0
          STML   CHLOCK      SET CHANNEL LOCKED FLAG
          UJN    ISPX        EXIT
          TITLE  CHANNEL DIAGNOSTIC ROUTINES.
**        CDR - CHANNEL DIAGNOSTICS READ.
*
*         THIS ROUTINE PERFORMS ALL READ DATA OPERATIONS
*         DURING THE CHANNEL VERIFICATION STATE.
*
*         ENTRY  (RPBF) = DIAGNOSTIC READ OR READ/WRITE RESPONSE.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                   <> 0, IF ERRORS.
*


 CDR80    LDN    0           READ SUCCESSFUL

 CDR      SUBR               ENTRY/EXIT
          RJM    RIC         RESET INTERNAL CACHE BUFFER COUNT
          LDML   MAXPDU      MAXIMUM CCPDU SIZE
          SBML   RPBF+P.IP+/DIAGP/P.DATLEN  LENGTH OF TRANSFER
          MJK    CDR70       IF TRANSFER TOO LARGE
          LDML   RPBF+P.IP+/DIAGP/P.DATLEN  LENGTH OF TRANSFER
          RJM    SFR         SETUP FOR READ
          LDML   RPBF+P.IP+/DIAGP/P.DATLEN  LENGTH OF TRANSFER
          RJM    RDD         READ DATA DMA
          ZJN    CDR10       IF NO ERRORS DETECTED
          LDN    0           UNSUCCESSFUL STATUS
          UJN    CDR20

 CDR10    LDC    /STATP/K.SUC  SUCCESSFUL STATUS
          ADDL   INPOK       GLOBAL FLOW CONTROL
 CDR20    RJM    ESS         ENDING STATUS SEQUENCE
          NJK    CDR60       IF SLAVE STATUS NOT RECEIVED
          LDDL   STATUS      SLAVE STATUS
          SHN    17-/STATP/SUC
          MJK    CDR80       IF SUCCESSFUL
 CDR30    LDML   IOERR+/ILD/P.SCODE
          NJN    CDR50       IF HOST DETECTED ERROR
          RJM    ASS         ANALYZE SLAVE STATUS
 CDR40    STML   IOERR+/ILD/P.SCODE
 CDR50    LDC    IOERR
          RJM    CEP         LOG ERROR
 CDR60    LDN    DS.ILR
          STDL   DSTATE      RESET DEVICE
          UJK    CDRX        EXIT


 CDR70    LDML   RPBF+P.IP+/DIAGP/P.DATLEN  LENGTH OF TRANSFER
          STML   LRS+/RS/P.ADATA
          LDC    E229        TRANSFER SIZE TOO LARGE
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 CDW      SPACE  4,10
**        CDW - CHANNEL DIAGNOSTICS WRITE.
*
*         THIS ROUTINE PROCESSES ALL WRITE OPERATIONS
*         DURING THE CHANNEL VERIFICATION STATE.
*
*         ENTRY  (A) = NUMBER OF BYTES TO TRANSFER.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                   <> 0, IF ERRORS.
*
*         USES   T1, T2.
*
*         CALLS  CEP, ESS

 CDW70    LDML   IOERR+/ILD/P.SCODE  NON-ZERO IF ERROR DETECTED
          ZJN    CDW80       IF NO ERRORS DETECTED
          LDN    0
          UJN    CDW90

 CDW80    LDC    /STATP/K.SUC  SUCCESSFUL STATUS
          ADDL   INPOK       GLOBAL FLOW CONTROL STATUS
 CDW90    RJM    ESS         ENDING STATUS SEQUENCE
          NJN    CDW130      IF SLAVE STATUS NOT RECEIVED
          LDDL   STATUS      SLAVE STATUS
          SHN    17-/STATP/SUC
          MJK    CDW140      IF SUCCESSFUL
 CDW100   LDML   IOERR+/ILD/P.SCODE
          NJN    CDW120      IF HOST DETECTED ERROR
          RJM    ASS         ANALYZE SLAVE STATUS
 CDW110   STML   IOERR+/ILD/P.SCODE
 CDW120   LDC    IOERR
          RJM    CEP         LOG ERROR
 CDW130   LDN    DS.ILR
          STDL   DSTATE      RESET DEVICE
          UJN    CDWX        EXIT

 CDW140   LDN    0           WRITE SUCCESSFUL


 CDW      SUBR
          STML   EDATA
          STDL   TBYTS       TOTAL BYTES TO TRANSFER
          LDN    0
          STML   ADATA
          STDL   CML         RESET OFFSET OF LENGTH/ADDRESS PAIRS
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0381       STREAM, WRITE
          RJM    ICF         RAISE MASTER OUT
 IVB0     IF     DEF,IVB0
          ACN    CH
 IVB0     ENDIF
 CDW10    LDML   RS+/RS/P.DLEN,CML  LENGTH OF BUFFER
          STDL   BUFLEN
          LDDL   TBYTS       BYTES TO TRANSFER
          SBDL   BUFLEN
          PJN    CDW20       IF ALL DATA IN BUFFER TO BE TRANSFERRED
          LDDL   TBYTS
          STDL   BUFLEN
 CDW20    LDDL   BUFLEN      BYTES TO TRANSFER FROM CURRENT BUFFER
 IVB0     IF     DEF,IVB0
          ADN    1           ROUND UP
          SHN    -1          CONVERT TO PP WORDS
          STDL   WC
          SHN    1           BYTE COUNT
          RAML   ADATA       INCREMENT ACTUAL DATA
          LRML   BPRMA+/BPR/P.RMA,CML
          LDML   BPRMA+/BPR/P.RMA+1,CML  DATA START ADDRESS
          SHN    -3
          CMCH   WC,CH
          LDDL   WC
          NJN    CDW30       IF INCOMPLETE TRANSFER
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          STDL   BC
          RAML   ADATA
          LDML   BPRMA+/BPR/P.RMA,CML
          STDL   RMA
          LDML   BPRMA+/BPR/P.RMA+1,CML
          STDL   RMA+1
          LDC    H0D00       DMA WRITE
          RJM    ICF
          ACN    CH
          LDN    3
          OAM    BC,CH       BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
          RJM    WTE         WAIT UNTIL T' REGISTER EMPTY
          NJK    CDW30
 IVB4     ENDIF
          ERRNZ  P.BPR-4
          LDN    P.BPR
          RADL   CML         INCREMENT LENGTH/ADDRESS PAIR OFFSET
          LDDL   TBYTS
          SBDL   BUFLEN
          STDL   TBYTS       BYTES LEFT TO TRANSFER
          ZJN    CDW40       IF ALL DATA SENT
          UJK    CDW10

 CDW30    LDN    E07         INCOMPLETE TRANSFER
          STML   IOERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
          LDML   EDATA
          STML   IOERR+/ILD/P.EDATA
          LDML   ADATA       BYTES WRITTEN IF THIS OPERATION HAD COMPLETED
          SBDL   WC          WC IS PP WORDS NOT WRITTEN
          SBDL   WC
          STML   IOERR+/ILD/P.ADATA  ACTUAL BYTES WRITTEN
          UJN    CDW60       CONTINUE

 CDW40    BSS    0
 IVB0     IF     DEF,IVB0
          LDC    64          MULTIPLY LOOP TO 15 SECONDS
          STML   TIMEX
 CDW45    BSS    0
          LCN    0
 CDW50    IJM    CDW60,CH    IF SLAVE IN DROPPED
          SBN    1
          NJN    CDW50       IF NOT TIMED OUT
          SOML   TIMEX
          NJN    CDW45       IF NOT COMPLETE
          DCN    CH+40B
          LDN    E28         SLAVE IN DID NOT DROP
          STML   IOERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
          UJK    CDW120      LOG ERROR
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          RJM    WTC         WAIT TRANSFER COMPLETE
          NJK    CDW30
 IVB4     ENDIF
 CDW60    CFM    CDW70,CH    IF CHANNEL ERROR FLAG CLEAR
          LDC    IOERR       ERROR INFO BUFFER
          RJM    EFP         ERROR FLAG PROCESSING
          UJK    CDW70
 CER      SPACE 4,10
**        CER - CLEAR ERROR REGISTERS
*         THIS ROUTINE WILL CLEAR THE IPI AND DMA
*         ERROR REGISTERS.
*
*         CALLS  SAF.


 CER      SUBR               ENTRY/EXIT
          LDC    H0022
          RJM    SAF         CLEAR IPI ERRORS
 IVB4     IF     DEF,IVB4
          LDC    H0100
          RJM    SAF         CLEAR DMA ERRORS
 IVB4     ENDIF
          UJK    CERX        EXIT
 CRC      SPACE  4,10
**        CRC - COPY RESPONSE TO COMMAND BUFFER.
*
*         THIS ROUTINE COPIES A RECEIVED RESPONSE TO THE COMMAND
*         BUFFER FOR SUBSEQUENT OUTPUT TO THE IVB.
*
*         ENTRY  (RPBF) = RESPONSE TO COPY.
*
*         EXIT   (CPBF) = COPIED RESPONSE.
*
*         USES   T1.


 CRC      SUBR
          LDML   RPBF+/IP/P.LEN  MOVE FIRST WORD (LENGTH)
          STML   CPBF+/IP/P.LEN
          SHN    -1          CONVERT BYTES TO PP WORDS
          SBN    /IP/B.REFNO  SKIP REFERENCE NUMBER
          STDL   T1
 CRC10    LDML   RPBF+/IP/P.OPCODE,T1  COPY FROM OPCODE ON
          STML   CPBF+/IP/P.OPCODE,T1
          SODL   T1
          PJN    CRC10       IF MORE TO COPY
          LDK    0#80        CONVERT THE RESPONSE INTO A COMMAND
          RAML   CPBF+/IP/P.OPCODE
          UJK    CRCX        EXIT
 RIC      SPACE  4,10
**        RIC - RESET INTERNAL CACHE.
*
*         THIS ROUTINE WILL RESET THE INTERNAL CACHE
*         BUFFER NEEDED COUNTS (*BPCNT*) TO INDICATE
*         THAT THE INTERNAL CACHE IS FULL. THIS IS DONE
*         ONLY DURING CHANNEL DIAGNOSTICS WHERE THE SAME
*         BUFFERS ARE USED FOR MULTIPLE READS.
*
*         EXIT   (BPCNT,SMINDX) = 0,
*                (BPCNT,LGINDX) = 0.
*
*

 RIC      SUBR               ENTRY/EXIT
          LDN    0
          STML   BPCNT+SMINDX
          STML   BPCNT+LGINDX
          UJN    RICX        EXIT

 VDR      SPACE  4,10
**        VDR - VALIDATE DIAGNOSTIC RESPONSE.
*
*         THIS ROUTINE VALIDATES THE RECEIVED DIAGNOSTIC
*         RESPONSE.
*
*         ENTRY  (A)= EXPECTED OPCODE AND MODIFIER.
*
*         EXIT   (A) = 0 IF RESPONSE VALID,
*
*         CALLS  PPE.


 VDR      SUBR
          LMML   RPBF+/IP/P.OPCODE
          NJN    VDR10       IF INCORRECT OPCODE/MODIFER
          LDML   RPBF+/IP/P.LEN  CHECK LENGTH
          SBN    B.IP+B.DIAGP-/IP/B.LEN
          NJN    VDR30       IF INCORRECT LENGTH
          LDML   RPBF+P.IP+/DIAGP/P.PARML  CHECK PARAMETER AND LENGTH
          LMK    0#0752
          ZJN    VDRX        IF CORRECT PARAMETER AND LENGTH
 VDR10    BSS    0
          LDC    E205        ILLEGAL DIAGNOSTIC RESPONSE
 VDR20    STDL   T6          SAVE ERROR CODE
          LDML   RPBF+/IP/P.OPCODE  RESPONSE OPCODE
          STML   LRS+/RS/P.OPCD  PLACE IN LOG MESSAGE
          LDDL   T6          ERROR CODE
          RJM    PPE         PROCESS PROTOCOL ERROR

 VDR30    LDML   RPBF+/IP/P.LEN  RESPONSE LENGTH
          STML   LRS+/RS/P.ADATA  PLACE IN LOG MESSAGE
          LDC    E206        INVALID DIAGNOSTIC RESPONSE LENGTH
          UJN    VDR20
          TITLE  PP REQUEST PROCESSING ROUTINES
 PPR      SPACE  4,10
**        PPR - PROCESS PP REQUESTS.
*
*         THIS ROUTINE WILL PROCESS ALL REQUESTS IN THE PP REQUEST
*         QUEUE ASSUMING THE QUEUE LOCK CAN BE OBTAINED.
*
*         NOTE: IT IS ASSUMED THAT THERE WILL BE ONLY ONE COMMAND
*               PER REQUEST.
*
*         ENTRY  (CM.PIT) = REFORMATED ADDRESS OF PP INTERFACE TABLE.
*
*         USES   P1 - P4, WC.
*
*         CALLS  SPL, SPR, STB.



 PPR      SUBR               ENTRY/EXIT
 PPR10    BSS    0
          LCN    0
          STDL   P1
          STDL   P2
          STDL   P3
          LDC    0#7FFF
          STDL   P4
          LDN    1
          STDL   WC
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          RDCL   P1          CLEAR ACTIVE CHECK BIT
          ADN    /PIT/C.PPQ  CM ADDRESS OF PP REQUEST QUEUE POINTER
          CRML   P1,WC       READ PP QUEUE POINTER
          LDDL   P3          RMA OF NEXT QUEUED PP REQUEST
          ADDL   P4
          ZJN    PPRX        IF NO PP REQUESTS
          RJM    SPL         SET PP QUEUE LOCKWORD
          NJN    PPRX        IF LOCK WAS NOT SET
          STML   RS+/RS/P.XFER
          STML   RS+/RS/P.XFER+1  CLEAR TRANSFER COUNT
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          ADN    /PIT/C.PPQPVA
          CRML   RS,TWO      READ PVA AND RMA OF FIRST REQUEST IN CHAIN
          LDN    C.RQ
          STDL   WC
          LOADF  RS+/RS/P.REQ
          CRML   RQ,WC       READ PP REQUEST
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          ADN    /PIT/C.PPQPVA  CM ADDRESS OF PP QUEUE POINTER
          CWML   RQ,TWO      WRITE PVA AND RMA POINTERS OF NEXT REQUEST
          RJM    CPL         CLEAR PP QUEUE LOCKWORD
          LDML   RQ+/RQ/P.REQCOD  REQUEST CODE
          SHN    -16+/RQ/N.REQCOD+/RQ/L.REQCOD
          STML   STBI        SAVE SEARCH KEY
          LDC    TPPC-2      ADDRESS-2 OF PP COMMAND TABLE
          RJM    STB         SEARCH TABLE
          NJN    PPR20       IF MATCH FOUND

*         PROCESS INVALID COMMAND

          LDML   STBI        INVALID COMMAND CODE
          STML   LRS+/RS/P.OPCD  PLACE IN LOG MESSAGE
          LDC    E321        INVALID PP REQUEST COMMAND CODE
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

*         PROCESS VALID COMMAND.

 PPR20    STDL   P2
          RJM    0,P2        CALL COMMAND PROCESSOR
          LDN    R.NRM       NORMAL RESPONSE
          STML   RESPC
          LDN    /RS/C.XFER*8+8
          STML   RS+/RS/P.RESPL   BYTE LENGTH OF RESPONSE
          LDML   RQ+/RQ/P.RECOV   REQUEST R/I FIELD
          LPC    177400B
          LMML   DEVID
          STML   RS+/RS/P.RECOV   SETUP RESPONSE R/I FIELD
          LDML   RQ+/RQ/P.ALRT
          STML   RS+/RS/P.ALERT    SET UP ALERT MASK FIELD
          LDML   RS+/RS/P.REQ+1
          ADN    /RQ/C.CMDLEN*8
          STML   RS+/RS/P.LASTC+1  SET UP LAST COMMAND RMA
          SHN    -16
          ADML   RS+/RS/P.REQ
          STML   RS+/RS/P.LASTC
          RJM    PRB         PREPARE RESPONSE BUFFER
          LDC    RS          STANDARD RESPONSE BUFFER
          RJM    SPR         SEND PP RESPONSE
          UJK    PPR10       CHECK FOR ANOTHER REQUEST

**        TPPC - TABLE OF PP COMMANDS.
*
*         THE COMMAND TABLE CONTAINS TWO WORD ENTRIES OF THE FOLLOWING FORMAT:
*         BITS 32 - 47, PP COMMAND CODE
*         BITS 48 - 63, COMMAND PROCESSOR ADDRESS.

 TPPC     BSS    0
          VFD    16/C.IDLE,16/IDL     IDLE
          VFD    16/C.RESUME,16/RES   RESUME
          VFD    16/C.DNRACK,16/CPA   DEVICE NOT READY ACK
          VFD    16/C.DBUG,16/SDM     DEBUG MODE
          VFD    16/C.RESET,16/RST    RESET LINK
          VFD    16/C.PPAD,16/SPA     SELECT PP ADDRESS
          VFD    16/C.RPM,16/RPM      READ PP MEMORY
          VFD    16/C.WPM,16/WPM      WRITE PP MEMORY
          CON    0
 CPA      SPACE  4,10
**        CPA - CPU TO PP ACK.
*
*         THIS ROUTINE PROCESSES THE CPU TO PP SYNCHRONIZATION
*         PP COMMAND RECEIVED IN A PP REQUEST.
*
*         ENTRY  (RQ) = PP REQUEST.
*
*         EXIT   (DSTATE) = NEW DEVICE STATE.
*                           IF INITIAL STATE = DS.WNR, THEN NEW STATE = DS.NRDY
*                           IF INITIAL STATE = DS.WOA, THEN NEW STATE = DS.IS
*
*         CALLS  PPE


 CPA      SUBR               ENTRY/EXIT
          LDDL   DSTATE      CURRENT DEVICE STATE
          LMN    DS.WNR
          ZJN    CPA10       IF CURRENT DEVICE STATE = WAITING FOR NOT READY ACK
          LMN    DS.WOA&DS.WNR
          NJN    CPA30       IF INTERFACE PROTOCOL ERROR
          LDN    DS.IS       DEVICE IN SERVICE
          UJN    CPA20

 CPA10    LDN    DS.NRDY     DEVICE NOT READY
 CPA20    STDL   DSTATE      CHANGE DEVICE STATE
          UJN    CPAX        EXIT

 CPA30    LDC    E322        CPU-PP OUT OF SYNCH
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 IDL      SPACE  4,10
**        IDL - IDLE COMMAND PROCESSOR
*
*         THIS ROUTINE PROCESSES THE PP IDLE COMMAND
*         RECEIVED IN A PP REQUEST. THIS ROUTINE ALSO
*         CALLS *RCB* TO RETURN ALL CM BUFFERS THE PP
*         IS HOLDING IN ITS INTERNAL BUFFER CACHE. IT
*         SHOULD BE NOTED THAT *RCB* ISSUES A PP RESPONSE
*         AS A PART OF RETURNING BUFFERS AND THAT THAT
*         RESPONSE MUST BE ISSUED BEFORE THE RESPONSE
*         FOR THIS IDLE REQUEST IS ISSUED.
*
*         ENTRY  (RQ) = PP REQUEST.
*
*         EXIT   (PPSTATE) = PS.IDL.
*
*         CALLS  RCB


 IDL      SUBR               ENTRY/EXIT
          RJM    RCB         RETURN CM BUFFERS
          LDN    PS.IDL
          STDL   PPSTATE     PLACE PP IN IDLE STATE
          UJN    IDLX        EXIT
 RES      SPACE  4,10
**        RES - RESUME COMMAND PROCESSOR.
*
*         THIS ROUTINE PROCESSES THE PP RESUME COMMAND
*         RECEIVED IN A PP REQUEST.
*
*         ENTRY  (RQ) = PP REQUEST.
*
*         EXIT   (PPSTATE) = PS.NRM.

 RES      SUBR               ENTRY/EXIT
          LDN    PS.NRM
          STDL   PPSTATE     PLACE PP IN NORMAL STATE
          UJN    RESX        EXIT
 RPM      SPACE  4,10
**        RPM - READ PP MEMORY.
*
*         THIS PP REQUEST READS PP MEMORY CHANGES.
*
*         ENTRY  (RQ) = PP REQUEST.
*
*         USES   T5.
          SPACE  2
 RPM      SUBR               ENTRY/EXIT
          LDML   RQ+/RQ/P.CMDLEN GET LENGTH OF OVERLAY
          ADK    7
          SHN    -3          CONVERT LENGTH TO LENGTH IN CM WORDS
          STDL   T5          SAVE OVERLAY LENGTH FOR TRANSFER
          LOADF  RQ+/RQ/P.CMDRMA  REFORMAT CM ADDRESS
          CRML   **,T5       READ IN CHANGES.
 RPMA     EQU    *-1
          UJN    RPMX        EXIT
 RST      SPACE  4,10
**        RST - RESET LINK.
*
*         THIS ROUTINE PROCESSES THE PP RESET LINK
*         COMMAND RECEIVED IN A PP REQUEST. THIS
*         ROUTINE DOES NOT PERFORM THE ACTUAL RESET,
*         RATHER IT CHANGES THE CURRENT DEVICE STATE
*         WHICH WILL RESULT IN A LINK RESET.
*
*         ENTRY  (RQ) = PP REQUEST.
*
*         EXIT   (DSTATE) = DS.ILR.
*

 RST      SUBR               ENTRY/EXIT
          LDN    DS.ILR      ISSUE LOGICAL RESET
          STDL   DSTATE
          UJN    RSTX        EXIT
 SDM      SPACE  4,10
**        SDM - SET DEBUG MODE.
*
*         THIS ROUTINE PROCESSES THE SET DEBUG MODE COMMAND.
*
*         CALLS  PPE


 SDM10    LDC    E321
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

 SDM      SUBR               ENTRY/EXIT
          LDML   RQ+/RQ/P.CMDRMA+1
          ZJN    SDM20       IF DEBUG MODE ON
          SBN    1
          NJN    SDM10       IF INVALID COMMAND
          LDN    1
 SDM20    STML   DBUGM
          UJN    SDMX        EXIT

 SPA      SPACE  4,10
**        SPA - SELECT PP MEMORY.
*
*         THIS PP REQUEST SAVES THE PP ADDRESS
*         FOR READ AND WRITE MEMORY REQUESTS.
*
*         ENTRY  (RQ) = PP REQUEST.
          SPACE  2
 SPA      SUBR               ENTRY/EXIT
          LDML   RQ+/RQ/P.CMDRMA+1  GET SECOND HALF OF PP MEM ADDR
          STML   RPMA        SAVE PP ADDRESS
          STML   WPMA
          UJN    SPAX        EXIT
 WPM      SPACE  4,10
**        WPM - WRITE PP MEMORY.
*
*         THIS PP REQUEST WRITES REQUESTED PP MEMORY
*         TO CENTRAL MEMORY.
*
*         ENTRY  (RQ) = PP REQUEST.
*
*         USES   T5, T6.


 WPM      SUBR               ENTRY/EXIT
          LDML   RQ+/RQ/P.CMDLEN GET BYTE COUNT
          ADK    1
          SHN    -1          GET PP WORD COUNT
          STDL   T6          SAVE PP WORD COUNT
 IVB0     IF     DEF,IVB0
          LDK    37777B      GET MAX PP MEMORY ADDRESS
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LDK    17777B      GET MAX PP MEMORY ADDRESS
 IVB4     ENDIF
          SBML   WPMA        SUBTRACT STARTING PT. OF COPY
          STDL   T5          SAVE MAX LENGTH OF COPY
          SBDL   T6          SUBTRACT REQUESTED LENGTH
          MJN    WPM10       IF REQUESTED LENGTH TOO LARGE, SKIP
          LDDL   T6          RESET TRANSFER LENGTH TO REQUESTED LENGTH
          STDL   T5
 WPM10    LDDL   T5          GET PP WORD LENGTH OF TRANSFER
          ADK    3
          SHN    -2          CONVERT PP WORD COUNT TO CPU WORD COUNT
          STDL   WC          SAVE CPU WORD COUNT FOR CM WRITE
          LOADF  RQ+/RQ/P.CMDRMA  REFORMAT CM ADDRESS
          CWML   **,WC       COPY PP MEMORY TO CM
 WPMA     EQU    *-1
          UJK    WPMX        EXIT
          TITLE  COMMAND SUBROUTINES.

 ACR      SPACE  4,10
**        ACR - ABORT CURRENT RESPONSE.
*
*         THIS ROUTINE WILL SEND A *ABORT CURRENT RESPONSE*
*         COMMAND TO THE IVB. THE IVB MUST HAVE ALREADY BEEN
*         SELECTED. THE SEQUENCE NUMBER OF THIS COMMAND AND
*         THE NEXT RESPONSE READ MUST BE EQUAL TO THE SEQUENCE
*         NUMBER OF THE RESPONSE BEING ABORTED.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*
*         CALLS  SCP.
*


 ACR10    LDML   ACRLC
          STML   CPBF+/IP/P.REFNO
          RJM    PFR         PAUSE FOR RECOVERY
          RJM    VBR         RESELECT BOARD
          LDN    0

 ACR      SUBR               ENTRY/EXIT
          LDML   CPBF+/IP/P.REFNO
          STML   ACRLC       SAVE LAST COMMAND SEQUENCE NUMBER
          LDML   RPSEQ
          STML   CPBF+/IP/P.REFNO
          DPM    CPBF+/IP/P.REFNO  DECREMENT REFERENCE NUMBER
          LDN    B.IP-/IP/B.LEN  SET LENGTH
          STML   CPBF+/IP/P.LEN
          LDK    O.ACR+0#80  SET ABORT LAST RESPONSE
          STML   CPBF+/IP/P.OPCODE
          RJM    SCP         SEND COMMAND PACKET
          ZJK    ACR10       EXIT IF NO ERRORS
          LDN    DS.ILR
          STDL   DSTATE      RESET IF ERROR
          UJK    ACRX        EXIT

 ACRLC    BSSZ   1           SAVE LAST COMMAND SEQUENCE NUMBER


 ALC      SPACE  4,10
**        ALC - ABORT LAST COMMAND.
*
*         THIS ROUTINE WILL SEND A *ABORT LAST COMMAND*
*         COMMAND TO THE IVB. THE IVB MUST HAVE ALREADY BEEN
*         SELECTED. THE SEQUENCE NUMBER OF THIS COMMAND AND
*         THE NEXT COMMAND SEND MUST BE EQUAL TO THE SEQUENCE
*         NUMBER OF THE COMMAND BEING ABORTED.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*
*         CALLS  SCP.
*


 ALC10    DPM    CPBF+/IP/P.REFNO  DECREMENT REFERENCE NUMBER
          RJM    PFR         PAUSE FOR RECOVERY
          RJM    VBR         RESELECT BOARD
          LDN    0

 ALC      SUBR               ENTRY/EXIT
          DPM    CPBF+/IP/P.REFNO  DECREMENT REFERENCE NUMBER
          LDN    B.IP-/IP/B.LEN  SET LENGTH
          STML   CPBF+/IP/P.LEN
          LDK    O.ALC+0#80  SET ABORT LAST COMMAND
          STML   CPBF+/IP/P.OPCODE
          RJM    SCP         SEND COMMAND PACKET
          ZJK    ALC10       EXIT IF NO ERRORS
          LDN    DS.ILR
          STDL   DSTATE      RESET IF ERROR
          UJK    ALCX        EXIT
 ASS      SPACE  4,16
**        ASS -  ANALYZE SLAVE STATUS.
*
*         THIS ROUTINE WILL ANALYZE THE SLAVE STATUS TO
*         DETERMINE THE APPROPRIATE SYMPTOM CODE.
*
*         ENTRY  (STATUS) = SLAVE STATUS.
*
*         EXIT   (A) = SYMPTOM CODE.


 ASS30    LDN    E39         ENDING STATUS WRONG

 ASS      SUBR               ENTRY/EXIT
          LDDL   STATUS
          SHN    11
          PJN    ASS10       IF NOT BUS PARITY
          LDK    E34
          UJN    ASSX        EXIT BUS PARITY ERROR

 ASS10    LDDL   STATUS
          LPN    17B
          ZJN    ASS30       IF REPORTING -ENDING STATUS WRONG-
          SBN    9
          NJN    ASS20       IF NOT -SYNC OUTS NOT EQUAL SYNC INS-
          LDK    E36
          UJN    ASSX        EXIT -SYNC OUTS NOT EQUAL SYNC INS-

 ASS20    PJN    ASS30       IF NOT COMMAND REJECT
          LDK    E35
          UJN    ASSX        EXIT COMMAND REJECT

 BCS      SPACE  4,10
**        BCS - BUS CONTROL SEQUENCE.
*
*         THIS ROUTINE PERFORMS THE BUS CONTROL SEQUENCE
*         ON THE IPI CHANNEL.
*
*         **************************************************************
*         * NOTE: THIS ROUTINE DOES NOT RETURN TO ITS CALLER IF        *
*         *       UNRECOVERED ERRORS OCCUR. RATHER THE DEVICE IS RESET *
*         *       AND EXIT IS TO THE MAIN LOOP.                        *
*         **************************************************************
*
*         ENTRY  (A, BIT 1) = 1 IF DATA.
*                (A, BIT 1) = 0 IF COMMAND/RESPONSE.
*                (A, BIT 0) = 1 IF MESSAGE IN.
*                (A, BIT 0) = 0 IF MESSAGE OUT.
*                (A, OTHER BITS) = 0.
*
*         CALLS  CEP, EFP, ICF.


 BCS      SUBR
          SHN    14
          ADC    H005B
          STDL   BCSFC
          LDN    RRL
          STDL   BCSRC
 BCS10    LDDL   BCSFC
          RJM    ICF         SET SYNC OUT
          ACN    CH
          LDN    77B
 BCS20    FJM    BCS30,CH     IF SYNC IN
          SBN    1
          NJN    BCS20       IF TIMEOUT NOT EXPIRED
          DCN    CH+40B
          LDN    E22         NO SYNC IN
          UJN    BCS50       PROCESS ERROR

 BCS30    IAN    CH          GET BUS ACKNOWLEDGE STATUS
          STDL   P5          BUS ACK STATUS
          SFM    BCS80,CH    IF ERROR FLAG SET
          LDDL   LF          LAST FUNCTION
          LMN    H0069&H005B
          RJM    ICF         DROP SYNC OUT
          ACN    CH
          LDN    77B
 BCS40    FJM    BCSX,CH     IF SYNC IN DROPPED
          SBN    1
          NJN    BCS40       IF TIMEOUT NOT EXPIRED
          DCN    CH+40B
          LDN    E23         SYNC IN DID NOT DROP
 BCS50    STML   OTHERR+/ILD/P.SCODE
 BCS60    BSS    0
          SODL   BCSRC
          NJN    BCS70       IF NOT UNRECOVERED
          LDN    DS.ILR      ISSUE LOGICAL RESET
          STDL   DSTATE      CHANGE DEVICE STATE
 BCS70    SRU    OTHERR,BCSRC,REC.I
          LDC    OTHERR
          RJM    CEP         COMMON ERROR PROCESSING  (NO RETURN IF RESET)
          RJM    VBR         VERIFY BOARD READY
          UJK    BCS10       RETRY BUS CONTROL

 BCS80    BSS
          LDC    OTHERR      'OTHER ERROR' INFO BUFFER
          RJM    EFP         ERROR FLAG PROCESSOR
          UJK    BCS60       LOG ERROR
 CCL      SPACE  4,10
**        CCL -  CLEAR CHANNEL LOCK.
*
*         THIS ROUTINE CLEARS THE CHANNEL LOCK IN THE CM
*         CHANNEL TABLE.
*
*         ENTRY  (CM.CHAN) = CHANNEL TABLE ADDRESS,
*                (CHAN) = CHANNEL NUMBER.
*
*         EXIT   CHANNEL IS UNLOCKED.
*
*         USES   T5, T7.
*
*         CALLS  CLK, PPE.


 CCL      SUBR
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDML   CHAN        CHANNEL NUMBER
          STDL   T5
          RJM    CLK         CLEAR CHANNEL LOCKWORD
          ZJN    CCLX        EXIT
          LDC    E323        UNABLE TO CLEAR CHANNEL LOCK
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 CEP      SPACE  4,12
**        CEP - COMMON ERROR PROCESSING.
*
*         THIS ROUTINE IS CALLED TO COMPLETE PROCESSING OF CHANNEL
*         ERRORS. IF THE *FLAGS* FIELD OF THE LOG MESSAGE INDICATES THAT
*         THE IPI AND DMA REGISTERS HAVE NOT BEEN READ THEY ARE READ HERE.
*         THE FUNCTION HISTORY TABLE IS COPIED TO THE LOG MESSAGE BUFFER.
*         THE REMAINDER OF THE BUFFER IS EXPECTED TO BE SETUP BEFORE CEP
*         IS CALLED.
*
*         ***************************************************************
*         * NOTE: THIS ROUTINE DOES NOT RETURN TO ITS CALLER IF THE     *
*         *       DEVICE STATE IS RESET OR THE PP STATE IS HALTED.      *
*         ***************************************************************
*
*         ENTRY  (A) = PP ADDRESS OF ERROR INFO BUFFER.
*
*         CALLS  CEP, CFH, GAR, ILM, SLM.
*
*         USES   T2, T3.


 CEP      SUBR               ENTRY/EXIT
          STDL   T2
          LDML   /ILD/P.FLAGS,T2
          LPC    /ILD/K.LREG
          NJN    CEP10       IF REGISTERS ALREADY READ
          LDDL   T2
          RJM    GAR         READ REGISTERS
 CEP10    LDDL   T2
          RJM    CFH         COPY FUNCTION HISTORY TABLE
          LDML   CEP
          STML   /ILD/P.RES0,T2  SAVE CALLERS P REGISTER
          LDN    P.ILD-1
          STDL   T3
          RADL   T2

*         MOVE TO LRS

 CEP20    LDML   0,T2
          STML   LRS+/RS/P.SCODE,T3
          SODL   T2
          SODL   T3
          PJN    CEP20       IF NOT DONE
          AODL   T2
          LMC    LRS+/RS/P.SCODE
          ZJN    CEP30       IF USING LRS SLM WILL CLEAR
          LDDL   T2
          RJM    ILM         REINITIALIZE BUFFER
 CEP30    RJM    SLM         SEND LOG MESSAGE
          LDDL   PPSTATE
          LMN    PS.HLT
          ZJN    CEP40       IF PP HALTED
          LDDL   DSTATE
          LMN    DS.ILR
          NJK    CEPX        EXIT IF NOT HALTED OR RESET
 CEP40    LJM    MCL         JUMP TO MAIN LOOP
 CFH      SPACE  4,10
**        CFH - COPY FUNCTION HISTORY.
*
*         THIS ROUTINE WILL COPY THE FUNCTION HISTORY TABLE TO
*         A BUFFER DEFINED AS INTERMEDIATE LOGGING DATA.
*
*         ENTRY  A = ADDRESS OF LOGGING BUFFER.
*
*         USES   T7, T8.


 CFH      SUBR               ENTRY/EXIT
          ERRNZ  FHT-8       ERROR IF FHT NOT EQUAL 8
          ADN    FHT-1
          STDL   T7          SAVE BUFFER ADDRESS
          LDN    FHT-1
          STDL   T8          LENGTH OF LOOP
 CFH10    LDML   FBUF,FI     GET ONE ENTRY
          STML   /ILD/P.FHIST,T7  STORE IN BUFFER
          AODL   FI
          LPN    7
          STDL   FI          RESET INDEX
          SODL   T7
          SODL   T8
          MJN    CFHX        IF DONE EXIT
          UJN    CFH10       ELSE CONTINUE
 CFI      SPACE  4,10
**        CFI - CHECK FOR INTERRUPTS.
*
*         THIS ROUTINE WILL REQUEST CLASS 1 INTERRUPTS
*         FROM THE IVB.
*
*         EXIT   (IP) = 0, IF NO INPUT AVAILABLE,
*                     <> 0, IF INPUT AVAILABLE,
*
*         CALLS  CEP, EFP, ICF.


 CFI      SUBR
          LDC    H0115       REQUEST CLASS 1 INTERRUPT
          RJM    ICF         ISSUE CHANNEL FUNCTION
          PAUSE  100         ALLOW TIME FOR IVB TO SET ITS ADDRESS
          LDN    0
          ACN    CH
          EJM    CFI10,CH    IF CHANNEL NOT FULL
          IAN    CH
          LPC    **          CHECK FOR INTERRUPT
 CFIA     EQU    *-1         SLAVE ADDRESS MASK STORED AT INITIALIZATION
 CFI10    STDL   IP
          LDC    H0111       DROP MASTER OUT
          RJM    ICF         ISSUE CHANNEL FUNCTION
          UJK    CFIX        EXIT
 CLK      SPACE  4,10
**        CLK - CLEAR LOCK.
*
*         THIS ROUTINE CLEARS THE LOCK AT THE SPECIFIED
*         CM ADDRESS.
*
*         ENTRY  (T7) = CM TABLE ADDRESS.
*                (T5) = WORD OFFSET OF LOCKWORD.
*
*         EXIT   (A) = 0, IF LOCK CLEARED,
*                (A) <> 0, IF LOCK COULD NOT BE CLEARED.
*
*         USES   T1, T2, T3, T4, T5, T6, T7.
*
*         MACROS LOADR.


 CLK      SUBR               ENTRY/EXIT
 CLK10    LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
 IVB0     IF     DEF,IVB0
          LRIL   T7
          LDML   1,T7        CHANNEL/PP INTERFACE TABLE ADDRESS
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADR  0,T7        CHANNEL/PP INTERFACE TABLE ADDRESS
 IVB4     ENDIF
          ADDL   T5          ADD LOCKWORD OFFSET
          STDL   T6
          RDSL   T1          SET UPPER 32 BITS OF LOCK WORD TO '1'S
          LDDL   T1
          ADDL   T2
          ADC    400001B
          ZJN    CLK10       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          AODL   T5          INSURE T5 NON ZERO
          LDDL   T1
          SHN    17-15
          PJN    CLK20       IF INTERLOCK LOST (RESTORE ORIGINAL CONTENTS)
          LDDL   T4
          LMDL   PPNO        PP NUMBER
          NJN    CLK20       IF SOMEONE ELSE HAS GRABBED THE INTERLOCK
*         LDN    0
          STDL   T1          CLEAR INTERLOCK WORD
          STDL   T2
          STDL   T3
          STDL   T4
          STDL   T5
 CLK20    LDDL   T6
          ADC    400000B
          CWDL   T1          UPDATE INTERLOCK WORD
          LDDL   T5
          UJK    CLKX        EXIT
 CPL      SPACE  4,10
**        CPL - CLEAR PP LOCKWORD.
*
*         THIS ROUTINE CLEARS THE PP REQUEST QUEUE LOCK
*         IN THE PP INTERFACE TABLE.
*
*         USES   T5, T7.
*
*         CALLS  CLK.


 CPL      SUBR
          LDN    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    CLK         CLEAR THE LOCKWORD
          UJK    CPLX        EXIT
 CSW      SPACE  4,28
**        CSW - COMPARE-SWAP ROUTINE.
*
*         THIS ROUTINE DOES A COMPARE-SWAP OF A SPECIFIED WORD.
*         A PSEUDO-LANGUAGE COMPARABLE CALL WOULD BE
*            CALL COMPARE-SWAP(CS_WORD, OLD, NEW, ACTUAL, STATUS)
*            WHERE
*                CS_WORD  = (T7) + (T5) = ADDRESS OF THE WORD TO BE COMPARE/SWAPPED,
*                OLD    = ((P5)) = EXPECTED VALUE OF THE C/S WORD,
*                NEW    = ((A)) UPON ENTRY = REPLACEMENT VALUE OF THE C/S WORD,
*                ACTUAL = (P1 - P4) RETURNED BY ROUTINE *SLR* = ORIGINAL VALUE
*                         OF THE C/S WORD,
*                STATUS = (A) UPON EXIT = SUCCESS/FAILURE OF THE COMPARE-SWAP
*
*         ENTRY  (A)  = ADDRESS OF NEW (REPLACEMENT) VALUE FOR C/S WORD,
*                (P5) = ADDRESS OF OLD (EXPECTED) VALUE IN C/S WORD,
*                (T5) = WORD OFFSET OF C/S WORD,
*                (T7) = CM ADDRESS OF TABLE.
*
*         EXIT   (A) = 0, IF THE COMPARE-SWAP WAS SUCCESSFUL.  (IF THE CONTENTS
*                         OF THE C/S WORD WAS REPLACED BY *NEW*).
*                (A) <> 0, IF THE COMPARE-SWAP FAILED.  (IF THE ORIGINAL
*                          CONTENTS REMAIN IN THE C/S WORD).
*                (P5) = UNDEFINED.
*
*         USES   P1 - P4, T2, T6.
*
*         CALLS  SLR.


*         OLD VALUE WAS NOT IN THE C/S WORD.  RESTORE ORIGINAL VALUE.

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

 CSW      SUBR               ENTRY/EXIT
          STML   CSWA        PLANT PP ADDRESS OF *NEW*
          RJM    SLR         SET LOCK RESERVATION

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

          LDML   0,P5
          LMDL   P1
          NJK    CSW10       IF DIFFERENT
          LDML   1,P5
          LMDL   P2
          NJK    CSW10       IF DIFFERENT
          LDML   2,P5
          LMDL   P3
          NJK    CSW10       IF DIFFERENT
          LDN    1           SIZE OF *NEW* (CM WORDS)
          STDL   WC
          LDDL   T6          OFFSET TO CM WORD
          ADC    400000B
          CWML   **,WC       UPDATE INTERLOCK WORD WITH *NEW*
 CSWA     EQU    *-1         PP ADDRESS OF *NEW*
          LDN    0           CM WORD CONTENTS WERE REPLACED BY *NEW*
          UJK    CSWX        EXIT
 DCM      SPACE  4,15
**        DCM - DESELECT CONTROL MODULE.
*
*         THIS ROUTINE WILL DESELECT THE IVB.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                   <> 0, IF ERRORS.
*
*         CALLS  ICF.


 DCM20    LDN    0

 DCM      SUBR
          LDC    H0071
          RJM    ICF         DROP SELECT OUT
          ACN    CH
          LDC    MS50
 DCM10    FJM    DCM20,CH     IF SLAVE IN DROPPED
          SBN    1
          NJN    DCM10       IF TIMEOUT NOT EXPIRED
          LDN    E28         SLAVE IN DID NOT DROP
          STML   LRS+/RS/P.SCODE
          LDN    DS.ILR
          STDL   DSTATE      RESET DEVICE
          LDC    LRS+/RS/P.SCODE
          RJM    CEP         COMMON ERROR PROCESSING
          UJN    DCMX        EXIT - (A) <> 0
 IVB4     IF     DEF,IVB4
 DCN      SPACE  4,10
**        DCN - DISCONNECT CHANNEL.
*
*         THIS ROUTINE IS TO BE USED IN CONJUNCTION
*         WITH A DMA READ OR WRITE FUNCTION. AFTER
*         ISSUING THE DMA FUNCTION, ACTIVATING THE
*         CHANNEL AND OUTPUTING THE BYTE COUNT AND
*         RMA THIS ROUTINE IS CALLED TO DISCONNECT
*         THE CHANNEL AND CHECK FOR ANY ERRORS DURING
*         THE 3 WORD TRANSFER.
*
*         NOTE: THIS ROUTINE IS NOT TO BE USED AS A
*               GENERAL PURPOSE CHANNEL DISCONNECT
*               ROUTINE.
*
*         ENTRY  THE 3 WORD OUTPUT TO START A DMA OPERATION
*                HAS COMPLETED.
*
*
*         USES   WC.
*
*         CALLS  CEP


 DCN50    BSS
          DCN    CH+40B      DISCONNECT THE CHANNEL
          LDN    0

 DCN      SUBR               ENTRY/EXIT
          STDL   WC          WORDS NOT TRANSFERRED
          SFM    DCN40,CH    IF ERROR FLAG SET
          NJN    DCN30       IF INCOMPLETE TRANSFER
          EJM    DCN50,CH    IF CHANNEL EMPTY
          LDN    E08         CHANNEL NOT EMPTY
 DCN10    BSS
          STML   IOERR+/ILD/P.SCODE
 DCN20    LDN    DS.ILR
          STDL   DSTATE
          LDC    IOERR
          RJM    CEP         COMMON ERROR PROCESSING (NO RETURN)

 DCN30    LDN    6
          STML   IOERR+/ILD/P.EDATA
          SBDL   WC
          SBDL   WC
          STML   IOERR+/ILD/P.ADATA
          LDN    E07         INCOMPLETE TRANSFER
          UJN    DCN10

 DCN40    BSS
          LDC    IOERR
          RJM    EFP         ERROR FLAG PROCESSING
          UJN    DCN20       LOG ERROR
 IVB4     ENDIF
 DGU      SPACE  4,10
**        DGU - DEVICE GONE UNAVAILABLE.
*
*         THIS ROUTINE IS CALLED WHEN THE IVB HAS
*         TRANSITIONED TO THE 'NOT READY' STATE. IF THE
*         IVB WAS IN SERVICE PRIOR TO BECOMING NOT READY,
*         AN UNSOLICITED RESPONSE WILL BE ISSUED AND THE
*         DEVICE STATE SET TO DS.WNR. IF THE IVB WAS NOT IN
*         SERVICE, THE DEVICE STATE WILL BE SET TO DS.NRDY.
*
*         EXIT   (DSTATE) = DS.WNR OR DS.NRDY.
*
*         CALLS  RCB, SUR.


 DGU      SUBR               ENTRY/EXIT
          LDML   AVAIL
          NJN    DGU10       IF DEVICE WAS AVAILABLE
          LDN    DS.NRDY
          STDL   DSTATE      SET DEVICE STATE TO 'NOT READY'
          UJN    DGUX        EXIT

 DGU10    LDN    /RS/C.XFER*8+8
          STML   RS+/RS/P.RESPL  RESPONSE LENGTH
          LDN    URC.NRDY    DEVICE OPERATIONAL RESPONSE
          RJM    SUR         SEND UNSOLICITED RESPONSE
          LDN    0
          STML   AVAIL       DEVICE UNAVAILABLE
          RJM    LAM         LOG AVAILABILITY
          RJM    RCB         RETURN CM BUFFERS
          LDN    DS.WNR
          STDL   DSTATE      WAIT FOR NOT READY ACK
          UJK    DGUX        EXIT
 DMW      SPACE  4,20
**        DMW - DIRECT MEMORY WRITE.
*
*         THIS ROUTINE WILL COMPLETE THE OUTPUT OF A CC PDU.
*
*         ENTRY  BYTCNT = BYTES SENT WITH COMMAND.
*                BYTS = NUMBER OF BYTES SENT FROM CURRENT BUFFER.
*                CML = CURRENT CM LIST INDEX.
*                CMLISTL = NUMBER OF CM LENGTH/ADDRESS PAIRS.
*                P6 = OFFSET TO CURRENT RMA/ADDRESS PAIR.
*                RQ = UNIT REQUEST.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*                BYTCNT = BYTES WRITTEN.
*                WC <> 0 IF TRANSFER NOT COMPLETE.
*
*         USES   P6, WC.
*
*         CALLS  PPE, SCP, USR.


 DMW50    BSS    0
 IVB0     IF     DEF,IVB0
          LDC    64          MULTIPLY LOOP TO 15 SECONDS
          STML   TIMEX
 DMW55    BSS    0
          LCN    0
 DMW60    IJM    DMW70,CH    IF SLAVE IN DROPED
          SBN    1
          NJN    DMW60       IF NOT TIMED OUT
          SOML   TIMEX
          NJN    DMW55       IF NOT COMPLETE
          DCN    CH+40B
          LDN    E28         SLAVE IN DID NOT DROP
          STML   IOERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
          LDN    DS.ILR
          STDL   DSTATE
          LDC    IOERR
          RJM    CEP         LOG ERROR  (NO RETURN)

 DMW70    LDDL   WC
          ZJN    DMW90       IF NO ERRORS
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          RJM    WTC         WAIT TRANSFER COMPLETION
          ZJN    DMW90       IF NO ERRORS
 IVB4     ENDIF
 DMW80    LDML   BYTCNT
          ADDL   BC
          STML   IOERR+/ILD/P.EDATA
          SBDL   WC          WC IS IN PP WORDS
          SBDL   WC
          STML   IOERR+/ILD/P.ADATA
          LDN    E07
          STML   IOERR+/ILD/P.SCODE
 DMW90    CFM    DMW100,CH   IF ERROR FLAG CLEAR
          LDC    IOERR
          RJM    EFP
 DMW100   LDML   IOERR+/ILD/P.SCODE


 DMW      SUBR               ENTRY/EXIT
          LDN    0
          STDL   WC
          LDN    DATAOUT
          RJM    BCS         CONDITION BUS FOR DATA OUT
          LDC    H0381       STREAM, WRITE, DMA
          RJM    ICF         SEND FUNCTION
 IVB0     IF     DEF,IVB0
          ACN    CH
 IVB0     ENDIF
          LDML   RQ+/URQ/P.MBLEN,P6  TOTAL DATA LENGTH IN BUFFER
          SBML   BYTS        LESS BYTES SO FAR
          ZJK    DMW40       EXIT FOR NEXT BUFFER IF ALL FROM THIS ONE
 DMW10    STML   BC          NUMBER OF BYTES LEFT TO TRANSFER TO THE IVB
          ADML   BYTCNT      PLUS BYTES SO FAR
          SBML   MAXPDU      MAX BURST LENGTH OF IVB
          MJN    DMW20       IF NOT TOO MUCH FOR 1 DMA OPERATION
          LDK    E303
          RJM    PPE         LOG MAX LENGTH EXCEEDED  (NO RETURN)

 DMW20    BSS    0
 IVB4     IF     DEF,IVB4
          LDC    H0D00       DMA WRITE
          RJM    ICF         SEND FUNCTION
          LDML   BYTS
          ADML   RQ+/URQ/P.MBRMA+1,P6  LOWER PORTION OF BUFFER ADDRESS
          STDL   RMA+1
          SHN    -16
          ADML   RQ+/URQ/P.MBRMA,P6    UPPER PORTION OF BUFFER ADDRESS
          STDL   RMA
          ACN    CH
          LDN    3
          OAM    BC,CH       BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
          RJM    WTE         WAIT T' REGISTER EMPTY
          NJK    DMW80       IF ERRORS
 IVB4     ENDIF
 IVB0     IF     DEF,IVB0
          LDML   BC          REMAINING BYTES TO BE TRANSFERRED
          SHN    -1          PP WORD COUNT
          STDL   WC          LENGTH OF BUFFER TO BE WRITTEN TO IVB
          LRML   RQ+/URQ/P.MBRMA,P6     UPPER PORTION OF ADDRESS OF DATA BUFFER
          LDML   RQ+/URQ/P.MBRMA+1,P6  LOWER PORTION OF BUFFER ADDRESS
          ADML   BYTS        PLUS BYTES TRANSFERRED SO FAR THIS BLOCK
          SHN    -3
          CMCH   WC,CH
          LDDL   WC
          NJK    DMW50       IF INCOMPLETE WRITE
 IVB0     ENDIF
 DMW30    LDML   BC          BYTES TRANSFERRED
          RAML   BYTCNT      BUMP PROGRESSIVE COUNT
 DMW40    AOML   CML
          SBML   CMLISTL
          ZJK    DMW50       IF NO MORE TO WRITE
          LDN    0
          STML   BYTS
          LDML   CML         CURRENT CM LIST INDEX
          SHN    2           CONVERT TO PP WORD OFFSET
          STDL   P6          OFFSET TO CM LENGTH/ADDRESS PAIR (PP WORDS)
          LDML   RQ+/URQ/P.MBLEN,P6   LENGTH OF DATA BUFFER
          UJK    DMW10       CONTINUE TO WRITE MORE
 DUR      SPACE  4,16
**        DUR - DELINK UNIT REQUEST FROM QUEUE.
*
*         THIS ROUTINE DELINKS THE CURRENT UNIT REQUEST
*         FROM THE APPROPRIATE QUEUE AND UPDATES THE UNIT QUEUE HEAD POINTER
*         TO POINT TO THE NEXT REQUEST IN THE QUEUE.
*
*         ENTRY  (CM.URQ) = REFORMATTED ADDRESS OF REQUEST QUEUE.
*
*         USES   P5, T1 - T4, T5, T7, WC.
*
*         CALLS  CSW.
*
*         MACROS LOADC.


 DUR      SUBR               ENTRY/EXIT
          LDN    1           SIZE OF UNIT QUEUE HEAD POINTER
          STDL   WC

*         UPDATE UNIT QUEUE HEAD POINTER.

 DUR10    BSS    0
 IVB4     IF     DEF,IVB4
          LOADC  CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
 IVB4     ENDIF
 IVB0     IF     DEF,IVB0
          LRDL   CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          LDDL   CM.URQ+1
 IVB0     ENDIF
          ERRNZ  /UQD/C.HEAD OFFSET TO UNIT QUEUE HEAD POINTER IS NOT ZERO
          ADK    /UQD/C.HEAD OFFSET TO UNIT QUEUE HEAD POINTER
          CWML   RQ+/URQ/P.NEXTLN,WC   UPDATE UNIT QUEUE HEAD POINTER
          LDML   RQ+/URQ/P.NEXT     NEXT UNIT REQUEST (UPPER PART)
          ADML   RQ+/URQ/P.NEXT+1   NEXT UNIT REQUEST (LOWER PART)
          NJK    DURX        IF OTHER UNIT REQUESTS IN THIS QUEUE

*         CLEAR UNIT QUEUE TAIL POINTER TO SHOW THAT THERE ARE NO OTHER UNIT
*         REQUESTS IN THIS QUEUE.  IF A NEW UNIT REQUEST IS PLACED IN THE
*         QUEUE WHILE THIS IS BEING DONE, UNIT QUEUE HEAD POINTER WILL BE
*         UPDATED INSTEAD.

          LDK    CM.QT
          STDL   T7          UNIT QUEUE TAIL POINTER
          LDN    0
          STDL   T5          OFFSET TO UNIT QUEUE TAIL POINTER (NO OFFSET)
          LDK    RQ+/URQ/P.THISPV
          STDL   P5          ADDRESS OF WORD CONTAINING PVA OF CURRENT REQUEST
          LDK    NIL         NIL POINTER
          RJM    CSW         COMPARE-SWAP (UNIT QUEUE TAIL POINTER CONTENTS)
          ZJK    DURX        IF COMPARE-SWAP SUCCEEDED

*         COMPARE-SWAP FAILED (A NEW REQUEST CAME IN).
*         RE-READ NEXTLN/NEXT WORD OF REQUEST TO GET THE NEW REQUEST POINTER.

          LDN    1
          STDL   WC          SIZE OF NEXTLN/NEXT (CM WORD)
 IVB4     IF     DEF,IVB4
          LOADF  RS+/RS/P.REQ  RMA OF THE CURRENT REQUEST
 IVB4     ENDIF
 IVB0     IF     DEF,IVB0
          LRML   RS+/RS/P.REQ  RMA OF THE CURRENT REQUEST
          LDML   RS+/RS/P.REQ+1
          SHN    -3
 IVB0     ENDIF
          ADN    /URQ/C.NEXT OFFSET TO NEXTLN/NEXT WORD
          CRML   RQ+/URQ/P.NEXTLN,WC   READ UNIT REQUEST NEXTLN/NEXT WORD
          UJK    DUR10       UPDATE UNIT QUEUE HEAD POINTER
 EFP      SPACE  4,10
**        EFP - ERROR FLAG PROCESSOR.
*
*         THIS ROUTINE IS CALLED WHEN A CHANNEL ERROR WAS DETECTED.  IT
*         ANALYZES THE DMA AND IPI ERROR REGISTERS TO DETERMINE A SYMPTOM CODE
*         TO BE PLACED IN THE LOG MESSAGE.  THE *FLAGS* FIELD OF THE LOG
*         MESSAGE IS CHECKED TO DETERMINE IF THE ERROR REGISTERS WERE READ BY
*         THE CALLER.
*
*         ENTRY  (A) = ADDRESS OF ERROR INFORMATION BUFFER.
*
*         USES   T8.
*
*         CALLS  ICF, GAR.


 EFP      SUBR
          STDL   T8
 IVB4     IF     DEF,IVB4
          LDC    H0800       DMA TERMINATE
          RJM    ICF
 IVB4     ENDIF
          LDML   /ILD/P.FLAGS,T8
          LPC    /ILD/K.LREG
          NJN    EFP3        IF REGISTERS IN BUFFER
          LDDL   T8
          RJM    GAR         GET ALL REGISTERS
 EFP3     BSS    0
 IVB4     IF     DEF,IVB4
          LDML   /ILD/P.DMAER,T8
          SHN    9
          MJK    EFP60       IF IPI ERROR
          SHN    12
          MJK    EFP85       IF ILLEGAL FUNCTION
          SHN    1
          MJN    EFP5        IF UNCORRECTED CM ERROR
          SHN    1
          PJN    EFP10       IF NOT CM REJECT
 EFP5     BSS
          LDN    E09         CENTRAL MEMORY ERROR
          UJN    EFP40

 EFP10    BSS
          SHN    1
          PJN    EFP15       IF NOT INVALID CM RESPONSE CODE
          LDN    E10
          UJN    EFP40

 EFP15    BSS
          SHN    1
          PJN    EFP20       IF CM RESPONSE CODE PARITY ERROR
          LDN    E11
          UJN    EFP40

 EFP20    BSS
          SHN    1
          PJN    EFP25       IF NOT CMI READ DATA PARITY ERROR
          LDN    E12
          UJN    EFP40

 EFP25    BSS
          SHN    5
          PJN    EFP35       IF NOT JY DATA ERROR
          LDN    E13
          UJN    EFP40

 EFP35    BSS
          SHN    1
          PJN    EFP45       IF NOT BAS PARITY ERROR
          LDN    E14
 EFP40    BSS
          UJN    EFP75

 EFP45    BSS
          SHN    1
          PJN    EFP50       IF NOT LZ ERROR
          LDN    E15
          UJN    EFP75

 EFP50    BSS
          SHN    1
          PJN    EFP55       IF NOT JY ERROR
          LDN    E16
          UJN    EFP75

 EFP55    BSS
          SHN    1
          PJK    EFP130      IF NOT LX ERROR
          LDN    E17
          UJN    EFP75
 IVB4     ENDIF

 EFP60    BSS
          LDML   /ILD/P.ERREG,T8
          SHN    2
          PJN    EFP65       IF NOT BUFFER COUNTER PARITY
          LDN    E31
          UJN    EFP75

 EFP65    BSS
          SHN    2
          PJN    EFP70       IF NOT SYNC COUNTER PARITY
          LDN    E32
          UJN    EFP75

 EFP70    BSS
          SHN    1
          PJN    EFP80       IF NOT PERIOD COUNTER PARITY
          LDN    E03
 EFP75    BSS
          UJN    EFP120

 EFP80    BSS
          SHN    1
          MJN    EFP85       IF PARITY ERROR ON FUNCTION
          SHN    1
          PJN    EFP95       IF NOT PARITY ERROR ON FUNCTION
 EFP85    BSS
          LDN    E01         FUNCTION TIMEOUT
          UJN    EFP120

 EFP95    BSS
          SHN    3
          PJN    EFP100      IF NOT LOST DATA
          LDN    E33
          UJN    EFP150

 EFP100   BSS
          SHN    1
          PJN    EFP105      IF NOT UPPER ICI PARITY
          LDN    E04
          UJN    EFP150

 EFP105   BSS
          SHN    1
          PJN    EFP110      IF NOT LOWER ICI PARITY
          LDN    E05
          UJN    EFP150

 EFP110   BSS
          SHN    1
          PJN    EFP115      IF NOT IPI SEQUENCE ERROR
          LDN    E24
          UJN    EFP150

 EFP115   BSS
          SHN    1
          PJN    EFP125      IF NOT UPPER IPI CHANNEL PARITY
          LDN    E25
 EFP120   BSS
          UJN    EFP150

 EFP125   BSS
          SHN    1
          PJN    EFP130      IF NOT LOWER IPI CHANNEL PARITY
          LDN    E26
          UJN    EFP150

 EFP130   BSS
          LDN    E06         IOU ERROR
 EFP150   BSS
          STML   /ILD/P.SCODE,T8
          RJM    CER         CLEAR ERRORS
          UJK    EFPX        EXIT
 ESS      SPACE  4,10
**        ESS - ENDING STATUS SEQUENCE.
*
*         THIS ROUTINE EXECUTES THE ENDING STATUS SEQUENCE
*         AFTER BOTH COMMAND/RESPONSE AND READ/WRITE TRANSFERS.
*
*         ENTRY  (A) = MASTER STATUS TO SEND TO IVB.
*
*         EXIT   (A) = 0, IF ENDING STATUS RECEIVED,
*                   <> 0, IF ENDING STATUS NOT RECEIVED,
*                (STATUS) = SLAVE STATUS BYTE IF (A) = 0.
*
*         CALLS  EFP, ICF.
*

 ESS60    LDN    0

 ESS      SUBR               ENTRY/EXIT
          STML   MSTAT       SAVE MASTER STATUS
          SHN    8
          ADC    H0039       SETUP MASTER STATUS IN BUS A
          RJM    ICF         DROP MASTER OUT
          ACN    CH
          LDC    64          MULTIPLY LOOP TO 15 SECONDS
          STML   TIMEX
 ESS05    BSS    0
          LCN    0
 ESS10    FJM    ESS30,CH     IF SLAVE IN SET
          SBN    1
          NJN    ESS10       IF TIMEOUT NOT EXPIRED
          SOML   TIMEX
          NJN    ESS05       IF NOT COMPLETE
          LDN    DS.ILR
          STDL   DSTATE
          LDN    E27         SLAVE IN NOT SET
          STML   LRS+/RS/P.SCODE
 ESS20    LDC    LRS+/RS/P.SCODE
          RJM    CEP         LOG ERROR (NO RETURN IF RESET)
          RJM    VBR         MASTER CLEAR AND RESELECT
          LDN    1
          UJK    ESSX        EXIT - (A) <> 0

 ESS30    IAN    CH
          STDL   STATUS      SAVE ENDING STATUS
          TRACE  (ESS,STATUS)
          LDDL   STATUS
          SFM    ESS50,CH    IF ERROR FLAG SET
          SHN    17-/STATP/SUC
          MJK    ESS40       IF SUCCESSFUL
          RJM    PFR         PAUSE FOR RECOVERY
          RJM    VBR         MASTER CLEAR AND RESELECT
          UJK    ESS60       EXIT

*         VALIDATE THAT IF MASTER STATUS WAS UNSUCCESSFUL,
*         SLAVE STATUS IS ALSO UNSUCCESSFUL.

 ESS40    LDML   MSTAT       MASTER STATUS
          SHN    17-/STATP/SUC
          MJK    ESS60       IF MASTER STATUS ALSO SUCCESSFUL
          LDC    LRS+/RS/P.SCODE
          RJM    ISS         INCLUDE SLAVE STATUS
          LDC    LRS+/RS/P.SCODE
          RJM    IMS         INCLUDE MASTER STATUS
          LDC    E203        SLAVE/MASTER STATUS MISMATCH
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

 ESS50    LDC    LRS+/RS/P.SCODE
          RJM    EFP         ERROR FLAG PROCESSING
          UJK    ESS20       LOG ERROR
 FORMA    SPACE  4,10
**        FORMA - FORMAT ADDRESS.
*
*         ENTRY  (A) = ADDRESS OF 2-BYTE REAL MEMORY ADDRESS.
*
*         EXIT   (CMADR - CMADR+2) = REFORMATTED RMA,
*                -ADDRESS-, WORD 0, BITS 0-13 AND
*                           WORD 1, BITS 3-15, ARE REFORMATTED TO-
*                -CMADR-,   WORD 0, BITS 0-9,
*                           WORD 1, BITS 0-11,
*                           WORD 2, BITS 0-5.
*

 FOR10    LDIL   CMADR       CONVERT ADDRESS
          LPN    37B
          SHN    16
          LMML   1,CMADR
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STD    CMADR+2
          LDIL   CMADR
          SHN    -5
          STD    CMADR
          LRD    CMADR       LOAD R-REGISTER
          LDDL   CMADR+2     LOAD A-REGISTER
          LMC    400000B

 FORMA    SUBR
          STDL   CMADR       SAVE POINTER TO ADDRESS
          LDML   1,CMADR     CHECK BYTE NUMBER
          LPN    7
          ZJN    FOR10       IF RMA IS ON WORD BOUNDARY
          LDC    E300        RMA NOT WORD BOUNDARY
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 GAR      SPACE  4,18
**        GAR - GET ALL REGISTERS.
*
*         READ ALL IPI STATUS, ERROR, AND CONTROL REGISTERS.
*         REGISTERS ARE STORED IN A LOGGING DATA BUFFER WHOSE
*         ADDRESS IS PASSED IN THE A REGISTER.
*
*         ENTRY  A = ADDRESS OF LOGGING DATA BUFFER
*
*         USES   T7.
*
*         CALLS  RAR.


 GAR      SUBR               ENTRY/EXIT
          STDL   T7
          LDC    H00E1       IPI STATUS REGISTER
          RJM    RAR         READ REGISTER
          STML   /ILD/P.STREG,T7  SAVE REGISTER CONTENTS
          LDC    H00F1       IPI ERROR REGISTER
          RJM    RAR         READ REGISTER
          STML   /ILD/P.ERREG,T7  SAVE REGISTER CONTENTS
 IVB4     IF     DEF,IVB4
          LDC    H0700       DMA STATUS REGISTER
          RJM    RAR         READ REGISTER
          STML   /ILD/P.OSR,T7  SAVE REGISTER CONTENTS
          LDC    H0600       DMA ERROR REGISTER
          RJM    RAR         READ REGISTER
          STML   /ILD/P.DMAER,T7  SAVE REGISTER CONTENTS
          LDC    H0200       DMA CONTROL REGISTER
          RJM    RAR         READ REGISTER
          STML   /ILD/P.CR,T7  SAVE REGISTER CONTENTS
 IVB4     ENDIF
          LDC    /ILD/K.LREG
          RAML   /ILD/P.FLAGS,T7
          UJK    GARX        EXIT
 GCB      SPACE  4,16
**        GCB - GET CM BUFFERS.
*
*         THIS ROUTINE WILL INTERLOCK THE PP OUT POINTER WORD
*         AND REMOVE THE REQUESTED NUMBER OF BUFFERS FROM THE
*         SPECIFIED POOL AND UPDATE THE 'OUT' POINTERS.
*
*         ENTRY  (BPINDX) = BUFFER POOL INDEX.
*
*         EXIT   (BPCNT) = NUMBER OF BUFFERS STILL NEEDED FROM POOLS,
*                RESPONSE BUFFER POOL STATUS SET APPROPRIATELY IF POOL IS
*                          EMPTY OR BELOW THRESHOLD.
*
*         USES   T1 - T3, T8, P6.
*
*         CALLS  SBL.
          SPACE  4,10
*         BUFFER POOL DESCRIPTOR PP OUT POINTER

 PPOUT    EQU    P1+/BPD/P.PPOUT-/BPD/C.PPOUT*4

 GCB      SUBR               ENTRY/EXIT
          LDDL   BPINDX
          LMK    SMINDX
          NJN    GCB10       IF LARGE POOL INDEX
          LDC    SBUFC       SMALL BUFFER CACHE
          UJN    GCB20

 GCB10    LDC    LBUFC       LARGE BUFFER CACHE
 GCB20    STML   CACHE
          ERRNZ  C.BPD-5
          LDDL   BPINDX      INDEX INTO BUFFER POOL
          LMK    SMINDX
          ZJN    GCB30       IF FIRST BUFFER POOL
          LDN    C.BPD
 GCB30    STDL   P6          CM WORD OFFSET OF BUFFER POOL DESCRIPTOR
          ADN    /BPD/C.PPOUT   OFFSET TO BPD 'PP_OUT' POINTER
          RJM    SBL         INTERLOCK 'PP_OUT' POINTER

*         GET BUFFER POOL DESCRIPTOR.

          LDN    0
          STML   BUFCNT      NUMBER OF BUFFERS OBTAINED
          LDN    C.BPD
          STDL   WC          LENGTH OF POOL DESCRIPTOR
 IVB0     IF     DEF,IVB0
          LRDL   CM.BPD
          LDDL   CM.BPD+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
 IVB4     ENDIF
          ADDL   P6          CM WORD OFFSET OF BUFFER POOL DESCRIPTOR
          CRML   BPD,WC      READ BUFFER POOL DESCRIPTOR

*         VALIDATE BUFFER POOL DESCRIPTOR 'IN' POINTER.

          LDML   BPD+/BPD/P.IN   BUFFER POOL DESCRIPTOR 'IN' POINTER
          LPN    7           BYTE OFFSET
          NJN    GCB40       IF BPD 'IN' POINTER NOT ON A CM WORD BOUNDARY

*         VALIDATE BUFFER POOL DESCRIPTOR 'OUT' POINTER.

          LDDL   PPOUT       BUFFER POOL DESCRIPTOR PP 'OUT' POINTER
          LPN    7           BYTE OFFSET
          ZJN    GCB45       IF BPD 'OUT' POINTER ON A CM WORD BOUNDARY
 GCB40    LDC    E324        INVALID BUFFER POOL DESCRIPTOR
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

*         CHECK IF A BUFFER IS AVAILABLE.

 GCB45    LDML   BPD+/BPD/P.IN   BUFFER POOL DESCRIPTOR 'IN' POINTER
          SBDL   PPOUT       COMPARE WITH BPD 'PP_OUT' POINTER
          ZJK    GCB70       IF BUFFER POOL IS EMPTY
          LDN    C.BP
          STDL   WC          BUFFER POOL ENTRY SIZE (CM WORDS)
 GCB50    BSS    0
          LDDL   PPOUT       BUFFER POOL ENTRY OFFSET (CM BYTES)
          SHN    -3          CONVERT TO CM WORDS
          STDL   T2          BUFFER POOL ENTRY OFFSET

*         GET BUFFER POOL TABLE ENTRY.

          SOML   BPCNT,BPINDX  DECREMENT COUNT OF BUFFERS NEEDED
          ERRNZ  P.IBC-8
          SHN    3           8 PP WORDS PER ENTRY
          ADML   CACHE       BASE CACHE ADDRESS
          STML   GCBA        PLUG CACHE ENTRY ADDRESS
 IVB0     IF     DEF,IVB0
          LRML   BPD+/BPD/P.BPRMA
          LDML   BPD+/BPD/P.BPRMA+1
          SHN    -3
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  BPD+/BPD/P.BPRMA  BUFFER POOL ADDRESS
 IVB4     ENDIF
          ADDL   T2          BUFFER POOL ENTRY OFFSET (CM WORDS)
          CRML   **,WC       READ BUFFER PVA AND RMA INTO CACHE
 GCBA     EQU    *-1

*         DETERMINE NEW BUFFER POOL DESCRIPTOR 'PP_OUT' POINTER VALUE.

          LDDL   PPOUT       BUFFER POOL DESCRIPTOR 'PP_OUT' POINTER
          ADN    B.BP        NEXT BUFFER POOL TABLE ENTRY
          SBML   BPD+/BPD/P.LIMIT   COMPARE WITH LIMIT
          ZJN    GCB60       IF AT LIMIT
          ADML   BPD+/BPD/P.LIMIT   RESTORE GOOD VALUE OF NEW BPD PP OUT POINTER

 GCB60    BSS    0
          STDL   PPOUT       NEW BUFFER POOL DESCRIPTOR 'PP_OUT' POINTER
          AOML   BUFCNT      NUMBER OF BUFFERS OBTAINED

*         CHECK IF POOL HAS BEEN EMPTIED OR ALL BUFFERS OBTAINED.

          LDML   BPD+/BPD/P.IN   BUFFER POOL DESCRIPTOR 'IN' POINTER
          SBDL   PPOUT       COMPARE WITH BPD 'PP_OUT' POINTER
          ZJN    GCB70       IF BUFFER POOL IS EMPTY
          LDML   BPCNT,BPINDX  COUNT OF BUFFERS STILL NEEDED
          ZJN    GCB80       IF ALL BUFFERS OBTAINED
          UJK    GCB50


*         BUFFER POOL IS EMPTY.

 GCB70    BSS    0
          LDML   BUFCNT      NUMBER OF BUFFERS OBTAINED
          ZJN    GCB110      IF WE DID NOT EMPTY THE POOL (IF NO BUFFERS OBTAINED)
          AOML   EMPBUF,BPINDX     INCREMENT EMPTY POOL COUNT
          LDK    BP.EMPTY    EMPTY BUFFER POOL STATUS
          UJN    GCB100

*         CHECK IF BELOW THRESHOLD.

 GCB80    BSS    0
          LDML   BPD+/BPD/P.IN   BUFFER POOL DESCRIPTOR IN POINTER
          SBDL   PPOUT           COMPARE WITH BPD PP OUT POINTER
          PJN    GCB90       IF LIMIT NOT CROSSED OVER (IF NEXT BUFFER CONTIGUOUS)
          ADML   BPD+/BPD/P.LIMIT   RESTORE AVAILABLE BUFFERS (CM BYTES)

 GCB90    BSS    0
          ERRNZ  16-B.BP     BUFFER POOL ENTRY SIZE NOT 16 CM BYTES
          SHN    -B.BP/4     CONVERT ENTRY SIZE (CM BYTES) TO NUMBER OF BUFFERS
          SBML   BPD+/BPD/P.THRESH   COMPARE WITH THRESHOLD
          PJN    GCB110      IF AVAILABLE BUFFERS .GE. THRESHOLD
          ADML   BUFCNT      NUMBER OF BUFFERS OBTAINED
          MJN    GCB110      IF WE DID NOT VIOLATE THRESHOLD
          LDK    BP.THRSH    BUFFER POOL BELOW THRESHOLD STATUS

*         SET STATUS IN THE RESPONSE.

 GCB100   BSS    0
          STML   RS+/RS/P.BP1ST,BPINDX  SET STATUS

*         UPDATE BUFFER POOL DESCRIPTOR OUT POINTERS AND CLEAR THE BPD LOCK.

 GCB110   BSS    0
 IVB0     IF     DEF,IVB0
          LRDL   CM.BPD
          LDDL   CM.BPD+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
 IVB4     ENDIF
          ADDL   P6          CM WORD OFFSET OF BUFFER POOL DESCRIPTOR
          ADK    /BPD/C.CPUOUT   OFFSET TO BPD CPU OUT POINTER
          CWDL   PPOUT+/BPD/C.PPOUT*4-/BPD/P.PPOUT   NEW BPD CPU OUT POINTER
          ADK    /BPD/C.PPOUT-/BPD/C.CPUOUT   OFFSET TO BPD PP OUT POINTER
          CWDL   PPOUT+/BPD/C.PPOUT*4-/BPD/P.PPOUT   CLEAR THE BPD LOCK
          UJK    GCBX        EXIT
 GRB      SPACE  4,22
**        GRB - GET READ BUFFERS.
*
*         THIS ROUTINE OBTAINS ENOUGH CM BUFFERS FROM THE BUFFER POOLS TO READ
*         A MAXIMUM SIZED CHANNEL CONNECTION (CC) PDU. THE PVA'S AND RMA'S
*         OF THE BUFFERS ARE STORED IN THE PP INTERNAL CACHE (LBUFC AND SBUFC)
*         UNTIL NEEDED ON THE NEXT INPUT.
*
*         ENTRY  (BPCNT,SMINDX) = NUMBER OF SMALL BUFFERS NEEDED (0 OR 1),
*                (BPCNT,LGINDX) = NUMBER OF LARGE BUFFERS NEEDED.
*
*         EXIT   (A) <> 0, IF ENOUGH BUFFERS OBTAINED,
*                    = 0, IF NOT ENOUGH BUFFERS OBTAINED,
*                (INPOK) <> 0, IF ENOUGH BUFFERS OBTAINED,
*                       = 0, IF NOT ENOUGH BUFFERS OBTAINED.
*
*         CALLS  GCB.


 GRB      SUBR               ENTRY/EXIT
          LDN    SMINDX      SMALL BUFFER INDEX
          STDL   BPINDX
          LDML   BPCNT,BPINDX  NUMBER OF SMALL BUFFERS NEEDED (0 OR 1)
          ZJN    GRB10       IF NO SMALL BUFFER NEEDED
          RJM    GCB         GET CM BUFFER
 GRB10    AODL   BPINDX      LARGE BUFFER INDEX
          LDML   BPCNT,BPINDX  LARGE BUFFERS NEEDED
          ZJN    GRB20       IF NO LARGE BUFFERS NEEDED
          RJM    GCB         GET CM BUFFERS
          LDML   BPCNT+LGINDX  LARGE BUFFERS NEEDED
 GRB20    ADML   BPCNT+SMINDX  SMALL BUFFERS NEEDED
          ZJN    GRB30       IF ENOUGH BUFFERS OBTAINED
          LDN    0
          UJN    GRB40

 GRB30    LDN    /STATP/K.INPOK
 GRB40    STDL   INPOK       SET INPUT OK FLAG
          UJN    GRBX        EXIT
 GUR      SPACE  4,16
**        GUR - GET UNIT REQUEST.
*
*         THIS ROUTINE WILL GET THE NEXT REQUEST ON A
*         UNIT QUEUE.
*
*         ENTRY  (CM.URQ) = REFORMATTED ADDRESS OF UNIT
*                           QUEUE TO SEARCH.
*
*         EXIT   (A) = 0, IF NO REQUESTS TO PROCESS,
*                    <> 0, IF REQUEST TO PROCESS.
*                RQ = UNIT REQUEST.
*
*         USES   P1 - P4, T2, WC.
*


 GUR      SUBR               ENTRY/EXIT

*         GET THE FIRST WORD ADDRESS OF THE NEXT UNIT REQUEST.

 IVB0     IF     DEF,IVB0
          LRDL   CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          LDDL   CM.URQ+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
 IVB4     ENDIF
          ERRNZ  /UQD/C.HEAD OFFSET TO UNIT QUEUE HEAD POINTER IS NOT ZERO
*         ADN    /UQD/C.HEAD OFFSET TO UNIT QUEUE HEAD POINTER
          CRDL   P1          READ UNIT QUEUE HEAD POINTER
          LDDL   P1+/UQD/P.HEAD  RMA OF NEXT QUEUED UNIT REQUEST
          ADDL   P1+/UQD/P.HEAD+1
          ZJN    GURX        IF NO UNIT REQUESTS

*         CHECK THAT THE UNIT REQUEST WILL FIT IN PP MEMORY.

          LDDL   P1+/UQD/P.LEN  REQUEST LENGTH (CM BYTES)
          SHN    -3          REQUEST LENGTH (CM WORDS)
          STDL   WC
          SBN    MAXURQ+1    COMPARE WITH MAX UNIT REQUEST SIZE
          PJN    *           IF REQUEST TOO BIG FOR PP MEMORY  --HANG--

*         READ THE UNIT REQUEST.

 IVB0     IF     DEF,IVB0
          LRDL   P1+/UQD/P.HEAD
          LDDL   P1+/UQD/P.HEAD+1
          SHN    -3
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  P1+/UQD/P.HEAD  CM ADDRESS OF THE NEXT REQUEST
 IVB4     ENDIF
          CRML   RQ,WC       READ UNIT REQUEST

*         SAVE PVA OF UNIT REQUEST IN RESPONSE.

          LDML   RQ+/URQ/P.THISPV   PVA OF THE UNIT REQUEST
          STML   RS+/RS/P.PVA       PVA OF THE RESPONSE
          LDML   RQ+/URQ/P.THISPV+1  PVA OF THE UNIT REQUEST
          STML   RS+/RS/P.PVA+1     PVA OF THE RESPONSE
          LDML   RQ+/URQ/P.THISPV+2  PVA OF THE UNIT REQUEST
          STML   RS+/RS/P.PVA+2     PVA OF THE RESPONSE

*         SAVE RMA OF UNIT REQUEST IN RESPONSE.

          LDDL   P1+/UQD/P.HEAD  RMA OF THE UNIT REQUEST
          STML   RS+/RS/P.REQ  RMA OF THE RESPONSE
          LDDL   P1+/UQD/P.HEAD+1
          STML   RS+/RS/P.REQ+1
          LCN    0
          UJK    GURX        EXIT
          SPACE  4,10
**        IBC - INITIALIZE BUFFER CACHE.
*
*         THIS ROUTINE WILL DETERMINE THE NUMBER OF
*         BUFFERS THE PP NEEDS TO MAINTAIN IN ITS
*         CACHE. THIS NUMBER IS BASED ON THE MAXIMUM
*         CCPDU SIZE AND CM BUFFER SIZE.
*
*         ENTRY  (MAXPDU) = MAXIMUM CCPDU SIZE,
*                (BPSIZE) = ARRAY OF CM BUFFER SIZES.
*
*         EXIT   (BPCNT - BPCNT+1) = NUMBER OF BUFFERS NEEDED
*                                    IN CACHE.
*

 IBC      SUBR               ENTRY/EXIT
          LDN    0
          STML   BPCNT+LGINDX  INITIALIZE LARGE BUFFER COUNT
          LDML   MAXPDU
          SBN    1           MAX CCPDU SIZE - 1
          SBML   BPSIZE+SMINDX  SMALL BUFFER SIZE
          MJN    IBC20       IF ONLY 1 SMALL BUFFER NEEDED
 IBC10    STDL   T1
          AOML   BPCNT+LGINDX  INCREMENT LARGE BUFFER COUNT
          LDDL   T1
          SBML   BPSIZE+LGINDX  LARGE BUFFER SIZE
          PJN    IBC10       IF MORE LARGE BUFFERS NEEDED
 IBC20    LDML   BPCNT+LGINDX
          STML   MAXLRG      MAXIMUM NUMBER OF LARGE BUFFERS NEEDED FOR INPUT
          SBN    MAXLBUF+1   MAXIMUM NUMBER OF LARGE BUFFERS SUPPORTED +1
          PJN    IBC30       IF UNSUPPORTED
          LDN    1
          STML   BPCNT+SMINDX  ONE SMALL BUFFER
          UJN    IBCX        EXIT

 IBC30    LDN    MAXLBUF     MAXIMUM LARGE BUFFERS SUPPORTED
          STML   LRS+/RS/P.EDATA  PLACE IN LOG MESSAGE
          LDML   MAXLRG      MAXIMUM LARGE BUFFERS REQUIRED
          STML   LRS+/RS/P.ADATA  PLACE IN LOG MESSAGE
          LDC    E230        BUFFER REQUIREMENTS EXCEED MAXIMUM
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 ICF      SPACE  4,20
**        ICF - ISSUE CHANNEL FUNCTION.
*
*         THE PURPOSE OF THIS ROUTINE IS TO FUNCTION THE IPI ADAPTOR
*         AND TIMEOUT THE ACTIVE CHANNEL.
*
*         *************************************************************
*         * NOTE: THIS ROUTINE DOES NOT RETURN TO ITS CALLER IF       *
*         *       AN UNRECOVERED ERROR OCCURS. RATHER IT RETURNS TO   *
*         *       THE MAIN LOOP.                                      *
*         *************************************************************
*
*         ERROR RECOVERY ON FUNCTION TIMEOUT IS HANDLED AS FOLLOWS.
*         1. ALL FUNCTIONS ARE RETRIED UP TO TWO MORE TIMES.
*         2. ALL FUNCTION TIMEOUTS ARE LOGGED.
*         3. IF THE FUNCTION FAILS, THE IVB IS DOWNED.
*
*         ENTRY  (A) = FUNCTION CODE.
*
*         USES T1.
*
*         CALLS  GAR, CFH.


 ICF      SUBR               ENTRY/EXIT
          STDL   LF          SAVE FUNCTION CODE
          STML   FBUF,FI     STORE IN TABLE
          AODL   FI          INDEX INTO FUNCTION HISTORY TABLE
          LPN    7
          STDL   FI
          LDN    RRL
          STDL   T1          RETRY COUNTER
          DCN    CH+40B      ENSURE CHANNEL IS INACTIVE
 ICF10    LDDL   LF
          FAN    CH          ISSUE FUNCTION
 ICF20    LDC    FTOLEN*1000 LOOP IS ONE MILLISECOND
 ICF30    IJM    ICF80,CH
          SBN    1
          SHN    18          NO OP TO LENGTHEN LOOP
          NJN    ICF30       IF TIMEOUT NOT EXPIRED
 ICF40    BSS    0
          DCN    CH+40B
          CFM    ICF70,CH    CLEAR CHANNEL ERROR FLAG
 ICF50    BSS    0
          LDDL   T1
          SBN    RRL
          NJN    ICF60       IF NOT FIRST ERROR
          LDC    ICFER
          RJM    GAR         READ REGISTERS
 ICF60    RJM    CER         CLEAR ERRORS
 ICF70    SODL   T1          DECREMENT RETRY COUNTER
          ZJK    ICF110      IF UNRECOVERED ERROR
          UJK    ICF10       RETRY FUNCTION

 ICF80    LDDL   T1
          SBN    RRL
          ZJN    ICF100      EXIT IF NO ERRORS
 ICF90    SRU    ICFER,T1,REC.R
          LDK    E01         FUNCTION TIMEOUT ERROR
          STML   ICFER+/ILD/P.SCODE  STORE ERROR ID
          LDC    ICFER
          RJM    CEP         COMMON ERROR PROCESSOR (NO RETURN IF DOWN)
 ICF100   UJK    ICFX        EXIT

 ICF110   LDN    PS.HLT      DOWN IVB
          STDL   PPSTATE
          UJK    ICF90       LOG ERROR
 IIR      SPACE  4,10
**        IIR - ISSUE INTERFACE RESET.
*
*         THIS ROUTINE WILL ISSUE EITHER A LOGICAL OR
*         PHYSICAL INTERFACE RESET TO THE IVB.
*
*         ENTRY  (A) = FUNCTION.
*                8215 FOR LOGICAL RESET.
*                8415 FOR PHYSICAL RESET.
*
*         USES   P2.
*
*         CALLS  ICF, MCC.
*
*         MACROS PAUSE.


 IIR      SUBR               ENTRY/EXIT
          STDL   P2
          RJM    MCC         MASTER CLEAR CHANNEL
          LDC    **          SLAVE ADDRESS
 IIRA     EQU    *-1
          SHN    12
          ADDL   P2
          RJM    ICF         SET MASTER OUT
          PAUSE  20
          LDDL   LF          LAST FUNCTION ISSUED
          LMN    0#15&0#17
          RJM    ICF         SET SYNC OUT
          PAUSE  10
          LDDL   LF
          LMN    0#17&0#15
          RJM    ICF         DROP SYNC OUT
          LDDL   LF
          LMN    0#15&0#11
          RJM    ICF         DROP MASTER OUT
          UJK    IIRX        EXIT
 ILM      SPACE  4,12
**        ILM - INITIALIZE LOG MESSAGE.
*
*         THIS ROUTINE IS CALLED TO INITIALIZE A LOG BUFFER.
*         THE BUFFER IS ZEROED AND THE KIND FIELD IS SET UNRECOVERED.
*
*         ENTRY  (A) = PP ADDRESS OF ERROR INFO BUFFER.
*
*         USES   T7, T8.


 ILM      SUBR               ENTRY/EXIT
          ADN    P.ILD-1
          STDL   T7
          LDN    P.ILD-1
          STDL   T8
 ILM10    LDN    0
          STML   0,T7        CLEAR LOG BUFFER
          SODL   T7
          SODL   T8
          PJN    ILM10       IF NOT DONE
          LDN    REC.U
          STML   /ILD/P.ERRK+1,T7  INITIALIZE TO UNRECOVERED
          UJK    ILMX        EXIT
 ILR      SPACE  4,10
**        ILR - ISSUE LOGICAL RESET.
*
*         THIS ROUTINE WILL ISSUE A LOGICAL RESET
*         TO THE DEVICE.
*
*         ENTRY  (DSTATE) = DS.ILR
*
*         EXIT   (DSTATE) = DS.NRDY OR DS.WNRA.
*
*         CALLS  IIR, DGU.


 ILR      SUBR
          RJM    PFR         PAUSE FOR RECOVERY
          LDC    H8215       LOGICAL INTERFACE RESET
          RJM    IIR         ISSUE RESET
          RJM    DGU         DEVICE GONE UNAVAILABLE
          LDN    0
          STML   SLREC
          UJK    ILRX        EXIT
 IML      SPACE  4,10
**        IML - INITIALIZE MAIN LOOP
*
*         THIS ROUTINE WILL INITIALIZE VARIABLES THAT
*         MAY NEED NITIALIZATION ON ENTRY TO THE MAIN LOOP.
*


 IML      SUBR
          LDC    C.RS*8
          STML   LRS+/RS/P.RESPL  SET LENGTH
          LDN    URC.LOG
          STML   LRS+/RS/P.URC  SET LOG MESSAGE
          LDC    LRS+/RS/P.SCODE
          RJM    ILM         INITIALIZE BUFFER
          LDC    OTHERR
          RJM    ILM         INITIALIZE BUFFER
          LDC    CRERR
          RJM    ILM         INITIALIZE BUFFER
          LDC    ICFER
          RJM    ILM         INITIALIZE BUFFER
          LDC    IOERR
          RJM    ILM         INITIALIZE BUFFER
          UJK    IMLX        EXIT
 IMS      SPACE  4,13
**        IMS - INCLUDE MASTER STATUS.
*
*         THIS ROUTINE SETS MASTER STATUS INTO THE
*         RESPONSE BUFFER AND SETS THE MASTER
*         STATUS INCLUDED BIT IN THE RESPONSE.
*
*         ENTRY  (A) = ADDRESS OF RESPONSE DATA BUFFER.
*                (MSTAT) = COPY OF MASTER STATUS.
*
*         USES   T6, T7, T8.


 IMS      SUBR               ENTRY/EXIT
          STDL   T8
          LDC    /ILD/K.LMS
          STDL   T6
          LMC    -0
          STDL   T7
          LDML   /ILD/P.LMS,T8  STATUS FLAGS
          LPDL   T7
          ADDL   T6          ADD MASTER STATUS
          STML   /ILD/P.LMS,T8
          LDML   MSTAT
          STML   /ILD/P.MSTAT,T8
          UJN    IMSX        EXIT
 IRC      SPACE  4,10
**        IRC - INITIALIZE RESPONSE CODES.
*
*         THIS ROUTINE INITIALIZES THE RESPONSE CODE
*         VARIABLES IN PREPERATION FOR THE NEXT RESPONSE.
*

 IRC      SUBR               ENTRY/EXIT
          LDN    0
          STML   UNSC        UNSOLICITED RESPONSE CODE
          STML   RESPC       RESPONSE CODE
          LDN    RC.NODS     NO DETAILED STATUS
          STML   RCON        RESPONSE CONDITION CODE
          UJN    IRCX        EXIT
 IRP      SPACE  4,10
**        IRP - INITIALIZE REQUEST PROCESSING.
*
*         INITIALIZES A PERIPHERAL RESPONSE TEMPLATE, AND ESTABLISHES
*         THE ENVIRONMENT FOR REQUEST PROCESSING.  TERMINATION MAY BE
*         REFLECTED THROUGH A PERIPHERAL RESPONSE AFTER THE RESPONSE
*         IS INITIALIZED.
*
*         ENTRY  (RQ) = PERIPHERAL REQUEST BEING PROCESSED.
*
*         EXIT   (RS) = RESPONSE AREA FOR RESPONSE.


 IRP      SUBR           ENTRY/EXIT
          LDML   RQ+/RQ/P.RECOV  RECOVER, INTERRUPT, PORT, PRIORITY
          LPC    177400B
          LMML   DEVID
          STML   RS+/RS/P.RECOV
          LDN    /RS/C.XFER*8+8  SET RESPONSE LENGTH FOR NORMAL RESPONSE
          STML   RS+/RS/P.RESPL
          LDN    R.NRM       SET RESPONSE CODE = NORMAL
          STML   RESPC
          UJK    IRPX        EXIT
 ISS      SPACE  4,13
**        ISS - INCLUDE SLAVE STATUS.
*
*         THIS ROUTINE SETS SLAVE STATUS INTO THE
*         RESPONSE BUFFER AND SETS THE SLAVE
*         STATUS INCLUDED BIT IN THE RESPONSE.
*
*         ENTRY  (A) = ADDRESS OF RESPONSE DATA BUFFER.
*                (STATUS) = COPY OF SLAVE STATUS.
*
*         USES   T6, T7, T8.


 ISS      SUBR               ENTRY/EXIT
          STDL   T8
          LDC    /ILD/K.LSS
          STDL   T6
          LMC    -0
          STDL   T7
          LDML   /ILD/P.LMS,T8  STATUS FLAGS
          LPDL   T7
          ADDL   T6          ADD MASTER STATUS
          STML   /ILD/P.LMS,T8
          LDDL   STATUS
          STML   /ILD/P.SSTAT,T8
          UJN    ISSX        EXIT
 LAM      SPACE  4,12
**        LAM - LOG AVAILABILITY MESSAGE.
*
*         THIS ROUTINE WILL LOG A MESSAGE INDICATING THE
*         AVAILABILITY OF THE IVB.
*
*         ENTRY  (AVAIL) = 0 IF DEVICE RESET.
*                        <> 0 IF DEVICE AVALABLE.
*
*         CALLS  SLM.


 LAM      SUBR               ENTRY/EXIT
          LDML   AVAIL
          ZJN    LAM10       IF NOT AVAILABLE
          LDML   IPIVER
          SHN    8
          ADML   CCVER
          STML   LRS+/RS/P.ADATA
          LDML   MAXPDU
          STML   LRS+/RS/P.EDATA
          LDN    E40
          UJN    LAM20       CONTINUE

 LAM10    LDN    E41
 LAM20    STML   LRS+/RS/P.SCODE
          LDN    REC.IM
          STML   LRS+/RS/P.ERRK
          RJM    SLM         SEND LOG MESSAGE
          UJN    LAMX        EXIT
 MCC      SPACE  4,10
**        MCC - MASTER CLEAR CHANNEL.
*
*         THIS ROUTINE RE-INITIALIZES THE CHANNEL BY ISSUING A MASTER CLEAR.
*         THE MASTER CLEAR IS ISSUED TWICE BECAUSE THE FIRST MASTER CLEAR
*         MAY RESULT IN A SEQUENCER ERROR IF ILLEGAL STATE CHANGES OCCUR AS
*         CONTROL LINES ARE DROPPED.
*
*         CALLS  ICF.
*
*         MACROS PAUSE.


 MCC      SUBR
 IVB0     IF     DEF,IVB0
          MCLR   CH
          PAUSE  100         ALLOW CONTROLLER TIME TO DROP LINES
          MCLR   CH
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LDN    H0000       MASTER CLEAR CHANNEL
          RJM    ICF
          PAUSE  100         ALLOW CONTROLLER TIME TO DROP LINES
          LDN    H0000       MASTER CLEAR CHANNEL
          RJM    ICF
 IVB4     ENDIF
          PAUSE  1
          LDC    H7E42       SET IPI CHANNEL TRANSFER RATE
          RJM    ICF
 IVB4     IF     DEF,IVB4
          LDC    H0062       SET PORT NUMBER
 MCCA     EQU    *-1         (PORT NUMBER)
          RJM    ICF
 IVB4     ENDIF
          UJK    MCCX        EXIT
 MCH      SPACE  4,16
**        MCH - MOVE CC HEADER.
*
*         THIS ROUTINE TRANSFERS THE CHANNEL CONNECTION (CC)
*         HEADER TO CM BUFFERS.
*
*         ENTRY  (A) = PP ADDRESS OF CC HEADER,
*                (CML) = 0, OFFSET TO FIRST BUFFER LENGTH/ADDRESS PAIR,
*                (BPRMA+/BPR/P.LENGTH) = NUMBER OF BYTES TO TRANSFER TO BUFFER.
*
*         EXIT   (CML) = OFFSET OF CURRENT BUFFER LENGTH/ADDRESS PAIR,
*                 CC HEADER TRANSFERRED TO CM BUFFER(S).
*
*         USES   T1, WC.
*


 MCH      SUBR               ENTRY/EXIT
          STML   MCHA
          LDN    B.CCP-/CCP/B.PARML-/CCP/B.PARMID  CC HEADER LENGTH
          STDL   BYTS        NUMBER OF BYTES TO TRANSFER TO CM
 MCH10    BSS    0
          LDML   BPRMA+/BPR/P.LENGTH,CML  LENGTH OF BUFFER
          STDL   BUFLEN
          SBDL   BYTS        BYTES TO TRANSFER TO CM
          PJN    MCH20       IF ROOM IN CM BUFFER FOR ALL
          LDDL   BUFLEN
          UJN    MCH30

 MCH20    BSS    0
          LDDL   BYTS

 MCH30    STDL   T1          BYTES TO TRANSFER
          SHN    -3          CONVERT TO CM WORDS
          STDL   WC
 IVB0     IF     DEF,IVB0
          LRML   BPRMA+/BPR/P.RMA,CML
          LDML   BPRMA+/BPR/P.RMA+1,CML  ADDRESS OF BUFFER
          SHN    -3
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  BPRMA+/BPR/P.RMA,CML  ADDRESS OF BUFFER
 IVB4     ENDIF
          CWML   **,WC
 MCHA     EQU    *-1
          LDDL   T1          BYTES TRANSFERRED
          RAML   BPRMA+/BPR/P.RMA+1,CML  UPDATE CM BUFFER ADDRESS
          SHN    -16
          RAML   BPRMA+/BPR/P.RMA,CML
          LDDL   BUFLEN      SPACE IN BUFFER
          SBDL   T1          BYTES TRANSFERRED
          STML   BPRMA+/BPR/P.LENGTH,CML  SPACE REMAINING IN BUFFER
          LDDL   BYTS
          SBDL   T1
          STDL   BYTS        UPDATE REMAINING BYTES IN PP
          ZJN    MCH50       IF ENTIRE CC HEADER TRANSFERRED

*         ONLY 8 OF THE 16 BYTES OF THE CC HEADER WERE TRANSFERRED
*         IN THE FIRST WRITE. SETUP TO TRANSFER THE REMAINING 8 BYTES.

          LDN    4
          RAML   MCHA        UPDATE PP TRANSFER ADDRESS
          LDN    P.BPR
          RADL   CML         NEXT LENGTH/ADDRESS PAIR
          UJK    MCH10       TRANSFER REMAINDER OF CC HEADER

 MCH50    BSS    0
          STML   RS+/RS/P.XFER
          LDN    B.CCP-/CCP/B.PARML-/CCP/B.PARMID
          STML   RS+/RS/P.XFER+1  SETUP TRANSFER COUNT IN RESPONSE
          UJK    MCHX        EXIT
 OWC      SPACE  4,20
**        OWC - OUTPUT WRITE COMMAND.
*
*         THIS ROUTINE WILL CREATE AND OUTPUT THE WRITE COMMAND PACKET.
*
*         ENTRY  RQ = UNIT REQUEST.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*                BYTCNT = BYTES SENT WITH COMMAND.
*                BYTS = NUMBER OF BYTES SENT FROM CURRENT BUFFER.
*                CML = CURRENT CM LIST INDEX.
*                CMLISTL = NUMBER OF CM LENGTH/ADDRESS PAIRS.
*                P6 = OFFSET TO CURRENT RMA/ADDRESS PAIR.
*
*         USES   P6.
*
*         CALLS  PPE, SCP, SUR.


 OWC      SUBR               ENTRY/EXIT
 OWC10    LDN    0
          STDL   CML         CURRENT CM LIST INDEX
          STML   BYTCNT
          LDML   RQ+/URQ/P.URQLEN  LENGTH OF REQUEST
          SBN    /URQ/C.MBRMA*8    MINUS FIXED LENGTH PART
          SHN    -3          TO CM WORDS
          STML   CMLISTL     NUMBER OF CM LENGTH/ADDRESS PAIRS

*         GENERATE IPI COMMAND PACKET.

          LDK    B.IP+B.CCP-/IP/B.LEN  PACKET WRITE CMD LENGTH
          STML   CPBF+/IP/P.LEN
          LDC    O.WR+0#80    PACKET WRITE COMMAND
          STML   CPBF+/IP/P.OPCODE
          LDK    B.CCP-/CCP/B.PARML  LENGTH OF THIS PARAMETER
          SHN    8           POSITION TO PARAMETER LENGTH
          LMC    PID.CC      MOVE IN PARAMETER ID
          STML   CPBF+P.IP+/CCP/P.PARML
          LDN    B.CCP-/CCP/B.PARML-/CCP/B.PARMID
          STDL   TBYTS       SET TOTAL TRANSFER SIZE FOR HEADER
 OWC20    LDDL   CML         CURRENT CM LIST INDEX
          SHN    2           CONVERT TO PP WORD OFFSET
          STDL   P6          OFFSET TO NEXT CM LENGTH/ADDRESS PAIR
          LDML   RQ+/URQ/P.MBLEN,P6  DATA LENGTH IN BUFFER
          SBDL   TBYTS       LESS BYTES REMAINING IN CCP HEADER
          PJN    OWC30       IF COMPLETE HEADER IN THIS FRAGMENT
          ADDL   TBYTS
          UJN    OWC40       MOVE PARTIAL HEADER FROM THIS BUFFER

 OWC30    LDDL   TBYTS       USE BYTES IN HEADER
 OWC40    STML   BYTS
          SHN    -3          CONVERT TO CM WORDS
          STDL   WC
          LDML   BYTCNT      PROGRESSIVE COUNT
          SHN    -1          CONVERT TO PP WORDS
          ADC    CPBF+P.IP+/CCP/P.KIND  CALCULATE NEXT POSITION
          STML   OWCA
 IVB4     IF     DEF,IVB4
          LOADF  RQ+/URQ/P.MBRMA,P6  REFORMAT CM ADDRESS
 IVB4     ENDIF
 IVB0     IF     DEF,IVB0
          LRML   RQ+/URQ/P.MBRMA,P6     UPPER PORTION OF ADDRESS OF BUFFER
          LDML   RQ+/URQ/P.MBRMA+1,P6   LOWER PORTION OF ADDRESS OF BUFFER
          SHN    -3          FORM WORD ADDRESS
 IVB0     ENDIF
          CRML   **,WC       READ CCP HEADER INTO COMMAND BUFFER
 OWCA     EQU    *-1
          LDML   BYTS        BYTES READ
          RAML   BYTCNT      BUMP PROGRESSIVE COUNT
          LDDL   TBYTS
          SBML   BYTS        DECREMENT BYTES READ
          ZJN    OWC50       IF HEADER READ
          STDL   TBYTS       SET REMAINING BYTES TO TRANSFER
          AODL   CML
          SBML   CMLISTL
          NJK    OWC20       CONTINUE IF MORE TO READ IN HEADER
          LDK    E301        CCPDU HEADER TOO SMALL
          RJM    PPE         PROCESS INTERFACE ERROR (NO RETURN)

 OWC50    RJM    SCP         SEND COMMAND PACKET TO SLAVE
          ZJK    OWCX        EXIT
          RJM    ALC         ABORT LAST COMMAND
          NJK    OWCX        IF ERRORS EXIT
          SOML   RTCNT
          NJK    OWC10       IF RETRIES REMAINING
          LDN    DS.ILR
          STDL   DSTATE
          UJK    OWCX        ERROR EXIT
 PAUS     SPACE  4,10
**        PAUS - WAIT FOR N MICROSECONDS.
*
*         ENTRY  (A) = NUMBER OF MICROSECONDS.
*
*         EXIT   (A) = 0.
*
*         USES   T1.


 PAUS     SUBR
 PAUS10   SBN    1           EACH ITERATION OF THIS LOOP
          STDL   T1           IS ONE MICROSECOND
 IVB0     IF     DEF,IVB0
          STDL   T1
          STDL   T1
 IVB0     ENDIF
          NJN    PAUS10
          UJK    PAUSX       EXIT
 PFR      SPACE  4,10
**        PFR - PAUSE FOR RECOVERY.
*
*         THIS ROUTINE WILL PAUSE THE REQUIRED AMOUNT
*         OF TIME NEEDED IN RECOVERY TO ALLOW THE IVB
*         TO RESET ANY HARDWARE.


 PFR      SUBR
          PAUSE  177777B
          PAUSE  177777B
          PAUSE  177777B
          PAUSE  177777B
          UJK    PFRX        EXIT
 PIM      SPACE  4,10
**        PIM - PROCESS INPUT MESSAGE.
*
*         THIS ROUTINE PROCESSES ALL INPUT WHEN THE IVB
*         IS IN SERVICE. THERE ARE THREE POSSIBLE RESPONSES
*         THAT MAY BE RECEIVED: NOOP, PACKET READ AND REPORT
*         STATUS.
*
*         ENTRY  (IP) <> 0, INPUT IS PENDING.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*
*         USES   P2.
*
*         CALLS  PNO, PPE, PRR, PRS, RRP.


 PIM      SUBR               ENTRY/EXIT
          LDN    RRL
          STML   RTCNT
 PIM10    RJM    RRP         READ RESPONSE PACKET
          ZJN    PIM30       IF NO ERRORS
          PJN    PIM20       IF IVB SAW ERROR
          RJM    ACR         ABORT CURRENT COMMAND
          NJN    PIMX        IF ERRORS EXIT
 PIM20    SOML   RTCNT
          NJK    PIM10       IF NOT UNRECOVERED
          LDN    DS.ILR
          STDL   DSTATE
          UJK    PIMX        EXIT

 PIM30    LDML   RPBF+/IP/P.OPCODE  RESPONSE OPCODE
          LMK    O.READ
          NJN    PIM40       IF NOT READ RESPONSE
          LDDL   INPOK
          ZJN    PIM70       IF GLOBAL FLOW CONTROL ON
          RJM    PRR         PROCESS READ RESPONSE
          ZJK    PIMX        EXIT IF NO ERRORS
          DPM    RPSEQ       DECREMENT SEQUENCE NUMBER
          UJK    PIM20       IF ERRORS

 PIM40    LMK    O.READ&O.RSTAT
          NJN    PIM60       IF NOT REPORT STATUS RESPONSE
          RJM    PRS         PROCESS REPORT STATUS RESPONSE
 PIM50    UJK    PIMX        EXIT

 PIM60    LMK    O.RSTAT&O.NOOP
          NJN    PIM70       IF INVALID RESPONSE
          RJM    PNO         PROCESS NO-OP RESPONSE
          UJN    PIM50

 PIM70    LDML   RPBF+/IP/P.OPCODE  RESPONSE OPCODE
          STML   LRS+/RS/P.OPCD  PLACE ILLEGAL OPCODE IN LOG MESSAGE
          LDC    E205        ILLEGAL IPI RESPONSE OPCODE
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

 PNO      SPACE  4,10
**        PNO - PROCESS NO-OP RESPONSE.
*
*         THERE IS NO PROCESSING INVOLVED WITH THE
*         NO-OP RESPONSE. THIS ROUTINE IS A NO-OP.
*
*         EXIT   (A) = 0.
*

 PNO      SUBR               ENTRY/EXIT
          LDN    0
          UJN    PNOX        EXIT
 PGS      SPACE  4,10
**        PGS - PROCESS GLOBAL STATUS.
*
*         THIS ROUTINE PROCESSES THE GLOBAL FLOW CONTROL STATUS
*         PARAMETER RECEIVED AS PART OF A 'REPORT STATUS' OR
*         'READ PACKET' RESPONSE.
*
*         ENTRY  (A) = OFFSET OF GLOBAL FLOW CONTROL PARAMETER ADDRESS
*                      IN RESPONSE BUFFER (RPBF).
*
*         EXIT   (IP) AND (SNDOK) UPDATED WITH CURRENT STATUS.
*
*         USES   T2.
*
*         CALLS  PPE, UGS.


 PGS      SUBR               ENTRY/EXIT
          STDL   T2          ADDRESS OF PARAMETER
          LDML   RPBF+/STATP/P.PARML,T2
          SHN    -8          PARAMETER LENGTH-1
          SBN    B.STATP-/STATP/B.PARML
          NJN    PGS10       IF INVALID PARAMETER LENGTH
          LDML   RPBF+/STATP/P.STATUS,T2  GLOBAL FLOW CONTROL STATUS
          SHN    -8          POSITION STATUS BYTE IN LOWER 8 BITS
          RJM    UGS         UPDATE GLOBAL FLOW CONTROL STATUS
          UJN    PGSX        EXIT

 PGS10    LDC    PID.GFC     GLOBAL FLOW CONTROL STATUS PARAMETER ID
          STML   LRS+/RS/P.PID  PLACE PARAMETER ID IN LOG MESSAGE
          LDML   RPBF+/STATP/P.PARML,T2
          STML   LRS+/RS/P.ADATA  PLACE INVALID PARAMETER LENGTH IN LOG MESSAGE
          LDC    E201        INVALID PARAMETER LENGTH
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
          SPACE  4,10
**        PPE - PROCESS PROTOCOL ERROR.
*
*         THIS ROUTINE IS TO BE CALLED WHEN A DEVICE OR CPU
*         PROTOCOL ERROR HAS BEEN DETECTED. THE ERROR IS LOGGED
*         AND THE DEVICE RESET OR DOWNED DEPENDING ON THE ERROR
*         ENCOUNTERED.
*
*       *********************************************************
*       * NOTE: THIS ROUTINE DOES NOT RETURN TO ITS CALLER,     *
*       *       RATHER THE MAIN CONTROL LOOP IS ENTERED.        *
*       *********************************************************
*
*         ENTRY  (A) = PROTOCOL ERROR CODE.
*
*         EXIT   PROCESSING RESUMES AT *MCL* (MAIN CONTROL LOOP).
*
*         CALLS  CFH, SLM.


 PPE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.SCODE  PROTOCOL ERROR CODE
          ADC    -E300
          MJN    PPE10       IF IN RANGE (E200 - E299)
          LDN    PS.HLT
          STDL   PPSTATE     PP STATE = HALTED
 PPE10    LDC    LRS+/RS/P.SCODE
          RJM    CFH         COPY FUNCTION HISTORY
          LDML   PPE         P-ADDRESS OF WHERE CALLED FROM
          STML   LRS+/RS/P.RES0  RESERVED WORD 0
          RJM    SLM         SEND LOG MESSAGE
          LDN    DS.ILR      ISSUE LOGICAL RESET
          STDL   DSTATE      CHANGE DEVICE STATE
          LJM    MCL         ENTER MAIN CONTROL LOOP
 PRB      SPACE  4,10
**        PRB - PREPARE RESPONSE BUFFER.
*
*         THIS ROUTINE PREPARES THE PP RESPONSE BUFFER
*         FOR THE ISSUING OF A RESPONSE BY SETTING UP
*         SPECIFIC RESPONSE CODE FIELDS.
*
*         ENTRY  RS = PP RESPONSE BUFFER,
*


 PRB      SUBR
          LDML   RESPC       RESPONSE CODE
          SHN    /RS/L.RCON-/RS/L.RC+/RS/N.RCON-/RS/N.RC
          ADML   RCON        RESPONSE CONDITION
          SHN    /RS/L.URC-/RS/L.RCON+/RS/N.URC-/RS/N.RCON
          ERRNZ  /RS/P.URC-/RS/P.RCON
          ERRNZ  /RS/P.RC-/RS/P.URC
          ADML   UNSC        UNSOLICITED RESPONSE CODE
          STML   RS+/RS/P.URC
          UJK    PRBX        EXIT
 PRP      SPACE  4,15
**        PRP - PROCESS READ PACKET.
*
*         THIS ROUTINE WILL PROCESS THE CC PARAMETER
*         ASSOCIATED WITH THE READ PACKET RESPONSE AND
*         PERFORM A DATA READ IF REQUIRED. THE DATA WILL
*         BE PLACED IN CM BUFFERS AND A CPU RESPONSE
*         GENERATED UPON SUCCESSFUL COMPLETION.
*
*         ENTRY  (P1) = OFFSET OF CC PARAMETER IN RESPONSE BUFFER (RPBF).
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*
*         CALLS  CEP, ESS, GRB, MCH, PPE, RDD, SFR, SRS, SUR, UGS.



 PRP      SUBR               ENTRY/EXIT
          LDML   RPBF+/CCP/P.PARML,P1
          SHN    -8          PARAMETER LENGTH-1
          SBN    B.CCP-/CCP/B.PARML
          ZJN    PRP10       IF VALID PARAMETER
          LDC    PID.CC      CC PARAMETER ID
          STML   LRS+/RS/P.PID  PLACE IN LOG MESSAGE
          LDML   RPBF+/CCP/P.PARML,P1  PARAMETER LENGTH-1
          STML   LRS+/RS/P.ADATA  PLACE IN LOG MESSAGE
          LDC    E201        INVALID PARAMETER
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

*         SET UP RESPONSE IN PREPARATION FOR RETURN OF BUFFERS.

 PRP10    LDN    BP.GOOD     BUFFER POOL CONTAINS A SUFFICIENT NUMBER OF BUFFERS
          STML   RS+/RS/P.BP1ST
          STML   RS+/RS/P.BP2ST
          LDDL   SNDOK       IVB GLOBAL FLOW CONTROL STATUS
          STML   RS+/RS/P.PSEND
          STML   RS+/RS/P.NSEND
          LDML   RPBF+/CCP/P.LEN2,P1
          STDL   TBYTS       TOTAL BYTES TO TRANSFER
          RJM    SFR         SETUP FOR READ
          LDDL   P1          ADDRESS OF CC HEADER
          ADC    RPBF+/CCP/P.KIND
          RJM    MCH         MOVE CC HEADER TO CM BUFFER
          LDDL   TBYTS
          SBN    B.CCP-/CCP/B.PARML-/CCP/B.PARMID  CC HEADER LENGTH
          ZJK    PRP60       IF NO MORE DATA TO TRANSFER
          RJM    RDD         READ DATA
          ZJN    PRP30       IF NO ERRORS
          LDN    0
          UJN    PRP40       SEND UNSUCCESSFUL

 PRP30    LDC    /STATP/K.SUC  SUCCESSFUL STATUS
 PRP40    ADDL   INPOK       GLOBAL FLOW CONTROL
          RJM    ESS         ENDING STATUS SEQUENCE
          ZJN    PRP50       IF STATUS READ WITHOUT ERRORS
          LDML   MSTAT
          STML   RSTAT
          LDML   RPBF+/IP/P.REFNO
          STML   RSEQ
          RJM    RSS         REQUEST SLAVE STATUS

 PRP50    LDDL   STATUS      SLAVE STATUS
          SHN    17-/STATP/SUC
          PJN    PRP90       IF UNSUCESSFUL TRANSFER
          LDDL   STATUS      SLAVE STATUS
          RJM    UGS         UPDATE GLOBAL FLOW CONTROL STATUS
 PRP60    LDN    RC.DS       DETAILED STATUS INCLUDED
          STML   RCON        RESPONSE CONDITION CODE
          RJM    GRB         REPLACE BUFFERS
          LDN    URC.CC      CC READ RESPONSE CODE
          RJM    SUR         SEND UNSOLICITED RESPONSE
          LDDL   INPOK
          ZJN    PRP70       IF INPUT NOT OK
          LDN    0
          UJN    PRP80       EXIT

 PRP70    RJM    SRS         REPORT SATUS

*         SEND TWO NOOP'S TO ASSURE IVB HAD TIME TO CLEAR BUFFER

          RJM    SNO         SEND NO_OP
          RJM    SNO         SEND NO_OP
          LDN    0
 PRP80    UJK    PRPX        EXIT - (A) = 0

 PRP90    SRU    IOERR,RTCNT,REC.I
          LDC    IOERR
          RJM    IMS         INCLUDE MASTER STATUS
          LDC    IOERR
          RJM    ISS         INCLUDE SLAVE STATUS
          LDML   IOERR+/ILD/P.SCODE
          NJN    PRP100      IF PP DETECTED ERROR
          RJM    ASS         ANALYZE SLAVE STATUS
 PRP100   LDC    IOERR
          RJM    CEP         LOG ERROR
          RJM    RIC         RETURN BUFFERS
          LDN    1
          UJK    PRPX        EXIT
 PRR      SPACE  4,10
**        PRR - PROCESS READ RESPONSE.
*
*         THIS ROUTINE PROCESSES READ RESPONSES RECEIVED
*         WHILE THE IVB IS IN SERVICE. A READ RESPONSE
*         WILL CONTAIN A CC PARAMETER (51(16)) AND MAY
*         ALSO CONTAIN A GLOBAL FLOW STATUS PARAMETER (56(16)).
*         ALTHOUGH THESE PARAMETERS MAY APPEAR IN ANY ORDER,
*         THE CC PARAMETER IS ALWAYS PROCESSED LAST.
*
*         ENTRY  (RPBF) = READ RESPONSE.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS
*
*         USES   P1, T4.
*
*         CALLS  PGS, PPE, PRP
*

 PRR80    LDML   /CCP/P.PARMID,T4  PARAMETER ID
          STML   LRS+/RS/P.PID  PLACE ILLEGAL PARAMETER ID IN LOG MESSAGE
          LDML   RPBF+/IP/P.OPCODE
          STML   LRS+/RS/P.OPCD  PLACE RESPONSE OPCODE IN LOG MESSAGE
          LDC    E207        ILLEGAL PARAMETER
 PRR90    RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)


 PRR      SUBR
          LDN    0
          STDL   P1          ADDRESS OF CC PARAMETER IN RESPONSE
          LDN    P.IP
          STDL   T4          OFFSET OF NEXT PARAMETER IN RESPONSE BUFFER
 PRR10    BSS    0
          SHN    1           CONVERT TO BYTES
          SBML   RPBF+/IP/P.LEN  LENGTH OF RESPONSE-2
          SBN    /IP/B.LEN
          PJN    PRR50       IF NO MORE PARAMETERS
          LDML   RPBF+/CCP/P.PARMID,T4  PARAMETER ID
          LPC    0#0FF
          LMK    PID.CC
          ZJN    PRR40       IF CC PARAMETER
          LMK    PID.GFC&PID.CC
          NJK    PRR80       IF ILLEGAL PARAMETER
          LDDL   T4
          RJM    PGS         PROCESS GLOBAL FLOW CONTROL STATUS PARAMETER
          LDN    P.STATP
 PRR30    RADL   T4          UPDATE TO NEXT PARAMETER
          UJN    PRR10

 PRR40    LDDL   T4
          STDL   P1          SAVE CC PARAMETER ADDRESS
          LDN    P.CCP
          UJN    PRR30

*         PROCESS CC PARAMETER

 PRR50    BSS    0
          LDDL   P1          CC PARAMETER ADDRESS
          ZJN    PRR70       IF CC PARAMETER NOT PRESENT
          RJM    PRP         PROCESS READ PACKET
          UJK    PRRX        EXIT

 PRR70    BSS    0
          LDML   RPBF+/IP/P.LEN  LENGTH OF RESPONSE-2
          STML   LRS+/RS/P.ADATA  PLACE RESPONSE LENGTH IN LOG MESSAGE
          LDC    E200        INVALID RESPONSE - NO CC PARAM ON READ
          UJK    PRR90
 PRS      SPACE  4,12
**        PRS - PROCESS REPORT STATUS.
*
*         THIS ROUTINE PROCESSES THE 'REPORT STATUS'
*         RESPONSE. THE 'REPORT STATUS' RESPONSE CONTAINS
*         ONE PARAMETER, NAMELY THE GLOBAL FLOW CONTROL
*         PARAMETER.
*
*         ENTRY  (RPBF) = REPORT STATUS RESPONSE.
*
*         CALLS  PGS, PPE.
*

 PRS      SUBR               ENTRY/EXIT
          LDML   RPBF+/IP/P.LEN
          SBN    B.IP+B.STATP-/IP/B.LEN  EXPECTED RESPONSE LENGTH
          NJN    PRS10       IF INVALID IPI RESPONSE
          LDN    P.IP        OFFSET OF GFC PARAMETER IN RESPONSE BUFFER
          RJM    PGS         PROCESS GLOBAL FLOW CONTROL PARAMETER
          UJN    PRSX        EXIT - (A) = 0

 PRS10    LDML   RPBF+/IP/P.OPCODE
          STML   LRS+/RS/P.OPCD  PLACE RESPONSE OPCODE IN LOG MESSAGE
          LDML   RPBF+/IP/P.LEN
          STML   LRS+/RS/P.ADATA  PLACE RESPONSE LENGTH IN LOG MESSAGE
          LDC    E206        INVALID IPI RESPONSE LENGTH
          RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)
 PUC      SPACE  4,16
**        PUC - PROCESS UNIT COMMAND.
*
*         THIS ROUTINE PROCESSES A WRITE COMMAND.
*         MULTIPLE WRITE COMMANDS PER REQUEST ARE
*         NOT ALLOWED.
*
*         ENTRY  (RQ) = UNIT REQUEST.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    > 0 IF ERRORS.
*                    < 0 IF DEVICE STATE CHANGE
*
*         CALLS  PPE, WRP.


 PUC      SUBR               ENTRY/EXIT
          LDML   RQ+/URQ/P.CODE  GET COMMAND CODE
          SHN    -16+/URQ/N.CODE+/URQ/L.CODE
          LMK    C.WRTR      COMPARE WITH WRITE RECORD
          NJN    PUC10       IF BAD COMMAND CODE

*         PROCESS VALID COMMAND.

          RJM    WRP         WRITE RECORD PROCESSOR
          UJK    PUCX        EXIT

*         PROCESS INVALID COMMAND.

 PUC10    BSS    0
          LDC    E302        INTERFACE ERROR CODE
          RJM    PPE         PROCESS INTERFACE ERROR
          UJK    PUCX        EXIT
 PUR      SPACE  4,20
**        PUR - PROCESS UNIT REQUEST.
*
*         THIS ROUTINE PROCESSES ONE UNIT REQUEST FROM A UNIT QUEUE.  IF NORMAL
*         FLOW CONTROL IS ON ONLY PRIORITY REQUESTS ARE PROCESSED.  IF NORMAL
*         FLOW CONTROL IS OFF THEN A PRIORITY REQUEST WILL BE SELECTED IF
*         AVAILABLE, IF NOT A NORMAL REQUEST WILL BE SELECTED.  NOT MORE THAN
*         *MAXPR* CONSECUTIVE PRIORITY REQUESTS WILL BE SELECTED WITHOUT A
*         NORMAL REQUEST BEING SELECTED IF NORMAL FLOW CONTROL IS OFF.
*
*         ENTRY  (CM.URQ) = REFORMATTED R REGISTER PORTION OF
*                           THE MASTER CONTROL TABLE ADDRESS.
*                (CM.MCT) = REFORMATTED A REGISTER PORTION OF THE
*                           MASTER CONTROL TABLE ADDRESS.
*                (NUMPRI) < OR = MAXPR IF FLOW CONTROL OFF,
*                         > MAXPR IF FLOW CONTROL ON.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*
*         CALLS  GUR, PUC.


 PUR100   LDN    0           EXIT NO ERRORS

 PUR      SUBR               ENTRY/EXIT
          LDML   SNDOK
          ZJN    PURX        IF GLOBAL FLOW CONTROL ON
          LDML   RTCNT
          LMN    RRL
          ZJN    PUR10       IF NOT IN RECOVERY
          LDML   NUMPRI
          ZJN    PUR50       IF NORMAL REQUEST
          UJN    PUR30       IF PRIORITY REQUEST

 PUR10    LDML   NUMPRI
          LMN    MAXPR
          ZJN    PUR40       IF TIME TO SERVICE NORMAL
 PUR20    LDDL   CM.MCT
          ADN    /MCT/C.PRI  PRIORITY QUEUE
 IVB0     IF     DEF,IVB0
          STDL   CM.URQ+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          STDL   CM.URQ+2
 IVB4     ENDIF
 PUR30    RJM    GUR         GET PRIORITY UNIT REQUEST
          NJN    PUR60       IF REQUEST FOUND
          LDN    MAXPR
          SBML   NUMPRI
          MJK    PUR100      IF ONLY PRIORITY ALLOWED
 PUR40    LDDL   CM.MCT
          ADN    /MCT/C.NOR  NORMAL QUEUE
 IVB0     IF     DEF,IVB0
          STDL   CM.URQ+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          STDL   CM.URQ+2    NORMAL REQUEST QUEUE
 IVB4     ENDIF
 PUR50    RJM    GUR         GET NORMAL UNIT REQUEST
          ZJN    PUR90       IF NO REQUESTS
          LDN    0
          STML   NUMPRI
 IVB0     IF     DEF,IVB0
          LRML   MCT+/MCT/P.NOR+/UQD/P.TAIL   UNIT NORMAL QUEUE TAIL POINTER
          LDML   MCT+/MCT/P.NOR+/UQD/P.TAIL+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  MCT+/MCT/P.NOR+/UQD/P.TAIL   UNIT NORMAL QUEUE TAIL POINTER
 IVB4     ENDIF
          UJN    PUR80       PROCESS UNIT REQUESTS

 PUR60    LDML   RTCNT
          LMN    RRL
          NJN    PUR70       IF IN RECOVERY
          AOML   NUMPRI
 PUR70    BSS    0
 IVB0     IF     DEF,IVB0
          LRML   MCT+/MCT/P.PRI+/UQD/P.TAIL   UNIT PRIORITY QUEUE TAIL PTR
          LDML   MCT+/MCT/P.PRI+/UQD/P.TAIL+1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  MCT+/MCT/P.PRI+/UQD/P.TAIL   UNIT PRIORITY QUEUE TAIL PTR
 IVB4     ENDIF
 PUR80    BSS    0
 IVB0     IF     DEF,IVB0
          SRML   CM.QT
          SHN    -3
          STML   CM.QT+1     UNIT QUEUE TAIL POINTER
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          SRD    CM.QT
          STML   CM.QT+2     UNIT QUEUE TAIL POINTER
 IVB4     ENDIF
          RJM    PUC         PROCESS UNIT COMMAND
          UJK    PURX        EXIT

 PUR90    LDN    MAXPR
          SBML   NUMPRI
          NJK    PUR100      IF PRIORITY SEARCHED
          STML   NUMPRI
          UJK    PUR20       TRY PRIORITY
 RAR      SPACE  4,10
**        RAR - READ ADAPTER REGISTER.
*
*         READ AN IPI STATUS OR ERROR REGISTER.
*         ALL ERRORS ARE FATAL AND THE IPI IS DOWNED.
*
*         *********************************************************
*         * NOTE: THIS ROUTINE DOES NOT RETURN TO THE CALLER IF   *
*         *       ERRORS OCCUR, RATHER IT RETURNS TO THE MAIN LOOP*
*         *********************************************************
*
*         ENTRY  (A) = FUNCTION CODE
*
*         EXIT   (A) = REGISTER CONTENTS.
*
*         CALLS  CFH, SLM.


 RAR20    LDK    E02         CHANNEL NOT FULL
 RAR30    STML   LRS+/RS/P.SCODE
          LDDL   LF
          STML   FBUF,FI     INCLUDE FUNCTION CODE IS HISTORY LIST
          AODL   FI
          LPN    7
          STDL   FI          UPDATE INDEX INTO HISTORY TABLE
          LDC    LRS+/RS/P.SCODE
          RJM    CFH         GET FUNCTION HISTORY
          LDN    PS.HLT
          STDL   PPSTATE     DOWN DEVICE
          RJM    SLM         LOG ERROR
          LJM    MCL         EXIT TO MAIN LOOP

 RAR      SUBR
          RJM    SAF         SEND FUNCTION
 RAR50    ACN    CH+40B
          LDN    77B
 RAR60    FJM    RAR70,CH    IF CHANNEL FULL
          SBN    1
          NJN    RAR60
          UJK    RAR20       IF WORD COULD NOT BE READ

 RAR70    IAN    CH
          UJK    RARX        EXIT
 RCB      SPACE  4,10
**        RCB - RETURN CM BUFFERS.
*
*         THIS ROUTINE WILL RETURN THE CM BUFFERS THE PP HAS
*         IN ITS INTERNAL CACHE. AN UNSOLICITED DEVICE ERROR
*         RESPONSE WILL BE ISSUED TO RETURN THE BUFFERS.
*
*         ENTRY  (BPCNT) = ORDINAL INTO BUFFER CACHE,
*                (MAXLRG) = MAXIMUM NUMBER OF LARGE BUFFERS IN CACHE.
*
*         USES   T1 - T3, T5, T6.
*
*         CALLS  SUR.


 RCB      SUBR               ENTRY/EXIT
          LDN    0
          STDL   INPOK
          STDL   T5          OFFSET OF LENGTH/ADDRESS PAIR IN RESPONSE
          STDL   T1          NUMBER OF BUFFERS TO RETURN
          LDML   BPCNT+SMINDX
          NJN    RCB20       IF NO SMALL BUFFERS TO RETURN
          AODL   T1          BUFFERS TO RETURN
          LDN    1
          STML   BPCNT+SMINDX  INITIALIZE SMALL CACHE COUNT (BUFFERS NEEDED)
          LDN    2
          STDL   T2
 RCB10    LDML   SBUFC+/IBC/P.PVA,T2
          STML   RS+/RS/P.BUFPVA,T2  SETUP BUFFER PVA IN RESPONSE
          SODL   T2
          PJN    RCB10       IF MORE TO DO
          LDN    4
          RADL   T5          ADVANCE TO NEXT LENGTH/ADDRESS PAIR
 RCB20    LDML   MAXLRG      MAXIMUM NUMBER OF LARGE BUFFERS TO RETURN
          SBML   BPCNT+LGINDX
          ZJN    RCB30       IF NO MORE LARGE BUFFERS TO RETURN
          ERRNZ  P.IBC-8
          LDML   BPCNT+LGINDX
          SHN    3           MULTIPLY BY 8
          STDL   T3          OFFSET OF CACHE ENTRY PVA
          AODL   T1          BUFFERS TO RETURN
          LDML   LBUFC+/IBC/P.PVA,T3
          STML   RS+/RS/P.BUFPVA,T5
          LDML   LBUFC+/IBC/P.PVA+1,T3
          STML   RS+/RS/P.BUFPVA+1,T5
          LDML   LBUFC+/IBC/P.PVA+2,T3
          STML   RS+/RS/P.BUFPVA+2,T5  MOVE BUFFER PVA TO RESPONSE
          LDN    4
          RADL   T5          ADVANCE TO NEXT LENGTH/ADDRESS PAIR
          AOML   BPCNT+LGINDX  INCREMENT BUFFER NEEDED COUNT
          UJK    RCB20

 RCB30    LDDL   T1          BUFFERS TO RETURN
          ZJN    RCB40       IF NO BUFFERS TO RETURN
          SHN    3           ONE CM WORD PER RETURNED BUFFER
          ADN    /RS/C.BP1ST*8+8
          STML   RS+/RS/P.RESPL  SET RESPONSE LENGTH
          LDN    BP.GOOD     BUFFER POOL CONTAINS A SUFFICIENT NUMBER OF BUFFERS
          STML   RS+/RS/P.BP1ST
          STML   RS+/RS/P.BP2ST
          LDDL   SNDOK       IVB GLOBAL FLOW CONTROL STATUS
          STML   RS+/RS/P.PSEND
          STML   RS+/RS/P.NSEND
          LDN    RC.DS       DETAILED STATUS INCLUDED
          STML   RCON        RESPONSE CONDITION CODE
          LDN    URC.DE      UNSOLICITED RESPONSE CODE
          RJM    SUR         SEND UNSOLICITED RESPONSE
 RCB40    UJK    RCBX        EXIT
 RDD      SPACE  4,20
**        RDD - READ DATA.
*
*         THIS ROUTINE WILL PERFORM A DMA READ. THE *BPRMA*
*         ARRAY OF LENGTH/RMA ADDRESS PAIRS SPECIFIES THE BYTE
*         COUNTS AND BUFFER ADDRESSES FOR THE DMA(S).
*
*         ENTRY  (BPRMA) = LENGTH/RMA ADDRESS PAIRS FOR READ.
*                (CML) = OFFSET OF BUFFER LENGTH/ADDRESS PAIR.
*
*         EXIT   (A) = 0, IF NO ERRORS DETECTED DURING I/O,
*                    <> 0, IF ERRORS AND RECOVERY POSSIBLE,
*                (WC) = UNTRANSFERRED PP WORD COUNT,
*                (IOERR) = LOG RESPONSE IF ERROR.
*
*         USES   WC.
*
*         CALLS  BCS, EFP, ICF.
*


 RDD20    BSS    0
 IVB0     IF     DEF,IVB0
          LDC    MS50
 RDD30    IJM    RDD40,CH    IF SLAVE IN DROPPED
          SBN    1
          NJN    RDD30       IF NOT TIMED OUT
          DCN    CH+40B
          LDN    E30
          STML   IOERR+/ILD/P.SCODE  SYMPTOM CODE
          LDN    DS.ILR
          STDL   DSTATE
          LDC    IOERR
          RJM    CEP         LOG ERROR (NO RETURN)

 RDD40    LDDL   WC
          ZJN    RDD60       IF NO ERROR
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          RJM    WTC         WAIT TRANSFER COMPLETE
          ZJN    RDD60       IF NO ERROR
 IVB4     ENDIF
 RDD50    LDML   EDATA
          STML   IOERR+/ILD/P.EDATA
          LDML   RS+/RS/P.XFER+1
          SBDL   WC
          SBDL   WC
          STML   IOERR+/ILD/P.ADATA
          LDN    E07
          STML   IOERR+/ILD/P.SCODE
 RDD60    CFM    RDD70,CH    IF CHANNEL ERROR FLAG NOT SET
          LDC    IOERR       I/O ERROR INFO BUFFER
          RJM    EFP         ERROR FLAG PROCESSING
 RDD70    LDML   IOERR+/ILD/P.SCODE  SYMPTOM CODE


 RDD      SUBR               ENTRY/EXIT
          STML   EDATA
          STDL   TBYTS       TOTAL NUMBER OF BYTES TO TRANSFER
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0281       STREAM, READ
          RJM    ICF         RAISE MASTER OUT
 IVB0     IF     DEF,IVB0
          ACN    CH
 IVB0     ENDIF
 RDD10    LDML   BPRMA+/BPR/P.LENGTH,CML  BYTES TO TRANSFER
          STDL   BUFLEN
 IVB0     IF     DEF,IVB0
          SHN    -1          CHANNEL FRAMES TO READ
          STDL   WC          TRANSFER COUNT
          LRML   BPRMA+/BPR/P.RMA,CML  CM ADDRESS OF BUFFER
          LDML   BPRMA+/BPR/P.RMA+1,CML
          SHN    -3
          CHCM   WC,CH
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LDC    BPRMA+/BPR/P.LENGTH  BYTES TO TRANSFER
          ADDL   CML         OFFSET OF CURRENT LENGTH/ADDRESS PAIR
          STML   RDDA        BYTE COUNT/RMA TRIPLET FOR DMA
          LDC    H0C00       DMA READ
          RJM    ICF
          ACN    CH
          LDN    3
          OAM    **,CH       BYTE COUNT, RMA
 RDDA     EQU    *-1
          RJM    DCN         DISCONNECT THE CHANNEL
 IVB4     ENDIF
          LDDL   BUFLEN      BYTES TRANSFERRED IN LAST READ
          RAML   RS+/RS/P.XFER+1  UPDATE TRANSFER COUNT IN RESPONSE
          LDDL   TBYTS       BYTES TO READ
          SBDL   BUFLEN      BYTES READ
          STDL   TBYTS       BYTES LEFT TO READ
          ZJK    RDD20       IF ALL DATA READ
          ERRNZ  P.BPR-4
          LDN    P.BPR
          RADL   CML         USE NEXT LENGTH/ADDRESS PAIR
 IVB0     IF     DEF,IVB0
          LDDL   WC
          NJK    RDD20       IF INCOMPLETE TRANSFER
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          RJM    WTE         WAIT FOR T' REGISTER TO EMPTY
          NJK    RDD50       IF ERROR
 IVB4     ENDIF
          UJK    RDD10
 RRP      SPACE  4,10
**        RRP - READ RESPONSE PACKET.
*
*         THIS ROUTINE WILL INPUT A RESPONSE PACKET
*         FROM THE IVB.
*
*         EXIT   (A) = 0, IF NO ERROR,
*                         (RPBF) = RESPONSE PACKET,
*                   <> 0, IF UNSUCCESSFUL OR SUSPEND LINK.
*                   <  0, IF SLAVE STATUS NOT RECEIVED.
*
*         USES   WC
*
*         CALLS  BCS, CEP, EFP, ICF, DGU.


 RRP      SUBR
          LDN    RSPIN       BUS A FOR RESPONSE
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0281       STREAM, READ
          RJM    ICF         SET MASTER OUT
          ACN    CH
          LDN    P.IP        LENGTH OF BASIC RESPONSE
          IAM    RPBF,CH     INPUT REQUIRED WORDS
          ZJN    RRP10       IF TRANSFER COMPLETE
          SHN    1
          STML   CRERR+/ILD/P.ADATA
          LDN    B.IP
          UJN    RRP20       LOG ERROR

 RRP10    LDML   RPBF+/IP/P.LEN  BYTE COUNT MINUS 2
          SBN    B.IP-/IP/B.LEN  ALREADY READ
          SHN    -1          CONVERT BYTE COUNT TO WORD COUNT
          ZJN    RRP30       IF ALL WORDS TRANSFERRED
          SBN    RPBL-P.IP+1
          PJK    RRP230      IF RESPONSE TOO LONG
          ADN    RPBL-P.IP+1  INPUT EXACT LENGTH
          IAM    RPBF+P.IP+/CCP/P.PARML,CH   INPUT REMAINING WORDS
          ZJN    RRP30       IF TRANSFER COMPLETE
          SHN    1
          STML   CRERR+/ILD/P.ADATA
          LDML   RPBF+/IP/P.LEN  BYTE COUNT MINUS 2
          ADN    B.IP-/IP/B.LEN  INCLUDE LENGTH FIELD
 RRP20    STML   CRERR+/ILD/P.EDATA
          SBML   CRERR+/ILD/P.ADATA
          STML   CRERR+/ILD/P.ADATA
          LDN    E07         INCOMPLETE TRANSFER
          STML   CRERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
 RRP30    STDL   IP          CLEAR INPUT PENDING FLAG
          LDC    MS50
 RRP40    BSS
          IJM    RRP50,CH    IF SLAVE IN DROPPED
          SBN    1
          NJN    RRP40       IF TIMEOUT NOT EXPIRED
          DCN    CH+40B
          LDN    E28         SLAVE IN DID NOT DROP
          STML   CRERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
          LDN    DS.ILR
          STDL   DSTATE
          UJK    RRP100

 RRP50    BSS
          SFM    RRP70,CH    IF CHANNEL ERROR FLAG SET
          LDML   CRERR+/ILD/P.SCODE  NON-ZERO IF ERROR DETECTED
          ZJN    RRP80       IF NO ERRORS DETECTED
 RRP60    LDN    0           UNSUCCESSFUL STATUS
          UJN    RRP90

 RRP70    LDC    CRERR       ERROR INFO BUFFER
          RJM    EFP         ERROR FLAG PROCESSING
          UJN    RRP60

 RRP80    LDC    /STATP/K.SUC  SUCCESSFUL STATUS
 RRP90    RJM    ESS         ENDING STATUS SEQUENCE
          ZJN    RRP120      IF ABLE TO GET SLAVE STATUS
          LDML   CRERR+/ILD/P.SCODE
          ZJN    RRP110      IF NO ERROR TO REPORT
 RRP100   LDC    CRERR
          RJM    CEP         LOG ERROR
 RRP110   LDC    777776B
          UJK    RRPX        EXIT A <0


 RRP120   LDDL   STATUS      SLAVE STATUS
          SHN    17-/STATP/SUC
          MJK    RRP170      IF TRANSFER SUCCESSFUL
          LDC    CRERR+/ILD/P.SCODE
          RJM    ISS         INCLUDE SLAVE STATUS
          LDC    CRERR+/ILD/P.SCODE
          RJM    IMS         INCLUDE MASTER STATUS
          LDML   CRERR+/ILD/P.SCODE
          NJN    RRP140      IF HOST SAW ERROR
          RJM    ASS         ANALYZE SLAVE STATUS
          STML   CRERR+/ILD/P.SCODE
 RRP140   LDC    CRERR       ERROR INFO BUFFER
          RJM    CEP         COMMON ERROR PROCESSING
 RRP150   LDN    1
 RRP160   UJK    RRP180      EXIT - (A) <> 0

 RRP170   LDML   RPBF+/IP/P.OPCODE
          LMK    O.SL
          ZJN    RRP190      IF *SUSPEND LINK*
          LDML   RPBF+/IP/P.REFNO  RESPONSE SEQUENCE NUMBER
          SBML   RPSEQ       EXPECTED SEQUENCE NUMBER
          NJN    RRP210      IF SEQUENCE NUMBERS OUT OF SYNC
          AOML   RPSEQ       INCREMENT RESPONSE SEQUENCE NUMBER
          LDN    0
 RRP180   UJK    RRPX        EXIT

*         *SUSPEND LINK* RESPONSE RECEIVED

 RRP190   LDN    2
          STML   RPSEQ       RESET RESPONSE SEQUENCE NUMBER
          STML   SLREC       *SUSPEND LINK* RECEIVED
          RJM    DGU         DEVICE GONE UNAVAILABLE
 RRP400   LDN    1
          UJN    RRP180

 RRP210   BSS    0
          LDML   RPSEQ       EXPECTED SEQUENCE NUMBER
          STML   LRS+/RS/P.EDATA  PLACE IN LOG MESSAGE
          LDML   RPBF+/IP/P.REFNO  ACTUAL SEQUENCE NUMBER
          STML   LRS+/RS/P.ADATA  PLACE IN LOG MESSAGE
          LDC    E202        RESPONSE SEQUENCE NUMBERS OUT OF SYNC
 RRP220   RJM    PPE         PROCESS PROTOCOL ERROR (NO RETURN)

 RRP230   LDML   RPBF+/IP/P.LEN  RESPONSE LENGTH
          STML   LRS+/RS/P.ADATA  PLACE IN LOG MESSAGE
          LDML   RPBF+/IP/P.OPCODE  RESPONSE OPCODE
          STML   LRS+/RS/P.OPCD  PLACE IN LOG MESSAGE
          LDC    E206
          UJN    RRP220

 RSS      SPACE  4,10
**        RSS - REQUEST SLAVE STATUS.
*
*         THIS ROUTINE REQUESTS THAT THE IVB RETURN
*         STATUS OF THE PREVIOUS COMMAND OR RESPONSE.
*         THIS ROUTINE IS USED WHEN AN ERROR PREVENTED
*         DATA STATUS FROM BEING EXCHANGED WITH THE IVB.
*
*         ENTRY  (RSTAT) = MASTER STATUS TO BE SENT.
*                (RSEQ) = SEQUENCE NUMBER BEING RECOVERED.
*


 RSS40    LDML   RSSA
          STML   CPBF+/IP/P.REFNO
          LDML   RSSB
          STML   RPSEQ
          LDN    0

 RSS      SUBR               ENTRY/EXIT
          LDML   CPBF+/IP/P.REFNO
          STML   RSSA
          LDML   RPSEQ
          STML   RSSB
          LDML   RSEQ
          STML   RPSEQ
          STML   CPBF+P.IP+/MSDS/P.REFNO
          SBN    1
          STML   CPBF+/IP/P.REFNO
          LDK    B.IP-/IP/B.LEN+B.MSDS
          STML   CPBF+/IP/P.LEN
          LDK    O.RSDS+0#80  REQUEST SLAVE DATA STATUS
          STML   CPBF+/IP/P.OPCODE
          LDML   RSTAT
          STML   CPBF+P.IP+/MSDS/P.STATUS
          LDN    B.MSDS-/MSDS/B.PARML
          SHN    /MSDS/N.PARML
          ADK    PID.MSDS
          STML   CPBF+P.IP+/MSDS/P.PARML
          RJM    SCP         SEND COMMAND
          NJK    RSS30       IF ERRORS

*         WAIT FOR IVB TO RESPOND

          RJM    RRP         READ RESPONSE
          RJM    RRP         READ RESPONSE
          NJK    RSS30       IF ERRORS
          LDML   CPBF+P.IP+/MSDS/P.REFNO
          LMML   RPBF+P.IP+/MSDS/P.REFNO
          NJK    RSS20       IF NOT IN SEQUENCE LOG ERROR
          LDML   RPBF+P.IP+/MSDS/P.STATUS
          SHN    -8
          STDL   STATUS
          TRACE  (RSS,STATUS)
          LDDL   STATUS
          SHN    17-/STATP/SUC
          MJK    RSS10       IF SUCCESSFUL
          UJK    RSS40       EXIT A=0

*         IF IVB STATUS IS SUCCESSFUL MAKE SURE
*         MASTER STATUS WAS ALSO SUCCESSFUL

 RSS10    LDML   CPBF+P.IP+/MSDS/P.STATUS
          STML   MSTAT
          SHN    17-/STATP/SUC
          MJK    RSS40       IF MASTER SUCCESSFUL EXIT A=0
          LDC    LRS+/RS/P.SCODE
          RJM    ISS         INCLUDE SLAVE STATUS
          LDC    LRS+/RS/P.SCODE
          RJM    IMS         INCLUDE MASTER STATUS
          LDC    E203
          RJM    PPE         LOG ERROR (NO RETURN)

 RSS20    LDML   CPBF+P.IP+/MSDS/P.REFNO
          STML   LRS+/RS/P.EDATA
          LDML   RPBF+P.IP+/MSDS/P.REFNO
          STML   LRS+/RS/P.ADATA
          LDC    E202
          RJM    PPE         LOG ERROR (NO RETURN)

 RSS30    LDN    DS.ILR
          STDL   DSTATE      RESET IVB
          UJK    MCL         EXIT TO MAIN LOOP

 RSSA     BSSZ   1           SAVE COMMAND REFERENCE NUMBER
 RSSB     BSSZ   1           SAVE RESPONSE REFERENCE NUMBER
 SAF      SPACE  4,18
**        SAF - SEND ADAPTER FUNCTION.
*
*         SEND A FUNCTION TO THE IPI ADAPTER WITHOUT
*         INCLUDING IN THE FUNCTION HISTORY TABLE.
*         THIS ROUTINE IS USED TO READ AND CLEAR ADAPTOR
*         REGISTERS. NO RECOVERY IS PERFORMED.
*         ALL ERRORS ARE FATAL AND THE IPI IS DOWNED.
*
*         *********************************************************
*         * NOTE: THIS ROUTINE DOES NOT RETURN TO THE CALLER IF   *
*         *       ERRORS OCCUR, RATHER IT RETURNS TO THE MAIN LOOP*
*         *********************************************************
*
*         ENTRY  (A) = FUNCTION CODE.
*
*         EXIT   LF = FUNCTION CODE.
*
*         CALLS  CFH, SLM.


 SAF      SUBR
          STML   LF
          DCN    CH+40B      ENSURE CHANNEL IS INACTIVE
          FAN    CH          ISSUE THE FUNCTION
          LDN    77B
 SAF10    IJM    SAFX,CH     IF FUNCTION REPLY
          SBN    1
          NJN    SAF10       IF NOT TIMEOUT
          LDK    E01
          STML   LRS+/RS/P.SCODE
          LDDL   LF
          STML   FBUF,FI     INCLUDE FUNCTION CODE IS HISTORY LIST
          AODL   FI
          LPN    7
          STDL   FI          UPDATE INDEX INTO HISTORY TABLE
          LDC    LRS+/RS/P.SCODE
          RJM    CFH         GET FUNCTION HISTORY
          LDN    PS.HLT
          STDL   PPSTATE     DOWN DEVICE
          RJM    SLM         LOG ERROR
          LJM    MCL         EXIT TO MAIN LOOP
 SBL      SPACE  4,12
**        SBL - SET BUFFER POOL DESCRIPTOR LOCK.
*
*         THIS ROUTINE INTERLOCKS THE SPECIFIED WORD IN THE
*         BUFFER POOL DESCRIPTOR.
*
*         ENTRY  (A) = ARRAY INDEX OF POOL DESCRIPTOR TO LOCK.
*
*         EXIT   (A) = 0, TO SHOW THAT THE CM WORD IS INTERLOCKED.
*
*         USES   T5, T7.
*
*         CALLS  SLR.
          SPACE  4,10
 SBL      SUBR               ENTRY/EXIT
          STDL   T5
          LDK    CM.BPD      FIRST BUFFER POOL DESCRIPTOR
          STDL   T7
          RJM    SLR         SET LOCK RESERVATION
          UJK    SBLX
 SCL      SPACE  4,10
**        SCL - SET CHANNEL LOCK.
*
*         THIS ROUTINE SETS THE CHANNEL LOCK IN THE CM
*         CHANNEL TABLE.
*
*         ENTRY  (CM.CHAN) = CM ADDRESS OF CHANNEL TABLE,
*                (CHAN) = CHANNEL NUMBER.
*
*         EXIT   (A) = 0, IF LOCK COULD BE SET,
*                   <> 0, IF LOCK NOT SET.
*
*         USES   T5, T7.
*

 SCL      SUBR               ENTRY/EXIT
          LDC    CM.CHAN
          STDL   T7          CHANNEL TABLE
          LDML   CHAN
          STDL   T5          CHANNEL NUMBER
          RJM    SLR         SET LOCK RESERVATION
          RJM    SLW         SET LOCK WORD
          UJN    SCLX        EXIT
 SCP      SPACE  4,10
**        SCP - SEND COMMAND PACKET.
*
*         THIS ROUTINE WILL SEND THE PREVIOUSLY CONSTRUCTED
*         COMMAND PACKET TO THE IVB.
*
*         ENTRY  (CPBF) = COMMAND PACKET.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                   <> 0, IF UNSUCCESSFUL
*                   <  0, IF SLAVE STATUS NOT RECEIVED.
*
*         USES   WC
*
*         CALLS  BCS, CEP, EFP, ESS, ICF.


 SCP140   LDN    0

 SCP      SUBR
          AOML   CPBF+/IP/P.REFNO  INCREMENT COMMAND SEQUENCE NUMBER
          LDN    CMDOUT      BUS A FOR COMMAND
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0381       STREAM, WRITE
          RJM    ICF         RAISE MASTER OUT
          ACN    CH
          LDML   CPBF+/IP/P.LEN  LENGTH FIELD
          ADN    /IP/B.LEN+1  ADD SIZE OF LENGTH FIELD AND ROUND UP
          SHN    -1
          OAM    CPBF,CH     SEND COMMAND PACKET
          STDL   WC          WORDS NOT TRANSFERRED
          ZJN    SCP10       IF TRANSFER COMPLETE
          LDN    E07         INCOMPLETE TRANSFER
          STML   CRERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
          LDML   CPBF+/IP/P.LEN  LENGTH FIELD
          ADN    /IP/B.LEN+1  ADD SIZE OF LENGTH FIELD AND ROUND UP
          SHN    -1
          STML   CRERR+/ILD/P.EDATA
          SBDL   WC
          STML   CRERR+/ILD/P.ADATA
 SCP10    LDC    MS50
 SCP20    IJM    SCP30,CH    IF SLAVE IN DROPPED
          IJM    SCP30,CH    (INCREASE LOOP TIME...IVB HAS HUNG HERE)
          IJM    SCP30,CH
          SBN    1
          NJN    SCP20       IF TIMEOUT NOT EXPIRED
          DCN    CH+40B
          LDN    E28         SLAVE IN DID NOT DROP
          STML   CRERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
          LDN    DS.ILR
          STDL   DSTATE
          UJK    SCP70

 SCP30    CFM    SCP40,CH    IF NO CHANNEL ERROR
          LDC    CRERR       ERROR INFO BUFFER
          RJM    EFP         ERROR FLAG PROCESSING
 SCP40    LDML   CRERR+/ILD/P.SCODE  NON-ZERO IF ERROR DETECTED
          ZJN    SCP50       IF TRANSFER SUCCESSFUL
          LDN    0           UNSUCCESSFUL STATUS
          UJN    SCP60

 SCP50    LDC    /STATP/K.SUC  SUCCESSFUL STATUS
 SCP60    RJM    ESS         ENDING STATUS SEQUENCE
          ZJN    SCP90       IF ABLE TO GET SLAVE STATUS
          LDML   CRERR+/ILD/P.SCODE
          ZJN    SCP80       IF NO ERROR TO REPORT
 SCP70    LDC    CRERR
          RJM    CEP         LOG ERROR
 SCP80    LDC    777776B
          UJK    SCPX        EXIT A <0

 SCP90    LDDL   STATUS      SLAVE STATUS
          SHN    17-/STATP/SUC
          MJK    SCP140      IF TRANSFER SUCCESSFUL
          LDC    CRERR+/ILD/P.SCODE
          RJM    ISS         INCLUDE SLAVE STATUS
          LDC    CRERR+/ILD/P.SCODE
          RJM    IMS         INCLUDE MASTER STATUS
          LDML   CRERR+/ILD/P.SCODE
          NJN    SCP110      IF HOST SAW ERROR
          RJM    ASS         ANALYZE SLAVE STATUS
          STML   CRERR+/ILD/P.SCODE
 SCP110   LDC    CRERR       ERROR INFO BUFFER
          RJM    CEP         COMMON ERROR PROCESSING
 SCP120   LDN    1
          UJK    SCPX        EXIT - (A) <> 0
 SDO      SPACE  4,10
**        SDO - SEND DEVICE OPERATIONAL.
*
*         THIS ROUTINE SENDS A DEVICE OPERATIONAL
*         UNSOLICITED RESPONSE TO THE CPU TO NOTIFY
*         THE HOST THAT THE IVB IS IN SERVICE. THE
*         RESPONSE WILL CONTAIN THE MAXIMUM CCPDU SIZE
*         SUPPORTED BY THE IVB.
*
*         EXIT   (DSTATE) = DS.WOA.
*
*         CALLS  SUR.

 SDO      SUBR               ENTRY/EXIT
          LDN    /RS/C.SYSID*8+8
          STML   RS+/RS/P.RESPL  RESPONSE LENGTH
          LDML   IPIVER
          STML   RS+/RS/P.PROV  IPI PROTOCOL VERSION
          LDN    0
          STML   RS+/RS/P.MAXRS
          LDML   MAXPDU
          STML   RS+/RS/P.MAXRS+1  MAXIMUM CCPDU SIZE
          LDN    RC.DS       DEATAILED STATUS INCLUDED
          STML   RCON        RESPONSE CONDITION CODE
          LDN    URC.OPER    DEVICE OPERATIONAL RESPONSE
          RJM    SUR         SEND UNSOLICITED RESPONSE
          LCN    0
          STML   AVAIL       DEVICE AVAILABLE
          RJM    LAM         LOG AVAILABILITY
          LDN    DS.WOA
          STDL   DSTATE      WAIT FOR DEVICE OPERATIONAL ACK
          UJK    SDOX        EXIT
 SEL      SPACE  4,10
**        SEL - SELECT CONTROL MODULE.
*
*         THIS ROUTINE WILL SELECT THE IVB.
*
*         ***********************************************************
*         * NOTE: THIS ROUTINE ASSUMES THE DEVICE HAS RESET IF      *
*         *       THE SELECT FAILS. IN THIS CASE RETURN IS TO THE   *
*         *       MAIN LOOP                                         *
*         ***********************************************************
*
*         USES   P6.
*
*         CALLS  CEP, EFP, ICF.


 SEL      SUBR               ENTRY/EXIT
 SELA     LDC    H0029       SET SELECT OUT
          RJM    ICF
          ACN    CH
          LDN    77B
 SEL10    FJM    SEL20,CH    IF SLAVE IN
          SBN    1
          NJN    SEL10       IF TIMEOUT NOT EXPIRED
          LDN    DS.ILR
          STDL   DSTATE
          UJK    MCL         EXIT TO MAIL LOOP

 SEL20    IAN    CH
          SFM    SEL50,CH    IF CHANNEL ERROR
          LPC    377B
          LMC    **
 SELB     EQU    *-1
          ZJN    SELX        IF CORRECT BIT SIGNIFICANT RESPONSE - EXIT
          STDL   STATUS      SAVE BIT SIGNIFICANT RESPONSE
          LDC    OTHERR
          RJM    ISS         INCLUDE SLAVE STATUS
          LDN    E21         BIT SIGNIFICANT RESPONSE WRONG
 SEL30    BSS
          STML   OTHERR+/ILD/P.SCODE  SAVE SYMPTOM CODE
 SEL40    LDN    DS.ILR
          STDL   DSTATE
          LDC    OTHERR      ERROR INFO BUFFER ADDRESS
          RJM    CEP         COMMON ERROR PROCESSING ( NO RETURN )

 SEL50    LDC    OTHERR      ERROR INFO BUFFER ADDRESS
          RJM    EFP         ERROR FLAG PROCESSING
          UJN    SEL40
 SFR      SPACE  4,10
**        SFR - SETUP FOR READ.
*
*         THIS ROUTINE WILL SETUP THE RESPONSE BUFFER
*         LENGTH/ADDRESS PAIRS AND THE BUFFER RMA'S IN
*         *BPRMA* IN PREPARATION OF AN UPCOMING READ OF
*         THE SPECIFIED NUMBER OF BYTES.
*
*         ENTRY  (A) = TOTAL NUMBER OF BYTES TO READ,
*
*         EXIT   (BUFCNT) = NUMBER OF BUFFERS USED,
*                (CML) = 0 = OFFSET OF FIRST LENGTH/ADDRESS PAIR,
*                (BPRMA) = LENGTH/RMA ADDRESS PAIRS FOR READ BUFFERS.
*
*         USES   T2.


 SFR      SUBR               ENTRY/EXIT
          STDL   BYTS        TRANSFER SIZE
          LDN    0
          STDL   CML         LENGTH/ADDRESS PAIR OFFSET
          STML   BUFCNT
 SFR10    LDN    SMINDX
          STDL   BPINDX      BUFFER POOL INDEX
          LDML   BPSIZE,BPINDX  BUFFER SIZE
          SBML   BYTS
          PJN    SFR20       IF SMALL BUFFER LARGE ENOUGH
          AODL   BPINDX      USE LARGE BUFFER
          LDC    LBUFC
          UJN    SFR30

 SFR20    LDC    SBUFC
 SFR30    STML   CACHE       BASE BUFFER CACHE ADDRESS
          AOML   BUFCNT      NUMBER OF BUFFERS USED
          LDML   BPSIZE,BPINDX
          SBDL   BYTS
          MJN    SFR40       IF NOT FIRST BUFFER

*         INITIALIZE FOR FIRST BUFFER

          LDN    0
          STDL   CML         OFFSET INTO RESPONSE AND *BPRMA*
          UJN    SFR50

*         INITIALIZE FOR ALL OTHER BUFFERS

 SFR40    LDN    4
          RADL   CML         OFFSET INTO RESPONSE AND *BPRMA*

*         SETUP BUFFER PVA IN RESPONSE BUFFER

          ERRNZ  P.IBC-8     INTERNAL BUFFER CACHE ENTRY LENGTH = 8
 SFR50    LDML   BPCNT,BPINDX
          SHN    3
          ADML   CACHE       BASE CACHE ADDRESS
          STDL   T2          NEXT AVAILABLE BUFFER CACHE ENTRY ADDRESS

*         SETUP RESPONSE BUFFER PVA

          LDML   /IBC/P.PVA,T2
          STML   RS+/RS/P.BUFPVA,CML
          LDML   /IBC/P.PVA+1,T2
          STML   RS+/RS/P.BUFPVA+1,CML
          LDML   /IBC/P.PVA+2,T2
          STML   RS+/RS/P.BUFPVA+2,CML  MOVE PVA TO RESPONSE

*         SETUP BUFFER RMA

          LDML   /IBC/P.RMA,T2
          STML   BPRMA+/BPR/P.RMA,CML
          LDML   /IBC/P.RMA+1,T2
          STML   BPRMA+/BPR/P.RMA+1,CML  SETUP BUFFER RMA
          AOML   BPCNT,BPINDX  BUFFERS NEEDED TO FILL CACHE

*         SETUP LENGTH FIELD IN RESPONSE BUFFER

          LDML   BPSIZE,BPINDX  BUFFER SIZE
          STML   RS+/RS/P.DLEN,CML
          STML   BPRMA+/BPR/P.LENGTH,CML  TRANSFER SIZE FOR BUFFER
          LDDL   BYTS        REMAINING BYTES
          SBML   BPRMA+/BPR/P.LENGTH,CML
          PJN    SFR70       IF ENTIRE BUFFER NEEDED

*         SETUP CORRECT BYTE COUNT AND START ADDRESS FOR FIRST BUFFER

          LDDL   BYTS        REMAINING BYTES
          STML   RS+/RS/P.DLEN  BYTES TO BE WRITTEN INTO FIRST BUFFER
          STML   BPRMA+/BPR/P.LENGTH  TRANSFER SIZE FOR FIRST BUFFER
          LDML   BPSIZE,BPINDX  BUFFER SIZE
          SBML   RS+/RS/P.DLEN  BYTES TO BE WRITTEN INTO FIRST BUFFER
          RAML   BPRMA+/BPR/P.RMA+1  INCREMENT DATA START ADDRESS
          SHN    -16
          RAML   BPRMA+/BPR/P.RMA
          LDN    0

 SFR70    STDL   BYTS        REMAINING BYTES
          NJK    SFR10       IF MORE BUFFERS NEEDED
          LDML   BUFCNT
          SHN    3           LENGTH OF ALL LENGTH/ADDRESS PAIRS
          ADN    /RS/C.DLEN*8
          STML   RS+/RS/P.RESPL  SETUP RESPONSE LENGTH
          UJK    SFRX        EXIT
 SLM      SPACE  4,12
**        SLM - SEND LOG MESSAGE.
*
*         THIS ROUTINE IS CALLED TO SEND A LOG MESSAGE TO
*         THE HOST.
*
*         ENTRY  (LRS) = RESPONSE TO BE SENT.
*
*         CALLS  ILM, SPR.

 SLM      SUBR               ENTRY/EXIT
          LDDL   PPSTATE
          SBN    PS.HLT
          NJN    SLM10       IF NOT HALTED
          LDC    /RS/K.DIVB
          RAML   LRS+/RS/P.FLAGS  SET IVB DOWN
 SLM10    LDC    LRS
          RJM    SPR         SEND RESPONSE
          LDC    LRS+/RS/P.SCODE
          RJM    ILM         REINITIALIZE LOG RESPONSE
          UJN    SLMX        EXIT
 SLR      SPACE  4,16
**        SLR - SET LOCK RESERVATION.
*
*         THIS ROUTINE INTERLOCKS THE COMPARE/SWAP WORD AT THE SPECIFIED
*         CM ADDRESS.  IT PLACES 0FFFFFFFF(16) IN THE UPPER PORTION OF THE
*         WORD TO RESERVE IT.
*
*         ENTRY  (T5) = WORD OFFSET OF CM WORD TO INTERLOCK.
*                (T7) = CM ADDRESS OF TABLE.
*
*         EXIT   (A) = 0, INDICATES LOCK HAS BEEN RESERVED.
*                (P1 - P4) = ORIGINAL CONTENTS OF CM WORD.
*                (T6) = (A) PORTION OF ADDRESS OF CM WORD.
*
*         USES   P1 - P4, T5, T6, T7.
*
*         MACROS LOADR.


 SLR      SUBR               ENTRY/EXIT
 SLR10    LCN    0
          STDL   P1
          STDL   P2
          LDN    0
          STDL   P3
          STDL   P4
 IVB0     IF     DEF,IVB0
          LRIL   T7
          LDML   1,T7        UNIT/PP INTERFACE/ETC TABLE ADDRESS
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADR  0,T7        UNIT/PP INTERFACE/ETC TABLE ADDRESS
 IVB4     ENDIF
          ADDL   T5          ADD INTERLOCK WORD OFFSET
          STDL   T6
          RDSL   P1          SET UPPER 32 BITS OF LOCK WORD TO '1'S
          LDDL   P1
          ADDL   P2
          ADC    400001B
          ZJN    SLR10       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS

*         WORD HAS BEEN SUCCESSFULLY INTERLOCKED

          LDN    0           INTERLOCK RESERVED
          UJK    SLRX        EXIT, INTERLOCK RESERVED
 SLW      SPACE  4,10
**        SLW - SET LOCK WORD.
*
*         THIS ROUTINE SETS THE LOCK WORD AT THE SPECIFIED
*         CM ADDRESS.
*
*         ENTRY  (P1 - P4) = ORIGINAL CONTENTS OF LOCK,
*                (R) = R-REGISTER PORTION OF LOCK ADDRESS,
*                (T6) = A-REGISTER PORTION OF LOCK ADDRESS (LOCK OFFSET).
*
*         EXIT   (A) = 0, IF LOCK SET,
*                (A) <> 0, IF LOCK COULD NOT BE SET,
*                (P1 - P4) = NEW CONTENTS OF LOCKWORD.
*
*         USES   P1 - P4, T6.


 SLW      SUBR               ENTRY/EXIT
          LDDL   P1
          SHN    17-15
          MJN    SLW20       IF INTERLOCK ALREADY SET (RESTORE WORD)
          LDC    100000B
          RADL   P1          SET INTERLOCK BIT
          LDDL   PPNO        PP NUMBER
          STDL   P4

 SLW20    LDDL   T6
          ADC    400000B
          CWDL   P1          UPDATE INTERLOCK WORD
          LDDL   P4
          LMDL   PPNO        PP NUMBER

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

          UJK    SLWX        EXIT
 SNO      SPACE  4,10
**        SNO - SEND NO-OP.
*
*         THIS ROUTINE WILL SEND A *NO-OP* COMMAND TO
*         THE IVB. THE IVB MUST HAVE ALREADY BEEN
*         SELECTED
*
*         CALLS  SCP.
*

 SNO      SUBR               ENTRY/EXIT
          LDN    RRL
          STML   RTCNT
 SNO10    LDN    B.IP-/IP/B.LEN  SET LENGTH
          STML   CPBF+/IP/P.LEN
          LDK    O.NOOP+0#80 SET NO-OP COMMAND
          STML   CPBF+/IP/P.OPCODE
          RJM    SCP         SEND COMMAND PACKET
          ZJK    SNOX        IF NO ERRORS
          PJN    SNO20       IF STATUS RECEIVED
          RJM    ALC         ABORT LAST COMMAND
          NJK    SNOX        IF RESET
 SNO20    SOML   RTCNT       DECREMENT RETRY COUNT
          NJN    SNO10       IF RETRY'S REMAINING
          LDN    DS.ILR
          STML   DSTATE
          UJK    SNOX        EXIT
 SPL      SPACE  4,10
**        SPL - SET PP LOCK.
*
*         THIS ROUTINE SET THE PP REQUEST QUEUE LOCK IN
*         THE PP INTERFACE TABLE.
*
*         EXIT   (A) = 0, IF LOCK SET,
*                   <> 0, IF LOCK COULD NOT BE SET.
*
*         USES   T5, T7.
*
*         CALLS  SLR, SLW.


 SPL      SUBR
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    SLR         SET LOCK RESERVATION
          RJM    SLW         SET LOCK WORD
          UJK    SPLX        EXIT
 SPR      SPACE  4,10
**        SPR - SEND PP RESPONSE.
*
*         THIS ROUTINE WILL WRITE THE SPECIFIED RESPONSE TO
*         THE CM RESPONSE BUFFER, UPDATE THE 'IN' POINTER AND
*         OPTIONALLY INTERRUPT THE PROCESSOR.
*
*         ENTRY  (A) = PP RESPONSE BUFFER ADDRESS,
*                (INN) = CURRENT 'IN' POINTER,
*                (LIM) = RESPONSE BUFFER LIMIT.
*
*         EXIT   (INN) = NEW 'IN' POINTER.
*
*         USES   T2 - T8.
*
*         MACROS LOADC.


 SPR      SUBR               ENTRY/EXIT
          STDL   T8
          STML   SPRA        INSTRUCTION MODIFICATION FOR BUFFER
          RJM    PRB         PREPARE RESPONSE BUFFER

 SPR10    BSS
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          ADN    /PIT/C.OUT  OFFSET OF OUT POINTER
          CRDL   T4          READ OUT POINTER

*         CHECK IF THERE IS ROOM FOR THE RESPONSE IN THE RESPONSE BUFFER.

          LDDL   INN         IN POINTER
          STDL   T1
          SBDL   T7          OUT POINTER
          MJN    SPR20       IF IN .LT. OUT
          LDDL   LIM         IN .GE. OUT, SET OUT = OUT + LIMIT
          RADL   T7
 SPR20    LDML   /RS/P.RESPL,T8  GET RESPONSE LENGTH
          STDL   INPNT
          LDN    0
          STDL   T2          CLEAR WRAP FLAG
          LDDL   INN
          RADL   INPNT       IN + RESPONSE LENGTH
          SBDL   T7          CHECK IF ENOUGH ROOM IN BUFFER FOR RESPONSE
          PJN    SPR10       IF NOT ENOUGH ROOM IN BUFFER, LOOP
          LDDL   INPNT
          STDL   INN         UPDATE 'IN' POINTER
          SBDL   LIM
          MJN    SPR40       IF IN + RESPONSE LENGTH .LT. LIMIT
          STDL   INN         IN + RESPONSE LENGTH - LIMIT = NEW IN POINTER
          AODL   T2          2 BLOCK WRITES REQUIRED

*         WRITE RESPONSE TO CM.

 SPR40    LDDL   T1          ORIGINAL 'IN' POINTER
          SHN    -3
          STDL   T3          'IN' POINTER IN WORDS
          LDML   /RS/P.RESPL,T8  CONVERT RESPONSE LENGTH TO WORDS
          SHN    -3
          STDL   T4          RESPONSE LENGTH IN WORDS
          STDL   T5
          LDDL   T2
          ZJN    SPR50       IF ONLY 1 BLOCK WRITE REQUIRED
          LDDL   LIM         FIRST BLOCK WRITE = (LIMIT - IN) WORDS
          SBDL   T1          ORIGINAL 'IN' POINTER
          SHN    -3
          STDL   T4          NUMBER OF WORDS TO TRANSFER ON FIRST BLOCK
          SHN    2           CONVERT TO NUMBER OF PP WORDS
          ADDL   T8
          STML   SPRB        RESPONSE ADDRESS FOR SECOND BLOCK WRITE
 SPR50    LOADC  CM.RS       LOAD CM ADDRESS OF RESPONSE BUFFER
          STDL   T6          SAVE CM ADDRESS
          ADDL   T3          ADD IN OFFSET
          CWML   **,T4       WRITE RESPONSE TO CM

*         CWML   (A),T4      ENTRY CONDITION SPECIFIES BUFFER ADDRESS

 SPRA     EQU    *-1
          LDDL   T5          RESPONSE LENGTH
          SBDL   T4
          ZJN    SPR70       IF ONLY 1 BLOCK WRITE REQUIRED
          STDL   T5          RESPONSE LENGTH - (LIMIT - IN)
          LDDL   T6          LOAD ADDRESS OF RESPONSE BUFFER
          LMC    400000B
          CWML   **,T5       WRITE SECOND PART OF RESPONSE TO CM
                             (BEGINNING OF RESPONSE BUFFER)
 SPRB     EQU    *-1

*         SET UP INTERRUPT PROCESSOR INSTRUCTION IF INTERRUPT IS SELECTED.

 SPR70    BSS
          LDML   RQ+/RQ/P.INT  CHECK IF INTERRUPT WAS SELECTED
          LPC    /RQ/K.INT
          ZJN    SPR80       IF INTERRUPT WAS NOT SELECTED

*         AFTER THE FIRST REQUEST SELECTING INTERRUPT IS PROCESSED,
*         ALL FOLLOWING RESPONSES WILL ALSO SEND AN INTERRUPT.

          LDML   RQ+/RQ/P.PORT  GET PROCESSOR PORT NUMBER TO INTERRUPT
          SHN    -16+/RQ/L.PORT+/RQ/N.PORT
          LPN    /RQ/M.PORT
          ADC    .INPN
          STML   INTPRC
 SPR80    BSS    0
          RJM    UIP         UPDATE 'IN' POINTER
          RJM    IRC         INITIALIZE RESPONSE CODES
          UJK    SPRX        EXIT
 SRL      SPACE  4,10
**        SRL - SEND RESUME LINK.
*
*         THIS ROUTINE WILL SEND A *RESUME LINK*
*         COMMAND TO THE IVB. THE IVB MUST HAVE ALREADY
*         BEEN SELECTED.
*
*         CALLS  SCP.
*

 SRL      SUBR               ENTRY/EXIT
          LDN    RRL
          STML   RTCNT
 SRL10    LDN    B.IP-/IP/B.LEN  SET LENGTH
          STML   CPBF+/IP/P.LEN
          LDK    O.RL+0#80   SET RESUME LINK COMMAND
          STML   CPBF+/IP/P.OPCODE
          RJM    SCP         SEND COMMAND PACKET
          ZJK    SRLX        IF NO ERRORS
          PJN    SRL20       IF STATUS RECEIVED
          RJM    ALC         ABORT LAST COMMAND
          NJK    SRLX        IF RESET
 SRL20    SOML   RTCNT       DECREMENT RETRY COUNT
          NJN    SRL10       IF RETRY'S REMAINING
          LDN    DS.ILR
          STML   DSTATE
          UJK    SRLX        EXIT
 SRS      SPACE  4,10
**        SRS - SEND REPORT STATUS.
*
*         THIS ROUTINE SENDS A REPORT STATUS COMMAND
*         TO THE IVB. THE COMMAND WILL REPORT THE
*         OPENING OR CLOSING OF THE SEND GLOBAL FLOW
*         CONTROL WINDOW.
*
*         ENTRY  (INPOK) = STATE OF SEND WINDOW.
*
*         EXIT   (A) = 0, IF COMMAND SENT SUCCESSFULLY,
*                   <> 0, IF UNABLE TO SEND COMMAND.
*

 SRS      SUBR               ENTRY/EXIT
          TRACE  (SRS,IP,STATUS,INPOK)
          LDN    RRL
          STML   RTCNT
 SRS10    LDDL   INPOK
          SHN    8
          STML   CPBF+P.IP+/STATP/P.STATUS  SETUP STATUS
          LDN    B.IP-/IP/B.LEN+B.STATP  SET LENGTH
          STML   CPBF+/IP/P.LEN
          LDK    O.RSTAT+0#80   SET REPORT STATUS COMMAND
          STML   CPBF+/IP/P.OPCODE

*         SETUP REST OF GLOBAL FLOW CONTROL STATUS PARAMETER

          LDN    B.STATP-/STATP/B.PARML
          SHN    /STATP/N.PARML
          ADK    PID.GFC
          STML   CPBF+P.IP+/STATP/P.PARML  SETUP LENGTH AND ID FIELDS

          RJM    SCP         SEND COMMAND PACKET
          ZJK    SRSX        IF NO ERRORS
          PJN    SRS20       IF STATUS RECEIVED
          RJM    ALC         ABORT LAST COMMAND
          NJK    SRSX        IF RESET
 SRS20    SOML   RTCNT       DECREMENT RETRY COUNT
          NJN    SRS10       IF RETRY'S REMAINING
          LDN    DS.ILR
          STML   DSTATE
          UJK    SRSX        EXIT

 SSL      SPACE  4,10
**        SSL - SEND SUSPEND LINK.
*
*         THIS ROUTINE SENDS A SUSPEND LINK COMMAND
*         TO THE IVB. THE IVB MUST HAVE ALREADY BEEN
*         SELECTED.
*
*         ENTRY  (RPBF) = *SUSPEND LINK* RESPONSE
*
*         EXIT   (A) = 0, IF SUCCESSFUL,
*                   <> 0, IF UNABLE TO SEND COMMAND.
*
*         CALLS  CRC, SCP.
*

 SSL      SUBR
          LDN    RRL
          STML   RTCNT
 SSL10    RJM    CRC         COPY RESPONSE TO COMMAND BUFFER
          LDN    0
          STML   CPBF+/IP/P.REFNO  INITIALIZE COMMAND REFERENCE NUMBER
          RJM    SCP         SEND COMMAND PACKET
          ZJK    SSLX        IF NO ERRORS
          PJN    SSL20       IF STATUS RECEIVED
          RJM    ALC         ABORT LAST COMMAND
          NJK    SSLX        IF RESET
 SSL20    SOML   RTCNT       DECREMENT RETRY COUNT
          NJN    SSL10       IF RETRY'S REMAINING
          LDN    DS.ILR
          STML   DSTATE
          UJK    SSLX        EXIT
 STB      SPACE  4,10
**        STB - SEARCH TABLE.
*
*         THIS ROUTINE WILL PERFORM A TABLE SEARCH ON
*         THE SPECIFIED TABLE.  THE TABLE MUST HAVE TWO
*         WORDS PER ENTRY.
*
*         ENTRY  (A) = ADDRESS - 2 OF TABLE TO SEARCH.
*                (STBI) = KEY FOR SEARCH.
*
*         EXIT   (A) = 0, IF NO MATCH FOUND.
*                (A) = ADDRESS OF PROCESSOR OR FUNCTION TO
*                      ISSUE TO MCI.
*
*         USES   T2.


 STB      SUBR               ENTRY/EXIT
          STDL   T2
 STB10    LDN    2
          RADL   T2
          LDIL   T2          GET NEXT ENTRY
          ZJN    STBX        IF END OF TABLE
          LMML   STBI
          NJN    STB10       IF NOT A MATCH
          AODL   T2
          LDIL   T2          GET FUNCTION CODE OR PROCESSOR ADDRESS
          UJK    STBX        EXIT WITH ADDRESS
 STD      SPACE  4,16
**        STD - SAVE TRACE DATA.
*
*         THIS ROUTINE IS USED FOR DEBUGGING PURPOSES AND IS USED IN
*         CONJUNCTION WITH THE TRACE MACRO. A CIRCULAR BUFFER IS KEPT
*         AT LOCATIONS 30000B THRU 37777B. LOCATION STDA CONTAINS THE
*         ADDRESS OF THE NEXT ENTRY IN THE BUFFER. EACH ENTRY IS 10B
*         WORDS LONG AND SAVES THE A REGISTER, CALLER ADDRESS, CLOCK,
*         PLUS UP TO FIVE VARIABLES.
*
*         EXIT   (3XXX0) = CALLER ADDRESS.
*                (3XXX1) = (A).
*                (3XXX2) = CLOCK.
*                (3XXX3 - 3XXX7) = VALUE OF VARIABLE LIST.
*
*         USES   LOC 0.


 STD      SUBR
          STDL   0           SAVE (A)
          LDC    15000B
*         LDC    30000B
 STDA     EQU    *-1
          STML   STDC
          ADN    1
          STML   STDB
          ADN    1
          STML   STDD
          ADN    1
          STML   STDF
          ADN    5
          STM    STDA
          LDDL   0           SAVE (A)            WORD 1
          STML   **
 STDB     EQU    *-1
          LDML   STD         SAVE CALL ADDRESS   WORD 0
          STML   **
 STDC     EQU    *-1
          STDL   0
          IAN.   14B
          STML   **          SAVE TIME           WORD 2
 STDD     EQU    *-1
          AOML   STD         ADJUST RETURN ADDRESS
          LDIL   0           GET PARAMETER LIST
          ZJN    STD20       IF NO PARAMETERS
          STDL   0
 STD10    LDIL   0
          ZJN    STD20       IF END OF PARAMETERS
          STML   STDE
          AODL   0
          LDML   **
 STDE     EQU    *-1
 STD20    STML   **
 STDF     EQU    *-1
          AOML   STDF
          LPN    7
          NJN    STD10       IF NOT COMPLETE
*
*
          LDM    STDA
          NJK    STDX
          LDC    5000B
          STM    STDA
*
*
          UJK    STDX
 STR      SPACE  4,10
**        STR - SEND TERMINATION RESPONSE.
*
*         THIS ROUTINE TERMINATES A PERIPHERAL REQUEST BY SENDING
*         A SOLICITED RESPONSE AND DELINKING THE REQUEST.
*
*         CALLS  DLR, PRC, UIP, WRB, ZRE.


 STR      SUBR               ENTRY/EXIT
          RJM    PRB         PUT RESPONSE CODES IN RESPONSE
          RJM    DUR         DELINK REQUEST
          LDC    RS          RESPONSE BUFFER
          RJM    SPR         WRITE RESPONSE BUFFER
          UJN    STRX        RETURN
 SUR      SPACE  4,10
**        SUR - SEND UNSOLICITED RESPONSE.
*
*         THIS ROUTINE SENDS AN UNSOLICITED RESPONSE
*         TO THE CPU.
*
*         ENTRY  (A) = UNSOLICITED RESPONSE CODE.
*
*         CALLS  PRB, SPR.


 SUR      SUBR
          STML   UNSC        UNSOLICITED RESPONSE CODE
          LDN    R.UNS
          STML   RESPC       UNSOLICITED RESPONSE
          RJM    PRB         PREPARE RESPONSE BUFFER
          LDC    RS
          RJM    SPR         SEND PP RESPONSE
          UJK    SURX        EXIT
 UGS      SPACE  4,10
**        UGS - UPDATE GLOBAL STATUS.
*
*         THIS ROUTINE WILL UPDATE THE PP'S INTERNAL
*         GLOBAL FLOW CONTROL STATUS VARIABLES BASED
*         ON THE STATUS RECEIVED FROM THE IVB.
*
*         ENTRY  (A) = STATUS BYTE.
*
*         EXIT   (SNDOK) AND (IP) UPDATED APPROPRIATELY.
*
*         USES   T1.


 UGS      SUBR               ENTRY/EXIT
          STDL   T1
          LPN    /STATP/K.INPOK
          STDL   IP          UPDATE INPUT PENDING FLAG
          LDDL   T1          GLOBAL FLOW CONTROL STATUS BYTE
          LPN    /STATP/K.SNDOK
          SHN    -/STATP/SNDOK
          STDL   SNDOK       UPDATE SEND OK FLAG
          TRACE  (UGS,T1)
          UJN    UGSX        EXIT
 UIP      SPACE  4,10
**        UIP - UPDATE IN POINTER.
*
*         THIS ROUTINE UPDATES THE 'IN' POINTER IN CM,
*         SETS THE CM INTERRUPT WORD NON-ZERO, AND
*         INTERRUPTS THE CPU.
*
*         ENTRY  (INN) = NEW 'IN' POINTER.
*
*         USES   P1, P2, P3, P4.
*
*         MACROS LOADC.


 UIP      SUBR               ENTRY/EXIT
          LDN    0
          STDL   P1
          STDL   P2
          STDL   P3
          LDDL   INN         NEW 'IN' POINTER
          STDL   P4
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          ADN    /PIT/C.IN   OFFSET OF 'IN' POINTER
          CWDL   P1          WRITE NEW 'IN' POINTER TO CM

*         SET CM INTERRUPT WORD NON-ZERO AND CONDITIONALLY INTERRUPT
*         THE CPU.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   PPNO-3      SET LAST BYTE NONZERO
          ERRNZ  R.UNS
          LDML   RESPC       RESPONSE CODE
          ZJN    UIP10       IF UNSOLICITED RESPONSE
          SOML   INTRRPT
          PJN    UIP20       IF NOT TIME TO INTERRUPT
 UIP10    BSS    0
 IVB0     IF     DEF,IVB0
          LDN    0           I0 HARDWARE PROBLEM
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LDML   CM.INT+2    SET VALID ADDRESS IN A
          LMC    400000B     FOR I4 HARDWARE PROBLEM
 IVB4     ENDIF
 INTPRC   PSN    0           INTERRUPT OR PSN (MODIFIED)
          LDN    8
          STML   INTRRPT     RESET INTERRUPT INTERVAL
 UIP20    UJK    UIPX        EXIT
 URT      SPACE  4,10
**        URT - UPDATE REAL TIME CLOCK.
*
*         *******************************************************************
*         * NOTE: THIS ROUTINE WILL UPDATE THE CLOCK WHICH IS USED TO       *
*         * DETERMINE WHEN TO SEND NO-OPS TO THE IVB. DURING PERIODS        *
*         * WHEN LARGE BLOCKS (32K) ARE BEING TRANSFERED IT IS POSSIBLE     *
*         * THAT SOME ACCURACY COULD BE LOST. THIS SHOULD NOT BE A PROBLEM  *
*         * AS NO-OPS ARE NOT REQUIRED UNLESS THERE HAS BEEN NO ACTIVITY.   *
*         *******************************************************************
*
*         ENTRY  (CLCUR) = PREVIOUS SYSTEM CLOCK VALUE.
*
*         EXIT   (CLCUR) = NEW SYSTEM CLOCK VALUE.
*                CLMSC, CLMLS, AND CLSEC UPDATED.


 URT      SUBR
          LDDL   CLCUR       SAVE CURRENT CLOCK
          STDL   T0
          IAN    14B         GET NEW CLOCK VALUE
          STDL   CLCUR
          SBDL   T0
          PJN    URT10       IF CLOCK HASNT WRAPPED
          ADC    10000B
 URT10    RADL   CLMCS       UPDATE MICROSECOND PORTION OF CLOCK
          LDDL   CLMCS
          ADC    -2000
          MJN    URTX        IF LESS THAN 2 MILLISECONDS
          STDL   CLMCS
          LDN    2
          RADL   CLMLS       UPDATE MILLISECOND PORTION OF CLOCK
          ADC    -1000
          MJN    URTX        IF LESS THAN 1 SECOND
          STDL   CLMLS
          AODL   CLSEC       UPDATE SECOND PORTION OF CLOCK
          UJK    URTX        EXIT
 VBR      SPACE  4,13
**        VBR - VERIFY BOARD READY.
*
*         THIS ROUTINE WILL TRY TO DETERMINE IF THE IVB
*         IS STILL AVAILABLE. THIS IS ACCOMPLISHED BY MASTER
*         CLEARING THE BOARD AND VERIFYING THAT ALL LINES DROP.
*         THIS IS FOLLOWED BY ANOTHER SELECT.
*
*         *******************************************************************
*         * NOTE: THIS ROUTINE WILL EXIT TO THE MAIN LOOP IF THE IVB IS     *
*         *       NOT AVAILABLE.                                            *
*         *******************************************************************
*
*         CALLS  MCC, SEL, RAR.


VBR10     RJM    SEL         SELECT DEVICE
          LDN    0

 VBR      SUBR               ENTRY/EXIT
          RJM    MCC         MASTER CLEAR
          LDC    H00E1
          RJM    RAR         READ IPI STATUS REGISTER
          LPC    /IPISR/K.ALLIN
          ZJN    VBR10       IF ALL LINES DROPED
          LDN    DS.ILR
          STDL   DSTATE
          LJM    MCL         EXIT RESET BOARD
 IVB4     IF     DEF,IVB4
 WTC      SPACE  4,15
**        WTC - WAIT TRANSFER COMPLETE.
*
*         THIS ROUTINE WILL WAIT FOR A DMA TRANSFER TO COMPLETE.
*
*         EXIT   (A) = 0, IF TRANSFER COMPLETE,
*                    <> 0, IF RECOVERABLE ERROR.
*                (WC) = PP WORDS NOT TRANSFERED IF A <> 0.
*
*         USES   T8
*
*         CALLS  CEP, EFP, ICF, RAR.
*


 WTC50    BSS
          LDN    0

 WTC      SUBR
          LDC    64          MULTIPLY LOOP TO 15 SECONDS
          STML   TIMEX
 WTC05    BSS    0
          LDC    20000
          STDL   T8          T8 CONTROLS THE TIMEOUT
 WTC10    BSS
          LDC    H0700
          RJM    RAR         READ OPERATIONAL STATUS
          STML   OPSTAT      SAVE OPERATIONAL STATUS
          SHN    17-/DMAOSR/CHIN
          PJN    WTC50       IF TRANSFER COMPLETE
          SODL   T8
          NJN    WTC10       IF TIMEOUT NOT EXPIRED
          SOML   TIMEX
          NJN    WTC05       IF NOT COMPLETE
          LDC    H0A00       READ T REGISTER
          RJM    RAR
          SHN    -1
          STDL   WC          SAVE WORD COUNT
          LDC    H0800       DMA TERMINATE FUNCTION
          RJM    ICF         SEND THE FUNCTION
          LDC    H00E1       READ STATUS REGISTER FUNCTION
          RJM    RAR
*         STDL   STATUS
          SHN    17-/IPISR/SLAI
          PJN    WTC30       IF SLAVE IN DROPPED
          LDN    E30         SLAVE IN DID NOT DROP
          STML   IOERR+/ILD/P.SCODE
          LDN    DS.ILR
          STML   DSTATE
          LDC    IOERR
          RJM    CEP         LOG ERROR  (NO RETURN)

 WTC30    BSS
          LDN    E07         INCOMPLETE TRANSFER
          STML   IOERR+/ILD/P.SCODE  SYMPTOM CODE
          UJK    WTCX        EXIT
 WTE      SPACE  4,10
**        WTE - WAIT T-PRIME REGISTER EMPTY.
*
*         THIS ROUTINE WILL WAIT FOR THE T' REGISTER
*         TO EMPTY. THE T' REGISTER MUST BE EMPTY WHEN
*         STARTING OR CONTINUING A DMA I/O OPERATION OR
*         DATA LOSS/CORRUPTION WILL OCCUR.
*
*         EXIT   (A) = 0, IF T' REGISTER EMPTY,
*                    <> 0, IF ERROR OCCURRED.
*                (WC) = PP WORDS NOT TRANSFERED IF A <> 0.
*
*         USES   OPSTAT, STATUS, T8, P6.
*
*         CALLS  CEP, EFP, ICF, RAR.


 WTE60    LDN    0


 WTE      SUBR
          LDC    64          MULTIPLY LOOP TO 15 SECONDS
          STML   TIMEX
 WTE05    BSS    0
          LDC    20000
          STDL   T8          T8 CONTROLS THE TIMEOUT
 WTE10    BSS
          LDC    H0700
          RJM    RAR         READ OPERATIONAL STATUS
          STML   OPSTAT      SAVE OPERATIONAL STATUS
          SHN    17-/DMAOSR/TEMP
          MJN    WTE60       IF T PRIME REGISTER EMPTY
          SODL   T8
          NJN    WTE10       IF TIMEOUT NOT EXPIRED
          SOML   TIMEX
          NJN    WTE05       IF NOT COMPLETE
          LDC    H0A00       READ T REGISTER
          RJM    RAR
          SHN    -1
          STDL   WC          SAVE WORD COUNT
          LDC    H0800       DMA TERMINATE FUNCTION
          RJM    ICF         SEND THE FUNCTION
          LDC    H00E1       READ STATUS REGISTER FUNCTION
          RJM    RAR
*         STDL   STATUS
          SHN    17-/IPISR/SLAI
          PJN    WTE30       IF SLAVE IN DROPPED
          LDN    E30         SLAVE IN DID NOT DROP
          STML   IOERR+/ILD/P.SCODE
          LDN    DS.ILR
          STML   DSTATE
          LDC    IOERR
          RJM    CEP         LOG ERROR  (NO RETURN)

 WTE30    BSS
          LDN    E07         INCOMPLETE TRANSFER
          STML   IOERR+/ILD/P.SCODE  SYMPTOM CODE
          UJK    WTEX        ERROR EXIT
 IVB4     ENDIF
 WRP      SPACE  4,30
**        WRP - WRITE PROCESSOR
*
*         THIS ROUTINE PROCESSES THE WRITE BYTES COMMAND.  THE PROCESSING
*         IS DONE IN TWO PARTS.  FIRST THE CCP HEADER IS READ INTO THE PP
*         AND AN IPI LEVEL 3 COMMAND IS CREATED USING THE HEADER AND THIS
*         COMMAND IS SENT TO THE SLAVE.  IF THE HEADER INDICATES USER DATA,
*         THEN A DMA TRANSFER IS SET UP TO SEND THIS DATA.  THE TRANSFER
*         INCLUDES ANY MESSAGE PROPER (OTHER PROTOCOL HEADERS) INCLUDED IN
*         THE CCPDU.  RECORDS WRITTEN TO THE IVB MAY BE IN FRAGMENTS
*         SCATTERED THROUGHOUT MEMORY.  THE FIRST BYTE OF USER DATA
*         TRANSFERRED MUST BE WORD ALIGNED.  CONSEQUENTLY, IT IS NECESSARY
*         FOR USER DATA TO START AND END ON WORD BOUNDARYS EXCEPT THE LAST
*         BUFFER.  OTHERWISE THE PP WOULD NOT BE ABLE TO USE THE DMA
*         INSTRUCTIONS.  WITH WORD ALIGNMENT THEN, EACH FRAGMENT IS WRITTEN
*         IN A MULTIPLE OF 64 BIT CENTRAL MEMORY WORDS USING THE DIRECT
*         MEMORY ACCESS(DMA) CHANNEL INSTRUCTION ON THE I0, OR AN IPI
*         ADAPTOR FUNCTION ON THE I4A.
*
*         ENTRY  RQ = UNIT REQUEST.
*
*         USES   CML, CMLISTL, T1, T2, P6.
*
*         CALLS  DMW, ESS, OWC, STR, UGS.


 WRP      SUBR               ENTRY/EXIT
          LDN    RRL
          STML   RTCNT
 WRP10    RJM    OWC         SEND COMMAND PACKET
          NJN    WRPX        IF ERRORS
          LDML   CPBF+P.IP+/CCP/P.LEN2  CCPDU DATA LENGTH
          SBN    B.CCP-/CCP/B.PARML-/CCP/B.PARMID
          ZJK    WRP80       IF NO USER DATA
          RJM    DMW         COMPLETE DATA TRANSFER
          ZJN    WRP20       IF NO ERRORS
          LDN    0
          UJN    WRP30       SEND UNSUCCESSFUL

 WRP20    LDC    /STATP/K.SUC
 WRP30    ADML   INPOK
          RJM    ESS         GET ENDING STATUS
          ZJN    WRP40       IF NO  ERRORS GETTING STATUS
          LDML   MSTAT
          STML   RSTAT
          LDML   CPBF+/IP/P.REFNO
          STML   RSEQ
          RJM    RSS         REQUEST SLAVE STATUS

 WRP40    LDDL   STATUS
          SHN    17-/STATP/SUC
          MJK    WRP70       IF  SUCCESSFULL
          SOML   RTCNT
          SRU    IOERR,RTCNT,REC.I
          LDC    IOERR
          RJM    IMS         INCLUDE MASTER STATUS
          LDC    IOERR
          RJM    ISS         INCLUDE SLAVE STATUS
          LDML   IOERR+/ILD/P.SCODE
          NJN    WRP50       IF PP DETECTED ERROR
          RJM    ASS         ANALYZE SLAVE STATUS
 WRP50    LDC    IOERR
          RJM    CEP         LOG ERROR
          DPM    CPBF+/IP/P.REFNO  DECREMENT REFERENCE NUMBER
          LDML   RTCNT
          NJK    WRP10       RETRY REQUEST
 WRP60    LDN    DS.ILR
          STDL   DSTATE
          UJK    WRPX        EXIT

 WRP70    LDDL   STATUS
          RJM    UGS         UPDATE GLOBAL STATUS
 WRP80    LDML   BYTCNT
          STML   RS+/RS/P.XFER+1
          RJM    IRP         INITIALIZE RESPONSE BUFFER
          RJM    STR         SEND TERMINATION RESPONSE
          LDN    0
          UJK    WRPX        EXIT
          TITLE  INITIALIZATION.
 IPD      SPACE  4,10
**        IPD - INITIALIZE PP DRIVER.
*
*         THIS ROUTINE WILL ACCESS ALL PP CM TABLES
*         AND VALIDATE THEM. APPROPRIATE PP CELLS WILL
*         ALSO BE INITIALIZED.
*
*         ENTRY  (CM.PIT) = RMA ADDRESS OF PP INTERFACE TABLE (UNFORMATTED).
*
*         EXIT   PP TABLES VALIDATED AND PP IN IDLE STATE.

 IPD      BSS    0
          LDDL   P1
          STML   DRNAME
          LDDL   P2
          STML   DRNAME+1    STORE PP DRIVER NAME IN WORDS 100B AND 101B
          RJM    LPT         LOCATE PP INTERFACE TABLE
          RJM    LUT         LOCATE UNIT INTERFACE TABLE
          RJM    LMT         LOCATE MASTER CONTROL TABLE
          RJM    CHG         SET UP CHANNEL INSTRUCTIONS
          RJM    MCC         MASTER CLEAR CHANNEL
          LDN    1
          STML   BPCNT+SMINDX  INITIALIZE BUFFER NEEDED COUNT
          UJK    MCL         MAIN CONTROL LOOP
          EJECT
 LBP      SPACE  4,20
**        LBP - LOCATE BUFFER POOLS.
*
*         THIS ROUTINE ESTABLISHES ACCESS TO THE PP BUFFER
*         POOLS AND PERFORMS VALIDATION ON THE BUFFER POOL
*         DESCRIPTORS.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                   <> 0, IF ERRORS,
*                (BPSIZE) = SIZE OF BUFFER POOLS (SMALLEST TO LARGEST).
*
*         USES   P1, P2, P3.
*
*         MACROS LOADC, LOADF.

 LBP      SUBR               ENTRY/EXIT
          ERRNG  MAXBPD-1
          LDN    MAXBPD
          STDL   P3
          LDN    0
          STDL   P2          BUFFER POOL INDEX
          LDN    C.BPD
          STDL   WC          LENGTH OF BUFFER POOL DESCRIPTOR
 IVB0     IF     DEF,IVB0
          LRML   MCT+/MCT/P.BPDESC
          LDML   MCT+/MCT/P.BPDESC+1
          SHN    -3
          STDL   CM.BPD+1
          SRDL   CM.BPD
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  MCT+/MCT/P.BPDESC
          STDL   CM.BPD+2
          SRD    CM.BPD
 IVB4     ENDIF
 LBP10    CRML   BPD,WC      READ BUFFER POOL DESCRIPTOR
          STDL   P1
          LDML   BPD+/BPD/P.LEN
          NJN    LBP20       IF BUFFER LENGTH TOO LARGE
          LDML   BPD+/BPD/P.LEN+1
          ZJK    LBP50       IF INVALID BUFFER LENGTH
          STML   BPSIZE,P2    SAVE BUFFER LENGTH
          LDML   BPD+/BPD/P.IN
          LPN    7
          NJN    LBP20       IF INVALID 'IN' POINTER
          LDML   BPD+/BPD/P.PPOUT
          LPN    7
          NJN    LBP20       IF INVALID 'OUT' POINTER
          LDML   BPD+/BPD/P.LIMIT
          LPN    7
 LBP20    NJN    LBP50       IF INVALID LIMIT
          LDML   BPD+/BPD/P.BPRMA+1
          LPN    7
          NJN    LBP50       IF INVALID BUFFER POOL ADDRESS
          SODL   P3
          ZJN    LBP60       IF NO MORE POOLS
          AODL   P2
 IVB0     IF     DEF,IVB0
          LRDL   CM.BPD      CM ADDRESS OF NEXT DESCRIPTOR
          LDDL   P1
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.BPD,P1   CM ADDRESS OF NEXT DESCRIPTOR
 IVB4     ENDIF
          UJK    LBP10

 LBP50    LDC    E324
 LBP60    UJK    LBPX        EXIT
 LMT      SPACE  4,15
**        LMT - LOCATE MASTER CONTROL TABLE.
*
*         ESTABLISHES ACCESS TO THE MASTER CONTROL TABLE.
*
*         ENTRY  (CM.URQ - CM.URQ+1) = (R) PART OF MASTER CONTROL TABLE FWA.
*                (CM.MCT) = (A) PORTION OF MASTER CONTROL TABLE FWA.
*
*         CALLS  CVM, DBP.
*
*         MACROS LOADC.


 LMT      SUBR               ENTRY/EXIT

*         VALIDATE MASTER CONTROL TABLE.

          RJM    CVM         CHECK FOR VALID MASTER CONTROL TABLE
          NJN    *           IF INVALID MASTER CONTROL TABLE  --HANG--

*         DEFINE AND VALIDATE BUFFER POOLS.

          RJM    LBP         LOCATE BUFFER POOLS
          ZJN    LMTX        IF VALID BUFFER POOLS  --EXIT--
          UJN    *           INVALID BUFER POOLS, SO  --HANG--
          EJECT
**        LPT - LOCATE PP INTERFACE TABLE.
*
*         ESTABLISHES ACCESS TO THE PP INTERFACE TABLE.
*
*         ENTRY  (CM.PIT) = CENTRAL MEMORY BYTE ADDRESS OF PP INTERFACE TABLE.
*
*         EXIT   (CM.PIT) = REFORMATTED PP INTERFACE TABLE ADDRESS.
*
*         USES   WC.
*
*         CALLS  CVI, CVR.
*
*         MACROS LOADC, REFAD.


 LPT      SUBR               ENTRY/EXIT
 IVB0     IF     DEF,IVB0
          LDDL   CM.PIT+1
          SHN    -3
          STDL   CM.PIT+1    REFORMAT PP INTERFACE TABLE ADDRESS
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          REFAD  CM.PIT,CM.PIT  REFORMAT PP INTERFACE TABLE ADDRESS
 IVB4     ENDIF

*         READ PP INTERFACE TABLE.

          LDN    C.PIT       LENGTH OF PP INTERFACE TABLE
          STDL   WC
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          CRML   IPIT,WC
          RJM    CVR         CHECK FOR VALID RESPONSE BUFFER
          NJN    *           IF INVALID RESPONSE BUFFER  --HANG--
          RJM    CVI         CHECK FOR VALID PP INTERFACE TABLE
          NJN    *           IF INVALID PP INTERFACE TABLE  --HANG--
          LDML   IPIT+/PIT/P.PPNO
          STDL   PPNO        PP NUMBER

*         REFORMAT CM ADDRESSES OF INTERRUPT WORD AND CHANNEL INTERLOCK TABLE.

 IVB0     IF     DEF,IVB0
          LDML   IPIT+/PIT/P.CHAN
          STML   CM.CHAN
          LDML   IPIT+/PIT/P.CHAN+1
          SHN    -3
          STML   CM.CHAN+1   REFORMAT CHANNEL TABLE ADDRESS
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          REFAD  IPIT+/PIT/P.CHAN,CM.CHAN  REFORMAT CHANNEL TABLE ADDRESS
 IVB4     ENDIF
          REFAD  IPIT+/PIT/P.INT,CM.INT  REFORMAT INTERRUPT WORD ADDRESS
          UJK    LPTX
          EJECT
 LUT      SPACE  4,15
**        LUT - LOCATE UNIT INTERFACE TABLE.
*
*         ESTABLISHES ACCESS TO THE UNIT INTERFACE TABLE.
*
*         ENTRY  (CM.PIT) = CM ADDRESS OF PP INTERFACE TABLE.
*
*         EXIT   (A) = 0.
*                (UD) = UNIT DESCRIPTOR ACCESSIBLE BY THIS PP.
*
*         USES   WC.
*
*         CALLS  CVD, CVU.
*
*         MACROS LOADC, LOADF.


 LUT      SUBR               ENTRY/EXIT
          LDN    C.UD        UNIT DESCRIPTOR LENGTH
          STDL   WC
 IVB0     IF     DEF,IVB0
          LRDL   CM.PIT
          LDDL   CM.PIT+1    CM ADDRESS OF PP INTERFACE TABLE
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
 IVB4     ENDIF
          ADN    C.PIT
          CRML   UD,WC       READ UNIT DESCRIPTOR
          RJM    CVD         CHECK FOR VALID UNIT DESCRIPTOR
          NJN    *           IF INVALID UNIT DESCRIPTOR  --HANG--
          LDML   UD+/UD/P.CHAN
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    37B
          STML   CHAN        CHANNEL NUMBER
          LDML   UD+/UD/P.LU
          STML   RS+/RS/P.LU  STORE LOGICAL UNIT NUMBER IN STD RESPONSE
          STML   LRS+/RS/P.LU STORE UNIT NUMBER IN LOG RESPONSE
          LDML   UD+/UD/P.CNTRLR
          LPN    7
          STDL   T1          SLAVE ADDRESS
          STML   IIRA        SETUP SLAVE ADDRESS FOR RESET
          RAML   SELA        SETUP SLAVE ADDRESS FOR SELECT
          LDDL   T1          SLAVE ADDRESS
          SHN    8
          ADC    0#FF        SET FACILITY ADDRESS
          STML   CPBF+/IP/P.ADDR  SET UP SLAVE AND FACILITY ADDR IN COMMAND
          LDM    SAM,T1      GET SLAVE ADDRESS MASK
          STM    CFIA
          STM    SELB
 IVB4     IF     DEF,IVB4
          LDML   UD+/UD/P.CHAN  GET PORT NUMBER
          LPC    100B
          SHN    5
          RAML   MCCA
 IVB4     ENDIF
          LDN    C.UIT       UNIT INTERFACE TABLE LENGTH
          STDL   WC
          LOADF  UD+/UD/P.UQT  REFORMAT CM ADDRESS OF UNIT INTERFACE TABLE
          CRML   UIT,WC      READ UNIT INTERFACE TABLE
          RJM    CVU         CHECK FOR VALID UNIT INTERFACE TABLE
          NJN    *           IF INVALID UNIT INTERFACE TABLE  --HANG--
          UJK    LUTX        EXIT

 SAM      DATA   1,2,4,8,16,32,64,128  SLAVE ADDRESS MASKS

 SAVAD    SPACE  4,10
**        SAVAD - SAVE REFORMATTED CM ADDRESSES.
*
*         THIS ROUTINE IS CALLED ONLY DURING INITIALIZATION
*         AND ONLY BY THE *REFAD* MACRO.
*
*         USES   T2.
          SPACE  2
 SAVAD    SUBR               ENTRY/EXIT
          STML   2,T2
          LDDL   CMADR
          STI    T2
          LDDL   CMADR+1
          STML   1,T2
          UJN    SAVADX      EXIT
 CVM      SPACE  4,10
**        CVM - CHECK FOR VALID MASTER CONTROL TABLE.
*
*         ENTRY  (CM.URQ - CM.URQ+1) = (R) PART OF MASTER CONTROL TABLE FWA.
*                (CM.MCT) = (A) PORTION OF MASTER CONTROL TABLE FWA.
*
*         EXIT   (A) = 0, IF VALID MASTER CONTROL TABLE.
*                    <> 0, IF INVALID.
*
*         USES   P1 - P4, T1, WC.


 CVM      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1          UNIT INTERFACE ERROR CODE

*         READ MASTER CONTROL TABLE.

          LDN    C.MCT       LENGTH OF MASTER CONTROL TABLE
          STDL   WC

 CVM20    BSS    0
 IVB0     IF     DEF,IVB0
          LRDL   CM.URQ      FWA OF MASTER CONTROL TABLE
          LDML   CM.MCT
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADC  CM.URQ,CM.MCT   FIRST WORD ADDRESS OF MASTER CONTROL TABLE
 IVB4     ENDIF
          CRML   MCT,WC
          LDML   MCT+/MCT/P.FLAGS   MASTER CONTROL TABLE INITIALIZED FLAG
          SHN    17-/MCT/INIT
          PJN    CVM20       IF MASTER CONTROL TABLE NOT INITIALIZED
          LDML   MCT+/MCT/P.DEVID   DEVICE ID
          STML   DEVID
          STML   RS+/RS/P.DEVID   STORE DEVICE IDENTIFIER IN STANDARD RESPONSE
          STML   LRS+/RS/P.DEVID  STORE DEVICE IDENTIFIER IN LOG RESPONSE

*         RESERVED FIELD OF UNIT REQUEST QUEUE DESCRIPTOR.

          LDML   UIT+/UIT/P.NEXTPV-1
          ADML   UIT+/UIT/P.NEXT-2
          ADML   UIT+/UIT/P.NEXT-1
          NJN    CVM80       IF RESERVED FIELD NOT ZERO
 CVM70    UJK    CVMX        EXIT

 CVM80    BSS
          LDML   TUEM,T1     INTERFACE ERROR CODE
          UJK    CVM70

**        TUEM - TABLE OF UNIT INTERFACE ERROR MESSAGES.

 TUEM     BSS    0
          LOC    0
          CON    E417        RESERVED FIELD OF UNIT REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
          LOC    *O
 CVD      SPACE  4,10
**        CVD - CHECK FOR VALID UNIT DESCRIPTOR.
*
*         EXIT   (A) = 0, IF VALID UNIT DESCRIPTOR.
*                    <> 0, IF INVALID.


 CVD      SUBR               ENTRY/EXIT
          LDML   UD+/UD/P.LU  LOGICAL UNIT
          SBML   IPIT+/PIT/P.FLU  FIRST LOGICAL UNIT
          PJN    CVD10
          LDC    E404        LOGICAL UNIT NOT IN RANGE
          UJK    CVD60

 CVD10    BSS
          LDML   UD+/UD/P.CHAN  CHANNEL NUMBER
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    37B
          SBN    14B         VALID CHANNELS ARE 0 - 13B AND 20B - 33B
          MJN    CVD40       IF CHANNEL OK
          SBN    20B-14B
          PJN    CVD30       IF CHANNEL OK
 CVD20    BSS
          LDC    E406        INVALID CHANNEL NUMBER
          UJN    CVD60

 CVD30    BSS
          SBN    34B-20B
          PJN    CVD20       IF INVALID CHANNEL
 CVD40    BSS
          LDML   UD+/UD/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADML   UD+/UD/P.UQT+1
          ZJN    CVD50       IF UIT RMA ZERO
          LDML   UD+/UD/P.UQT+1  UNIT INTERFACE TABLE ADDRESS
          LPN    7
          ZJN    CVD60
 CVD50    LDC    E405        UNIT INTERFACE TABLE NOT A WORD BOUNDARY
 CVD60    BSS
          UJK    CVDX        EXIT
 CVI      SPACE  4,10
**        CVI - CHECK FOR VALID PP INTERFACE TABLE.
*
*         EXIT   (A) = 0, IF VALID PP INTERFACE TABLE.
*                    <> 0, IF INVALID.
*
*         USES   T1.


 CVI      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1
          LDML   IPIT+/PIT/P.CBUFL  COMMUNICATION BUFFER LENGTH
          LPN    7
          NJK    CVI10       IF LENGTH NOT A MULTIPLE OF WORDS
          AODL   T1

*         CHECK PP COMMUNICATION BUFFER RMA

          LDML   IPIT+/PIT/P.CBUF
          ADML   IPIT+/PIT/P.CBUF+1  COMMUNICATION BUFFER (RMA)
          ZJN    CVI10       IF COMMUNICATION BUFFER RMA ZERO
          AODL   T1
          LDML   IPIT+/PIT/P.CBUF+1  COMMUNICATION BUFFER (RMA)
          LPN    7
          NJN    CVI10       IF PP COMMUNICATION BUFFER NOT A WORD BOUNDARY
          AODL   T1

*         RESERVED FIELD OF PP REQUEST QUEUE DESCRIPTOR

          LDML   IPIT+/PIT/P.PPQPVA-1
          ADML   IPIT+/PIT/P.PPQ-2
          ADML   IPIT+/PIT/P.PPQ-1
          NJN    CVI10       IF RESERVED FIELD NOT ZERO
          AODL   T1
          LDML   IPIT+/PIT/P.INT+1  INTERRUPT WORD (RMA)
          LPN    7
          NJN    CVI10       IF INTERRUPT WORD NOT A WORD BOUNDARY
          AODL   T1
          LDML   IPIT+/PIT/P.CHAN+1  CHANNEL INTERLOCK TABLE (RMA)
          LPN    7
          ZJN    CVI20       IF PP INTERFACE TABLE VALID
 CVI10    LDML   TPEC,T1     INTERFACE ERROR CODE
 CVI20    UJK    CVIX        EXIT

**        TPEC - TABLE OF PP INTERFACE ERROR CODES.

 TPEC     BSS    0
          LOC    0
          CON    E407        COMMUNICATION BUFFER LENGTH NOT A
                              MULTIPLE OF WORDS
          CON    E401        PP COMMUNICATION BUFFER RMA ZERO
          CON    E400        PP COMMUNICATION BUFFER NOT A WORD BOUNDARY
          CON    E402        RESERVED FIELD OF PP REQUEST QUEUE
                              DESCRIPTOR NOT ZERO
          CON    E411        RMA OF INTERRUPT WORD NOT A WORD BOUNDARY
          CON    E412        RMA OF CHANNEL INTERLOCK TABLE NOT A WORD BOUNDARY
          LOC    *O
 CVR      SPACE  4,10
**        CVR - CHECK FOR VALID RESPONSE BUFFER.
*
*         EXIT   (A) = 0, IF VALID RESPONSE BUFFER.
*                    <> 0, IF INVALID.
*                (CM.RS - CM.RS+2) = CM ADDRESS OF RESPONSE BUFFER.
*
*         MACROS LOADF.


 CVR      SUBR               ENTRY/EXIT

*         RESERVED WORD OF RESPONSE BUFFER DESCRIPTOR
          LDML   IPIT+/PIT/P.RSBUF-2
          ADML   IPIT+/PIT/P.RSBUF-1
          ADML   IPIT+/PIT/P.RSPVA-1
          NJN    CVR05       IF RESERVED FIELD NOT ZERO
          LDML   IPIT+/PIT/P.IN-3  RESERVED FIELD OF IN POINTER
          ADML   IPIT+/PIT/P.IN-2
          ADML   IPIT+/PIT/P.IN-1
 CVR05    NJN    CVR10       IF RESERVED FIELD NOT ZERO
          LDML   IPIT+/PIT/P.OUT-3  RESERVED FIELD OF OUT POINTER
          ADML   IPIT+/PIT/P.OUT-2
          ADML   IPIT+/PIT/P.OUT-1
          NJN    CVR10       IF RESERVED FIELD NOT ZERO
          LDML   IPIT+/PIT/P.LIMIT-3  RESERVED FIELD OF LIMIT POINTER
          ADML   IPIT+/PIT/P.LIMIT-2
          ADML   IPIT+/PIT/P.LIMIT-1
          NJN    CVR10       IF RESERVED FIELD NOT ZERO

*         RESPONSE BUFFER VALID - REFORMAT INTO CM.RS - CM.RS+2.

          LOADF  IPIT+/PIT/P.RSBUF REFORMAT ADDRESS OF RESPONSE BUFFER
          STDL   CM.RS+2
          SRD    CM.RS
          LDML   IPIT+/PIT/P.LIMIT
          STDL   LIM         LIMIT OF RESPONSE BUFFER
          LDN    0
 CVR10    UJK    CVRX        EXIT
 CVU      SPACE  4,10
**        CVU - CHECK FOR VALID UNIT INTERFACE TABLE.
*
*         EXIT   (A) = 0, IF VALID UNIT INTERFACE TABLE,
*                    <> 0, IF INVALID.
*                (CM.URQ - CM.URQ+1) = (R) PART OF MASTER CONTROL TABLE FWA.
*                (CM.MCT) = (A) PORTION OF MASTER CONTROL TABLE FWA.
*
*         USES   T1.


 CVU      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1
          LDML   UIT+/UIT/P.LU  LOGICAL UNIT NUMBER
          SBML   UD+/UD/P.LU
          NJN    CVU20       LOGICAL UNIT NUMBER MISMATCH
          AODL   T1
          LDML   UIT+/UIT/P.UTYPE  UNIT TYPE
          ADC    -IVBUT      IVB UNIT TYPE
          NJN    CVU20       IF INVALID UNIT TYPE
          AODL   T1

*         CHECK MASTER CONTROL TABLE DESCRIPTOR

          LDML   UIT+/UIT/P.MBUFL  MASTER CONTROL TABLE LENGTH
          ADC    -B.MCT      COMPARE WITH EXPECTED MASTER CONTROL TABLE LENGTH
          PJN    CVU30       IF BUFFER LONG ENOUGH
 CVU20    UJK    CVU40       INTERFACE ERROR

 CVU30    BSS
          AODL   T1
          LDML   UIT+/UIT/P.MBUF+1  MASTER CONTROL TABLE
          LPN    7
          NJN    CVU40       NOT A WORD BOUNDARY
 IVB0     IF     DEF,IVB0
          LRML   UIT+/UIT/P.MBUF
          LDML   UIT+/UIT/P.MBUF+1
          SHN    -3
          STDL   CM.URQ+1
          SRDL   CM.URQ
 IVB0     ENDIF
 IVB4     IF     DEF,IVB4
          LOADF  UIT+/UIT/P.MBUF
          STDL   CM.URQ+2
          SRD    CM.URQ
 IVB4     ENDIF
          STML   CM.MCT
          LDN    0           VALID UNIT INTERFACE TABLE
 CVU38    UJK    CVUX        EXIT

 CVU40    BSS
          LDML   TUEC,T1     INTERFACE ERROR CODE
          UJK    CVU38

**        TUEC - TABLE OF UNIT INTERFACE ERROR CODES.

 TUEC     BSS    0
          LOC    0
          CON    E413        LOGICAL UNIT NUMBER MISMATCH
          CON    E418        INVALID UNIT TYPE
          CON    E419        MASTER CONTROL TABLE NOT LARGE ENOUGH
          CON    E414        MASTER CONTROL TABLE NOT A WORD BOUNDARY
          LOC    *O
 CHG      SPACE  4,10
**        CHG - CHANGE CHANNEL INSTRUCTIONS.
*
*         CHANGE ALL CHANNEL INSTRUCTIONS TO USE THE SPECIFIED CHANNEL.
*
*         ENTRY  (CHAN) = NEW CHANNEL NUMBER TO BE USED.
*
*         USES   T1, T2.
          SPACE  2
 CHG      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1          CHANGE CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGX        IF END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMML   CHAN        CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJN    CHG10
          SPACE  4,10
 CONCH    BSS                CHANNEL REFERENCES
 TCH+40B  HERE
 T40B+CH  HERE
 TCH      HERE
          CON    0           END OF TABLE

          LIST   G
 TRACE    HERE
          LIST   *
          SPACE  4,10
 CPBF     BSSZ   P.IP+P.CCP+P.STATP  COMMAND PACKET BUFFER (SPACE FOR PARM 51 AND 56)
 RPBF     BSSZ   P.IP+P.CCP+P.STATP  RESPONSE PACKET BUFFER (SPACE FOR PARM 51 AND 56)
 RPBL     EQU    B.IP+B.CCP+B.STATP  RESPONSE BUFFER LENGTH IN BYTES
 RQ       BSSZ   P.RQ+MAXBUFS*4    REQUEST BUFFER + SPACE FOR 9 LENGTH/ADDRESS PAIRS
 RS       BSSZ   MAXRS*4     RESPONSE BUFFER
 LRS      BSSZ   P.RS        LOG RESPONSE BUFFER
 OTHERR   BSSZ   P.ILD       'OTHER ERROR' INFO BUFFER
 ICFER    BSSZ   P.ILD       FUNCTION PROCESSOR ERROR
 IOERR    BSSZ   P.ILD       'I/O ERROR' INFO BUFFER
 CRERR    BSSZ   P.ILD       'CMD/RESP ERROR' INFO BUFFER
 MCT      BSSZ   P.MCT       MASTER CONTROL TABLE
 BPD      BSSZ   P.BPD       BUFFER POOL DESCRIPTOR
 BPRMA    BSSZ   MAXBUFS*P.BPR  RMA'S OF CM POOL BUFFERS
 FBUF     BSSZ   FHT         FUNCTION HISTORY BUFFER
 IPIT     EQU    FBUF+FHT    PP INTERFACE TABLE
 UD       EQU    IPIT+P.PIT  UNIT DESCRIPTOR
 UIT      EQU    UD+P.UD     UNIT INTERFACE TABLE
 EOM      EQU    UIT+P.UIT
          ERRMI  17777B-EOM  IF NOT ENOUGH SPACE

