          IDENT  ICAD,0
          CIPPU  J
          MEMSEL 8
          LIST   F
          TITLE  NAM$ICA DRIVER (ICAD) - INTEGRATED COMMUNICATIONS DRIVER
          COMMENT *SMD* LVL=01
          COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
          SPACE  4,10
***       ICAD - INTEGRATED COMMUNICATIONS DRIVER.
          EJECT
***           ICAD PROVIDES FOR COMMUNICATION BETWEEN NAM/VE
*         AND A INTEGRATED COMMUNICATIONS ADAPTOR (ICA).
*         ICAD COMMUNICATES THROUGH AN S0 ICI CHANNEL TO THE
*         ICA HARDWARE.  THE STATUS OF THE ICA CAN BE
*         DETERMINED FROM THE GENERAL STATUS.  THE ICA HAS
*         FOUR STATES, EACH REFLECTING A DIFFERENT LEVEL OF
*         FUNCTIONALITY.  THESE STATES AND THERE MEANINGS
*         ARE:
*
*         OPERATIONAL: THE ICA MAY BE USED TO RELAY MESSAGES
*             BETWEEN A HOST CHANNEL AND AN ETHERNET.
*
*         RESET: THE ICA IS IN THE FIRST STAGE OF INITIALIZATION.
*             THE ONBOARD DIAGNOSTICS (PHASE 1) ARE EXECUTING
*             OR HAVE JUST COMPLETED EXECUTION.
*
*         DIAGNOSTIC: THE ICA IS IN THE SECOND STAGE OF
*             INITIALIZATION. THE ICA, IN COOPERATION WITH THE
*             ICA DRIVER, IS EXECUTING PHASE 2 OF ONBOARD
*             DIAGNOSTICS.
*
*         IDLE: THE ICA IS IN THE THIRD STAGE OF INITIALIZATION.
*             THE ICA HAS COMPLETED ALL DIAGNOSTICS AND IS WAITING
*             TO BE DUMPED AND/OR LOADED.
*
*             DATA TRANSFER IS ALLOWED IN IDLE OR OPERATIONAL
*         STATE.  DATA TRANSFER TO THE ICA IS INITIATED VIA
*         A WRITE BYTES REQUEST IN THE UNIT QUEUE.  THE
*         REQUEST IS TERMINATED WITH THE STANDARD RESPONSE
*         INDICATING SUCCESS OR FAILURE, AND THEN DELINKED
*         FROM THE CHAIN.  DATA TRANSFER FROM THE ICA IS
*         INITIATED BY THE ICA SETTING THE DATA-AVAILABLE
*         BIT IN GENERAL STATUS.  WHEN TRANSFERRING DATA TO
*         CM,  THE PP OBTAINS CM BUFFERS OUT OF THE BUFFER
*         POOLS SET UP BY THE CP.  MULTIPLE POOLS ALLOW THE
*         PP TO SELECT BUFFERS IN A MANNER WHICH MINIMIZES
*         MESSAGE FRAGMENTATION AND MAXIMIZES BUFFER
*         UTILIZATION.
*
*         TWO POSSIBLE RECORD TYPES MUST BE ACCEPTED FROM THE
*         ICA DEPENDING ON ICA STATE.
*         AN ICA-II RUNNING OSI MODE SENDS AND RECEIVES CHANNELNET
*         PDUS IN IDLE STATE TO LOAD AND DUMP THE ICA. AFTER THE
*         ICA SWITCHES TO OPERATIONAL STATE ALL
*         PDUS ARE CHANNEL CONNECTION FORMAT.
*
*         NOTE THAT IF THE NUMBER OF BUFFER SIZES IS INCREASED
*         BEYOND 2 THE EQUATE MAXBPD MUST BE CHANGED.
*
*         DEBUGGING CODE CAN BE INCLUDED BY SETTING DEBUG = 1
*         AND ASSEMBLING THIS DECK.
*
*         BREAKPOINT CODE CAN BE INCLUDED BY SETTING BRK = 1
*         AND ASSEMBLING THIS DECK. PLUS MODIFYING DECK
*         NAV$INCLUDE_PP_BREAKPOINT AND CHANGING THE BOOLEAN
*         TO TRUE AND COMPILE THE FOLLOWING DECKS.
*
*         NAM$CHANNELNET_RING1
*         NAM$INITIALIZE_NETWORKS_R1
*         NAM$INITIALIZE_NETWORKS_R3
*         NAM$INTRANET_LAYER_MGMT_R3


          TITLE  MACROS
***       MACRO DEFINITIONS.
*
          SPACE  4,10
 SUBR     SPACE  4
***       SUBR - DEFINE SUBROUTINE ENTRY/EXIT LINE.
*
*
*NAME     SUBR
*         DECLARE *NAME* TO BE THE ENTRY POINT TO A PP SUBROUTINE.
*         THIS SUBROUTINE IS ENTERED VIA RETURN JUMP TO *NAME*.
*
*         THE FOLLOWING CODE IS GENERATED -
*NAMEX    LJM    *
*NAME     EQU    *-1


          PURGMAC  SUBR

          MACRO  SUBR,A
A_X LJM *
A EQU *-1
  ENDM
          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    TRACE
 .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
*copy iodmac1
**copy nad$temp_i0_instructions
*copy iodmac4
          SPACE  4,10
**        LOADB - LOAD BYTE ADDRESS
*
*         THIS MACRO REFORMATS A CM ADDRESS AND LOADS IT
*         INTO THE A AND R REGISTERS. CM ADDRESS IS ADJUSTED
*         TO A WORD BOUNDARY AND STARTING BYTE OFFSET IS
*         DETERMINED AND SAVED IN -SBYOFF-.
*
*         CALLING SEQUENCE - LOADB CMR,INDEX
*             THE 2-WORD UNFORMATTED CM ADDRESS IS CONTAINED
*             IN THE LOCATIONS STARTING AT -CMR- INDEXED BY
*             -INDEX-. -INDEX- IS OPTIONAL.
*

 LOADB    MACRO  CMR,INDEX
          LDC    CMR
          IFC    NE,$INDEX$$
          ADD    INDEX
          ENDIF
          STDL   T2
          LDIL   T2
          STDL   T3
          AODL   T2
          LDIL   T2
          LPN    7
          STML   SBYOFF      STARTING BYTE OFFSET
          LDIL   T2
          SCN    7
          STDL   T4
          LDN    T3
          RJM    FORMA
          ENDM

 SIMM     MACRO  TAG
          IFEQ   SIM,1
          UJK    TAG
          ENDIF
          ENDM

          TITLE  INTERFACE ERROR CODES
**        INTERFACE ERROR CODES.
*


 E101     EQU    401B        PP REQUEST QUEUE LOCKWORD TIMEOUT
 E102     EQU    402B        UNIT REQUEST QUEUE LOCKWORD TIMEOUT
 E103     EQU    403B        UNIT LOCKWORD TIMEOUT
 E104     EQU    404B        CHANNEL LOCKWORD TIMEOUT
 E105     EQU    405B        BUFFER POOL LOCKWORD TIMEOUT
 E106     EQU    406B        UNIT HARDWARE RESERVE TIMEOUT
 E107     EQU    407B        CONTROLLER HARDWARE RESERVE TIMEOUT
 E201     EQU    1001B       RMA OF CHANNEL RESERVATION TABLE NOT
                             A WORD BOUNDARY
 E202     EQU    1002B       RMA OF UNIT ACTIVITY MASK NOT A
                             WORD BOUNDARY
 E203     EQU    1003B       RMA OF PP COMMUNICATION BUFFER NOT A
                             WORD BOUNDARY
 E204     EQU    1004B       RESERVED FIELD OF THE PP COMMUNICATION
                             BUFFER DESCRIPTOR IS NOT ZERO
 E205     EQU    1005B       RESERVED FIELD OF THE PP REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
 E206     EQU    1006B       RMA OF NEXT PP NOT A WORD BOUNDARY
 E207     EQU    1007B       RESERVED FIELD OF THE PP RESPONSE
                             BUFFER DESCRIPTOR IS NOT ZERO
 E208     EQU    1010B       LOGICAL UNIT OF UNIT DESCRIPTOR NOT
                             IN SEQUENCE OR NOT IN RANGE
 E209     EQU    1011B       RMA OF UNIT INTERFACE TABLE NOT A
                             WORD BOUNDARY
 E20A     EQU    1012B       INVALID CHANNEL NUMBER SPECIFIED
                             IN UNIT DESCRIPTOR
 E20B     EQU    1013B       COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF WORDS OR NOT LONG ENOUGH
 E20C     EQU    1014B       RESERVED FIELD AFTER NUMBER OF
                             UNITS IS NOT ZERO
 E20D     EQU    1015B       RESERVED FIELD OF IN POINTER
                             IS NOT ZERO
 E20E     EQU    1016B       RESERVED FIELD OF OUT POINTER
                             IS NOT ZERO
 E20F     EQU    1017B       RESERVED FIELD OF LIMIT POINTER
                             IS NOT ZERO
 E210     EQU    1020B       INVALID PHYSICAL UNIT NUMBER
 E211     EQU    1021B       RMA OF INTERRUPT WORD NOT A WORD BOUNDARY
 E212     EQU    1022B       RMA OF CHANNEL INTERLOCK TABLE NOT A
                             WORD BOUNDARY
 E301     EQU    1401B       LOGICAL UNIT NUMBER NOT EQUAL TO LOGICAL
                             UNIT OF UNIT DESCRIPTOR
 E302     EQU    1402B       RMA OF MASTER CONTROL TABLE
                             NOT A WORD BOUNDARY
 E303     EQU    1403B       A RESERVED FIELD OF THE MASTER CONTROL TABLE
                             DESCRIPTOR IS NOT ZERO
 E304     EQU    1404B       RMA OF NEXT UNIT REQUEST
                             NOT A WORD BOUNDARY
 E305     EQU    1405B       RESERVED FIELD OF UNIT REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
 E306     EQU    1406B       INVALID UNIT TYPE
 E307     EQU    1407B       MASTER CONTROL TABLE LENGTH NOT A
                             MULTIPLE OF CM WORDS
 E308     EQU    1410B       MASTER CONTROL TABLE IS TOO SMALL
 E401     EQU    2001B       RMA OF NEXT REQUEST NOT A WORD BOUNDARY
 E402     EQU    2002B       REQUEST LENGTH NOT A MULTIPLE
                             OF EIGHT BYTES
 E403     EQU    2003B       REQUEST LENGTH IS LESS THAN FORTY BYTES
 E404     EQU    2004B       LOGICAL UNIT NUMBER NOT EQUAL TO LOGICAL
                             UNIT IN UNIT INTERFACE TABLE
 E405     EQU    2005B       RESERVED LINKAGE FIELD IS NOT ZERO
 E406     EQU    2006B       INVALID RECOVERY/INTERRUPT SELECTIONS
 E407     EQU    2007B       INVALID PRIORITY SELECTION
 E408     EQU    2010B       INVALID SECONDARY ADDRESS
 E501     EQU    2401B       INVALID COMMAND CODE
 E502     EQU    2402B       INVALID FLAG SELECTION
 E503     EQU    2403B       INVALID FUNCTION
 E504     EQU    2404B       FUNCTION NOT SUPPORTED BY HARDWARE
 E506     EQU    2406B       INVALID ADDRESS SPECIFICATION
                             IN COMMAND
 E507     EQU    2407B       INVALID LENGTH SPECIFICATION IN
                             INDIRECT LIST
 E508     EQU    2410B       INVALID ADDRESS SPECIFICATION
                             IN INDIRECT LIST
 E509     EQU    2411B       PP COMMAND NOT ALLOWED IN REQUEST
                             TO A UNIT
 E50A     EQU    2412B       INVALID SEQUENCE OF COMMANDS
 E50B     EQU    2413B       INVALID PARAMETER SPECIFICATION
                             (POOL READ OR COMPARE SWAP COMMANDS)
          TITLE  CYBIL STRUCTURE DEFINITIONS
**        PP INTERFACE TABLE
*


 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
          ALIGN  0,64
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL INTERLOCK TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
 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 14          RESPONSE BUFFER (PVA)
          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
* PP COMMUNICATION BUFFER.

 CB       RECORD PACKED

          ALIGN  31,64
 SLAVE    BOOLEAN            NONZERO IF SLAVE PP
 PARTNR   RMA                PARTNERS COMMUNICATION BUFFER (RMA)

          ALIGN  16,64
 CWLEN    PPWORD             LENGTH OF CONTROLWARE ADDRESS LIST
 CWRMA    RMA                ADDRESS OF FIRST ENTRY
 CB       RECEND


          SPACE  4,10
**        UNIT DESCRIPTORS.
*


 UD       RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 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
 DSABLE   BOOLEAN            UNIT IS ENABLED/DISABLED. (SET = DISABLED)
          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               = 400B, 844-4X
                               = 401B, 885-1X
                               = 402B, 885-42
 QCNT     PPWORD             QUEUE COUNT
*
          ALIGN  16,64
 MBUFL    PPWORD             MASTER CONTROL TABLE LENGTH
 MBUF     RMA                MASTER CONTROL TABLE (RMA)
 ULOCK    BOOLEAN            UNIT IS RESERVED FOR EXCLUSIVE USE
          ALIGN  48,64
 ULOCKP   PPWORD             UNIT LOCK OWNER
 QLOCK    BOOLEAN            UNIT QUEUE LOCK
          ALIGN  48,64
 QLOCKP   PPWORD             UNIT QUEUE LOCK OWNER
          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)

 UIT      RECEND
          SPACE  4,10
**        PP REQUESTS.
*


 RQ       RECORD PACKED

          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON QUEUE (RMA)
 LEN      PPWORD             REQUEST LENGTH
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS
                               0 - ATTEMPT RECOVERY
                               1 - SUPPRESS RECOVERY, TERMINATE WITH
                                    ABNORMAL STATUS.
                               2 - RESERVED FOR FUTURE USE.
                               3 - SUPPRESS RECOVERY, CONTINUE THE REQUEST
                                    IGNORING ERROR CONDITIONS.
 INT      BOOLEAN            INTERRUPT CPU (IF SET)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    PRIORITY
          ALIGN  48,64
 ALRT     PPWORD             ALERT MASK
          ALIGN  0,64
 SECADR   INTEGER            SECONDARY ADDRESS
 CMND     INTEGER            COMMAND SEQUENCE

 RQ       RECEND
          SPACE  4,10
**        PP COMMAND.
*


 CM       RECORD PACKED

 CODE     SUBRANGE 0,377B    COMMAND CODE
 STOR     BOOLEAN            STORE RESPONSE (IF SET)
 INDIR    BOOLEAN            INDIRECT ADDRESS (IF SET)
          ALIGN  16,64
 LEN      PPWORD             LENGTH OF CM AREA (EITHER DATA AREA OR
                             LENGTH/ADDRESS WORD PAIR LIST)
 RMA      RMA                ADDRESS OF CM AREA
          MGEN   N.CODE
 M.CODE   EQU    MASK$
          MASKP  INDIR
 M.INDIR  EQU    MSK

 CM       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
**        PP RESPONSE.
*


 RS       RECORD PACKED

          ALIGN  16,64
 PVA      STRUCT 6           PVA OF REQUEST
          ALIGN  32,64
 REQ      RMA                RMA OF REQUEST
 RESPL    PPWORD             RESPONSE LENGTH  (8-BIT BYTES)
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS (FROM REQUEST)
 INT      BOOLEAN            INTERRUPT CPU (IF SET)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS
          ALIGN  40,64
 DEVID    SUBRANGE 0,377B    DEVICE IDENTIFIER
          ALIGN  48,64
 ALRT     PPWORD             ALERT MASK
          ALIGN  0,64
 ABALRT   BOOLEAN            ABNORMAL ALERT CONDITION DETECTED
 INTERR   BOOLEAN            LOGICAL INTERFACE ERROR (INCLUDE INTERFACE
                             ERROR CODE)
 FORC     BOOLEAN            FORCED TERMINATION AS A RESULT OF STOP UNIT COMMAND
 CHERR    BOOLEAN            UNCORRECTABLE CHANNEL PARITY ERROR
 DATOV    BOOLEAN            DATA OVERRUN. A LOST DATA CONDITION
                             OCCURRED ON INPUT OR INADEQUATE DATA RATE ON OUTPUT
 DATERR   BOOLEAN            UNCORRECTABLE PARITY OR CHECKWORD ERROR
                             ON AN ADDRESS OR DATA FIELD.
 HDWR     BOOLEAN            UNCORRECTABLE HARDWARE MALFUNCTION IN A
                             CONTROLLER OR UNIT
 NRDY     BOOLEAN            INTERVENTION REQUIRED BY OPERATOR ON A
                             HARDWARE MALFUNCTION.  EX: UNIT NOT READY,
                             UNIT NOT CONNECTED.
 FTO      BOOLEAN            FUNCTION TIMEOUT
          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
          ALIGN  40,64
 URC      SUBRANGE 0,377B    UNSOLICITED RESPONSE CODE
                               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)
                               7  - ICA CHANNELNET READ COMPLETE
                               8  - ICA DEVICE ERROR
                               9  - PP LOG MESSAGE
                               13 - ICA CHANNEL CONNECTION READ COMPLETE
                               14 - UNIT CHANGED TO OPERATIONAL
                               15 - FLOW CONTROL STATUS CHANGE (NOT USED)
          ALIGN  49,64       ALERT CONDITIONS
 COMPRC   BOOLEAN            COMPARE NOT SATISFIED ON COMPARE/SWAP COMMAND
          ALIGN  0,64
 XFER     STRUCT 4           TRANSFER COUNT
 LASTC    RMA                LAST COMMAND (RMA)

          ALIGN  0,64
 T1STAT   PPWORD             TYPE 1 STATUS (BUFFER POOL 1 STATUS)
 T2STAT   PPWORD             TYPE 2 STATUS (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             DATA LENGTH OF BUFFER TO BE RETURNED
 BUFPVA   STRUCT 6           ADDRESS OF BUFFER TO BE RETURNED

 P.DUML   EQU    P.T1STAT    DUMP LENGTH
 BITC     SET    P.LASTC*16
          ALIGN  0,64
 PROV     PPWORD             CHANNEL PROTOCOL VERSION
          ALIGN  32,64
 MAXRS    STRUCT 4           MAXIMUM RECORD SIZE
 BITC     SET    P.LASTC*16
          ALIGN  0,64
 ERRID    PPWORD             ERROR IDENTIFIERS
 OPTP     PPWORD             OPRATION TYPE
          ALIGN  32,64
*
*         SYMPTOM CODES
 LSGSE    BOOLEAN            GENERAL STATUS ERROR
 LSCEF    BOOLEAN            CHANNEL ERROR FLAG
 LSCD     BOOLEAN            CHANNEL DEACTIVATION ERROR
 LSMLV    BOOLEAN            MESSAGE LENGTH VERIFICATION
 LSCA     BOOLEAN            CHANNEL ACTIVE
 LSCF     BOOLEAN            CHANNEL FULL
 LSCE     BOOLEAN            CHANNEL EMPTY
 LSMT     BOOLEAN            MESSAGE CONTENT ERROR
 LSIT     BOOLEAN            INCOMPLETE TRANSFER
 LSMSE    BOOLEAN            MAXIMUM SIZE EXCEEDED
          ALIGN  48,64
 FUNTO    PPWORD             FUNCTION CODE IF FUNCTION TIMEOUT ERROR
 PFUNC    PPWORD             PREVIOUS FUNCTION
 CURST    PPWORD             CURRENT STATE
 P.DATA1  EQU    P.CURST     ERROR DATA WORD 1
 PREST    PPWORD             PREVIOUS STATE
 P.DATA2  EQU    P.PREST     ERROR DATA WORD 2
 TSTAT    PPWORD             TRANSITION STATE
 EXPD     STRUCT 4           EXPECTED MESSAGE LENGTH
 ACTD     STRUCT 4           ACTUAL MESSAGE LENGTH
 RETSUC   PPWORD             RETRY SUCCESS
*                            0 = UNRECOVERED ERROR
*                            1 = RECOVERED ERROR
*                            2 = INTERMEDIATE ERROR
*                            3 = INFORMATIVE MESSAGE
 RETCT    PPWORD             RETRY COUNT
 LDS      BOOLEAN            DETAIL STATUS INCLUDED
 LGS      BOOLEAN            GENERAL STATUS INCLUDED
 DICA     BOOLEAN            DOWN ICA
          ALIGN  48,64
 GENST    PPWORD             GENERAL STATUS OF THE FIRST TIME ERROR
                               WAS ENCOUNTERED
          ALIGN  0,64
 DETAIL   PPWORD             START OF DETAILED STATUS - ICA SOFTWARE VERSION NUMBER
          PPWORD             ROM VERSION NUMBER
          PPWORD             HARDWARE MODEL/BOARD NUMBER
          PPWORD             LAST FUNCTION ISSUED BY PP
          PPWORD             ERROR WORD 1
          PPWORD             ERROR WORD 2
          PPWORD             LAST BUT ONE FUNCTION ISSUED BY PP
          PPWORD             LAST BUT TWO FUNCTION ISSUED BY PP
          PPWORD             MESSAGES IN OUTPUT QUEUE
          PPWORD             MESSAGES IN INPUT QUEUE
          PPWORD             NUMBER OF FREE BUFFERS
          PPWORD             PERCENT OF FREE BUFFERS

          MASKP  INT
 K.INT    EQU    MSK
          MGEN   N.PORT
 M.PORT   EQU    MASK$
          MASKP  INTERR
 K.INTERR EQU    MSK
          MASKP  DATOV
 K.DATOV  EQU    MSK
          MASKP  DATERR
 K.DATERR EQU    MSK
          MASKP  HDWR
 K.HDWR   EQU    MSK
          MASKP  CHERR
 K.CHERR  EQU    MSK
          MASKP  NRDY
 K.NRDY   EQU    MSK
          MASKP  FTO
 K.FTO    EQU    MSK

*         ERRID CODES
 K.LFTO   EQU    1           FUNCTION TIMEOUT ERROR
 K.LTF    EQU    2           STATE TRANSITION FAILURE
 K.LIVST  EQU    3           INVALID STATE TRANSITION
 K.LGSBTO EQU    4           GENERAL STATUS BUSY TIME OUT
 K.LOF    EQU    5           OPERATION FAILURE
 K.LRBTO  EQU    6           RESET BUSY TIMEOUT
 K.LODF   EQU    7           ONBOARD DAIGNOSTIC FAILURE
 K.LGSSDT EQU    8           GENERAL STATUS SEND DATA TIMEOUT
 K.LGSAT  EQU    9           GENERAL STATUS AVAILABLE TIMEOUT
 K.LGSCF  EQU    10          GENERAL STATUS CONTENT FAILURE
 K.LIOP   EQU    11          INDETERMINATE OUTPUT PARITY
 K.LICAR  EQU    12          ICA RESET
 K.LICAO  EQU    13          ICA OPERATIONAL
 K.LGSRR  EQU    14          GENERAL STATUS REJECT ON READ DIAG FAILED
 K.LPROER EQU    15          PROTOCOL MISMATCH
 K.LUD    EQU    16          USAGE DATA
 K.LFCE   EQU    17          ILLEGAL FLOW CONTROL

*         OPERATION CODES
 K.LWRT   EQU    1           WRITE
 K.LREAD  EQU    2           READ
 K.LRDS   EQU    3           READ DETAILED STATUS
 K.LQPM   EQU    4           QUEUE PREVIOUS MESSAGE
 K.LCAT   EQU    5           CHANNEL ACTIVE TIMEOUT
 K.LSR    EQU    7           STATUS RETURN
 K.LRDC   EQU    6           READ DIAGNOSTIC COMMAND
 K.LRGS   EQU    8           READ GENERAL STATUS
 K.LLM    EQU    9           LOAD MEMORY
 K.LEIS   EQU    10          ENTER IDLE STATE
 K.LEDS   EQU    11          ENTER DIAGNOSTIC STATE
 K.LSIP   EQU    12          SET ICA PARAMETERS
 K.LDM    EQU    13          DUMP MEMORY
 K.LRCC   EQU    14          READ CONFIDENCE TEST
 K.LSEA   EQU    15          SEND ETHERNET ADDRESS
          MASKP  LSGSE
 K.LSGSE  EQU    MSK
          MASKP  LSCEF
 K.LSCEF  EQU    MSK
          MASKP  LSCD
 K.LSCD   EQU    MSK
          MASKP  LSMLV
 K.LSMLV  EQU    MSK
          MASKP  LSCA
 K.LSCA   EQU    MSK
          MASKP  LSCF
 K.LSCF   EQU    MSK
          MASKP  LSCE
 K.LSCE   EQU    MSK
          MASKP  LSMT
 K.LSMT   EQU    MSK
          MASKP  LSIT
 K.LSIT   EQU    MSK
          MASKP  LSMSE
 K.LSMSE  EQU    MSK
          MASKP  LDS
 K.LDS    EQU    MSK
          MASKP  LGS
 K.LGS    EQU    MSK
          MASKP  DICA
 K.DICA   EQU    MSK

 RS       RECEND
          SPACE 4,10
**        READ DATA UNIT HEADER
*

 RDATA    RECORD PACKED

 DLEN     PPWORD             DATA LENGTH
 DTYPE    PPWORD             DATA TYPE

 RDATA    RECEND
          SPACE 4,10
**        IEEE 802.3 HEADER.
*

 H802.3   RECORD PACKED

 DADDR    STRUCT 6           DESTINATION ADDRESS
 SADDR    STRUCT 6           SOURCE ADDRESS
 DLEN     PPWORD             DATA LENGTH

 H802.3   RECEND
          SPACE  4,10
**        CHANNEL CONNECTION HEADER.
*

 HCC      RECORD PACKED

 CCPDUH   STRUCT 4           CCPDU HEADER
 FILL     STRUCT 2           FUTURE LENGTH FIELD NOT SUPPORTED
 DLEN     STRUCT 2           LENGTH OF RECORD

 HCC      RECEND
          SPACE  4,10
**        HEADER DESCRIPTOR.
*
*         DESCRIPTOR OF DATA USED TO DESCRIBE THE HEADER CHARACTERISTICS
*         OF EACH RECORD TYPE SUPPORTED.

 HD       RECORD PACKED

 HLB      PPWORD             HEADER LENGTH IN BYTES READ
 HLC      PPWORD             HEADER LENGTH IN BYTES WRITTEN TO CM
 ALF      PPWORD             ADDRESS OF LENGTH FIELD IN HEADER
 ATL      PPWORD             ADD TO LENGTH IN HEADER
 RRC      PPWORD             READ RESPONSE CODE
 MRS      PPWORD             MAXIMUM RECORD SIZE

 HD       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)

          SPACE  4,10
**        BUFFER POOL.
*

 BP       RECORD PACKED

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

 BP       RECEND
          SPACE  4,10
**        BUFFER POOL DESCRIPTOR.
*

 BPD      RECORD PACKED

          ALIGN  32,64
 BTRMA    RMA                RMA OF BUFFER TABLE (RMA)
          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             MINIMUM NUMBER OF AVAILABLE BUFFERS ALLOWED
 LIMIT    PPWORD             LENGTH OF CIRCULAR BUFFER (CM BYTES)

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

 BPH      RECORD PACKED

 BP1      STRUCT B.BPD       TYPE 1 BUFFER POOL
 BP2      STRUCT B.BPD       TYPE 2 BUFFER POOL

 BPH      RECEND
 UQD      RECEND
          SPACE  4,10
**        MASTER CONTROL TABLE.
*

 MCT      RECORD PACKED

 FLAGS    PPWORD             FLAG WORD
          ALIGN  48,64
 DEVID    PPWORD             DEVICE IDENTIFIER
 NOR      STRUCT B.UQD       NORMAL QUEUE
 PRI      STRUCT B.UQD       PRIORITY QUEUE
          ALIGN  32,64
 BP       RMA                BUFFER POOL DESCRIPTOR POINTER (RMA)

 INIT     EQU    15          BIT ASSIGNED UNIT INITIALIZED FIELD

 MCT      RECEND
          TITLE  GENERAL EQUATES
**        GENERAL EQUATES.
*


 CHN      EQU    15B         CHANNEL NUMBER
 D.DATA1  EQU    125252B     DIAGNOSTIC CONFIDENCE TEST DATA
 D.DATA2  EQU    52525B      DIAGNOSTIC CONFIDENCE TEST DATA
 EAL      EQU    4           ETHERNET ADDRESS LENGTH
 FTRY     EQU    3           NUMBER OF RETRYS ON FUNCTION TIMEOUT
 LDSPP    EQU    12          DETAILED STATUS LENGTH IN PP WORDS (ICA-1 MODE)
 LDSOSI   EQU    8           DETAILED STATUS LENGTH IN PP WORDS (OSI MODE)
 MAXBPD   EQU    2           MAXIMUM BUFFER POOL DESCRIPTORS
 MAXDIAG  EQU    764         MAX NUMBER OF PP WORDS TO XFER IN DIAG STATE
 MAXBYTS  EQU    MAXDIAG*2   MAXIMUM LENGTH IN BYTES
*MAXDMA   EQU    1024        MAX CM BYTES THAT ICA CAN RECEIVE PER DMA TRANSFER
 MAXDMA   EQU    2048-8      MAX CM BYTES THAT ICA CAN RECEIVE PER DMA TRANSFER
 MAXLEN   EQU    1536        MAXIMUM LENGTH FOR CHANNELNET
 MINLEN   EQU    1400B       MINIMUM LENGTH OF I/O BUFFER
 MAXPR    EQU    3           MAXIMUM CONSECUTIVE PRIORITY REQUESTS

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

 MAXRS    EQU    12          MAXIMUM RESPONSE BUFFER SIZE (CM WORDS)
 MAXURQ   EQU    11          MAXIMUM UNIT REQUEST SIZE (CM WORDS)
 S.DATA0  EQU    124452B     ECHO STATUS DATA
 S.DATA1  EQU    50425B      ECHO STATUS DATA
 DRTYP    EQU    2           =2 IF ICA DRIVER
 U.I2TYPE EQU    1006B       ICA-2 UNIT TYPE
 SIM      EQU    0           =1, IF RUNNING ON SIMULATOR
 BRK      EQU    1           =1, IF PP BREAKPOINT CODE ASSEMBLED
 DEBUG    EQU    1           =1, IF DEBUGGING CODE ON
          SPACE  4,38
**        COMMAND CODES.
*


 C.ACK    EQU    0           ACKNOWLEDGE
 C.STOP   EQU    1           STOP UNIT
 C.SELU   EQU    2           SELECT UNIT
 C.SELC   EQU    3           SELECT CONTROLLER
 C.IDLE   EQU    4           IDLE
 C.RESUME EQU    5           RESUME
 C.DBGRM  EQU    6           READ PP MEMORY
 C.READY  EQU    7           START READY SCAN
 C.SREADY EQU    10B         STOP READY SCAN
 C.DBGSM  EQU    11B         SELECT PP MEMORY ADDRESS
 C.DBGWM  EQU    12B         WRITE PP MEMORY
 C.DEFBA  EQU    14B         DEFINE PP BKPT AREA IN CM
 C.FUNC   EQU    40B         OUTPUT FUNCTION
 C.OUTP   EQU    41B         OUTPUT 8-BIT PARAMETERS
 C.OUTD   EQU    43B         OUTPUT 8-BIT DATA
 C.IND    EQU    45B         INPUT 8-BIT DATA/PARAMETERS
 C.READ   EQU    100B        READ BYTES
 C.WRTR   EQU    121B        WRITE CHANNEL CONNECTION RECORD
 C.STATUS EQU    140B        READ STATUS
 C.COUNT  EQU    141B        STORE TRANSFER COUNT
 C.RDY    EQU    165B        SYNCHRONIZE READY
 C.GFC    EQU    167B        GLOBAL FLOW CONTROL
 C.DBUG   EQU    170B        DEBUG MODE
 C.RESET  EQU    171B        RESET ICA
 C.DEFEA  EQU    172B        DEFINE ETHERNET ADDRESS
 C.WRITEV EQU    200B        WRITE VERIFY
          SPACE  4,10
**        DIAGNOSTIC COMMAND CODES
*


 DC.UNFW  EQU    10000B      1000(16) WRITE UNFORMATTED
 DC.FW    EQU    10020B      1010(16) WRITE FORMATTED
 DC.READ  EQU    10040B      1020(16) READ DATA
 DC.ECHO  EQU    10100B      1040(16) ECHO STATUS
 DC.END   EQU    10120B      1050(16) END DIAGNOSTICS
          SPACE  4,10
**        ICA DIRECT FUNCTION CODES.
*


 F.GS     EQU    410B        0108(16) GENERAL STATUS
 F.RESET  EQU    440B        0120(16) RESET
 F.MCLEAR EQU    460B        0130(16) MASTER CLEAR
          SPACE  4,12
**        ICA RAM TRANSPARENT FUNCTION CODES.
*

 F.DS     EQU    1B          0001(16) DETAILED STATUS
 F.NORM   EQU    2B          0002(16) NORMAL FUNCTION
 F.QPREAD EQU    3B          0003(16) QUEUE PREVIOUS MESSAGE
 F.READ   EQU    4B          0004(16) TRANSPARENT READ
 F.WRITE  EQU    5B          0005(16) TRANSPARENT WRITE
 F.FCOFF  EQU    6B          0006(16) NORMAL FLOW CONTROL OFF
 F.FCON   EQU    7B          0007(16) NORMAL FLOW CONTROL ON
 F.SETPAR EQU    13B         000B(16) SET ICA PARAMETERS
          SPACE  4,10
**        ICA ROM TRANSPARENT FUNCTION CODES.
*

 F.LOAD   EQU    110000B     9000(16) LOAD MEMORY
 F.DUMP   EQU    110001B     9001(16) DUMP MEMORY
 F.IDLE   EQU    110002B     9002(16) ENTER IDLE STATE
 F.FDUMP  EQU    110003B     9003(16) FORMAT DUMP
 F.SOSI   EQU    110020B     9010(16) START OSI LOAD
 F.DEFEA  EQU    110021B     9011(16) DEFINE ETHERNET ADDRESS
          SPACE  4,14
**        ICA DIAGNOSTIC TRANSPARENT FUNCTION CODES.
*

 F.RET1   EQU    50025B      5015(16) STATUS RETURN 1
 F.RDIAG  EQU    114000B     9800(16) READ DIAGNOSTIC COMMAND
 F.OUTPUT EQU    114020B     9810(16) OUTPUT UNFORMATED MESSAGE
 F.EIDLE  EQU    114040B     9820(16) ENTER IDLE STATE
 F.EDIAG  EQU    114060B     9830(16) ENTER DIAGNOSTIC STATE
 F.GSRR   EQU    114100B     9840(16) GENERAL STATUS REJECT READ
 F.CHAATC EQU    114120B     9850(16) CHANNEL ACTIVE TIMEOUT
 F.RCC    EQU    114140B     9860(16) READ CONFIDENCE TEST
 F.WCC    EQU    114141B     9861(16) WRITE CONFIDENCE TEST
 F.RET0   EQU    124052B     A82A(16) STATUS RETURN 0


          SPACE  4,26
**        GENERAL STATUS BIT DEFINITIONS
*

 S.RC1    EQU    0           RESET CODE REASON
 S.RC2    EQU    1           RESET CODE REASON
 S.RC3    EQU    2           RESET CODE REASON
 S.FC1    EQU    0           FLOW CONTROL SUBSTATE
 S.FC2    EQU    1           FLOW CONTROL SUBSTATE
 S.FC3    EQU    2           FLOW CONTROL SUBSTATE
 S.SC1    EQU    3           SYMPTOM CODE
 S.SC2    EQU    4           SYMPTOM CODE
 S.SC3    EQU    5           SYMPTOM CODE
 S.SS1    EQU    3           OPERATIONAL SUBSTATE
 S.SS2    EQU    4           OPERATIONAL SUBSTATE
 S.SS3    EQU    5           OPERATIONAL SUBSTATE
 S.BUSY   EQU    6           BUSY BIT
 S.SEND   EQU    7           SEND DATA
 S.SB1    EQU    8           STATE BITS
 S.SB2    EQU    9           STATE BITS
 S.DATAV  EQU    10          DATA AVAILABLE
 S.IE     EQU    12          ICA ERRORS
 S.PE     EQU    13          PP ERRORS
 S.CE     EQU    14          CHANNEL ERRORS
 S.GE     EQU    15          GENERAL ERRORS
 SSMASK   EQU    7           SUBSTATE MASK
          SPACE  4,10
**        DETAILED STATUS WORD OFFSETS
*


 DS.PROV  EQU    0           CHANNEL PROTOCOL VERSION
 DS.MPS   EQU    6           MAXIMUM PDU SIZE
          SPACE  4,10
**        ICA STATES
*

 ST.RESET EQU    0           RESET STATE
 ST.DIAG  EQU    1           DIAGNOSTICS STATE
 ST.IDLE  EQU    2           IDLE STATE
 ST.OPER  EQU    3           OPERATIONAL
          SPACE  4,10
**        OPERATIONAL SUBSTATES
*

 OSS.DATA EQU    0           DATA TRANSFER
 OSS.WPN  EQU    1           WAITING FOR PROTOCOL NEGOTIATION
          SPACE  4,10
**        FLOW CONTROL SUBSTATES
*

 FSS.OFF  EQU    0           NORMAL FLOW CONTROL OFF
 FSS.ON   EQU    1           NORMAL FLOW CONTROL ON
          SPACE  4,10
**        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
**        RESPONSE CONDITIONS
*


 RC.NONE  EQU    0           NEITHER CONDITIONS 1 OR 2 OCCURRED
 RC.REC   EQU    1           RECOVERED ERROR
 RC.XRES  EQU    2           A COMMAND REQUESTING A RESPONSE WAS EXECUTED OK
 RC.BOTH  EQU    3           BOTH CONDITIONS 1 + 2 OCCURRED
          SPACE  4,15
**        UNSOLICITED RESPONSE CODES
*

 URC.RN   EQU    1           CHANGE FROM READY TO NOT READY
 URC.NR   EQU    2           CHANGE FROM NOT READY TO READY
 URC.IE   EQU    3           INTERNAL OR INTERFACE ERROR
 URC.RD   EQU    7           READ RESPONSE
 URC.DE   EQU    8           DEVICE ERROR
 URC.LM   EQU    9           PP LOG MESSAGE
 URC.CR   EQU    13          CHANNEL CONNECTION READ RESPONSE
 URC.LO   EQU    14          CHANGE TO OPERATIONAL
          SPACE  4,10
***       ERROR RECOVERY SUCCESS CODES
*

 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,12
***       WAIT TIMES IN MILLISECONDS
*
 FTOLEN   EQU    50          FUNCTION TIMEOUT LENGTH  (T1/T2)
 GSBUSY   EQU    100         MAXIMUM WAIT FOR NOT BUSY  (T4)
 GSFULL   EQU    1           WAIT FOR FULL ON GENERAL STATUS
 LMBUSY1  EQU    6000        MAX BUSY WAIT FOR LOAD FOR ICA-1  (T5)
 LMBUSY2  EQU    6000        MAX BUSY WAIT FOR LOAD FOR ICA-2  (T5)
 RSBUSY1  EQU    8000        MAXIMUM RESET BUSY WAIT FOR ICA-1 (T7)
 RSBUSY2  EQU    25000       MAXIMUM RESET BUSY WAIT FOR ICA-2 (T7)
 WTDEACT  EQU    10          WAIT FOR CHANNEL TO DEACTIVATE
 WTEMPTY  EQU    1           MAXIMUM WAIT FOR CHANNEL EMPTY  (T7)
 WTFULL   EQU    1           MAXIMUM WAIT FOR CHANNEL FULL  (T7)
          SPACE  4,10
**        BUFFER POOL STATUS CONDITIONS.
*

 BP.EMPTY EQU    0           BUFFER POOL IS OUT OF BUFFERS
 BP.THRSH EQU    1           BUFFER COUNT HAS FALLEN BELOW SPECIFIED THRESHOLD
 BP.GOOD  EQU    2           BUFFER POOL CONTAINS A SUFFICIENT NUMBER OF BUFFERS

          SPACE  4,10
***       INTERNAL STATE CODES
*

 SC.PPR   EQU    1           INTERNAL RESET CODE IF RESET BY PP
 SC.ICA   EQU    2           INTERNAL RESET CODE IF RESET BY ICA
 SC.PPD   EQU    3           INTERNAL RESET CODE IF ICA DOWNED BY PP
 SC.AV    EQU    4           STATE CHANGING TO AVAILABLE
 SC.OPER  EQU    5           STATE CHANGING TO OPERATIONAL
          SPACE  4,10
**        BUFFER RETURN SEND STATE CONDITIONS.
*

 SS.CLOSE EQU    0           PP CANNOT SEND ANY MORE MESSAGES TO THE DEVICE (NOT USED)
 SS.OPEN  EQU    1           PP IS ABLE TO SEND MESSAGES TO THE DEVICE
          SPACE  4,10
***       DATA CONTENT ERROR CODES
*

 CE.WUM   EQU    1           WRITE UNFORMATTED
 CE.WFM   EQU    2           WRITE FORMATTED
 CE.RD    EQU    3           READ
 CE.ES    EQU    4           ECHO STATUS
          SPACE  4,10
**        CHANNEL PROTOCOL EQUATES.
*

 PR.MIN   EQU    0#01        MINIMUM PROTOCOL SUPPORTED BY DRIVER
 PR.MAX   EQU    0#01        MAXIMUM PROTOCOL SUPPORTED BY DRIVER
 PR.BASE  EQU    0#40        BASE FOR PROTOCOL NEGOTIATION


          TITLE  DIRECT CELL DEFINITIONS
**        DIRECT CELLS
*


          ORG    0
          CON    INT-1       STARTING ADDRESS
 ABSC     BSSZ   1           ABNORMAL STATUS CODE
 BUFLEN   BSSZ   1           CM BUFFER LENGTH IN PP WORDS
 BUSYMP   CON    1           NUMBER OF TIMES TO EXECUTE BUSY LOOP IN GST
 BYTCNT   BSSZ   1           BYTE COUNT OF TRANSFER
 BYTS     BSSZ   1           NUMBER OF BYTES TO TRANSFER TO/FROM CM
 CMADR    BSSZ   3           CM ADDRESS
 CML      BSSZ   1           INDEX TO CMLIST
 CMLISTL  BSSZ   1           NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST.
 CM.PPR   BSSZ   2           CM ADDRESS OF PREVIOUS PERIPHERAL REQUEST (REFORMATTED)
 CM.PIT   BSSZ   2           CM ADDRESS OF PP INTERFACE TABLE (REFORMATTED)
 CM.URQ   BSSZ   2           CM ADDRESS OF UNIT REQUEST QUEUE (REFORMATTED)
 CM.RS    BSSZ   2           CM ADDRESS OF RESPONSE BUFFER (REFORMATTED)
 CM.QT    BSSZ   2           CM ADDRESS OF UNIT QUEUE TAIL POINTER (REFORMATTED)
 CM.BPD   BSSZ   2           CM ADDRESS OF BUFFER POOL DESCRIPTOR (REFORMATTED)
 DATADD   BSSZ   2           CM ADDRESS OF DATA AREA
 ERRCNT   BSSZ   1           NUMBER OF BYTES NOT TRANSFERED ON IO REQUEST
 ERRRCP   BSSZ   1           POINTER TO RECOVERY COUNTER
 ERRT1    BSSZ   1           TEMPORARY STORAGE FOR ERR CHECK
 FSTBD    BSSZ   1           INDEX TO BUFFER DESCRIPTOR
 FUNCD    BSSZ   1           FUNCTION CODE
 GNSTAT   BSSZ   1           GENERAL STATUS
 ICATDDP  BSSZ   1           ICA TYPE-DEPENDENT DATA POINTER
 LSTATE   BSSZ   1           LAST STATE ICA WAS KNOWN TO BE IN
 LIM      BSSZ   1           LIMIT OF CIRCULAR RESPONSE BUFFER
 ONE      CON    1           CONSTANT OF 1
 PPNO     CON    1           LOGICAL PP NUMBER

*         *P1* AND *P2* ARE MOVED TO *DRNAME* AT INITIALIZATION TIME.

 P1       DATA   H*IC*
 P2       DATA   H*AD*
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
 RDCNT    BSSZ   1           BYTES READ THIS XFER
 RESPC    BSSZ   1           RESPONSE CODE
 STCHNG   CON    SC.PPR      ICA STATE CHANGE REQUESTED

*                            0 = NO STATE CHANGE REQUESTED
*                            1 = PP REQUESTED RESET
*                            2 = ICA INITIATED RESET
*                            3 = ICA DOWN
*                            4 = ICA STATE CHANGE TO IDLE
*                            5 = ICA STATE CHANGE TO OPERATIONAL

 T1       BSSZ   1
 T2       BSSZ   1
 T3       BSSZ   1
 T4       BSSZ   1
 T5       BSSZ   1
 T6       BSSZ   1
 T7       BSSZ   1
 T8       BSSZ   1
 T9       BSSZ   1
 T10      BSSZ   1
 UNSC     BSSZ   1           UNSOLICITED RESPONSE CODE
 WC       BSSZ   1           WORD COUNT TO READ/WRITE CM WORDS
 C1       BSSZ   1           TEMPORARY ONLY FOR S1 TESTING
          SPACE  3
          ERRMI  72B-*       ERROR IF P > 72B
          ORG    72B

 DSRTP    CON    0           HCS REAL MEMORY WORD-ADDRESS
          CON    1
 C2       EQU    DSRTP       TEMPORARY FOR S1 TESTING
 INPNT    EQU    DSRTP+1     IN POINTER FOR RESPONSE BUFFER
 NUMBP    BSSZ   1           NUMBER OF BUFFER POOLS
 HDRTYP   BSSZ   1           INDEX INTO HEADER CHARACTERISTIC TABLE
          ERRMI  76B-*       ERROR IF P > 76B
          ORG    76B
          CON    5           TEMPORARY, PP TYPE USED BY DEADSTART
 ERRT2    EQU    76B         TEMPORARY STORAGE FOR ERR CHECK
 IOCNT    BSSZ   1           NUMBER OF CHANNEL WORDS TO TRANSFER
          SPACE  4,10
          ERRMI  100B-*      ERROR IF P > 100B
          ORG    100B
 DRNAME   LJM    INT         INITIALIZE DRIVER
          SPACE  4,10
 AVAIL    CON    URC.RN      = LAST UNSOLICITED RESPONSE CODE SENT
*                            INDICATING ICA AVAILABILITY
 BWRT     BSSZ   1           NUMBER OF BYTES TO WRITE TO CM BUFFER
 CHAN     BSSZ   1           CHANNEL NUMBER
 CHLOCK   BSSZ   1           NON ZERO IF CHANNEL LOCKED
 CM.INT   BSSZ   3           CM ADDRESS OF INTERRUPT WORD (REFORMATTED)
 CM.CHAN  BSSZ   3           CM ADDRESS OF CHANNEL INTERLOCK TABLE (REFORMATTED)
 CM.CONF  BSSZ   2           CM ADDRESS OF CONFIGURATION (REFORMATED)
 CM.LOAD  BSSZ   3           LENGTH/ADDRESS PAIR OF MICROCODE (REFORMATED)
*
*    A REGISTER PORTION OF REFORMATTED ADDRESS OF MASTER CONTROL TABLE.
*
 CM.MCT   BSSZ   1
 CPDS     BSSZ   1           CP DUMP SEQUENCER
 DBUGM    CON    1           = 0 IF DEBUG MODE ON
*                            = 1 IF DEBUG MODE OFF
 DEVID    BSSZ   1           DEVICE IDENTIFIER
 EA       BSSZ   4           ETHERNET ADDRESS OF ICA IF OSI MODE
 EBYOFF   BSSZ   1           ENDING BYTE OFFSET VALUE (ODD OR EVEN)
 ERRR     BSSZ   1           DECREMENTED BY ONE EACH TIME AN ERROR OCCURS
*                            THAT IS EXPECTED TO BE RETRIED IMMEDIATLY.
 EXPD     BSSZ   4           EXPECTED/ACTUAL LENGTH OF MESSAGE
 ACTD     EQU    EXPD+2
 FBSIZE   BSSZ   1           MAXIMUM SIZE OF FIRST BUFFER POOL BUFFER
 GFCFC    CON    F.FCOFF     FLOW CONTROL FUNCTION TO BE SENT AFTER READY
 GSSAVE   BSSZ   1           SAVE GENERAL STATUS FOR LOGGING
 OSITDD   BSS    0           ICA-2 OSI MODE TYPE DEPENDENT DATA
          LOC    0
 RSBUSY   CON    RSBUSY2/GSBUSY  MAX CYCLES TO WAIT FOR RESET FOR ICA-2
 LMBUSY   CON    LMBUSY2/GSBUSY  MAX CYCLES TO WAIT FOR LOAD FOR ICA-2
 DSCFLAG  CON    1           PERFORM DIAGNOSTIC STATUS CHECK
 OSI      CON    1           OSI SUPPORT
 LOADFC   CON    F.SOSI      FUNCTION CODE FOR LOAD
 CONFIG   CON    SEA         CONFIGURATION PROCEDURE
 STATAL   CON    ST.IDLE     STATE AFTER LOAD MEMORY
 LDS      CON    LDSOSI      LENGTH OF DETAILED STATUS
          LOC    *O
 IDLE     BSSZ   1           IDLE FLAG
 IERC     BSSZ   1           INTERFACE ERROR CODE
 INIT     BSSZ   1           0 IF IN PP INITIALIZATION
 LFLEN    BSSZ   2           LENGTH OF MICRO CODE LOAD FILE FROM HEADER
 LIOC     BSSZ   2           LARGE IO COUNT
 NIL      VFD    48/0#FFFF80000000,16/0  CYBIL NIL POINTER
 NUMPRI   BSSZ   1           NUMBER OF CONSECUTIVE PRIORITY REQUESTS
 NXTREC   BSSZ   1           NUMBER OF BYTES IN THE NEXT RECORD TO BE READ
 OSOSI    BSSZ   1           = 1 IF ICA IS OPERATIONAL
 OTYPE    BSSZ   1           OPERATION TYPE FOR ERROR CHECKING
 PREFC    BSSZ   1           PREVIOUS FUNCTION CODE
 PROV     BSSZ   1           VERSION OF CHANNEL PROTOCOL ICA SUPPORTS
 PWRT     BSSZ   1           SIZE OF DMA TRANSFER BLOCK (PP WORDS)
 PVA      BSSZ   8           PVA - RMA ADDRESS PAIR STORAGE AREA
 RMA      EQU    PVA+/RQ/P.NEXT
 RCON     BSSZ   1           RESPONSE CONDITION
 RESST    BSSZ   1           RESET STATUS
 REQTYP   BSSZ   1           =0, IF PROCESSING PP REQUEST
*                            <> 0, IF PROCESSING UNIT REQUEST
 RDRTY    BSSZ   1           DECREMENTED BY ONE EACH TIME A READ ERROR
*                            OCCURS. SET TO ZERO ON UNRECOVERED ERROR.
 SCP.DMP  BSSZ   1           SYNCHRONIZATION WORD FOR ICA DUMP
 SCP.TRM  BSSZ   1           SYNCHRONIZATION WORD FOR ICA DUMP TERMINATION
 SCP.RDY  BSSZ   1           SYNCHRONIZATION WORD FOR READY
 STBI     BSSZ   1           INPUT TO SEARCH TABLE ROUTINE

*
*         TCCH   DEFINES THE CHANNEL CONNECTION HEADER
*

 TCCH     BSS    0
          LOC    0
          VFD    16/B.HCC    CC HEADER LENGTH IN BYTES READ
          VFD    16/B.HCC    CC HEADER LENGTH IN BYTES WRITTEN TO CM
          VFD    16/IOBUF+/HCC/P.DLEN ADDRESS OF LENGTH FIELD
          VFD    16/0        ADDED TO LENGTH IN HEADER
          VFD    16/URC.CR   CC RESPONSE CODE
          VFD    16/0        SET AT PROTOCOL NEGOTIATION
          LOC    *O

*
*         TCNH   DEFINES THE CHANNELNET HEADER
*

 TCNH     BSS    0
          LOC    0
          VFD    16/C.H802.3*8  CHANNELNET HEADER LENGTH IN BYTES READ
          VFD    16/C.H802.3*8  CHANNELNET HEADER LENGTH IN BYTES WRITTEN TO CM
          VFD    16/IOBUF+/H802.3/P.DLEN  ADDRESS OF LENGTH FIELD
          VFD    16/B.H802.3  ADDED TO LENGTH IN HEADER
          VFD    16/URC.RD   CHANNELNET RESPONSE CODE
          VFD    16/MAXLEN   CHANNELNET MAXIMUM LENGTH
          LOC    *O

 TBYTS    BSSZ   1           TOTAL NUMBER OF BYTES TO ALLOCATE CM BUFFERS FOR
 TCHFR    BSSZ   1           TOTAL NUMBER OF PP WORDS TO READ
 TIMA     BSSZ   1           MOST RECENT CLOCK VALUE
 TIMB     BSSZ   1           NORMAL FUNCTION TIMER
 UNIT     BSSZ   1           LOGICAL UNIT NUMBER
 WRRTY    BSSZ   1           DECREMENTED BY ONE EACH TIME A WRITE ERROR
*                            OCCURS. SET TO ZERO ON UNRECOVERED ERROR.



          IFEQ   SIM,1
 DATCNT   BSSZ   1           CHANNEL FRAMES IN PP BUFFER
          ENDIF
 D.       IFEQ   DEBUG,1
 BUFCNT   BSSZ   MAXBPD      TOTAL CM BUFFERS USED
 EMPBUF   BSSZ   MAXBPD      NUMBER OF TIMES BUFFER POOL WENT EMPTY
 FTOCNT   BSSZ   1           FUNCTION TIMEOUT COUNT
 HISTINX  BSSZ   1           FUNCTION HISTORY INDEX
 FUNHIST  BSSZ   8           FUNCTION HISTORY TABLE
 LSTFUNC  BSSZ   1           LAST FUNCTION CODE SAVED IN TABLE
 RECNT    BSSZ   1           READ ERROR COUNT
 WECNT    BSSZ   1           WRITE ERROR COUNT
 D.       ENDIF

*         TEMPORARY FOR S1 CHECKOUT
 ASAVE    BSSZ   2
 LRURMA   BSSZ   2

          TITLE  DCS - DETERMINE CURRENT STATE
**        DCS - DETERMINE CURRENT STATE
*
*         THIS IS THE MAIN ROUTINE OF THE PP. THIS ROUTINE
*         IS ENTERED WHEN THE ICA IS TO BE RESET. IT NOTIFIES
*         THE CPU OF ANY AVAILABILITY CHANGE AND CALLS THE
*         RESET PROCESSOR. IF THE RESET IS SUCCESSFULL IT
*         CALLS THE OPERATIONAL STATE PROCESSOR.
*
*         ENTRY  NONE
*
*         USER   NONE
*
*         CALLS  SAC PPR IDL SOR PIR OSP
          SPACE  4,10
 DCS      BSS    0           ENTRY
 DCS10    RJM    PPR         PROCESS PP REQUESTS
          RJM    IDL         IDLE STATE PROCESSOR
          RJM    SAC         SEND AVAILABILITY CHANGE
          RJM    PIR         PROCESS RESET
          NJN    DCS30       IF ERRORS
          RJM    SAC         SEND AVAILABILITY CHANGE
          RJM    OSP         OPERATIONAL STATE
          LDDL   STCHNG
          SBN    SC.OPER
          NJN    DCS30       IF STATE NOT CHANGING TO OPERATIONAL
          STDL   STCHNG      CLEAR STATE CHANGE
          LDN    ST.OPER
          STDL   LSTATE      UPDATE LAST STATE
          RJM    CSC         CHECK FOR STATE CHANGE OR BUSY
          NJN    DCS30       IF STATE CHANGE OR BUSY
          RJM    NCP         NEGOTIATE CHANNEL PROTOCOL
          NJN    DCS30       IF ERRORS
          LDN    SC.OPER
          STDL   STCHNG
          RJM    SAC         SEND AVAILABILITY CHANGE
          LDN    0
          STDL   STCHNG
          RJM    SOR         LOG OPERATIONAL MESSAGE
          NJN    DCS30       IF ERRORS
          RJM    OSP         OPERATIONAL STATE
 DCS30    UJK    DCS10
          TITLE  OSP - OPERATIONAL STATE PROCESSOR
**        OSP - OPERATIONAL STATE PROCESSOR
*
*         THIS ROUTINE PERFORMS PROCESSING FOR OPERATIONAL AND IDLE
*         STATE MONITORING THE STATUS OF THE ICA. WHILE THE ICA REMAINS
*         OPERATIONAL ALTERNATE BETWEEN READING/WRITING THE ICA
*         AND HONORING PP REQUESTS. RETURNING WHEN THE ICA OR PP
*         STATE CHANGES.
*
*         ENTRY  NONE
*
*         USES   NONE
*
*         CALLS  FAN IOS PPR CSC CSD DFC PRD PUR SNF SSM
*
          SPACE  4,10
 OSP      SUBR               ENTRY/EXIT
          RJM    IOS         INITIALIZE OPERATIONAL STATE
          NJN    OSPX        IF ERRORS
 OSP10    RJM    PPR         PROCESS PP REQUESTS
 OSP20    RJM    SNF         SEND NORMAL FUNCTION
          NJN    OSPX        IF ERRORS
          RJM    CSC         CHECK IF STATE CHANGE
          NJN    OSP30       IF STATE CHANGE
          RJM    PRD         PROCESS READ
          RJM    CSC         CHECK IF STATE CHANGE
          NJN    OSP30       IF STATE CHANGE
          RJM    CSD         CHECK FOR SEND DATA
          NJN    OSP25       IF SEND DATA NOT INDICATED
          RJM    DFC         DETERMINE FLOW CONTROL
          NJN    OSP30       IF ERRORS
          RJM    PUR         PROCESS UNIT REQUEST
 OSP25    RJM    CSC         CHECK IF STATE CHANGE
          ZJN    OSP10       IF NO STATE CHANGE
 OSP30    UJK    OSPX        EXIT
          TITLE  DIA - DIAGNOSTIC STATE PROCESSOR
**        DIA - DIAGNOSTIC STATE PROCESSOR
*
*         THIS ROUTINE PERFORMS A NUMBER OF DIAGNOSTIC TESTS
*         TO DETERMINE THE CONDITION OF THE ICA AND THE CHANNEL.
*         DIA IS ENTERED IN THE RESET STATE AFTER PHASE ONE OF
*         THE ONBOARD DIAGNOSTICS HAVE RUN WITHOUT ERROR.
*         AFTER RUNNING A CONFIDENCE TEST TO VERIFY THE CHANNEL IS
*         FUNCTIONING AND A CHANNEL TIMEOUT CHECK TO VERIFY THE
*         CHANNEL ACTIVE TIMEOUT THE DIAGNOSTIC SEQUENCE IN EXECUTED.
*
*
*         ENTRY  NONE
*
*         EXIT   A = 0 IF NO ERRORS
*                A <> 0 IF ERRORS
*
*         USES   P5 P6
*
*         CALLS  DIC DAC DSC FAN GST BTE STE ERR GRB FAW STB DVE RDB
*                DDR DRD DSR
*
          SPACE  4,10
 DIA      SUBR               ENTRY/EXIT
          RJM    DIC         RUN INTERFACE CONFIDENCE CHECK
          NJN    DIAX        EXIT IF ERROR
          RJM    DAC         RUN CHANNEL TIMEOUT CHECK
*         ERRORS IN CHANNEL ACTIVE TIMEOUT ARE NOT FATAL

          RJM    DSC         RUN GENERAL STATUS REJECT CHECK
*         ERRORS IN REJECT CHECK ARE NOT FATAL

 DIA15    LDN    FTRY
          STML   ERRR        RESET RETRY COUNT
          LDC    F.EDIAG     ENTER DIAGNOSTIC STATE
          RJM    FAN
          NJN    DIAX        EXIT ON FUNCTION TIMEOUT
          LDN    77B
          STDL   LSTATE      DONT CHECK STATE
          RJM    GST         GET GENERAL STATUS
          PJN    DIA17       IF NOT BUSY
          RJM    BTE         LOG BUSY TIMEOUT ERROR
          LDN    1           EXIT
 DIA17    NJN    DIAX        EXIT IF READ GENERAL STATUS ERROR
          LDDL   GNSTAT
          SHN    -S.SB1
          LPN    3           GET STATE
          SBN    ST.DIAG
          ZJN    DIA19       IF PROPER STATE SWITCH
 DIA18    LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          LDN    ST.DIAG
          RJM    STE         LOG STATE TRANSITION ERROR
          LDN    1
          UJK    DIAX        EXIT WITH ERROR

 DIA19    LDN    ST.DIAG
          STDL   LSTATE      UPDATE LAST STATE
          LDDL   GNSTAT
          SHN    17-S.GE
          MJN    DIA18       IF GENERAL STATUS ERRORS
          LDML   BPDSIZE-1,NUMBP   GUARANTEE A LARGE BUFFER
          STML   TBYTS
 DIA20    RJM    GRB         GET A LARGE BUFFER
          ZJK    DIA20       IF NO BUFFER OBTAINED
          LRDL   DATADD      LOAD R REGISTER
 DIA25    LDC    F.RDIAG     READ DIAGNOSTIC COMMAND FUNCTION
          RJM    FAW
          NJK    DIA60       IF ERROR ON FUNCTION
          SIMM
          IAN    CHN
          STML   STBI        SAVE COMMAND
          RJM    WCI         WAIT FOR CHANNEL INACTIVE
          NJN    DIA30       IF CHANNEL INACTIVE
          LDK    /RS/K.LRDC
          RJM    CAE         LOG CHANNEL ACTIVE ERROR
          LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          UJK    DIA60       EXIT

 DIA30    LDN    /RS/K.LRDC
          RJM    DEC         CHECK FOR ERRORS
          NJK    DIA57       IF ERRORS CHECK FOR RETRY

          LDC    DC.END
          SBML   STBI
          ZJK    DIA50       EXIT ON END COMMAND
          LDC    DCT-2       COMMAND TABLE ADDRESS - 2
          RJM    STB         SEARCH COMMAND TABLE
          NJN    DIA40       PROCESSOR FOUND
          LDML   STBI        GET ILLEGAL COMMAND
          STML   LRS+/RS/P.DATA1
          LDK    /RS/K.LRDC
          RJM    DVE         LOG DATA VERIFICATION ERROR
          UJN    DIA60       EXIT WITH ERROR

 DIA40    STDL   P6          PROCESSOR ADDRESS
          RJM    0,P6        PROCESS COMMAND
          NJN    DIA57       IF ERRORS CHECK FOR RETRY
          UJK    DIA25       CONTINUE

 DIA50    RJM    RDB         RETURN DIAGNOSTIC BUFFER
          LDN    0
 DIA55    UJK    DIAX        EXIT

 DIA57    LDDL   STCHNG
          NJN    DIA60       IF STATE CHANGING
          RJM    RDB         RETURN DIAGNOSTIC BUFFER
          LDML   ERRR
          NJK    DIA15       RESTART DIAGNOSTICS
          UJN    DIA70       EXIT

 DIA60    RJM    RDB         RETURN DIAGNOSTIC BUFFER
 DIA70    DCN    CHN+40B     DISCONNECT CHANNEL
          TRACE
          LDN    1           ERROR RETURN
          UJN    DIA55       EXIT
          SPACE 4,10
 DCT      CON    DC.UNFW,DDR DIAGNOSTIC UNFORMATTED WRITE
          CON    DC.FW,DDR   DIAGNOSTIC FORMATTED WRITE
          CON    DC.READ,DRD DIAGNOSTIC READ
          CON    DC.ECHO,DSR DIAGNOSTIC STATUS RETURN
          CON    0
          TITLE  IDL - IDLE STATE PROCESSOR
**        IDL - IDLE STATE PROCESSOR
*
*         THIS ROUTINE IS ENTERED ANY TIME THE ICA HAS BEEN
*         DOWNED OR RESET AND WHEN AN IDLE COMMAND IS RECIEVED FROM THE
*         CPU. THIS ROUTINE WILL CONTINUE TO PROCESS PP COMMANDS
*         UNTIL THE ICA IS NO LONGER DOWN, AND A RESUME COMMAND
*         IS RECIEVED FROM THE CPU. ON ENTRY THE CHANNEL INTERLOCK
*         IS RELEASED AND ON EXIT IT IS AGAIN LOCKED.
*
*         ENTRY  NONE
*
*         USES   NONE
*
*         CALLS  CCK PPR SCK
          SPACE  4,10
 IDL      SUBR               ENTRY/EXIT
          LDML   CHLOCK
          ZJN    IDL10       IF CHANNEL NOT LOCKED
          RJM    CCK         CLEAR CHANNEL LOCK
 IDL10    RJM    PPR         PROCESS PP REQUESTS
          LDML   IDLE
          NJN    IDL10       IF STILL IN IDLE STATE
          LDN    SC.PPD
          SBDL   STCHNG
          ZJN    IDL10       IF ICA DOWN
 IDL20    RJM    SCK         SET CHANNEL LOCK
          NJN    IDL20       RETRY IF NOT LOCKED
          UJN    IDLX        EXIT
          TITLE  PIR - PROCESS ICA RESET
**        PIR - PROCESS ICA RESET.
*
*         THIS ROUTINE IS ENTERED WHEN THE PP REQUESTS A RESET OR
*         WHEN THE ICA HAS RESET ITSELF.
*         CONTROL CONTINUES WITHIN THIS ROUTINE UNTIL THE ICA
*         HAS HAD DIAGNOSTICS RUN, BEEN LOADED, DUMP TAKEN ,
*         AND HAS BEEN CONFIGURED.
*
*
*         ENTRY  STCHNG = SC.PPR IF PP REQUESTED RESET
*                         SC.ICA IF ICA RESET
*
*         EXIT   A = 0 IF NO ERRORS
*                A <> 0 IF ERRORS
*
*         USES   T1
*
*         CALLS  BTE DIA DUM FAN GST IGS LOM PAUS RBE RSE SEA SIP
*                SLM SOR SRU STE
*
          SPACE  4,10
 PIR      SUBR               ENTRY/EXIT
          LDN    FTRY
          STML   ERRR        RESET RETRY COUNT
          LDDL   STCHNG      RESET TYPE
          SBN    SC.ICA
          ZJN    PIR10       IF RESET BY ICA
          DCN    CHN+40B     DISCONNECT CHANNEL
          TRACE
 PIR05    LDC    F.RESET
          RJM    FAN         RESET ICA
          NJN    PIRX        EXIT IF ERRORS
          LDN    77B
          RJM    PAUS        PAUSE FOR RESET
 PIR10    LDML   RSBUSY,ICATDDP
          STDL   BUSYMP
          LDN    FTRY        RESET RECOVERY COUNTERS
          STML   RDRTY
          STML   WRRTY
          LDN    0           CLEAR COUNTERS
          STDL   STCHNG
          STDL   ERRCNT
          STML   OSOSI
          STML   NUMPRI
          STML   NXTREC
          LDN    77B
          STDL   LSTATE      DONT CHECK STATE
          RJM    GST         GET GENERAL STATUS
          PJN    PIR20       JUMP IF NOT BUSY
          RJM    RBE         LOG RESET BUSY TIMEOUT
          LDN    1
          UJK    PIRX        EXIT WITH ERROR

 PIR20    NJK    PIRX        IF ERRORS GETTING STATUS
          LDN    1
          STDL   BUSYMP      RESET BUSY MULTIPLIER
          LDDL   GNSTAT
          SHN    -S.SB1
          LPN    3           GET STATE
          ZJN    PIR22       IF RESET
          SOML   ERRR
          ZJN    PIR21       IF UNRECOVERED
          SBN    FTRY-1
          NJK    PIR05       IF NOT FIRST ERROR
          LDDL   GNSTAT
          STML   GSSAVE      SAVE FOR LOGGING
          UJK    PIR05       RETRY RESET FUNCTION

 PIR21    LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
 PIR22    LDML   ERRR
          SBN    FTRY
          ZJN    PIR25       IF NO ERRORS
          LDML   ERRR
          RJM    SRU         SET RECOVERY STATUS
          LDDL   GNSTAT
          STML   RESST       SAVE GENERAL STATUS
          LDML   GSSAVE
          STDL   GNSTAT      SET STATUS FOR LOGGING
          LDN    ST.RESET
          RJM    STE         LOG STATE TRANSITION ERROR
          LDML   RESST
          STDL   GNSTAT      RESTORE STATUS
          LDDL   STCHNG
          NJK    PIRX        ERROR EXIT IF DOWN

 PIR25    STDL   LSTATE      SET LAST STATE TO RESET
          LDDL   GNSTAT
          STML   RESST       SAVE RESET STATUS
          SHN    17-S.GE
          PJN    PIR40       IF NOT ERRORS
          RJM    RSE         LOG RESET STATUS ERRORS
          LDN    1
          UJK    PIRX        ERROR EXIT

 PIR40    LDK    /RS/K.LICAR LOG RESET
          STML   LRS+/RS/P.ERRID
          LDN    REC.IM
          STML   LRS+/RS/P.RETSUC INFORMATIVE MESSAGE
          RJM    IGS         INCLUDE GENERAL STATUS
          RJM    SLM         SEND LOG MESSAGE

          RJM    DIA         RUN DIAGNOSTICS
          NJK    PIRX        EXIT IF ERRORS
          LDC    F.EIDLE     ENTER IDLE STATE
          RJM    FAN
          NJK    PIRX        EXIT IF ERRORS
          LDN    77B
          STDL   LSTATE      DONT CHECK STATE
          RJM    GST         GET STATUS
          ZJN    PIR50       IF NO GST ERRORS
          PJK    PIRX        EXIT IF GST ERRORS
          RJM    BTE         LOG BUSY ERROR
          LDN    1
          UJK    PIRX        ERROR EXIT

 PIR50    LDDL   GNSTAT
          SHN    -S.SB1
          LPN    3           GET STATE
          STDL   LSTATE      SAVE STATE
          SBN    ST.IDLE
          ZJN    PIR55       IF STATE CHANGED OK
 PIR52    LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          LDN    ST.IDLE
          RJM    STE         LOG STATE TRANSITION ERROR
          LDN    1
          UJK    PIRX        ERROR EXIT

 PIR55    LDDL   GNSTAT
          SHN    17-S.GE
          MJN    PIR52       IF GENERAL STATUS ERRORS
          RJM    LOM         LOAD CONTROLWARE TO ICA
          NJK    PIRX        IF ERRORS ON LOAD
          LDDL   GNSTAT
          SHN    -S.SB1
          LPN    3
          STDL   LSTATE
          LDN    1
          STML   INIT        SET PP INITIALIZED
          LDML   CONFIG,ICATDDP
          STDL   T1
          RJM    0,T1        SEND CONFIGURARION OR ETHERNET ADDRESS
          NJN    PIR70       EXIT IF ERRORS
          LDN    SC.AV
          STDL   STCHNG
          LDN    0
 PIR70    UJK    PIRX        EXIT RESET PROCESS
          TITLE  DIAGNOSTIC STATE ROUTINES
          SPACE  4,12
**        CEE - CHANNEL EMPTY ERROR.
*
*         THIS ROUTINE WILL DISCONNECT THE CHANNEL AND
*         LOG AN EMPTY CHANNEL ERROR.
*
*         ENTRY  (A) = OPERATION TYPE.
*
*         CALLS  SSC.
          SPACE  4,10
 CEE      SUBR               ENTRY/EXIT
          DCN    CHN+40B     DISCONNECT CHANNEL
          STML   LRS+/RS/P.OPTP STORE OPERATION TYPE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDC    /RS/K.LSCE
          RJM    SSC         LOG SYMPTOM CODE
          UJN    CEEX        EXIT
          SPACE  4,12
**        CFE - CHANNEL FULL ERROR.
*
*         THIS ROUTINE WILL DISCONNECT THE CHANNEL AND
*         LOG A CHANNEL FULL ERROR.
*
*         ENTRY  (A) = OPERATION TYPE.
*
*         CALLS  SSC.
          SPACE  4,10
 CFE      SUBR               ENTRY/EXIT
          DCN    CHN+40B     DISCONNECT CHANNEL
          STML   LRS+/RS/P.OPTP   STORE OPERATION TYPE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDC    /RS/K.LSCF
          RJM    SSC         LOG SYMPTOM CODE
          UJN    CFEX        EXIT
          SPACE  4,12
**        CIE - CHANNEL INACTIVE ERROR.
*
*         THIS ROUTINE LOGS A CHANNEL INACTIVE ERROR.
*
*         ENTRY  (A) = OPERATION TYPE.
*
*         CALLS  SSC.
          SPACE  4,10
 CIE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.OPTP   STORE OPERATION TYPE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDC    /RS/K.LSCD
          RJM    SSC         LOG SYMPTOM CODE
          UJN    CIEX        EXIT
          SPACE  4,10
**        DAC - DIAGNOSTIC ACTIVE CHANNEL TIMEOUT
*
*         THIS ROUTINE WILL TEST THE ABILITY OF THE ICA
*         TO TIME OUT AN ACTIVE CHANNEL.
*
*         ENTRY - NONE
*
*         EXIT  - (A) = 0 IF NO ERRORS
*                 (A) <> 0 IF ERRORS
*
*         USES   T2
*
*         CALLS  FAN PAUS CAE SLM GST IGS SSC
*
          SPACE  4,10
 DAC20    DCN    CHN+40B     DISCONNECT
          TRACE
          LDK    /RS/K.LCAT
          RJM    CAE         ERROR CHANNEL ACTIVE
 DAC30    RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJN    DACX        RETURN

 DAC40    LDN    0           SET STATUS

 DAC      SUBR               ENTRY/EXIT
          LDML   INIT
          NJK    DAC40       IF NOT FIRST RESET
          LDC    F.CHAATC    FUNCTION ICA FOR TIMEOUT TEST
          RJM    FAN
          NJN    DACX        EXIT IF ERRORS
          ACN    CHN
          LDN    9           PAUSE A TOTAL OF 2.1 SECONDS
          STDL   T2
 DAC10    LCN    0
          RJM    PAUS        PAUSE 262 MILLS
          SODL   T2
          NJN    DAC10       CONTINUE TO PAUSE
          SIMM   DACX
          AJM    DAC20,CHN   CHANNEL SHOULD BE INACTIVE
          RJM    GST         GET GENERAL STATUS
          NJK    DACX        CANT GET GENERAL STATUS
          LDDL   GNSTAT
          SHN    0-S.GE
          ERRNZ  S.GE-15     CODE ASSUMES VALUE
          ZJK    DACX        IF NO ERRORS
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    /RS/K.LCAT
          STML   LRS+/RS/P.OPTP OPERATION TYPE
          LDN    /RS/K.LOF
          STML   LRS+/RS/P.ERRID STORE ERROR ID
          LDK    /RS/K.LSGSE
          RJM    SSC         SET SYMPTOM CODE
          UJK    DAC30       LOG ERROR
          SPACE  4,10
**        DIC - DIAGNOSTIC CONFIDENCE TEST
*
*         THIS ROUTINE PERFORMS A BASIC TEST OF THE ICI/ICA
*         INTERFACE. THIS IS THE FIRST TEST RUN DURING RESET
*         AFTER DIAGNOSTICS PHASE 1 COMPLETE.
*
*         ENTRY - NONE
*
*         EXIT  - A = 0 IF NO ERRORS
*                  A <> 0 IF ERRORS
*
*         USES   P1 P2
*
*         CALLS  FAW ERR DVE FAN CIE CEE CFE SLM
*
          SPACE  4,10
 DIC      SUBR               ENTRY/EXIT
          LDN    FTRY
          STML   ERRR        RESET RETRY COUNTER
 DIC05    LDC    F.RCC       FUNCTION FOR READ CONFIDENCE TESTS
          RJM    FAW
          NJN    DICX        EXIT IF ERRORS
          SIMM   DIC20
          IAN    CHN         READ ONE WORD
          STDL   P1
          LDC    WTFULL*1000
          RJM    PAUS        PAUSE 1 MILL CHANNEL
          LDN    /RS/K.LREAD MUST BE FULL NOW
          IJM    DIC70,CHN   CHANNEL NOT ACTIVE
          EJM    DIC75,CHN   CHANNEL NOT FULL
          IAN    CHN         READ NEXT WORD
          STDL   P2
 DIC20    RJM    WCI         WAIT CHANNEL NOT ACTIVE
          NJN    DIC30       IF CHANNEL INACTIVE
          LDK    /RS/K.LREAD
          UJK    DIC67       CHANNEL ACTIVE ERROR

 DIC30    LDN    /RS/K.LREAD
          RJM    DEC         CHECK FOR ERRORS
          ZJN    DIC55       IF NO ERRORS
          LDDL   STCHNG
          NJK    DICX        EXIT IF DOWN OR RESET
          UJK    DIC05       IF MORE RETRY'S

 DIC55    LDC    D.DATA1     EXPECTED FIRST DATA WORD
          SBDL   P1
          NJN    DIC57       IF ERROR
          LDC    D.DATA2     EXPECTED SECOND DATA WORD
          SBDL   P2          A = 0 IF DATA OK
          ZJN    DIC59       IF DATA OKAY
 DIC57    LDDL   P1          ERROR DATA WORD 1
          STML   LRS+/RS/P.DATA1
          LDDL   P2          ERROR DATA WORD 2
          STML   LRS+/RS/P.DATA2
          LDK    /RS/K.LRCC
          RJM    DVE         LOG DATA VERIFICATION ERROR
          LDN    1
          UJK    DICX        ERROR EXIT

 DIC59    LDN    FTRY
          STML   ERRR        RESET RETRY COUNTER
 DIC60    LDC    F.WCC
          RJM    FAN         FUNCTION WRITE CONFIDENCE TEST
          NJK    DICX        EXIT IF ERRORS
          LDN    /RS/K.LWRT
          SIMM   DIC65
          ACN    CHN         ACTIVATE CHANNEL
          IJM    DIC70,CHN   NOT ACTIVE
          LDDL   P1          FIRST DATA WORD
          OAN    CHN
          LDC    WTEMPTY*1000
          RJM    PAUS        PAUSE 1 MILL CHANNEL
          LDK    /RS/K.LWRT  MUST BE EMPTY NOW
          FJM    DIC80,CHN   JUMP IF CHANNEL FULL
          IJM    DIC70,CHN   JUMP IF CHANNEL NOT ACTIVE
          LDDL   P2          SECOND DATA WORD
          OAN    CHN
          LDC    WTEMPTY*1000
          RJM    PAUS        PAUSE 1 MILL CHANNEL
          LDN    /RS/K.LWRT  MUST BE EMPTY NOW
          FJM    DIC80,CHN   JUMP IF CHANNEL FULL
          IJM    DIC70,CHN   JUMP IF CHANNEL NOT ACTIVE
          DCN    CHN+40B     DISCONNECT CHANNEL
          TRACE
 DIC65    RJM    DEC         CHECK FOR ERRORS
          ZJK    DICX        EXIT IF NO ERRORS
          LDDL   STCHNG
          NJK    DICX        EXIT IF DOWN OR RESET
          UJK    DIC60       RETRY

 DIC67    RJM    CAE         LOG CHANNEL ACTIVE
          UJK    DIC82       LOG ERROR AND DOWN ICA

 DIC70    RJM    CIE         LOG CHANNEL INACTIVE
          UJN    DIC82       LOG ERROR AND DOWN ICA

 DIC75    RJM    CEE         LOG CHANNEL EMPTY
          UJN    DIC82       LOG ERROR AND DOWN ICA

 DIC80    RJM    CFE         LOG CHANNEL FULL
 DIC82    LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          DCN    CHN+40B     DISCONNECT CHANNEL
          TRACE
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJK    DICX        EXIT
          SPACE  4,10
**        DRD - DIAGNOSTIC READ DATA
*
*         THIS ROUTINE WILL CHECK FOR -DATA AVAILABLE- AND THEN
*         ATTEMPT TO INPUT 1500 BYTES.
*
*         ENTRY  DATADD = 2 WORD FORMATTED CM BUFFER ADDRESS
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                (A) <> 0, IF TRANSFER COULD NOT BE COMPLETED
*                IOCNT = NUMBER OF CHANNEL FRAMES TRANSFERRED.
*
*         USES   T1
*
*         CALLS  ERR GST NDA SLM FAW
          SPACE  4,10
 DRD      SUBR               ENTRY/EXIT
          RJM    GST         GET STATUS
          NJN    DRDX        ERROR IF STATE CHANGED
          LDDL   GNSTAT
          SHN    17-S.DATAV
          MJN    DRD10       IF DATA  AVAILABLE
          LDN    CE.RD       READ CONTENT ERROR
          RJM    SCE         LOG ERROR
          LDN    1
          UJN    DRDX        EXIT WITH ERROR

 DRD10    LDC    F.READ
          RJM    FAW         FUNCTION READ
          NJN    DRDX        EXIT ON ERROR
          LDC    MAXDIAG     PP WORDS PER BUFFER
          STDL   IOCNT
          LDDL   DATADD+1    CM FWA OF BUFFER
          SIMM   DRD20
          CHCM   IOCNT,CHN   READ TO CM
 DRD20    LDC    MAXDIAG     BUFFER SIZE
          SBDL   IOCNT
          STML   DDRL        SAVE TOTAL READ COUNT
          LDDL   IOCNT
          NJN    DRD30       IF THE ICA TERMINATED THE READ
*                            THE CHANNEL SHOULD BE INACTIVE
          LDC    WTDEACT*1000
          RJM    PAUS        PAUSE FOR ICA
          DCN    CHN+40B     IF NOT DISCONNECT
          TRACE
          LDC    WTDEACT*1000
          RJM    PAUS        PAUSE FOR ICA
 DRD30    RJM    WCI         WAIT CHANNEL NOT ACTIVE
          NJN    DRD40       IF NOT ACTIVE
          LDK    /RS/K.LREAD
          RJM    CAE         LOG ACTIVE CHANNEL ERROR
          LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJK    DRDX        ERROR EXIT

 DRD40    LDK    /RS/K.LREAD
          RJM    DEC         CHECK FOR ERRORS
          UJK    DRDX        EXIT
          SPACE  4,10
**        DSC - DIAGNOSTIC STATUS CHECK.
*
*         THIS ROUTINE WILL TEST THE ABILITY OF THE ICA TO IGNORE A
*         GENERAL STATUS REQUEST WHEN A READ HAS NOT COMPLETED.
*
*         ENTRY - NONE
*
*         EXIT  - (A) = 0 IF NO ERRORS
*                 (A) <> 0 IF ERRORS
*
*         USES   T2
*
*         CALLS  FAG FAN SLM SSC
*
          SPACE  4,10
 DSC20    LDN    0
          STML   FAGDEM      ENABLE ERROR MESSAGE LOGGING BY *FAG*
 DSC30    LDN    1           SET STATUS
          UJN    DSCX        RETURN

 DSC40    LDN    0           SET STATUS

 DSC      SUBR               ENTRY/EXIT
          LDML   DSCFLAG,ICATDDP
          ZJN    DSCX        IF TEST IS NOT TO BE RUN
          LDML   INIT
          NJN    DSC40       IF NOT FIRST RESET
          LDK    F.GSRR      FUNCTION ICA FOR STATUS TEST
          RJM    FAN
          NJN    DSCX        EXIT IF ERRORS
          AOML   FAGDEM      DISABLE ERROR MESSAGE LOGGING BY *FAG*
          RJM    FAG         FUNCTION FOR GENERAL STATUS
          NJN    DSC20       EXIT IF UNRECOVERABLE ERRORS
*         LDN    0
          STML   FAGDEM      ENABLE ERROR MESSAGE LOGGING BY *FAG*
          LDDL   T1
          SBN    FTRY-1
          ZJN    DSCX        IF GENERAL STATUS RETURNED ON FIRST RETRY
          LDK    /RS/K.LGSRR
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LSCD
          RJM    SSC         LOG SYMPTOM CODE
          RJM    SLM         SEND LOG MESSAGE
          UJK    DSC30       EXIT
          SPACE  4,10
**        DSR - DIAGNOSTIC STATUS RETURN
*
*         THIS ROUTINE WILL READ THE GENERAL STATUS AND RETURN
*         A FUNCTION EQUAL TO THE GENERAL STATUS READ.
*
*         ENTRY - NONE
*
*         EXIT - (A) = 0 IF NO ERRORS
*                  (A) <> 0 IF ERRORS
*
*         USES   NONE
*
*         CALLS  GST STB SCE FAN DEC
*
          SPACE  4,10
 DSR      SUBR               ENTRY/EXIT
          RJM    GST         CHECK STATE AND GET GENERAL STATUS
          NJN    DSRX        EXIT IF ERRORS
          LDDL   GNSTAT
          STML   STBI
          LDC    DSRT-2      COMMAND TABLE ADDRESS
          RJM    STB         SEARCH COMMAND TABLE
          NJN    DSR10       IF FUNCTION FOUND
          LDN    CE.ES       STATUS CONTENT ERROR
          RJM    SCE         LOG ERROR
          LDN    1
          UJN    DSRX

 DSR10    RJM    FAN         EXECUTE FUNCTION
          NJN    DSRX        EXIT ON ERROR
          LDK    /RS/K.LSR
          RJM    DEC         CHECK STATUS ERRORS
          UJN    DSRX        EXIT

*         TABLE OF LEGAL DATA RETURNED IN GENERAL STATUS

 DSRT     CON    S.DATA0,F.RET0
          CON    S.DATA1,F.RET1
          CON    0
          SPACE  4,10
**        DDR - DIAGNOSTIC DATA RETURN
*
*         THIS ROUTINE WILL CHECK FOR -SEND DATA- AND ATTEMPT
*         TO OUTPUT THE DATA IN THE PP BUFFER.
*         THIS ROUTINE IS USED FOR BOTH THE OUTPUT AND WRITE
*         FUNCTIONS. TABLE DDRT DETERMINES WHICH IS BEING USED.
*
*         ENTRY  IOCNT = NUMBER OF CHANNEL FRAMES TO TRANSFER.
*                STBI = DIAGNOSTIC COMMAND.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                (A) <> 0, IF TRANSFER COULD NOT BE COMPLETED.
*
*         USES   NONE
*
*         CALLS  GST NSD SLM STB FAN ERR SIT
*
          SPACE  4,10
 DDR      SUBR               ENTRY/EXIT
          RJM    GST         GET GENERAL STATUS
          NJN    DDRX        CANT READ OR STATE CHANGED
          LDDL   GNSTAT
          SHN    17-S.SEND
          MJN    DDR10       IF SEND DATA  STATUS
          LDC    DDRE-2      ERROR CODE TABLE
          RJM    STB         SEARCH TABLE
          RJM    SCE         LOG ERROR
          LDN    1
          UJN    DDRX        EXIT WITH ERROR

 DDR10    LDC    DDRT-2      WRITE TYPE TABLE
          RJM    STB         SEARCH TABLE
          RJM    FAN         FUNCTION WRITE/OUTPUT MESSAGE
          NJN    DDRX        EXIT ON FUNCTION REJECT
          SIMM   DDR30
          LDML   DDRL        SET BUFFER SIZE
          STDL   IOCNT
          ACN    CHN         ACTIVATE CHANNEL
          LDDL   DATADD+1    CM FWA OF BUFFER
          CMCH   IOCNT,CHN   WRITE LAST BUFFER READ
 DDR30    LDK    /RS/K.LWRT
          AJM    DDR40,CHN   IF ACTIVE
          RJM    CIE         LOG CHANNEL INACTIVE ERROR
 DDR35    LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJK    DDRX        EXIT

 DDR40    LDC    WTEMPTY*2000
 DDR50    EJM    DDR60,CHN   IF CHANNEL EMPTY
          SBN    1
          NJN    DDR50       IF NOT TIMED OUT
          LDK    /RS/K.LWRT
          RJM    CFE         LOG CHANNEL FULL ERROR
          UJN    DDR35       DOWN ICA AND LOG ERROR

 DDR60    DCN    CHN+40B     DISCONNECT
          TRACE
          RJM    DEC         CHECK FOR ERRORS
          NJK    DDRX        IF ERROR EXIT
          LDDL   IOCNT
          ZJK    DDRX        IF NO ERRORS
          LDK    /RS/K.LWRT
          RJM    SIT         LOG INCOMPLETE TRANSFER
          UJK    DDR35       DOWN ICA AND SEND MESSAGE
          SPACE  2
 DDRL     CON    0           BUFFER SIZE
          SPACE  2
 DDRT     CON    DC.UNFW,F.OUTPUT
          CON    DC.FW,F.WRITE
          CON    0
          SPACE  2
 DDRE     CON    DC.UNFW,CE.WUM
          CON    DC.FW,CE.WFM
          CON    0
          SPACE  4,10
**        RDB - RETURN DIAGNOSTIC BUFFER
*
*         THIS ROUTINE WILL RETURN THE DIAGNOSTIC BUFFER
*
*         ENTRY  NONE
*
*         USES   NONE
*
*         CALLS  USR
          SPACE  4,10
 RDB      SUBR               ENTRY/EXIT
          LDN    URC.DE
          STDL   UNSC
          LDN    /RS/C.T1STAT*8+8+8
          STML   RS+/RS/P.RESPL SET RESPONSE LENGTH
          RJM    USR         SEND UNSOLICITED RESPONSE
          UJK    RDBX        EXIT
          SPACE  4,10
**        SCK - SET CHANNEL LOCK.
*
*         SETS THE CHANNEL LOCK IN THE CM CHANNEL TABLE.
*
*         ENTRY  (CM.CHAN) = START OF 3 WORDS
*                  THAT CONTAIN A REFORMATTED CM ADDRESS
*                  POINTING TO THE CHANNEL TABLE.
*
*                (CHAN) = CHANNEL NUMBER.
*
*         EXIT    (A) = 0 IF LOCK SET.
*                 (A) <> 0 IF LOCK COULD NOT BE SET.
*
*         USES   T5, T7.
*
*         CALLS  SLK.
          SPACE  4,10
SCK       SUBR               ENTRY/EXIT
          LDK    CM.CHAN
          STDL   T7          SET POINTER TO CHANNEL TABLE
          LDML   CHAN
          STDL   T5          SET CHANNEL NUMBER AS INDEX
          RJM    SLK         SET THE LOCK ON THAT CM WORD
          NJN    SCKX        EXIT IF LOCK NOT SET
          LCN    0
          STML   CHLOCK      SET CHANNEL LOCKED FLAG
          LDN    0
          UJK    SCKX        EXIT
          SPACE  4,10
**        WCI - WAIT FOR CHANNEL INACTIVE
*
*         THIS ROUTINE WILL WAIT FOR *WTDEACT* MILLISECONDS FOR
*         THE CHANNEL TO GO INACTIVE.
*
*         ENTRY  NONE
*
*         EXIT   A = 0 IF CHANNEL ACTIVE.
*                A <> 0 IF CHANNEL INACTIVE.
*
*         USES   NONE
*
*         CALLS  NONE
          SPACE  4,10
 WCI      SUBR               ENTRY/EXIT
          LDC    WTDEACT*1200  WAIT FOR CHANNEL NOT ACTIVE
 WCI10    IJM    WCIX,CHN    EXIT IF NOT ACTIVE
          SBN    1
          NJN    WCI10       IF NOT TIMED OUT
          UJK    WCIX        EXIT CHANNEL ACTIVE TO LONG
          TITLE  IDLE STATE ROUTINES - LOADING
          EJECT
**        DLC - DECREMENT LARGE COUNT
*
*         THIS ROUTINE WILL DECREMENT THE TWO WORD I/O
*         COUNT AT *LIOC* BY *ERRCNT*
*
*         ENTRY  LIOC  =  NUMBER OF PP WORDS REMAINING
*                ERRCNT  =  MAXIMUM NUMBER TO OUTPUT IN ONE REQUEST
*
*         EXIT   LIOC  = PP WORDS REMAINING AFTER I/O
*                ERRCNT  = BLOCK SIZE TO USE
*
          SPACE  4,10
 DLC      SUBR               ENTRY/EXIT
          LDML   LIOC
          NJN    DLC20       IF COUNT > 200000
          LDML   LIOC+1
          SBDL   ERRCNT
          ZJN    DLC15       IF EQUAL
          PJN    DLC30       IF MORE THAN 1 BLOCK
 DLC15    LDML   LIOC+1
          STDL   ERRCNT       LAST BLOCK SIZE
          LDN    0
          STML   LIOC+1
          UJN    DLCX        EXIT

 DLC20    LDML   LIOC+1
          SBDL   ERRCNT
          PJN    DLC30       DONT DECREMENT UPPER WORD
          ADC    200000B
          STML   LIOC+1
          LDML   LIOC
          SBN    1
          STML   LIOC
          UJN    DLC40       EXIT

 DLC30    STML   LIOC+1
 DLC40    UJK    DLCX        EXIT
          SPACE  4,10
**        LOM - LOAD MEMORY
*
*         WRITE ICA CONTROLWARE TO ICA.
*
*         ENTRY  CM.LOAD - CM.LOAD+3 = LENGTH/RMA
*
*         EXIT  A = 0 IF NO ERRORS
*                <> 0 IF ERRORS
*
          SPACE  4,10
 LOM      SUBR               ENTER/EXIT
          LDN    FTRY
          STML   ERRR        RESET RETRY COUNTER
 LOM10    LDML   LOADFC,ICATDDP  FUNCTION FOR LOAD MEMORY
          RJM    FAN
          NJN    LOMX        EXIT IF ERRORS
          SIMM   LOM20
          ACN    CHN         ACTIVATE CHANNEL
 LOM20    LDN    0
          STDL   ERRT1
          STDL   CML         CLEAR INDEX
          LDML   LFLEN
          STML   LIOC
          LDML   LFLEN+1
          STML   LIOC+1
 LOM30    LRML   CM.LOAD-1+/CM/P.RMA
          LDML   CM.LOAD-1+/CM/P.RMA+1
          ADDL   CML         ADD INDEX
          CRDL   P1          READ ONE PAIR
          LDDL   P1+/CM/P.LEN
          STDL   ERRCNT      SAVE FOR I/O AND ERROR CHECKING
          RJM    DLC         DECREMENT COUNT
          LDDL   ERRCNT
          ADN    1           ROUND UP
          SHN    -1          CONVERT TO PP WORDS
          STDL   ERRCNT      SAVE FOR IO
          LRDL   P1+/CM/P.RMA
          LDDL   P1+/CM/P.RMA+1
          SHN    -3          TO PP WORD ADDRESS
          SIMM   LOM40
          CMCH   ERRCNT,CHN  WRITE ONE BLOCK
 LOM40    LDDL   ERRCNT
          NJN    LOM50       IF INCOMPLETE TRANSFER
          AODL   CML         INCREMENT COUNT
          SBML   CM.LOAD-1+/CM/P.LEN
          NJK    LOM30       IF NOT DONE
          ZJN    LOM60       IF NOT INCOMPLETE TRANSFER
 LOM50    LDK    /RS/K.LSIT
          RADL   ERRT1       SET INCOMPLETE TRANSFER
 LOM60    AJM    LOM70,CHN   IF CHANNEL ACTIVE
          LDK    /RS/K.LSCD
          RADL   ERRT1       SET CHANNEL INACTIVE ERROR
          UJN    LOM75


 LOM70    LDC    WTEMPTY*2000
 LOM72    EJM    LOM75,CHN   IF CHANNEL EMPTY
          SBN    1
          NJN    LOM72       IF NOT TIMED OUT
          LDK    /RS/K.LSCF
          RADL   ERRT1       SET CHANNEL FULL ERROR
 LOM75    DCN    CHN+40B
          TRACE
          CFM    LOM80,CHN   IF NO CHANNEL ERROR
          LDK    /RS/K.LSCEF
          RADL   ERRT1       SET CHANNEL ERROR FLAG
 LOM80    LDML   LMBUSY,ICATDDP
          STDL   BUSYMP      BUSY WAIT FOR LOAD MEMORY
          LDN    77B
          STDL   LSTATE      DONT CHECK STATE
          RJM    GST         GET STATUS
          PJN    LOM100      IF NOT BUSY TIMEOUT
          RJM    BTE         LOG BUSY TIMEOUT
 LOM90    LDN    SC.PPR      RESET ICA
 LOM95    STDL   STCHNG      CHANGE STATE
 LOM99    LDN    1
          UJK    LOMX        ERROR EXIT

 LOM100   NJK    LOMX        IF ERRORS GETTING STATUS
          LDN    1
          STDL   BUSYMP      RESET BUSY MULTIPLIER
          LDDL   GNSTAT
          SHN    17-S.GE
          MJN    LOM120      IF GENERAL STATUS ERRORS
          LDDL   ERRT1
          NJN    LOM130      IF ERRORS
          LDDL   GNSTAT
          SHN    -S.SB1
          LPN    3
          NJN    LOM110      IF NOT RESET
          LDN    SC.ICA
          UJK    LOM95       SET ICA RESET AND EXIT

 LOM110   SBML   STATAL,ICATDDP
          ZJK    LOMX        IF CORRECT STATE AFTER LOAD
          LDML   STATAL,ICATDDP
          RJM    STE         LOG STATE TRANSITION ERROR
          UJK    LOM90       RESET ICA

 LOM120   LDK    /RS/K.LSGSE
          RADL   ERRT1
 LOM130   RJM    SSC         SET SYMPTOM CODE
          LDN    /RS/K.LLM
          STML   LRS+/RS/P.OPTP
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    /RS/K.LOF
          STML   LRS+/RS/P.ERRID
          LDDL   GNSTAT      CHECK SYMPTOM CODE
          SHN    0-S.SC1
          LPN    7
          LMN    5
          ZJN    LOM140      IF HARDWARE MISMATCH ERROR
          SOML   ERRR
          RJM    SIU         SET RETRY SUCCESS
          RJM    SLM         SEND LOG MESSAGE
          LDML   ERRR
          ZJK    LOM90       IF UNRECOVERED ERROR
          UJK    LOM10       ELSE RETRY

 LOM140   STML   ERRR
          LDN    SC.PPD      DOWN ICA
          STDL   STCHNG
          RJM    SIU         SET UNRECOVERED FAILURE
          RJM    SLM         SEND LOG MESSAGE
          UJK    LOM99       RETURN WITH ERROR STATUS
          TITLE  MAIN ROUTINES - OPERATIONAL STATE
 GPR      SPACE  4,10
**        GPR - GET PP REQUEST.
*
*         EXIT   (A) = 0 IF NO PP REQUESTS.
*                (A) <> 0 IF PP REQUEST WAS FOUND.
*
*         CALLS  CPL, IRP, SPL.
*
*         USES   P1 - P4


 GPR      SUBR               ENTRY/EXIT
          LCN    0
          STDL   P1
          STDL   P2
          STDL   P3
          LDC    0#7FFF
          STDL   P4
          LRDL   CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          LDDL   CM.PIT+1
          RDCL   P1          CLEAR ACTIVE CHECK BIT
          ADN    /PIT/C.PPQ  CM ADDRESS OF PP REQUEST QUEUE POINTER
          CRML   P1,ONE      READ PP QUEUE POINTER
          LDDL   P3          RMA OF NEXT QUEUED PP REQUEST
          ADDL   P4
          ZJN    GPRX        IF NO PP REQUESTS
          RJM    SPL         SET PP QUEUE LOCK WORD
          ZJN    GPR10       IF LOCK WAS SET
          LDN    0
          UJK    GPRX        EXIT

 GPR10    LDN    2
          STDL   WC
          LRDL   CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          LDDL   CM.PIT+1
          ADN    /PIT/C.PPQPVA
          CRML   RS,WC       READ PVA AND RMA OF FIRST REQUEST IN CHAIN
          LDN    C.RQ
          STDL   WC
          LRML   RS+/RS/P.REQ  CM ADDRESS OF FIRST PP REQUEST
          LDML   RS+/RS/P.REQ+1
          SHN    -3
          CRML   RQ,WC       READ PP REQUEST
          RJM    CPL         CLEAR PP QUEUE LOCKWORD
          RJM    IRP         INITIALIZE REQUEST PROCESSING
          LCN    0
          UJK    GPRX        EXIT
          SPACE  4,10
**        GUR - GET UNIT REQUEST
*
*         THIS ROUTINE WILL GET THE NEXT REQUEST ON THE
*         UNIT QUEUE. IF THE REQUEST IS A WRITE, A CHECK
*         IS MADE TO SEE IF THE ICA HAS -SEND DATA- UP.
*         IF NOT, THE REQUEST IS IGNORED.
*
*         ENTRY  (CM.URQ) = REFORMATTED ADDRESS OF UNIT QUEUE TO SEARCH.
*
*         EXIT   (A) = 0, IF NO REQUESTS TO PROCESS,
*                    <> 0, IF REQUEST TO PROCESS.
*
*         USES   P1 - P4, T2, WC.
*
*         CALLS  IRP.
*
          SPACE  4,10
 GUR      SUBR               ENTRY/EXIT

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

          LRDL   CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          LDDL   CM.URQ+1
          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   P3          RMA OF NEXT QUEUED UNIT REQUEST
          ADDL   P4
          ZJN    GURX        IF NO UNIT REQUESTS

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

          LDDL   P1          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.

          LRDL   P3          CM ADDRESS OF THE NEXT REQUEST
          LDDL   P3+1
          SHN    -3
          CRML   RQ,WC       READ UNIT REQUEST

*         SAVE PVA OF UNIT REQUEST IN RESPONSE.

          LDN    2           LENGTH OF PVA - 1
          STDL   T2

 GUR20    LDML   RQ+/URQ/P.THISPV,T2   PVA OF THE UNIT REQUEST
          STML   RS+/RS/P.PVA,T2    PVA OF THE RESPONSE
          SODL   T2
          PJN    GUR20       IF MORE TO DO

*         SAVE RMA OF UNIT REQUEST IN RESPONSE.

          LDDL   P3            RMA OF THE UNIT REQUEST
          STML   RS+/RS/P.REQ  RMA OF THE RESPONSE
          LDDL   P3+1
          STML   RS+/RS/P.REQ+1

*         SET UP A DUMMY R/I FIELD IN THE REQUEST

          LDML   RQ+/RQ/P.RECOV  REQUEST R/I AND DEVICE ID FIELDS
          LPK    17400B          KEEP MEMORY PORT
          LMK    20000B          SET INTERRUPT OPTION
          STML   RQ+/RQ/P.RECOV  R/I FIELD (RECOVERY, INTERRUPT, AND MEM PORT)

          RJM    IRP         INITIALIZE REQUEST PROCESSING
          LCN    0
          UJK    GURX        EXIT
 NCP      SPACE  4,14
**        NCP - NEGOTIATE CHANNEL PROTOCOL.
*
*         NEGOTIATE WITH THE ICA TO DETERMINE WHICH CHANNEL
*         PROTOCOL WILL BE USED.
*
*         EXIT   A = 0 IF NEGOTIATIONS SUCCESSFUL
*                  <> 0 IF NEGOTIATIONS NOT SUCCESSFUL
*
*         CALLS  DST FAN ILR SLM


 NCP10    LDML   LRS+/RS/P.DETAIL+DS.MPS+1
          STML   TCCH+/HD/P.MRS
          LDN    1
          STML   OSOSI
          RJM    ILR         INITIALIZE LOG RESPONSE
          LDN    0

 NCP      SUBR               ENTRY/EXIT
          RJM    DST         GET DETAILED STATUS
          NJN    NCPX        IF ERRORS READING DETAILED STATUS
          LDML   LRS+/RS/P.DETAIL+DS.PROV
          ADC    -PR.MIN
          MJK    NCP20       IF ICA PROTOCOL .LT. MINIMUM SUPPORTED
          SBN    PR.MAX-PR.MIN+1
          MJN    NCP14       IF MAXIMUM SUPPORTED .GE. ICA MAXIMUM
          LDC    PR.MAX
          UJN    NCP15       USE MAXIMUM SUPPORTED PROTOCOL

 NCP14    LDML   LRS+/RS/P.DETAIL+DS.PROV
 NCP15    STML   PROV
          RJM    ILR         INITIALIZE LOG RESPONSE
          LDML   PROV
          ADC    PR.BASE
          RJM    FAN         SEND NEGOTIATION FUNCTION
          NJN    NCP30       IF FUNCTION TIMEOUT
          RJM    GST         WAIT FOR NOT BUSY
          NJN    NCP30       IF ERRORS GETTING GENERAL STATUS
          RJM    DST         READ DETAILED STATUS
          NJN    NCP30       IF ERRORS READING DETAILED STATUS
          LDML   LRS+/RS/P.DETAIL+DS.PROV
          SBML   PROV
          ZJK    NCP10       IF PROTOCOLS MATCH
 NCP20    LDN    SC.PPD
          STML   STCHNG      DOWN ICA
          LDK    /RS/K.LPROER
          STML   LRS+/RS/P.ERRID
          LDK    PR.MAX
          STML   LRS+/RS/P.DATA1
          RJM    SLM         SEND LOG MESSAGE
 NCP30    UJK    NCPX        EXIT
          SPACE  4,10
**        PPC - PROCESS PP COMMANDS
*
*         THIS ROUTINE PROCESSES ALL PP COMMANDS. VALID COMMANDS
*         ARE LISTED IN THE TABLE *PCT*.
*
*         ENTRY  CM - CONTAINS COMMAND
*                RQ - CONTAINS PP REQUEST.
*
*
*         CALLS  PIE  STB
*
          SPACE  4,10
 PPC      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.CODE GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          STML   STBI
          LDC    PCT-2       ADDRESS-2 OF PP COMMAND TABLE
          RJM    STB         SEARCH TABLE
          NJN    PPC20       IF MATCH FOUND

*         INVALID COMMAND

          LDC    E501        INTERFACE ERROR
          RJM    PIE         PROCESS INTERFACE ERROR
          UJN    PPC30

*         VALID COMMAND

 PPC20    STDL   P2
          RJM    0,P2        CALL COMMAND PROCESSOR
 PPC30    UJK    PPCX        EXIT

          SPACE  4,10
**        PP COMMAND TABLE
*
          SPACE  4,10
 PCT      CON    C.IDLE,IDP  IDLE PROCESSOR
          CON    C.RESUME,REP  RESUME PROCESSOR
          CON    C.DBUG,SDM    DEBUG MODE
          CON    C.GFC,GFC     GLOBAL FLOW CONTROL
          CON    C.DEFEA,DEA   DEFINE ETHERNET ADDRESS
          CON    C.RESET,RFC   RESET ICA
          CON    C.RDY,NRA     SYNCHRONIZE NOT READY
          CON    C.DBGSM,SPA   SELECT PP ADDRESS
          CON    C.DBGRM,RPM   READ PP MEMORY
          CON    C.DBGWM,WPM   WRITE PP MEMORY
 B.       IFEQ   BRK,1
          CON    C.DEFBA,DBA   DEFINE PP BKPT AREA IN CM
 B.       ENDIF
          CON    0
          SPACE  4,10
**        SAC - SEND AVAILABILITY CHANGE
*
*         THIS ROUTINE WILL SEND AN UNSOLICITED RESPONSE
*         INFORMING THE CP THAT THE ICA HAS CHANGED STATES
*         AND BECOME AVAILABLE/UNAVAILABLE.
*
*         ENTRY  *STCHNG* = STATE CHANGE CODE.
*
*         CALLS  PPR USR
          SPACE  4,10
 SAC      SUBR               ENTRY/EXIT
          LDDL   STCHNG
          LMN    SC.AV
          ZJN    SAC22       IF CHANGE TO AVAILABLE
          LMN    SC.OPER&SC.AV
          ZJN    SAC40       IF OPERATIONAL
          LDML   AVAIL
          SBN    URC.RN
          ZJN    SACX        IF ALREADY SENT
          LCN    0
          STML   SCP.RDY     DONT GO READY BEFORE CP REPLIES
          LDN    URC.RN
          UJN    SAC30       SEND UNSOLICITED NOT READY

 SAC22    LDML   SCP.RDY
          ZJN    SAC25       IF CPU HAS RESPONDED
          RJM    PPR         PROCESS PP REQUESTS
          LDML   IDLE
          ZJN    SAC22       WAIT IF NOT IDLE
          UJK    SACX        EXIT IF IDLE

 SAC25    LDN    URC.NR      SEND READY RESPONSE
 SAC30    STDL   UNSC
          STML   AVAIL
          RJM    USR         SEND UNSOLICITED RESPONSE
          UJK    SACX        EXIT

 SAC40    LDML   PROV        RETURN CHANNEL PROTOCOL VERSION
          STML   RS+/RS/P.PROV
          LDML   TCCH+/HD/P.MRS  RETURN MAXIMUM RECORD SIZE
          STML   RS+/RS/P.MAXRS+1
          LDN    /RS/C.BUFPVA*8+8
          STML   RS+/RS/P.RESPL  UPDATE RESPONSE LENGTH
          LDN    URC.LO      SEND OPERATIONAL RESPONSE
          UJK    SAC30       SEND RESPONSES
          SPACE  4,10
**        SEA -  SEND ETHERNET ADDRESS
*
*         THIS ROUTINE WILL WRITE THE ETHERNET ADDRESS
*         TO THE ICA
*
*         ENTRY  (EA - EA+3) = ETHERNET ADDRESS
*
*         EXIT   (A) = 0 IF NO ERRORS
*                (A) <> 0 IF ERRORS
*
*         CALLS  FAN ERR
          SPACE  4,10
 SEA      SUBR               ENTER/EXIT
          LDN    FTRY
          STML   ERRR        RESET ERROR COUNTER
 SEA10    LDC    F.DEFEA     FUNCTION DEFINE ETHERNET ADDRESS
          RJM    FAN
          NJN    SEAX        EXIT IF ERRORS
          ACN    CHN         ACTIVATE CHANNEL
          LDN    EAL         LENGTH OF ADDRESS
          OAM    EA,CHN      SEND ETHERNET ADDRESS
          STDL   ERRCNT      SAVE WORDS NOT WRITTEN
          LDK    /RS/K.LSEA
          RJM    ERR         CHECK FOR ERRORS
          ZJN    SEA20       IF NO ERRORS
          LDDL   STCHNG
          NJN    SEA20       IF STATE CHANGING
          LDML   ERRR
          NJK    SEA10       RETRY
          LDN    1           RETURN ERROR
 SEA20    UJK    SEAX        EXIT
          TITLE  COMMAND PROCESSORS
**        IDP - IDLE PROCESSOR
*
*         THIS ROUTINE PROCESSES THE IDLE COMMAND
*
*         ENTRY  NONE
*
*         EXIT   (A) = 0, IF NO ERRORS
*                (A) <> 0, IF ERRORS.
*
          SPACE  4,10
 IDP      SUBR               ENTRY/EXIT
          LDML   CHLOCK
          ZJN    IDP10       IF CHANNEL NOT LOCKED
          RJM    CCK         CLEAR CHANNEL LOCK
 IDP10    LCN    0
          STML   IDLE        SET IDLE FLAG NON-ZERO
          LDN    0
          UJN    IDPX        EXIT
          SPACE  4,10
**        REP - RESUME PROCESSOR
*
*         THIS ROUTINE PROCESSES THE RESUME COMMAND.
*
*         ENTRY  NONE
*
*         EXIT   (A) = 0, IF NO ERRORS
*                (A) <> 0, IF ERRORS.
*
          SPACE  4,10
 REP      SUBR               ENTRY/EXIT
          LDN    0
          STML   IDLE        CLEAR IDLE FLAG
          UJN    REPX        EXIT
          IFEQ   BRK,1
          SPACE  4,14
**        DBA - DEFINE BREAKPOINT AREA
*
*         THIS ROUTINE PROCESSES THE DEFINE BREAKPOINT AREA
*         COMMAND. THIS COMMAND TELLS THE PP WHERE IN CM
*         THE BREAKPOINT AREA IS.
*
*         ENTRY  CM - CONTAINS COMMAND.
*
*         EXIT   (A) = 0, IF NO ERRORS,
*                    <> 0, IF ERRORS,
*                BRMA-BRMA+1 = RMA OF PP BKPT AREA,
*                BALEN = LENGTH OF BKPT AREA IN CM WORDS.
*
          SPACE  4,10
 DBA      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.RMA
          STML   BRMA
          LDML   CM+/CM/P.RMA+1
          STML   BRMA+1      RMA OF PP BKPT AREA
          LDML   CM+/CM/P.LEN
          STML   BALEN       BKPT AREA LENGTH IN CM WORDS
          LDN    0
          STML   SBKP        START BREAKPOINTING
          UJK    DBAX        EXIT
          ENDIF
          SPACE  4,10
**        DEA - DEFINE ETHERNET ADDRESS
*
*         THIS ROUTINE PROCESSES THE DEFINE ETHERNET ADDRESS
*         COMMAND.
*
*         EXIT   (A) = 0.
          SPACE  4,10
 DEA      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.RMA+1
          LRML   CM+/CM/P.RMA
          SHN    -3
          CRML   EA,ONE      READ ETHERNET ADDRESS
          LDC    OSITDD
          STDL   ICATDDP     CHANGE TYPE TO OSI
          LDN    0
          UJN    DEAX        EXIT
 GFC      SPACE  4,10
**        GFC - GLOBAL FLOW CONTROL.
*
*         THIS ROUTINE PROCESSES THE GLOBAL FLOW CONTROL COMMAND.
*
*         EXIT   (A) = 0 IF NO ERRORS
*                    <> 0 IF ERRORS
*
*         CALLS  FAN PIE
          SPACE  4,10
 GFC10    LDC    E50B
          RJM    PIE         SEND INTERFACE ERROR

 GFC      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.LEN
          ZJN    GFC20       IF FLOW CONTROL ON
          SBN    1
          NJN    GFC10       IF INVALID COMMAND
          LDN    F.FCOFF
          UJN    GFC30       FUNCTION FLOW CONTROL OFF

 GFC20    LDN    F.FCON
 GFC30    STML   GFCFC
          RJM    FAN         SEND FUNCTION
          NJN    GFC40       EXIT IF ERRORS
          RJM    GST         WAIT FOR BUSY
 GFC40    LDN    0
          UJN    GFCX        EXIT
          SPACE  4,10
**        NRA - NOT READY ACKNOWLEDGE
*
*         THIS ROUTINE PROCESSES THE SYNCHRONIZE
*         READY ACKNOWLEDGE.
*
*         ENTRY  NONE
*
*         EXIT   (A) = 0, IF NO ERRORS
*                (A) <> 0, IF ERRORS.
*
          SPACE  4,10
 NRA      SUBR               ENTRY/EXIT
          LDML   SCP.RDY
          ZJN    NRA10       IF NOT WAITING FOR THIS
          LDN    0
          STML   SCP.RDY     UPDATE SYNCHRONIZATION WORD
          LDN    0
          UJK    NRAX

 NRA10    LDC    E50A
          RJM    PIE         RETURN INTERFACE ERROR
          UJN    NRAX        EXIT
          SPACE  4,18
**        PFR - PERFORM READ
*
*         THIS ROUTINE READS IN DATA FROM THE ICA.  THE
*         TOTAL LENGTH OF THE TRANSFER AND MESSAGE TYPE ARE
*         NOT KNOWN UNTIL THE HEADER HAS BEEN READ.
*
*         ENTRY  DATA AVAILABLE BIT SET IN GENERAL STATUS.
*
*         USES   P1 - P4, T2, T3, UNSC.
*
*         CALLS  ERR, FAW, GRB, QPR, RCP, RRH, USR.
          SPACE  4,10
 PFR      SUBR               ENTRY/EXIT
          LDK    BP.GOOD     BUFFER POOL CONTAINS A SUFFICIENT NUMBER OF BUFFERS
          STML   RS+/RS/P.T1STAT
          STML   RS+/RS/P.T2STAT
          LDK    SS.OPEN     PP IS ABLE TO SEND MESSAGES TO THE DEVICE
          STML   RS+/RS/P.PSEND
          STML   RS+/RS/P.NSEND
          LDK    /RS/C.T1STAT*8+8
          STML   RS+/RS/P.RESPL  UPDATE RESPONSE LENGTH

          LDN    0
          STML   ACTD
          STDL   BUFLEN      NUMBER OF FREE BYTES REMAINING IN CM BUFFER
          STML   CML         OFFSET TO LENGTH/ADDRESS PAIR IN RESPONSE BUFFER
          STDL   CMLISTL     LENGTH/ADDRESS PAIR COUNT
          LDML   NXTREC
          ZJN    PFR20       IF RECORD SIZE NOT KNOWN
          STML   TBYTS
          RJM    GRB         GET BUFFERS
          ZJK    PFR100      IF BUFFERS NOT AVAILABLE

*         ISSUE READ FUNCTION

 PFR20    LDC    F.READ
          RJM    FAW         ISSUE FUNCTION AND ACTIVATE CHANNEL
          NJK    PFR100      IF ERRORS
          RJM    RRH         READ RECORD HEADER
          MJK    PFR100      IF NO BUFFERS (OR INADEQUATE NUMBER)
          NJK    PFR80       IF ERRORS
          TRACE  (TCHFR,BUFLEN,RDCNT,EXPD+1,ACTD+1)

          LDML   OSOSI
          NJN    PFR30       IF OPERATIONAL

*         READ CHANNELNET PDU

          RJM    RCP         READ CHANNELNET PDU
          ZJK    PFR110      IF NO ERROR OCCURRED
          UJK    PFR90       IF AN ERROR OCCURRED

*         READ CHANNEL CONNECTION PDU

 PFR30    LDML   TCHFR       REMAINING WORDS TO WRITE
          SBML   BUFLEN
          ZJN    PFR40       IF LAST BUFFER
          PJN    PFR50       IF NOT LAST BUFFER

 PFR40    LDML   TCHFR
          STML   BUFLEN
          SHN    1
          SBML   EBYOFF      ODD BYTE INDICATOR
          STML   RDCNT       BYTES IN LAST BUFFER
          LDN    0
 PFR50    STML   TCHFR
          LDML   RDCNT
          RAML   ACTD+1      UPDATE ACTUAL DATA
          LRDL   DATADD      LOAD R UPPER
          LDDL   DATADD+1    FWA OF CM BUFFER
          CHCM   BUFLEN,CHN  READ ONE BUFFER
          LDDL   BUFLEN
          ZJN    PFR60       IF ALL READ
          SHN    1
          STDL   ERRCNT      FORCE ERROR FROM ERROR CHECK
          LDML   ACTD+1
          SBML   ERRCNT
          STML   ACTD+1      UPDATE ACTUAL DATA
          DCN    CHN+40B
          TRACE
          UJN    PFR70

 PFR60    LDDL   RDCNT       BYTES READ
          RAML   RS+/RS/P.XFER+1
          LDML   TCHFR
          ZJN    PFR70       IF LAST BUFFER
          AODL   CML
          RJM    SBI         SET UP NEXT BUFFER
          UJK    PFR30       READ NEXT BUFFER

 PFR70    LDK    /RS/K.LREAD
          RJM    ERR         CHECK FOR ERRORS
          ZJK    PFR110      NO ERRORS
 PFR80    LDDL   STCHNG
          NJK    PFR100      EXIT IF STATE CHANGED
          LDML   RDRTY
          NJN    PFR90       IF RETRY
          LDN    FTRY
          STML   RDRTY       RESET RECOVERY COUNTER IF UNRECOVERED
          UJN    PFR100      RETURN BUFFERS

 PFR90    RJM    QPR         QUEUE PREVIOUS READ
 PFR100   BSS    0

*         IT IS POSSIBLE FOR THE PP TO GENERATE NUMEROUS DEVICE ERRORS IF THE
*         BUFFER POOL IS EMPTY AND THE CPU HAS NOT HAD A CHANCE TO MAKE
*         ADDITIONAL BUFFERS AVAILABLE.  TO AVOID THIS, THE FOLLOWING CODE
*         CHECKS TO SEE IF THE RESPONSE BEING GENERATED IS GOING TO RETURN
*         ANY BUFFERS OR IF IT IS GOING TO RETURN A *BUFFER EMPTY* OR  A
*         *BUFFER THRESHOLD* STATUS.  IF NOT, A DEVICE ERROR UNSOLICITED
*         RESPONSE WILL NOT BE ISSUED.

          LDDL   CMLISTL     NUMBER OF LENGTH/ADDRESS PAIRS
          ADML   RS+/RS/P.T1STAT   STATUS OF TYPE 1 BUFFER POOL
          ADML   RS+/RS/P.T2STAT   STATUS OF TYPE 2 BUFFER POOL
          SBN    2*BP.GOOD   COMPARE WITH ADEQUATE NUMBER OF BUFFERS AVAILABLE
          NJN    PFR102      IF DEVICE ERROR REQUIRED
          RJM    ZRE         ZERO OUT BUFFER
          UJK    PFRX        EXIT  --  NO DEVICE ERROR REQUIRED

*         MOVE THE LAST LENGTH/ADDRESS PAIR TO BE THE FIRST ONE (IF THE FIRST
*         ONE HAS NOT BEEN ALLOCATED YET).  THIS IS NEEDED BECAUSE THE FIRST
*         BUFFER IS ALLOCATED LAST AND COULD BE UNALLOCATED AT THIS POINT.
*         THE CPU CODE EXPECTS THE BUFFER LIST TO BE CONTIGUOUS AND ALLOCATED.

 PFR102   BSS    0
          LDML   RS+/RS/P.DLEN   LENGTH OF FIRST BUFFER POOL BUFFER
          NJN    PFR108      IF FIRST BUFFER HAS BEEN ALLOCATED
          LDN    3           LENGTH/ADDRESS PAIR SIZE (PP WORDS)(0..3)
          STDL   T2          OFFSET TO FIRST LENGTH/ADDRESS PAIR
          LDDL   CMLISTL     NUMBER OF LENGTH/ADDRESS PAIRS
          SHN    2           CONVERT TO PP WORDS
          ADDL   T2          ADJUST FOR HIGHEST OFFSET
          STDL   T3          OFFSET TO LAST LENGTH/ADDRESS PAIR

 PFR105   BSS    0
          LDML   RS+/RS/P.DLEN,T3   PART OF LAST LENGTH/ADDRESS PAIR
          STML   RS+/RS/P.DLEN,T2   PART OF FIRST LENGTH/ADDRESS PAIR
          SODL   T3          NEXT OFFSET TO LAST LENGTH/ADDRESS PAIR
          SODL   T2          NEXT OFFSET TO FIRST LENGTH/ADDRESS PAIR
          PJK    PFR105      IF MORE TO MOVE

 PFR108   LDN    URC.DE      ISSUE DEVICE ERROR TO RETURN BUFFER
          UJN    PFR120      SEND UNSOLICITED RESPONSE

 PFR110   STML   NXTREC
          LDML   /HD/P.RRC,HDRTYP  GET RESPONSE CODE
 PFR120   STDL   UNSC        UNSOLICITED RESPONSE CODE
          LDDL   CMLISTL     NUMBER OF LENGTH/ADDRESS PAIRS
          SHN    3           CONVERT TO CM BYTES
          RAML   RS+/RS/P.RESPL  UPDATE RESPONSE LENGTH
          RJM    USR         SEND UNSOLICITED RESPONSE
          UJK    PFRX        EXIT
 RFC      SPACE  4,10
**        RFC - RESET FOR CPU.
*
*         THIS ROUTINE PROCESSES THE RESET COMMAND.
*
*         EXIT   (A) = 0.
          SPACE  4,10
 RFC      SUBR               ENTRY/EXIT
          LDN    SC.PPR      RESET ICA
          STDL   STCHNG
          LDN    0
          UJN    RFCX        EXIT
 SDM      SPACE  4,10
**        SDM - SET DEBUG MODE.
*
*         THIS ROUTINE PROCESSES THE SET DEBUG MODE COMMAND.
*
*         EXIT   (A) = 0 IF NO ERRORS
*                    <> 0 IF ERRORS
*
*         CALLS  PIE
          SPACE  4,10
 SDM10    LDC    E50B
          RJM    PIE         SEND INTERFACE ERROR

 SDM      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.RMA+1
          ZJN    SDM20       IF DEBUG MODE ON
          SBN    1
          NJN    SDM10       IF INVALID COMMAND
          LDN    1
 SDM20    STML   DBUGM
          LDN    0
          UJN    SDMX        EXIT
          SPACE  4,20
**        WRP - WRITE PROCESSOR
*
*         THIS ROUTINE PROCESSES THE WRITE BYTES COMMAND.
*         RECORDS WRITTEN TO THE ICA MAY BE IN FRAGMENTS
*         SCATTERED THROUGHOUT MEMORY AND ARE NOT GUARANTEED
*         TO START OR END ON WORD BOUNDARYS.  EACH FRAGMENT
*         IS WRITTEN IN A MULTIPLE OF 64 BIT CENTRAL MEMORY
*         WORDS USING THE DIRECT MEMORY ACCESS(DMA) CHANNEL
*         INSTRUCTION.  A 32 BIT HEADER MUST PRECEDE EACH
*         BLOCK DESCRIBING THE DATA WHICH FOLLOWS.  THE ICA
*         WILL THEN DISCARD LEADING AND TRAILING BYTES OF
*         UNUSED DATA.  THIS HEADER IS DEFINED AS FOLLOWS.
*
*         +-----+-----+----------+
*         |  P  |  R  |     Q    |
*         +-----+-----+----------+
*
*         P = NUMBER OF LEADING JUNK BYTES (8 BITS)
*         R = NUMBER OF TRAILING JUNK BYTES (8 BITS)
*         Q = LENGTH OF DATA PORTION IN BYTES (16 BITS)
*
*         ENTRY  CM - CONTAINS COMMAND.
*
*         USES   CML, CMLISTL, T1, T2, T3.
*
*         CALLS  ERR, FAN, STR, ZRE.
          SPACE  4,10
 WRP      SUBR               ENTRY/EXIT
          LDN    0
          STDL   CML         CURRENT CM LIST INDEX

*         ISSUE WRITE FUNCTION

          LDC    F.WRITE
          RJM    FAN         ISSUE WRITE FUNCTION
          NJK    WRPX        EXIT IF ERRORS
          ACN    CHN
          LDML   RQ+/URQ/P.URQLEN
          SBN    /URQ/C.MBRMA*8
          SHN    -3
          STDL   CMLISTL     NUMBER OF CM LENGTH/ADDRESS PAIRS

 WRP20    BSS    0
          LDDL   CML         CURRENT CM LIST INDEX
          SHN    2           CONVERT TO PP WORD OFFSET
          STDL   T3          OFFSET TO CM LENGTH/ADDRESS PAIR (PP WORDS)
          LRML   RQ+/URQ/P.MBRMA,T3     UPPER PORTION OF ADDRESS OF DATA BUFFER
          LDML   RQ+/URQ/P.MBRMA+1,T3   LOWER PORTION OF ADDRESS OF DATA BUFFER
          STML   WRPA
          LDML   RQ+/URQ/P.MBLEN,T3   LENGTH OF DATA BUFFER

 WRP22    BSS    0
          STDL   BYTS        NUMBER OF BYTES LEFT TO TRANSFER TO THE ICA
          ADK    -MAXDMA     MAX CM BYTES THAT ICA CAN RECEIVE PER DMA TRANSFER
          PJN    WRP24       IF TOO MUCH FOR 1 DMA OPERATION

          LDDL   BYTS        REMAINING BYTES TO BE TRANSFERRED
          UJN    WRP26

 WRP24    LDK    MAXDMA      MAX CM BYTES THAT ICA CAN RECEIVE PER DMA TRANSFER
 WRP26    STML   IOBUF+1
          LDML   WRPA        LOWER PORTION OF ADDRESS OF DATA BUFFER
          LPN    7
          STDL   T1          SAVE LEADING JUNK
          SHN    8
          STML   IOBUF       STORE LEADING JUNK IN HEADER
          LDML   IOBUF+1     LENGTH OF DMA TRANSFER (CM BYTES)
          ADDL   T1
          LPN    7
          STDL   T2          SAVE ENDING BYTE +1
          ZJK    WRP40       IF ON WORD BOUNDARY
          LDN    8
          SBDL   T2          FORM TRAILING JUNK
          STDL   T2
          RAML   IOBUF
 WRP40    LDML   IOBUF+1
          ADDL   T1
          ADDL   T2
          SHN    -1          PP WORD COUNT
          STML   PWRT        LENGTH OF BUFFER TO BE WRITTEN TO ICA (PP WORDS)
          LDN    2           WRITE TWO PP WORDS
          SIMM   WRP50
          OAM    IOBUF,CHN   WRITE HEADER
          NJK    WRP65       IF INCOMPLETE WRITE

 WRP50    BSS    0
          LDML   WRPA        LOWER PORTION OF ADDRESS OF DATA BUFFER
          SHN    -3          FORM WORD ADDRESS
          SIMM   WRP60
          CMCH   PWRT,CHN
          LDML   PWRT
          NJK    WRP65       IF INCOMPLETE WRITE
 WRP60    LDML   IOBUF+1     BYTES TRANSFERRED
          RAML   RS+/RS/P.XFER+1
          LDML   IOBUF+1     BYTES TRANSFERRED
          RAML   WRPA        START OF NEXT BLOCK TO BE WRITTEN TO ICA
          LDDL   BYTS        NUMBER OF BYTES LEFT TO WRITE TO THE ICA
          SBML   IOBUF+1     LESS THE AMOUNT THAT WAS JUST WRITTEN
          NJK    WRP22       IF MORE TO DO (FOR THIS BUFFER)
          AODL   CML
          SBDL   CMLISTL
          NJK    WRP20       CONTINUE IF MORE TO WRITE
 WRP65    STDL   ERRCNT      NUMBER OF WORDS NOT WRITTEN
          LDK    /RS/K.LWRT
          RJM    ERR         CHECK ERRORS
          ZJN    WRP70       IF NO ERRORS
          LDDL   STCHNG
          NJK    WRPX        EXIT IF RESET
          LDDL   ERRT1
          LPK    /RS/K.LSCEF
          ZJK    WRP66       IF NO CHANNEL ERROR FLAG
          LDDL   GNSTAT
          SHN    17-S.GE
          PJN    WRP67       IF ONLY ERROR WAS CEF
 WRP66    LDML   WRRTY
          ZJK    WRP67       IF UNRECOVERED
          RJM    ZRE         ZERO RESPONSE BUFFER
          UJK    WRPX        EXIT IF IN RECOVERY

 WRP67    LDN    FTRY
          STML   WRRTY       RESET RETRY COUNTER
          LDN    SC.PPR
          STDL   STCHNG
 WRP70    RJM    STR         SEND TERMINATION RESPONSE
          UJK    WRPX        EXIT

 WRPA     BSSZ   1           LOWER PORTION OF ADDRESS OF DATA BUFFER
          TITLE  MISCELLANEOUS ROUTINES
**        BTE - BUSY TIMEOUT ERROR
*
*         THIS ROUTINE  LOGS A BUSY TIMEOUT ERROR
*         AND RESETS THE ICA.
*
*         ENTRY  NONE
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  SEI SLM
          SPACE  4,10
 BTE      SUBR               ENTRY/EXIT
          LDN    SC.PPR
          STDL   STCHNG      RESET ICA
          LDK    /RS/K.LGSBTO
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDML   PREFC
          STML   LRS+/RS/P.PFUNC SAVE PREVIOUS FUNCTION CODE
          RJM    IGS         INCLUDE GENERAL STATUS
          RJM    SLM         SEND LOG MESSAGE
          UJN    BTEX        EXIT
          SPACE  4,12
**        CAE - CHANNEL ACTIVE ERROR
*
*         THIS ROUTINE DISCONNECTS THE CHANNEL AND
*         LOGS A CHANNEL ACTIVE ERROR.
*
*         ENTRY  NONE
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  SOT SEI SSC
          SPACE  4,10
 CAE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.OPTP  LOG OPERATION TYPE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LSCA
          RJM    SSC         LOG SYMPTOM CODE
          UJN    CAEX        EXIT
 CBP      SPACE  4,16
**        CBP - CHECK IF BUFFER IN POOL.
*
*         THIS ROUTINE WILL INTERLOCK THE BUFFER POOL
*         AND DETERMINE IF A BUFFER IS AVAILABLE.
*         THE INTERLOCK WILL BE CLEARED BEFORE EXIT.
*
*         ENTRY  (FSTBD) = INDEX INTO POOL BUFFER.
*
*         EXIT   (A) = 0, IF NO BUFFER AVAILABLE.
*                    <> 0, IF BUFFER AVAILABLE.
*                RESPONSE BUFFER POOL STATUS SET APPROPRIATELY IF POOL IS
*                          EMPTY OR BELOW THRESHOLD.
*                (BP - BP+7) = BUFFER POOL TABLE ENTRY.
*
*         USES   T2, T3, T9, WC.
*
*         CALLS  SBL.
*
*         MACROS LOADC, LOADF.
          SPACE  4,10
*         BUFFER POOL DESCRIPTOR PP OUT POINTER

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

 CBP      SUBR               ENTRY/EXIT
 CBP10    BSS    0
          LDDL   FSTBD       INDEX INTO BUFFER POOL
          SHN    2
          ADDL   FSTBD       5 WORDS PER BUFFER POOL DESCRIPTOR
          STDL   T9          CM WORD OFFSET OF BUFFER POOL DESCRIPTOR
          ADK    /BPD/C.PPOUT   OFFSET TO BPD PP OUT POINTER
          RJM    SBL         SET POOL DESCRIPTOR INTERLOCK

*         GET BUFFER POOL DESCRIPTOR.

*         LDN    0
          STDL   T3          NUMBER OF BUFFERS OBTAINED
          LDN    C.BPD
          STDL   WC          LENGTH OF POOL DESCRIPTOR
          IFEQ   DRTYP,1     IF MDI
          LOADC  CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRDL   CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
          LDDL   CM.BPD+1
          ENDIF
          ADDL   T9          CM WORD OFFSET OF BUFFER POOL DESCRIPTOR
          CRML   BPD,WC

*         VALIDATE BUFFER POOL DESCRIPTOR IN POINTER.

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

*         VALIDATE BUFFER POOL DESCRIPTOR OUT POINTER.

          LDDL   PPOUT       BUFFER POOL DESCRIPTOR PP OUT POINTER
          LPK    7           BYTE OFFSET
          NJN    *           IF BPD OUT POINTER NOT ON A CM WORD BOUNDARY

*         CHECK IF A BUFFER IS AVAILABLE.

          LDML   BPD+/BPD/P.IN   BUFFER POOL DESCRIPTOR IN POINTER
          SBDL   PPOUT           COMPARE WITH BPD PP OUT POINTER
          ZJN    CBP30       IF BUFFER POOL IS EMPTY
          AODL   T3          NUMBER OF BUFFERS OBTAINED

*         GET BUFFER POOL TABLE ENTRY.

          LDK    C.BP
          STDL   WC          BUFFER POOL ENTRY SIZE (CM WORDS)
          LDDL   PPOUT       BUFFER POOL ENTRY OFFSET (CM BYTES PER BP ENTRY)
          SHN    -3          CONVERT TO A BP ORDINAL (CM WORDS PER BP ENTRY)
          STDL   T2          BUFFER POOL ENTRY OFFSET (BP ENTRIES)
          IFEQ   DRTYP,1     IF MDI
          LOADF  BPD+/BPD/P.BTRMA   BUFFER POOL TABLE FWA
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   BPD+/BPD/P.BTRMA   BUFFER POOL TABLE FWA
          LDML   BPD+/BPD/P.BTRMA+1
          SHN    -3
          ENDIF
          ADDL   T2          BUFFER POOL ENTRY OFFSET (CM WORDS)
          CRML   BP,WC

*         DETERMINE NEW BUFFER POOL DESCRIPTOR PP OUT POINTER VALUE.

          LDDL   PPOUT       BUFFER POOL DESCRIPTOR PP OUT POINTER
          ADK    C.BP*8      NEXT BUFFER POOL TABLE ENTRY
          SBML   BPD+/BPD/P.LIMIT   COMPARE WITH LIMIT
          ZJN    CBP20       IF AT LIMIT
          ADML   BPD+/BPD/P.LIMIT   RESTORE GOOD VALUE OF NEW BPD PP OUT POINTER

 CBP20    BSS    0
          STDL   PPOUT        NEW BUFFER POOL DESCRIPTOR PP OUT POINTER

*         CHECK IF A BUFFER IS AVAILABLE.

          LDML   BPD+/BPD/P.IN   BUFFER POOL DESCRIPTOR IN POINTER
          SBDL   PPOUT           COMPARE WITH BPD PP OUT POINTER
          NJN    CBP40       IF BUFFER POOL IS NOT EMPTY

*         BUFFER POOL IS EMPTY.

 CBP30    BSS    0
          LDDL   T3          NUMBER OF BUFFERS OBTAINED
          ZJN    CBP70       IF WE DID NOT EMPTY THE POOL (IF NO BUFFERS OBTAINED)
          IFEQ   DEBUG,1
          AOML   EMPBUF,FSTBD      INCREMENT EMPTY POOL COUNT
          ENDIF
          LDK    BP.EMPTY    EMPTY BUFFER POOL STATUS
          UJN    CBP60

*         CHECK IF BELOW THRESHOLD.

 CBP40    BSS    0
          PJN    CBP50       IF LIMIT NOT CROSSED OVER (IF NEXT BUFFER CONTIGUOUS)
          ADML   BPD+/BPD/P.LIMIT   RESTORE AVAILABLE BUFFERS (CM BYTES)

 CBP50    BSS    0
          ERRNZ  16-C.BP*8   BUFFER POOL ENTRY SIZE NOT 16 CM BYTES
          SHN    -4          CONVERT ENTRY SIZE (CM BYTES) TO NUMBER OF BUFFERS
          SBML   BPD+/BPD/P.THRESH   COMPARE WITH THRESHOLD
          PJN    CBP70       IF AVAILABLE BUFFERS .GE. THRESHOLD
          ADDL   T3          NUMBER OF BUFFERS OBTAINED
          MJN    CBP70       IF WE DID NOT VIOLATE THRESHOLD
          LDK    BP.THRSH    BUFFER POOL BELOW THRESHOLD STATUS

*         SET STATUS IN THE RESPONSE.

 CBP60    BSS    0
          STML   RS+/RS/P.T1STAT,FSTBD   SET STATUS

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

 CBP70    BSS    0
          IFEQ   DRTYP,1     IF MDI
          LOADC  CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRDL   CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
          LDDL   CM.BPD+1
          ENDIF
          ADDL   T9          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 INTERLOCK
          LDDL   T3          NUMBER OF BUFFERS OBTAINED
          UJK    CBPX        EXIT

          SPACE  4,10
**        CSC - CHECK IF STATE CHANGE
*
*         THIS ROUTINE WILL CHECK IF THE ICA HAS
*         CHANGED STATES, THE PP HAS REQUESTED
*         A CHANGE, OR THE PP HAS BEEN IDLED.
*
*         ENTRY  NONE
*
*         EXIT   (A) = 0, NO STATE CHANGE
*                (A) <> 0, STATE CHANGE OR IDLE REQUESTED.
*
*         USES   NONE
*
*         CALLS  GST
*
          SPACE  4,10
 CSC      SUBR               ENTRY/EXIT
          LDML   IDLE        IDLE FLAG
          ADDL   STCHNG      ADD CHANGING STATE
          NJN    CSCX        EXIT IF IDLE OR STATE CHANGING
          RJM    GST         GET GENERAL STATUS
          LDML   IDLE        IDLE FLAG
          ADDL   STCHNG      ADD CHANGING STATE
          UJN    CSCX        EXIT
          SPACE  4,15
**        CSD - CHECK IF SEND DATA UP
*
*         THIS ROUTINE OBTAINS THE GENERAL STATUS AND CHECKS
*         FOR SEND DATA. A TIMER IS KEPT TO ASSURE THAT SEND
*         DATA IS BEING SET BY THE ICA WITHIN 1 SECOND.
*         IT IS ASSUMED THIS ROUTINE CAN ONLY BE CALLED
*         ONCE PER MICROSECOND. THIS TIMER IS KEPT ONLY IN
*         ICA-I MODE.
*
*         EXIT   (A) = 0, IF SEND DATA UP
*
*         CALLS  GST DST NSD IGS SLM
          SPACE  4,10
 CSD      SUBR               ENTRY/EXIT
          RJM    GST
          NJN    CSDX        EXIT IF STATUS CANT BE READ
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.SEND
          MJK    CSD10       IF SEND DATA UP
          LDML   OSI,ICATDDP
          NJN    CSDX        IF OSI MODE
          SOML   CSDTIME     DECREMENT TIMER
          NJN    CSDX        EXIT IF NOT TIMED OUT
          SOML   CSDTMP
          ZJK    CSD05       IF TIME EXAUSTED
          LDC    177777B
          STML   CSDTIME
          UJK    CSDX        EXIT

 CSD05    RJM    DST         GET DETAIL STATUS
          LDK    /RS/K.LGSSDT
          STML   LRS+/RS/P.ERRID SET ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    SC.PPR
          STDL   STCHNG      RESET ICA
          RJM    SLM         SEND LOG MESSAGE
          UJK    CSDX        EXIT

 CSD10    LDC    177777B
          STML   CSDTIME     RESET TIMER
          LDN    17B
          STML   CSDTMP      AND MULTIPLIER
          LDN    0
          UJK    CSDX        EXIT
          SPACE  2
 CSDTIME  CON    177777B
 CSDTMP   CON    17B
          SPACE  4,10
**        DEC - DIAGNOSTIC ERROR CHECK
*
*         THIS ROUTINE IS USED TO CHECK FOR INPUT/OUTPUT ERRORS
*         IN RESET AND DIAGNOSTIC MODE. ONLY CHANNEL PARITY ERRORS
*         WILL BE RETRIED OTHER GENERAL STATUS ERRORS ARE FATAL
*         AND CAUSE THE ICA TO BE DOWNED. AN EXCEPTION IS MADE FOR
*         THE READ DIAGNOSTIC COMMAND OPERATION IF THE COMMAND IS
*         ECHO STATUS. IN THIS CASE GENERAL STATUS IS NOT READ,
*         BUT WILL BE CHECKED BY THE COMMAND PROCESSOR.
*
*         ENTRY  (A) = OPERATION TYPE
*                ERRR = REMAINING RETRYS
*                STBI = COMMAND READ IF READ DIAGNOSTIC OPERATION
*
*         EXIT   (A) = 0 IF NO ERRORS
*                (A) <> 0 IF ERRORS
*                ERRR DECREMENTED BY ONE IF CHANNEL ERRORS
*
*         USES   T4
*
*         CALLS  GST SSC SIU IGS SLM
          SPACE  4,10
 DEC      SUBR               ENTRY/EXIT
          STML   OTYPE       SAVE OPERATION TYPE
          CFM    DEC40,CHN   IF NO CHANNEL ERROR FLAG
          RJM    GST         GET GENERAL STATUS
          NJN    DECX        IF ERRORS GETTING STATUS
          LDK    /RS/K.LSCEF
          RJM    SSC         SET SYMPTOM CODE
 DEC10    SOML   ERRR
          RJM    SIU         SET RETRY SUCCESS
          LDML   ERRR
          NJK    DEC30       IF NOT UNRECOVERED ERROR
 DEC20    LDN    SC.PPD
          STDL   STCHNG      DOWM ICA
 DEC30    RJM    IGS         INCLUDE GENERAL STATUS
          LDN    /RS/K.LOF
          STML   LRS+/RS/P.ERRID
          LDML   OTYPE
          STML   LRS+/RS/P.OPTP
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJK    DECX        ERROR EXIT

 DEC40    LDN    /RS/K.LRDC
          SBML   OTYPE
          NJK    DEC44       IF NOT READ DIAGNOSTIC COMMAND
          LDC    DC.ECHO
          SBML   STBI
          ZJK    DEC50       IF ECHO STATUS FUNCTION
 DEC44    RJM    GST         GET GENERAL STATUS
          NJK    DECX        EXIT IF GST ERRORS
          LDDL   GNSTAT
          SHN    17-S.GE
          PJK    DEC50       IF NO ERRORS
          LDK    /RS/K.LSGSE
          RJM    SSC         SET SYMPTOM CODE
          LDDL   GNSTAT
          SHN    17-S.CE
          MJK    DEC10       IF CHANNEL ERRORS
          UJK    DEC20       DOWN ICA

 DEC50    LDN    0
          UJK    DECX        EXIT NO ERRORS

 DFC      SPACE  4,14
**        DFC - DETERMINE FLOW CONTROL.
*
*         THIS ROUTINE DETERMINES IF THE ICA HAS SET NORMAL
*         FLOW CONTROL.  IT DOES SO BY EXAMINING THE LAST GENERAL
*         STATUS TAKEN.
*
*         ENTRY  (GNSTAT) = GENERAL STATUS, SEND DATA BIT IS SET.
*
*         EXIT   (A) = 0 IF NO ERRORS
*                    <> 0 IF FLOW CONTROL VALUE INVALID
*                (NUMPRI) = 0, IF FLOW CONTROL CHANGED FROM ON TO OFF
*                         > MAXPR IF FLOW CONTROL ON
*
*         CALLS  IGS SLM
          SPACE  4,10
 DFC10    LDN    MAXPR+1
 DFC20    STML   NUMPRI
 DFC30    LDN    0

 DFC      SUBR               ENTRY/EXIT
          LDML   OSOSI
          ZJN    DFCX        IF NOT OPERATIONAL
          LDDL   GNSTAT      GENERAL STATUS
          ERRNZ  S.FC1       ERROR IF NOT BIT ZERO
          LPN    SSMASK      LOOK AT FLOW CONTROL BITS
          LMN    FSS.ON
          ZJN    DFC10       IF FLOW CONTROL ON
          LMN    FSS.OFF&FSS.ON
          NJN    DFC40       IF INVALID FLOW CONTROL
          LDN    MAXPR
          SBML   NUMPRI
          PJN    DFC30       IF NO SWITCH IN FLOW CONTROL
          LDN    0
          UJN    DFC20       EXIT

 DFC40    LDN    /RS/K.LFCE  SET ILLEGAL FLOW CONTROL
          STML   LRS+/RS/P.ERRID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    SC.PPR
          STDL   STCHNG      RESET MCI
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJN    DFCX        EXIT
          SPACE  4,10
**        DLR - DELINK REQUEST FROM QUEUE
*
*         THIS ROUTINE DELINKS THE CURRENT REQUEST
*         FROM THE APPROPRIATE QUEUE.
*
*         ENTRY  REQTYP = 0, IF PP REQUEST
*                       <> 0, IF UNIT REQUEST.
*
*         CALLS  CPL, DUR, FDR, SPL.
*
          SPACE  4,10
 DLR      SUBR               ENTRY/EXIT
          LDML   REQTYP
          NJN    DLR20       IF UNIT REQUEST

*         PP REQUEST.

 DLR10    BSS    0
          LDN    2
          STDL   WC
          RJM    SPL         SET PP QUEUE LOCK
          NJN    DLR10       IF LOCK COULD NOT BE SET
          LRDL   CM.PIT
          LDDL   CM.PIT+1
          ADN    /PIT/C.PPQPVA
          RJM    FDR         FIND AND DELINK REQUEST
          RJM    CPL         CLEAR PP QUEUE LOCK
          UJK    DLRX        EXIT

*         UNIT REQUEST.

 DLR20    BSS    0
          RJM    DUR         DELINK UNIT REQUEST
          UJK    DLRX        EXIT
          SPACE  4,16
**        DST - DETAILED STATUS.
*
*         THIS ROUTINE READS THE ICA DETAILED STATUS INTO
*         THE RESPONSE BUFFER. THE RESPONSE BUFFER IS UPDATED
*         TO SHOW DETAILED STATUS IS INCLUDED. IF ERRORS ARE
*         ENCOUNTERED THEY ARE LOGGED AS INTERMEDIATE ERRORS.
*
*         ENTRY  NONE
*
*         EXIT   (A) = 0, IF NO ERROR
*                    <> 0, IF ERROR
*         USES   - T7 T8
*
*         CALLS  - GST FAW IGS SSC SEI SOT SLM SRU
*
*
          SPACE  4,10
 DST      SUBR               ENTRY/EXIT
 S.       IFEQ   SIM,1
          LDN    0
          UJN    DSTX
 S.       ENDIF
          LDN    FTRY
          STML   DSTRC
 DST10    LDN    F.DS        DETAILED STATUS
          RJM    FAW
          NJN    DSTX        IF FUNCTION TIMEOUT OR OTHER ERROR
          LDN    0
          STML   DSTER
          LDML   LDS,ICATDDP
          SIMM   DST40
          IAM    LRS+/RS/P.DETAIL,CHN  INPUT DETAILED STATUS
          ZJN    DST20       IF INPUT COMPLETE
          LDK    /RS/K.LSIT
          RAML   DSTER       SET INCOMPLETE TRANSFER
 DST20    LDN    5
          IJM    DST30,CHN   IF CHANNEL INACTIVE
          SBN    1
          NJN    DST20       IF NOT TIMEOUT
          DCN    CHN+40B     DISCONNECT CHANNEL
          TRACE
          LDK    /RS/K.LSMLV
          RAML   DSTER       MESSAGE LENGTH ERROR
 DST30    CFM    DST40,CHN   IF NOT CHANNEL ERROR
          LDK    /RS/K.LSCEF
          RAML   DSTER       SET CHANNEL ERROR
 DST40    RJM    GST         GET GENERAL STATUS
          NJK    DSTX        EXIT IF GST ERRORS
          LDDL   GNSTAT
          SHN    17-S.GE
          PJN    DST50       IF NO ERRORS GETTING DETAILED STATUS
          LDK    /RS/K.LSGSE
          RAML   DSTER       SET GENERAL STATUS ERROR
          RJM    IGS         INCLUDE GENERAL STATUS
 DST50    LDML   DSTER
          NJN    DST60       IF ERRORS GETTING DETAIL STATUS
          LDK    /RS/K.LDS
          STML   DSTER       UPDATE DETAIL STATUS INCLUDED
          LMC    -0          BIT IN RESPONSE BUFFER
          STML   DSTRC
          LDML   LRS+/RS/P.LDS
          LPML   DSTRC
          ADML   DSTER
          STML   LRS+/RS/P.LDS
          LDN    0
          UJK    DSTX        EXIT NO ERRORS

 DST60    RJM    SSC         SET SYMPTOM CODES
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LRDS
          STML   LRS+/RS/P.OPTP   STORE OPERATION TYPE
          SOML   DSTRC       DECREMENT RETRY COUNT
          ZJN    DST70       IF UNRECOVERED
          LDN    REC.I       SET INTERMEDIATE ERROR
          STML   LRS+/RS/P.RETSUC
          LDN    FTRY
          SBML   DSTRC       RETRY COUNT
          STML   LRS+/RS/P.RETCT
          RJM    SLM         SEND LOG MESSAGE
          UJK    DST10       RETRY

 DST70    RJM    SRU         SET RECOVERY SUCCESS
          LDN    SC.PPR
          STDL   STCHNG      RESET ICA
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJK    DSTX        EXIT WITH ERROR

 DSTRC    BSSZ   1           RETRY COUNT
 DSTER    BSSZ   1           SYMPTOM CODES
 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.
*
*         CALLS  CSW, CUL, SUL.
*
*         MACROS LOADC.

 DUR      SUBR               ENTRY/EXIT

*         UPDATE UNIT QUEUE HEAD POINTER.

 DUR20    BSS    0
          IFEQ   DRTYP,1     IF MDI
          LOADC  CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRDL   CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          LDDL   CM.URQ+1
          ENDIF
          ERRNZ  /UQD/C.HEAD OFFSET TO UNIT QUEUE HEAD POINTER IS NOT ZERO
*         ADN    /UQD/C.HEAD OFFSET TO UNIT QUEUE HEAD POINTER
          CWML   RQ+/URQ/P.NEXTLN,ONE  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.

          IFEQ   DRTYP,1     IF MDI
          LOADF  RS+/RS/P.REQ  RMA OF THE CURRENT REQUEST
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   RS+/RS/P.REQ  RMA OF THE CURRENT REQUEST
          LDML   RS+/RS/P.REQ+1
          SHN    -3
          ENDIF
          ADN    /URQ/C.NEXT OFFSET TO NEXTLN/NEXT WORD
          CRML   RQ+/URQ/P.NEXTLN,ONE  READ UNIT REQUEST NEXTLN/NEXT WORD
          UJK    DUR20       UPDATE UNIT QUEUE HEAD POINTER
          SPACE  4,10
**        DVE - DATA VERIFICATION ERROR
*
*         THIS ROUTINE LOGS A DATA VERIFICATION ERROR
*         AND DOWNS THE ICA.
*
*         ENTRY  NONE
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  SEI SOT SSC SLM
          SPACE  4,10
 DVE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.OPTP   STORE OPERATION TYPE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LSMT
          RJM    SSC         SET DATA VERIFICATION
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          UJN    DVEX        EXIT
          EJECT
**        ERR - ERROR ROUTINE
*
*         THIS ROUTINE WILL CHECK FOR ERRORS FOLLOWING
*         AN INPUT/OUTPUT OPERATION IN OPERATIONAL MODE.
*         THREE ERROR RECOVERY COUNTERS ARE MAINTAINED
*         AS FOLLOWS.
*
*         COUNTER            ICA STATE/OPERATION
*         -------            -------------------
*         WRRTY              OPERATIONAL STATE/WRITE OPERATION
*         RDRTY              OPERATIONAL STATE/READ OPERATION
*         ERRR               OPERATIONAL STATE/SET ICA PARAMETERS
*
*
*         ENTRY  (A) = OPERATION CODE
*                (ERRCNT) = WORDS NOT TRANSFERED
*                (EXPD) = LENGTH EXPECTED
*                (ACTD) = ACTUAL LENGTH
*
*         EXIT   (A) = 0 IF NO  ERRORS
*                  <> 0 IF ERRORS
*                GNSTAT = GENERAL STATUS OF I/O REQUEST
*                ERRT1 = SYMPTOM CODES OF ERRORS
*                  IF RETRY COUNTER <> 0 RETRY REQUEST
*
*         USES   T9
*
*         CALLS  FRC GST DST IGS SSC SEI SOT SLM
          SPACE  4,10
 ERR      SUBR               ENTRY/EXIT
          STML   OTYPE       SAVE OPERATION CODE
          RJM    FRC         FIND PROPER RECOVERY COUNTER
          STDL   ERRRCP      SAVE
          LDN    0
          STDL   ERRT1       ZERO ERROR WORD
          LDML   OTYPE
          SBN    /RS/K.LREAD
          NJK    ERR50       JUMP IF WRITE
          LDC    WTDEACT*1200  WAIT FOR CHANNEL NOT ACTIVE
 ERR15    IJM    ERR30,CHN   IF CHANNEL NOT ACTIVE
          SBN    1
          NJN    ERR15       IF NOT TIMED OUT
          LDDL   ERRCNT
          NJN    ERR20       IF TRANSFER NOT COMPLETE
          STML   ACTD+1
          LDC    100000B     MESSAGE LARGER THAN EXPECTED
          STML   ACTD
          UJN    ERR40       LOG ERROR

 ERR20    LDK    /RS/K.LSIT
          UJN    ERR45       SET INCOMPLETE TRANSFER

 ERR30    LDDL   ERRCNT
          ZJK    ERR80       IF TRANSFER COMPLETE
 ERR40    LDK    /RS/K.LSMLV
 ERR45    RADL   ERRT1       MESSAGE LENGTH VERIFICATION ERROR
          UJN    ERR80       CHECK CHANNEL FLAG

 ERR50    AJM    ERR60,CHN   IF CHANNEL ACTIVE
          LDK    /RS/K.LSCD
          RADL   ERRT1       SET CHANNEL NOT ACTIVE ERROR
          UJN    ERR80       CHECK CHANNEL FLAG

 ERR60    LDDL   ERRCNT
          ZJN    ERR65       IF TRANSFER COMPLETE
          LDK    /RS/K.LSIT  SET INCOMPLETE TRANSFER
          RADL   ERRT1
 ERR65    LDC    WTEMPTY*2000
 ERR70    EJM    ERR80,CHN   IF CHANNEL EMPTY
          SBN    1
          NJN    ERR70       IF NOT TIMED OUT
          LDK    /RS/K.LSCF
          RADL   ERRT1       SET CHANNEL NOT EMPTY
 ERR80    DCN    CHN+40B     DISCONNECT
          TRACE
          CFM    ERR90,CHN   IF NO CHANNEL ERROR
          LDK    /RS/K.LSCEF
          RADL   ERRT1       SET CHANNEL ERROR FLAG
 ERR90    RJM    GST         GET GENERAL STATUS
          NJK    ERR160      IF ERRORS GETTING STATUS
          LDDL   GNSTAT
          SHN    17-S.GE
          PJN    ERR100      IF NO GENERAL STATUS ERRORS
          LDK    /RS/K.LSGSE
          RADL   ERRT1       SET GENERAL STATUS ERRORS
          LDDL   GNSTAT
          STDL   ERRT2       SAVE STATUS
          RJM    DST         GET DETAILED STATUS
*         IGNORE DST ERRORS FOR NOW
          LDDL   ERRT2
          STDL   GNSTAT      RESTORE GENERAL STATUS
 ERR100   LDDL   ERRT1
          ADDL   STCHNG
          NJN    ERR110      IF ERRORS IN GST,DST OR IO
          LDML   OTYPE
          SBN    /RS/K.LREAD
          NJN    ERR105      IF NOT READ
          LDML   OSI,ICATDDP
          SBN    1
          ZJN    ERR107      IF OSI MODE
 ERR105   LDN    FTRY
 ERR107   STIL   ERRRCP      RESET RECOVERY COUNTER
          LDN    0
          UJK    ERRX        EXIT NO ERRORS

 ERR110   LDDL   ERRT1
          NJN    ERR120      IF I/O ERRORS
          LDN    1
          UJK    ERRX        IF STATE CHANGE BY DST OR GST

 ERR120   LPK    /RS/K.LSGSE
          ZJN    ERR130      IF NOT GENERAL STATUS ERRORS
          RJM    IGS         INCLUDE GENERAL STATUS IN RESPONSE
 ERR130   LDDL   ERRT1
          RJM    SSC         SET SYMPTOM CODE
          LDN    3
          STDL   T9
 ERR135   LDML   EXPD,T9     MOVE EXPECTED/ACTUAL
          STML   LRS+/RS/P.EXPD,T9
          SODL   T9
          PJN    ERR135      IF NOT DONE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDML   OTYPE
          STML   LRS+/RS/P.OPTP   STORE OPERATION TYPE
          SBN    /RS/K.LREAD
          NJN    ERR140      IF NOT READ
          LDML   OSI,ICATDDP
          ZJN    ERR140      IF NOT OSI MODE
          AOIL   ERRRCP
          STML   LRS+/RS/P.RETCT
          LDN    REC.I
          STML   LRS+/RS/P.RETSUC
          UJN    ERR150      SEND LOG MESSAGE

 ERR140   SOIL   ERRRCP
          RJM    SIU         SET RECOVERY SUCCESS
 ERR150   RJM    SLM         SEND LOG MESSAGE
 ERR160   LDN    0
          STDL   ERRCNT
          LDN    1
          UJK    ERRX        ERROR EXIT
 FAG      SPACE  4,10
**        FAG - FUNCTION AND TIMEOUT ACTIVE CHANNEL FOR GENERAL STATUS
*
*         THIS ROUTINE WILL FUNCTION THE CHANNEL FOR GENERAL STATUS AND
*         TIMEOUT THE ACTIVE CHANNEL. UNRECOVERED TIMEOUTS CAUSE THE ICA
*         TO BE DOWNED.
*
*         ENTRY - (FAGDEM) <> 0, IF ERROR LOGGING IS DISABLED
*
*         EXIT  - (A) = 0, FUNCTION ISSUED, NORMAL COMPLETION
*                 (A) <> 0, FUNCTION TIMEOUT.
*                 (T1) = RETRY COUNTER (=FTRY, IF NO RETRIES NEEDED)
*
*         USES T1
*
*         CALLS  SSC SLM SRU
          SPACE  4,10
 FAG      SUBR               ENTRY/EXIT
          LDN    FTRY
          STDL   T1          RETRY COUNTER
 FAG10    LDK    F.GS
          FAN    CHN         ISSUE FUNCTION
          LDC    FTOLEN*1000 LOOP IS ONE MICRO SECOND
 FAG30    IJM    FAG40,CHN
          SBN    1
          SHN    18          NO OP TO LENGTHEN LOOP
          NJN    FAG30       IF TIMEOUT NOT EXPIRED
          DCN    CHN+40B
          SODL   T1          DECREMENT RETRY COUNTER
          ZJN    FAG50       IF UNRECOVERED ERROR
          SBN    FTRY-1
          ADML   FAGDEM
          NJN    FAG10       IF NOT FIRST ERROR OR MESSAGES DISABLED
          LDK    F.GS
          STML   LRS+/RS/P.FUNTO  PUT FUNCTION CODE IN RESPONSE
          CFM    FAG10,CHN
          LDK    /RS/K.LSCEF
          RJM    SSC         SET SYMPTOM CODE
          UJK    FAG10       RETRY FUNCTION

 FAG40    LDML   LRS+/RS/P.FUNTO
          ZJN    FAG60       EXIT IF NO ERRORS
          LDDL   T1
 FAG50    RJM    SRU         SET RECOVERY STATUS
          LDK    /RS/K.LFTO
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDDL   T1
          ZJN    FAG70       IF UNRECOVERED
          RJM    SLM         SEND LOG MESSAGE
          LDN    0
 FAG60    UJK    FAGX        EXIT

 FAG70    LDN    SC.PPD
          STDL   STCHNG
          RJM    SLM         SEND LOG MESSAGE
          LCN    0
          UJK    FAG60       RETURN ERROR

 FAGDEM   CON    0           <> 0, IF ERROR LOGGING IS SUPPRESSED
          SPACE  4,20
**        FAN - FUNCTION AND TIMEOUT ACTIVE CHANNEL
*
*         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 FAILING FUNCTION WAS  RESET THEN DOWN ICA.
*         4. FOR FUNCTION TIMEOUT IN RESET STATE DOWN ICA.
*         5. FOR ALL ICA STATES OTHER THAN RESET THE ICA IS RESET.
*
*
*         ENTRY - (A) = FUNCTION CODE
*
*         EXIT  - (A) = 0, FUNCTION ISSUED, NORMAL COMPLETION
*                 (A) <> 0, FUNCTION TIMEOUT.
*                 (T1) = RETRY COUNTER (=FTRY, IF NO RETRIES NEEDED)
*
*         USES T1
*
*         CALLS  CSC SSC SLM SRU
          SPACE  4,10
 FAN      SUBR               ENTRY/EXIT
          STDL   FUNCD       SAVE FUNCTION CODE
 D.       IFEQ   DEBUG,1
          AOML   HISTINX     INDEX INTO FUNCTION HISTORY TABLE
          LPN    7
          STDL   T1
          LDDL   FUNCD       FUNCTION CODE
          STML   FUNHIST,T1  STORE IN TABLE
          STML   LSTFUNC     LAST FUNCTION CODE SAVED
 D.       ENDIF
          STML   PREFC       SAVE LAST NON GENERAL STATUS FUNCTION CODE
          LDN    FTRY
          STDL   T1          RETRY COUNTER
 FAN10    LDDL   FUNCD
          FAN    CHN         ISSUE FUNCTION
 FAN20    LDC    FTOLEN*1000 LOOP IS ONE MICRO SECOND
 FAN30    IJM    FAN40,CHN
          SBN    1
          SHN    18          NO OP TO LENGTHEN LOOP
          NJN    FAN30       IF TIMEOUT NOT EXPIRED
          LDML   DBUGM
          ZJN    FAN20       IF DEBUG MODE
          DCN    CHN+40B
          TRACE
 D.       IFEQ   DEBUG,1
          AOML   FTOCNT      INCREMENT FUNCTION TIMEOUT COUNTER
 D.       ENDIF
          SODL   T1          DECREMENT RETRY COUNTER
          ZJK    FAN70       IF UNRECOVERED ERROR
          SBN    FTRY-1
          NJN    FAN10       IF NOT FIRST ERROR
*         LDN    0
          STML   FANCEF
          CFM    FAN10,CHN
          LDK    /RS/K.LSCEF
          STML   FANCEF
          UJK    FAN10       RETRY FUNCTION

 FAN40    LDDL   T1
          SBN    FTRY
          ZJN    FAN60       EXIT IF NO ERRORS
          TRACE  (FAN,FUNCD,T1)
          LDDL   T1
 FAN50    RJM    SRU         SET RECOVERY STATUS
          LDK    /RS/K.LFTO
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDML   FANCEF
          RJM    SSC         SET SYMPTOM CODE
          LDDL   FUNCD
          STML   LRS+/RS/P.FUNTO  PUT FUNCTION CODE IN RESPONSE
          RJM    SLM         SEND LOG MESSAGE
          LDDL   STCHNG      STCHNG <> 0 IF ERRORS
 FAN60    UJK    FANX        EXIT

 FAN70    RJM    CSC         CHECK STATE CHANGE
          NJK    FAN60       IF STATE CHANGED
          LDDL   LSTATE
          SBN    ST.IDLE
          PJN    FAN90       IF IDLE OR OPERATIONAL
 FAN80    LDN    SC.PPD
          UJN    FAN100      DOWN ICA

 FAN90    LDC    F.RESET
          SBDL   FUNCD
          ZJN    FAN80       IF RESET FUNCTION
          LDN    SC.PPR      RESET ICA
 FAN100   STDL   STCHNG
          LDN    0
          UJK    FAN50       LOG ERROR

 FANCEF   BSSZ   1           CHANNEL ERROR FLAG
          SPACE  4,10
**        FAW - FUNCTION THE CHANNEL AND WAIT FOR DATA
*
*         ERRORS ENCOUNTERED ACTIVATING THE CHANNEL ARE
*         LOGGED AND A RESET IS REQUESTED.
*
*         ENTRY - (A) = FUNCTION CODE
*
*         EXIT  - (A) = 0, NORMAL COMPLETION - FUNCTION IS ISSUED,
*                          CHANNEL IS ACTIVE AND FULL.
*                 (A) <> 0, FUNCTION TIMEOUT OR CHANNEL ERROR
*
*         USES   NONE
*
*         CALLS  FAN CFE CIE SLM
          SPACE  4,10
 FAW      SUBR               ENTRY/EXIT
          IFEQ   SIM,1
          LDN    0
          UJN    FAWX
          ENDIF
          STML   STBI        SAVE FUNCTION FOR ERROR PROCESSING
          RJM    FAN
          NJN    FAWX        RETURN IF FUNCTION TIMEOUT
          ACN    CHN
          LDC    WTFULL*1000 LOOP = 1 MILLISECOND
 FAW10    IJM    FAW40,CHN
          EJM    FAW30,CHN
          LDN    0
          UJN    FAWX        EXIT - (A) = 0

 FAW30    SBN    1
          NJN    FAW10
          LDC    FAWT-2      TABLE OF OP CODES
          RJM    STB         FIND OPERATION CODE
          RJM    CEE         CHANNEL DID NOT GO FULL
          UJN    FAW50       SEND MESSAGE AND RESET ICA

*         CHANNEL ERROR

 FAW40    LDC    FAWT-2      TABLE OF OP CODES
          RJM    STB         FIND OPERATION CODE
          RJM    CIE         CHANNEL INACTIVE AFTER  ACN
 FAW50    LDN    SC.PPR
          STDL   STCHNG      RESET ICA
          RJM    SLM         SEND LOG MESSAGE
          LDN    1
          UJK    FAWX        EXIT - (A) <> 0
          SPACE  3
*         TABLE EQUATING FUNCTION CODES TO OPERATION CODES
*
 FAWT     CON    F.DUMP,/RS/K.LDM
          CON    F.DS,/RS/K.LRDS
          CON    F.READ,/RS/K.LREAD
          CON    F.RDIAG,/RS/K.LRDC
          CON    F.CHAATC,/RS/K.LCAT
          CON    F.RCC,/RS/K.LRCC
          CON    0
          SPACE  4,10
**        FDR - FIND AND DELINK REQUEST
*
*         THIS ROUTINE SEARCHES THE LINKED LIST OF REQUESTS
*         FOR THE CURRENT REQUEST AND DELINKS IT.
*
*         ENTRY  (A) + (R) = CM ADDRESS OF FIRST REQUEST ON QUEUE
*                WC = 2.
*
          SPACE  4,10
 FDR      SUBR               ENTRY/EXIT
 FDR10    STDL   CM.PPR+1
          SRDL   CM.PPR      SAVE CM ADDRESS
          CRML   PVA,WC      READ NEXT PVA + RMA
          LDML   RMA
          ADML   RMA+1
          ZJN    *           *** IF NOT ON LIST
          LDML   RMA
          SBML   RS+/RS/P.REQ
          NJN    FDR30       IF NOT CURRENT REQUEST
          LDML   RMA+1
          SBML   RS+/RS/P.REQ+1
          ZJN    FDR40       IF REQUEST FOUND
 FDR30    LRML   RMA
          LDML   RMA+1
          SHN    -3
          UJK    FDR10

 FDR40    LRML   RMA
          LDML   RMA+1
          SHN    -3
          CRML   PVA,WC      READ CURRENT REQUEST
          LRDL   CM.PPR
          LDDL   CM.PPR+1
          CWML   PVA,WC      DELINK REQUEST
          UJK    FDRX        EXIT
          IFEQ   BRK,1
          SPACE  4,10
**        FORMA - FORMAT REAL MEMORY ADDRESS.
*
*         ENTRY  (A) = ADDRESS OF RMA.
*
*         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.
*


 FORMA    SUBR               ENTRY/EXIT
          STDL   C1
          LDML   1,C1
          LPN    7
          NJN    *           RMA ADDRESS ERROR, TEMPORARY HALT
          LDIL   C1
          LPN    37B
          SHN    16
          LMML   1,C1
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STDL   CMADR+2
          LDIL   C1
          SHN    -5
          STD    CMADR
          LRD    CMADR
          LDDL   CMADR+2
          LMC    400000B
          UJN    FORMAX
          ENDIF
          SPACE  4,10
**        FRC - FIND RECOVERY COUNTER
*
*         THIS ROUTINE WILL FIND AND RETURN THE ADDRESS OF
*         THE RECOVERY COUNTER FOR THE APPROPRIATE ICA STATE/OPERATION.
*         THE FOLLOWING COUNTERS ARE DEFINED.
*
*         COUNTER            ICA STATE/OPERATION
*         -------            -------------------
*         WRRTY              OPERATIONAL STATE/WRITE OPERATION
*         RDRTY              OPERATIONAL STATE/READ OPERATION
*         ERRR               SET ICA PARAMETERS AND SEND ETHERNET ADDRESS
*
*         ENTRY  (A) = OPERATION TYPE
*
*         EXIT   (A) = ADDRESS OF RECOVERY COUNTER
*
*         USES   NONE
*
*         CALLS  STB
          SPACE  4,10
 FRC      SUBR               ENTRY/EXIT
          STML   STBI        SAVE OPERATION TYPE FOR TABLE SEARCH
          LDC    FRCT-2      TABLE ADDRESS
          RJM    STB         FIND COUNTER
          UJN    FRCX        EXIT
          SPACE  2
 FRCT     CON    /RS/K.LWRT,WRRTY
          CON    /RS/K.LREAD,RDRTY
          CON    /RS/K.LSIP,ERRR
          CON    /RS/K.LSEA,ERRR
          CON    0
 GRB      SPACE  4,22
**        GRB - GET READ BUFFER.
*
*         THIS ROUTINE OBTAINS ENOUGH CM BUFFERS FROM THE BUFFER POOLS TO READ
*         A PDU *TBYTS* LONG.  THE BUFFER LENGTH/ADDRESS PAIRS ARE STORED
*         SEQUENTIALLY IN THE RESPONSE BUFFER.
*
*         PROGRAMMER NOTE -- BUFFERS 2 - N ARE ALLOCATED FIRST.  BUFFER 1 IS
*         ALLOCATED LAST.  THUS, ALL CHECKS FOR THE FIRST BUFFER ARE REALLY
*         CHECKING TO SEE IF THE LAST BUFFER HAS BEEN ALLOCATED.
*
*         ENTRY  (TBYTS) = TOTAL BYTES TO ALLOCATE CM BUFFERS FOR.
*
*         EXIT   (A) = 0, IF NO BUFFERS,
*                    <> 0, IF BUFFERS OBTAINED.
*                (BUFLEN) = LENGTH OF THE FIRST BUFFER IN THE CHAIN.
*                (CML) = 0 = OFFSET TO THE FIRST LENGTH/ADDRESS PAIR.
*                (CMLISTL) = NUMBER OF LENGTH/ADDRESS PAIRS.
*                (CM.CRB) = REFORMATTED FIRST BUFFER ADDRESS IN THE CHAIN.
*                (DATADD) = REFORMATTED FIRST DATA ADDRESS IN FIRST BUFFER.
*
*         USES   T1, T2, T3.
*
*         CALLS  CBP, SBI.


 GRB      SUBR               ENTRY/EXIT
 GRB05    LDN    0           START WITH SMALL BUFFERS
          STDL   FSTBD       INITIALIZE BUFFER POOL INDEX

          LDML   BPDSIZE,FSTBD   1 * BUFFER POOL SIZE
          SHN    1               2 * BUFFER POOL SIZE
          ADML   BPDSIZE,FSTBD   3 * BUFFER POOL SIZE
          SBML   TBYTS       COMPARE REMAINDER WITH SIZE OF 3 SMALL BUFFERS
          MJN    GRB20       IF 3 BUFFERS ARE NOT LARGE ENOUGH
 GRB10    RJM    CBP         CHECK IF BUFFERS IN POOL
          NJN    GRB50       IF BUFFER AVAILABLE

 GRB20    AODL   FSTBD
          SBML   NUMBP
          MJN    GRB10       IF MORE POOLS TO LOOK AT

*         EXIT SINCE ALL POOLS ARE EMPTY.

          LDN    0
 GRB30    UJK    GRBX        EXIT - (A) = 0, NO BUFFERS

*         ADD BUFFER TO BUFFER LIST.

 GRB50    BSS    0
          IFEQ   DEBUG,1
          AOML   BUFCNT,FSTBD    TOTAL NUMBER OF CM BUFFERS USED
          ENDIF

          AODL   CMLISTL     INCREMENT FOR A NEW LENGTH/ADDRESS PAIR
          LDML   BPDSIZE,FSTBD   BUFFER POOL SIZE
          SBML   TBYTS       COMPARE WITH REMAINING BYTES
          MJN    GRB60       IF NOT FIRST BUFFER

*         INITIALIZE FOR FIRST BUFFER.

          LDN    0
          STML   CML
          STDL   T1          OFFSET TO LENGTH/ADDRESS PAIR IN RESPONSE BUFFER
          UJN    GRB70

*         INITIALIZE FOR ALL OTHER BUFFERS.

 GRB60    BSS    0
          ERRNZ  4-C.BP*2    BUFFER POOL (SIZE) DEPENDENCY ERROR
          LDN    4
          RAML   CML
          STDL   T1          OFFSET TO LENGTH/ADDRESS PAIR IN RESPONSE BUFFER
          SBN    MAXRS*4-/RS/C.BUFPVA*4   COMPARE WITH MAXIMUM RESPONSE LENGTH
          PJN    *           IF BEYOND END OF THE RESPONSE BUFFER

*         UPDATE ADDRESS (PVA) IN LENGTH/ADDRESS PAIR OF RESPONSE BUFFER.

 GRB70    BSS    0
          LDN    0
          STDL   T3          NO PVA YET
          LDN    3
          STDL   T2          HIGH PORTION OF BUFFER POOL PVA ADDRESS (1..3)
          RADL   T1          HIGH PORTION OF LENGTH/ADDRESS FIELD IN RESPONSE

 GRB75    BSS    0
          LDML   BP+/BP/P.PVA-1,T2   BUFFER POOL PVA ADDRESS FIELD
          STML   RS+/RS/P.BUFPVA-1,T1   RESPONSE PVA ADDRESS FIELD
          RADL   T3          INCLUDE A PVA FIELD
          SODL   T1          OFFSET TO NEXT PORTION OF LENGTH/ADDRESS FIELD
          SODL   T2          OFFSET TO NEXT PORTION OF BUFFER POOL PVA ADDRESS
          NJK    GRB75       IF MORE TO DO
          LDDL   T3          ALL PVA FIELDS
          ZJN    *           IF BAD PVA

*         UPDATE CONTAINER RMA TABLE.

          ERRNZ  4-C.BP*2    BUFFER POOL (SIZE) DEPENDENCY ERROR
          LDDL   T1          OFFSET TO LENGTH/ADDRESS PAIR IN RESPONSE BUFFER
          SHN    -1          CONVERT TO CONTAINER RMA TABLE INDEX
          STDL   T2
          LDML   BP+/BP/P.RMA   UPPER PART OF BUFFER POOL CONTAINER RMA ADDRESS
          STML   BPRMA,T2    MOVE TO CONTAINER RMA TABLE
          STDL   T3          INCLUDE A RMA FIELD
          LDML   BP+/BP/P.RMA+1   LOWER PART OF BUFFER POOL CONTAINER RMA ADDRESS
          STML   BPRMA+1,T2    MOVE TO CONTAINER RMA TABLE
          RADL   T3          INCLUDE A RMA FIELD
          ZJN    *           IF BAD RMA

*         UPDATE DATA LENGTH IN LENGTH/ADDRESS PAIR OF RESPONSE BUFFER.

          LDML   BPDSIZE,FSTBD   LENGTH OF BUFFER POOL BUFFER
          STML   RS+/RS/P.DLEN,T1   RESPONSE BUFFER LENGTH FIELD
          STML   FBSIZE      MAXIMUM SIZE OF FIRST BUFFER (WHEN LOOP IS DONE)
          LDML   TBYTS       REMAINING BYTES
          SBML   FBSIZE      COMPARE WITH MAXIMUM SIZE OF BUFFER
          PJN    GRB80       IF MORE TO ALLOCATE

*         ALL BUFFERS HAVE BEEN ALLOCATED.  CALCULATE THE CORRECT BUFFER SIZE
*         FOR THE FIRST BUFFER.

          LDML   TBYTS       REMAINING BYTES
          STML   RS+/RS/P.DLEN   FIRST BUFFER SIZE (BYTES USED IN BUFFER)
          LDN    0           NO BYTES LEFT TO BE ALLOCATED FOR

 GRB80    STML   TBYTS       UPDATE TOTAL BYTES TO ALLOCATE CM BUFFERS FOR
          NJK    GRB05       IF MORE TO ALLOCATE
          RJM    SBI         INITIALIZE BUFFER POINTERS
          UJK    GRBX        EXIT
          EJECT
**        GST - GENERAL STATUS.
*
*         THIS ROUTINE OBTAINS THE ICA GENERAL STATUS, AND WAITS FOR BUSY
*         TO CLEAR. THE WAIT FOR BUSY IS EQUAL TO *GSBUSY* MILLISECONDS.
*
*
*         THE FOLLOWING TABLE DEFINES THE ERRORS DETECTED AND THE
*         RECOVERY ACTION TAKEN FOR EACH ERROR.
*
*          ENTRY STATE\ERROR  1   2   3   4   5   6   7
*         +-----------------+---+---+---+---+---+---+---+
*         | RESET           |   |   | D | F | F | F | F |
*         +-----------------+---+---+---+---+---+---+---+
*         | DIAGNOSTICS     | A | C | D | F | F | F | F |
*         +-----------------+---+---+---+---+---+---+---+
*         | IDLE            | A | C | D | F | F | F | F |
*         +-----------------+---+---+---+---+---+---+---+
*         | OPERATIONAL     | A | C | D | F | F | F | F |
*         +-----------------+---+---+---+---+---+---+---+
*         | 77B             |   |   | E | F | F | F | F |
*         +-----------------+---+---+---+---+---+---+---+
*
*
*                           ERROR TYPES
*         1.  ICA INITIATED STATE CHANGE TO RESET.
*         2.  ICA INITIATED STATE CHANGE TO OTHER THAN RESET.
*         3.  BUSY TIMEOUT.
*         4.  CHANNEL DISCONNECT.
*         5.  GENERAL STATUS UNAVAILABLE TIMEOUT.
*         6.  FUNCTION TIMEOUT.
*         7.  CHANNEL PARITY ERROR.
*
*
*                           RECOVERY ACTIONS
*         A. RESET ICA
*         C. RESET ICA, LOG INVALID STATE TRANSITION
*         D. RESET ICA, LOG GENERAL STATUS BUSY TIMEOUT
*         E. RETURN WITH (A) NEGATIVE
*         F. RETRY UP TO TWO MORE TIMES IF UNSUCCESSFUL DOWN ICA,
*            LOG ERROR
*
*         ENTRY  BUSYMP = # OF TIMES TO MULTIPLY NORMAL WAIT FOR NOT BUSY
*                LSTATE = LAST KNOWN STATE OF ICA. USED TO DETERMINE IF
*                         THE ICA CHANGED STATES.
*                         IF LSTATE = 77B DONT CHECK STATE CHANGE OR LOG
*                         BUSY TIMEOUT. THIS WILL BE DONE BY CALLER.
*
*         EXIT   (A) = 0, IF NO ERRORS
*                    <> 0, IF ERROR
*                    < 0  IF BUSY TIMEOUT NOT LOGGED
*                GNSTAT = GENERAL STATUS IF NO ERRORS
*
*         USES   T1 T2 T7 P6
*
*         CALLS  FAG SIU SEI SOT SSC SLM BTE
*
          SPACE  4,10

 GST      SUBR               ENTRY/EXIT
          IFEQ   SIM,1
          LDC    1600B
 STAT     EQU    *-1
          STDL   GNSTAT
          LDN    0
          UJK    GSTX
          ENDIF
          LDN    0
          STDL   P6          SET ERRORS TO ZERO
          LDN    FTRY
          STDL   T7          RETRY COUNTER
 GST10    RJM    FAG         FUNCTION FOR GENERAL STATUS
          NJN    GSTX        IF FUNCTION TIMEOUT OR OTHER ERROR
          ACN    CHN
          LDDL   BUSYMP
          STDL   T2
          LDC    GSBUSY*250  SET BUSY TIMER
          STDL   T8

 GST25    LDC    GSFULL*1000 WAIT FOR FULL
 GST30    AJM    GST40,CHN   IF CHANNEL ACTIVE
          LDK    /RS/K.LSCD  LOG CHANNEL NOT ACTIVE
          UJK    GST90       RETRY IF NOT UNRECOVERED

 GST40    FJM    GST50,CHN   IF CHANNEL FULL
          SBN    1
          NJN    GST30       IF NOT TIMED OUT
          LDN    /RS/K.LGSAT
          STML   LRS+/RS/P.ERRID
          LDML   PREFC
          STML   LRS+/RS/P.PFUNC SAVE PREVIOUS FUNCTION CODE
          UJK    GST100      LOG ERROR AND CHECK RECOVERY STATUS

 GST50    IAN    CHN+40B     INPUT STATUS
          IJM    GST30,CHN   IF CHANNEL INACTIVE
          CFM    GST70,CHN   IF NO CHANNEL ERROR
          LDK    /RS/K.LSCEF LOG CHANNEL ERROR
          UJK    GST90       RETRY IF NOT UNRECOVERED

 GST70    STDL   GNSTAT      SAVE STATUS
          RJM    MSC         MONITOR STATE CHANGE
          ZJN    GST85       STATE DID NOT CHANGE
          DCN    CHN+40B     DISCONNECT
          LDN    1           SET ERROR STATUS
          UJK    GSTX        ERROR EXIT

 GST85    LDDL   GNSTAT
          SHN    17-S.BUSY
          MJK    GST110      IF ICA BUSY
          DCN    CHN+40B
          LDN    0
          UJK    GSTX        EXIT NO ERRORS

*         ERROR ENCOUNTERED READING STATUS
*         DETERMINE RECOVERY ACTION AND LOG ERROR

 GST90    RJM    SSC         SET SYMPTOM CODE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LRGS
          STML   LRS+/RS/P.OPTP   STORE OPERATION TYPE
 GST100   SODL   T7          ENTERED HERE IF NOT AVAILABLE
          RJM    SIU         SET RESPONSE STATUS
          DCN    CHN+40B
          LDDL   T7
          NJN    GST105      IF NOT UNRECOVERED
          LDN    SC.PPD
          STDL   STCHNG
 GST105   RJM    SLM         SEND LOG MESSAGE
          LDDL   STCHNG
          ZJK    GST10       RETRY GENERAL STATUS
          UJK    GSTX        ELSE EXIT WITH ERROR

*         BUSY STILL SET, CHECK IF TIMEOUT OCCURED
*         AND RETURN ERROR IF SO

 GST110   LDML   DBUGM
          ZJK    GST25       IF DEBUG MODE
          SODL   T8          TIMEOUT COUNTER
          NJK    GST25       IF NOT TIMEOUT CONTINUE
          LDC    GSBUSY*250
          STDL   T8          RESET TIMER
          TRACE  (GST,GNSTAT)
          SODL   T2          CHECK IF MULTIPLE LOOPS
          NJK    GST25       IF SO CONTINUE
          DCN    CHN+40B     DISCONNECT CHANNEL
          LDDL   LSTATE
          SHN    12
          MJK    GSTX        EXIT IF NOT LOGGING BUSY
          LDN    SC.PPR
          STDL   STCHNG      RESET ICA
          RJM    BTE         LOG BUSY TIMEOUT
          LDN    1
          UJK    GSTX        EXIT WITH ERRORS
 ILR      SPACE  4,10
**        ILR - INITIALIZE LOG RESPONSE.
*
*         INITIALIZE THE BUFFER FOR SENDING LOG RESPONSES.
*
*         USES   T9
          SPACE  4,10
 ILR      SUBR               ENTRY/EXIT
          LDN    P.RS
          STDL   T9
 ILR10    LDN    0
          STML   LRS,T9
          SODL   T9
          PJN    ILR10       IF MORE TO CLEAR
          LDML   DEVID
          STML   LRS+/RS/P.DEVID
          LDN    REC.U
          STML   LRS+/RS/P.RETSUC
          UJN    ILRX        EXIT
 IOS      SPACE  4,16
**        IOS - INITIALIZE OPERATIONAL STATE
*
*         INITIALIZE THE DRIVER FOR OPERATIONAL STATE BY
*         DETERMINING THE PROPER RECORD TYPE TO BE READ.
*         IF OPERATIONAL STATE AND OSI MODE ALSO SEND THE
*         PROPER FLOW CONTROL FUNCTION.
*
*         ENTRY  (OSOSI) = 1, IF OPERATIONAL
*                (GFCFC) = FLOW CONTROL FUNCTION TO SEND IF OSI MODE
*
*         EXIT   (A) = 0, IF NO ERRORS
*                    <> 0, IF ERRORS
*                (HDRTYP) = ADDRESS OF TABLE DESCRIBING HEADER
*
*         CALLS  FAN
          SPACE  4,10
 IOS10    LDN    0
          STML   RDRTY
          LDC    TCNH
 IOS30    STDL   HDRTYP      SAVE POINTER TO HEADER DESCRIPTOR
          LDN    0

 IOS      SUBR               ENTRY/EXIT
          LDN    0
          STDL   STCHNG
          LDML   OSOSI
          ZJN    IOS10       IF NOT OPERATIONAL
          LDML   GFCFC
          RJM    FAN         FUNCTION FOR FLOW CONTROL
          NJN    IOSX        EXIT IF ERRORS
          RJM    GST         WAIT FOR BUSY
          NJN    IOSX        EXIT IF ERRORS
          LDC    TCCH
          UJN    IOS30       CONTINUE

 MDC      SPACE  4,16
**        MDC - MOVE DATA TO CM.
*
*         THIS ROUTINE TRANSFERS DATA FROM THE PP I/O BUFFER
*         TO CM.
*
*         ENTRY  (RDCNT) = REMAINING FREE BYTES IN CM BUFFER (CM BYTES).
*                (BYTCNT) = NUMBER OF BYTES IN PP BUFFER.
*
*         EXIT   (A) = 0, IF DATA MOVE COMPLETE,
*                    <> 0, IF UNABLE TO MOVE DATA TO CM,
*                PP BUFFER EMPTY.
*                BYTE COUNT FIELD IN CM BUFFER UPDATED.
*
*         USES   T1, WC.
*
*         CALLS  SBI, SDB.
*
*         MACROS LOADC.


 MDC      SUBR               ENTRY/EXIT
          LDDL   BYTCNT      NUMBER OF BYTES IN PP BUFFER
          STDL   BYTS        NUMBER OF BYTES TO TRANSFER TO CM
          ZJN    MDCX        EXIT - IF NO DATA TRANSFERRED

 MDC10    BSS    0
          LDML   RDCNT       SPACE IN CM BUFFER
          NJN    MDC20       IF BUFFER NOT EMPTY
          AOML   CML         NEXT LENGTH/ADDRESS PAIR
          RJM    SBI         INITIALIZE FOR NEXT BUFFER
          LDML   RDCNT       SPACE IN CM BUFFER

 MDC20    BSS    0
          SBDL   BYTS        BYTES IN PP BUFFER
          PJN    MDC30       IF ROOM IN CM BUFFER FOR ALL
          LDML   RDCNT
          UJN    MDC40

 MDC30    BSS    0
          LDDL   BYTS

 MDC40    STML   BWRT        BYTES TO WRITE TO CM
          IFEQ   DRTYP,1     IF MDI
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          ZJN    MDC45       IF OPERATIONAL STATE
          ENDIF

          LDML   CML         LENGTH/ADDRESS PAIR OFFSET (ENTRY)
          ZJN    MDC41       IF FIRST BUFFER (IF FIRST LENGTH/ADDRESS PAIR)
          LDN    0           NO MORE BYTES OFF WORD BOUNDARY
          UJN    MDC45

 MDC41    BSS    0
          LDML   RS+/RS/P.XFER+1   LENGTH OF DATA (CM BYTES)
          LPN    1           ODD/EVEN
          ZJN    MDC43       IF EVEN NUMBER OF BYTES
          RJM    SDB         SHIFT DATA BUFFER

 MDC43    BSS    0
          LDML   RS+/RS/P.XFER+1   LENGTH OF DATA (CM BYTES)
          LPN    7
          ZJN    MDC45       IF PDU SIZE IS AN EXACT MULTIPLE OF CM WORDS
          STDL   T1          NUMBER OF BYTES OFF OF THE WORD BOUNDARY
          LDN    8           CM BYTES PER CM WORD
          SBDL   T1          TAKE AWAY CM BYTES THAT ARE OFF OF THE WORD BOUNDARY

 MDC45    BSS    0
          SHN    -1          CONVERT FROM CM BYTES TO PP WORDS
          STDL   T1          NUMBER OF EXTRA CM BYTES NEEDED FOR A WORD BOUNDARY
          LDDL   BYTCNT      NUMBER OF BYTES IN PP BUFFER
          SBDL   BYTS        ADJUST BY BYTES REMAINING IN PP BUFFER
          ADN    1           ADJUST FOR POSSIBLE ODD PDU SIZE
          SHN    -1          CONVERT FROM CM BYTES TO PP WORDS
          ADC    IOBUF
          SBDL   T1          ADJUST FOR BYTES NOT ON A WORD BOUNDARY
          STML   MDCW

          LDML   BWRT
          ADN    7
          SHN    -3
          STDL   WC          WORDS TO WRITE TO CM
          IFEQ   DRTYP,1     IF MDI
          LOADC  DATADD
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRDL   DATADD
          LDDL   DATADD+1
          ENDIF
          CWML   IOBUF,WC
 MDCW     EQU    *-1
          IFEQ   DRTYP,1     IF MDI
          STDL   DATADD+2  UPDATE CM BUFFER ADDRESS
          ENDIF
          LDML   RDCNT
          SBML   BWRT
          STML   RDCNT       UPDATE REMAINING CM BUFFER SPACE
          LDDL   BYTS
          SBML   BWRT
          STDL   BYTS        UPDATE REMAINING BYTES IN PP
          ZJN    MDC50       IF PP BUFFER EMPTY
          UJK    MDC10

 MDC50    BSS    0
          UJK    MDCX        EXIT
          SPACE  4,10
**        MLE - MESSAGE LENGTH ERROR.
*
*         THIS ROUTINE WILL LOG A MESSAGE LENGTH VERIFICATION ERROR OR
*         MAXIMUM LENGTH EXCEEDED ERROR. IT ALSO DESCONNECTS THE CHANNEL
*         AND RETURNS ANY BUFFERS WHICH MAY HAVE BEEN ASSIGNED.
*
*         ENTRY  (A)= SYMPTOM CODE
*
*         EXIT   (A) > 0
*
*         USES   T9
*
*         CALLS  PAUS SLM SSC USR
          SPACE  4,10
 MLE      SUBR               ENTRY/EXIT
          RJM    SSC         SET SYMPTOM CODE
          TRACE
          LDK    /RS/K.LOF   STORE ERROR ID
          STML   LRS+/RS/P.ERRID
          LDK    /RS/K.LREAD  STORE OPERATION TYPE
          STML   LRS+/RS/P.OPTP
          LDN    3
          STDL   T9
 MLE10    LDML   EXPD,T9     MOVE EXPECTED/ACTUAL
          STML   LRS+/RS/P.EXPD,T9
          SODL   T9
          PJN    MLE10       IF NOT DONE
          LDN    SC.PPR      RESET ICA
          STDL   STCHNG
          DCN    CHN+40B
          LDC    5000
          RJM    PAUS        PAUSE AFTER DISCONNECT
          RJM    SLM         SEND LOG MESSAGE
          UJK    MLEX        EXIT
          SPACE  4,20
**        MSC - MONITOR STATE CHANGE
*
*         THIS ROUTINE MONITORS THE ICA STATUS AND RETURNS AN ERROR IF
*         THE ICA STATE IS NOT WHAT IS EXPECTED.
*
*         ENTRY  LSTATE = LAST KNOWN STATE OF ICA. USED TO DETERMINE IF
*                         THE ICA CHANGED STATES.
*                         IF LSTATE = 77B DONT CHECK STATE CHANGE
*                         THIS WILL BE DONE BY CALLER.
*
*                GNSTAT = ICA GENERAL STATUS
*
*
*         EXIT   (A) = 0, IF NO ERRORS
*                   <> 0, IF ERROR
*
*         USES   T10
*
*         CALLS  SEI SLM
*
          SPACE  4,10

 MSC      SUBR               ENTRY/EXIT
          LDDL   LSTATE
          SBN    77B
          ZJN    MSCX        DONT CHECK STATE
          LDDL   GNSTAT
          SHN    -S.SB1
          LPN    3
          STDL   T10
          SBDL   LSTATE
          ZJN    MSCX        ICA DIDNT CHANGE STATES
          TRACE  (MSC,GNSTAT,LSTATE)
          LDDL   T10         GET STATE
          NJN    MSC10       NOT IN RESET STATE
          LDN    SC.ICA
          STDL   STCHNG      RESET INITIATED BY ICA
          UJK    MSCX        EXIT WITH ERROR

 MSC10    LDML   OSI,ICATDDP
          ZJN    MSC20       IF NOT OSI MODE
          LDDL   T10
          LMN    ST.OPER
          NJN    MSC20       IF NOT OPERATIONAL
          LDDL   LSTATE
          LMN    ST.IDLE
          NJN    MSC20       IF NOT CHANGE FROM IDLE
          LDDL   GNSTAT
          SHN    -S.SS1
          LPN    SSMASK
          LMN    OSS.WPN
          NJN    MSC20       IF NOT WAITING FOR PROTOCOL NEGOTIATION
          LDN    SC.OPER
          STDL   STCHNG
          UJK    MSCX        EXIT

 MSC20    LDN    SC.PPR
          STDL   STCHNG      INITIATE A PP RESET
          LDDL   T10
          STML   LRS+/RS/P.CURST LOG CURRENT STATE
          LDDL   LSTATE
          STML   LRS+/RS/P.PREST LOG PREVIOUS STATE
          LDK    /RS/K.LIVST
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          RJM    SLM         SEND LOG RESPONSE
          LDN    1
          UJK    MSCX        EXIT
          SPACE  4,10
**        PAUS - PAUSE.
*
*         DELAY PROGRAM EXECUTION FOR A SPECIFIED NUMBER OF MICROSECONDS.
*
*         ENTRY  (A) = NUMBER OF MICROSECONDS TO BE DELAYED.
*
*         USES   T9.
          SPACE  4,10
 PAUS     SUBR               ENTRY/EXIT
          IFEQ   SIM,1
          UJN    PAUSX
          ENDIF
 PAUS10   SBN    1           EACH ITERATION OF THIS SBN-LJM LOOP
          STDL   T9          EQUALS ONE MICRO SECOND
          ZJN    PAUSX       IF TIME EXPIRED
          ZJN    PAUSX       NEEDED TO EXTEND LOOP
          LJM    PAUS10
          SPACE  4,10
**        QPR - ISSUE QUEUE PREVIOUS READ
*
*         THIS ROUTINE IS CALLED WHEN A READ ERROR HAS BEEN DETECTED
*         BY THE PP. THE QUEUE PREVIOUS READ IS ISSUED TO NOTIFY
*         THE ICA TO RESEND THIS MESSAGE ON THE NEXT READ.
*
*         ENTRY  NONE
*
*         EXIT   (A) = 0 IF NO ERRORS
*                  <> 0 IF ERRORS
*
*         USES   NONE
*
*         CALLS  FAN ERR SSC
          SPACE  4,10
 QPR      SUBR               ENTRY/EXIT
          LDN    FTRY
          STML   ERRR        RESET RETRY COUNTER
 QPR10    LDN    F.QPREAD    QUEUE PREVIOUS READ
          RJM    FAN
          NJN    QPRX        EXIT IF FUNCTION TIMEOUT
          RJM    GST         GET GENERAL STATUS
          NJN    QPRX        IF GST ERROR EXIT
          LDDL   GNSTAT
          SHN    17-S.GE
          MJK    QPR20       IF ERRORS
          LDN    0
          UJK    QPRX        IF NO ERRORS

 QPR20    RJM    DST         GET DETAILED STATUS
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    /RS/K.LQPM
          STML   LRS+/RS/P.OPTP
          LDN    /RS/K.LOF
          STML   LRS+/RS/P.ERRID
          LDK    /RS/K.LSGSE
          RJM    SSC         LOG GENERAL STATUS ERROR
          SOML   ERRR
          RJM    SIU         SET RETRY SUCCESS
          RJM    SLM         SEND LOG MESSAGE
          LDDL   STCHNG
          NJK    QPRX        EXIT IF STATE CHANGING
          LDML   ERRR
          NJK    QPR10       IF MORE RETRY S
          LDDL   SC.PPR
          STDL   STCHNG      RESET ICA
          UJK    QPRX        EXIT
          SPACE  4,10
**        RBE - RESET BUSY TIMEOUT
*
*         THIS ROUTINE LOGS A RESET BUSY TIMEOUT ERROR
*
*         ENTRY  NONE
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  SEI IGS SLM
          SPACE  4,8
 RBE      SUBR               ENTRY/EXIT
          LDK    /RS/K.LRBTO
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          UJN    RBEX        EXIT
 RCP      SPACE  4,10
**        RCP -  READ CHANNELNET PDU.
*
*         THIS ROUTINE READS THE REMAINDER OF A CHANNELNET PDU (THE HEADER
*         HAS ALREADY BEEN READ IN) AND FORWARDS THE ENTIRE PDU TO THE
*         PRE-ALLOCATED CM BUFFERS.
*
*         ENTRY  (/HD/P.HLB) = SIZE OF HEADER ALREADY READ (CM BYTES)
*                (BYTCNT) = NUMBER OF BYTES IN PP BUFFER.
*                (TCHFR) = TOTAL CHANNEL FRAMES TO BE READ
*                (IOBUF) CONTAINS THE HEADER ALREADY READ
*
*         EXIT   (A) = 0, IF NO ERRORS
*                    <> 0, IF ERRORS
*                THE PDU IS COPIED TO THE PRE-ALLOCATED CM BUFFERS
*
*         CALLS  ERR, MDC.
          SPACE  4,10
 RCP80    BSS    0
          STML   ERRCNT      SAVE WORDS NOT READ
          LDK    /RS/K.LREAD
          RJM    ERR         PROCESS ERROR

 RCP      SUBR               ENTRY/EXIT
          LDML   /HD/P.HLB,HDRTYP  LENGTH OF HEADER READ IN BYTES
          SHN    -1          OFFSET OF NEXT LOCATION TO FILL (PP WORDS)
          ADK    IOBUF       FWA OF NEXT AVAILABLE LOCATION IN THE PP BUFFER
          STML   RCPA

          LDML   TCHFR       CHANNEL FRAMES LEFT TO TRANSFER
          IAM    IOBUF,CHN   READ THE REST OF THE PDU
 RCPA     EQU    *-1
          NJK    RCP80       IF NOT ALL READ
          LDDL   BYTCNT      TOTAL NUMBER OF CM BYTES READ IN
          STML   RS+/RS/P.XFER+1  UPDATE BYTES READ IN RESPONSE
          RJM    MDC         MOVE DATA TO CM
          UJK    RCPX        EXIT
          SPACE  4,10
**        RRH -  READ RECORD HEADER.
*
*         THIS ROUTINE READS A PDU HEADER AND OBTAINS THE REQUIRED BUFFERS
*         TO COMPLETE THE READ. CHANNELNET AND CHANNEL CONNECTION HEADERS
*         ARE WRITTEN TO THE CM BUFFERS. ICA-1 FORMAT HEADERS ARE NOT
*         PASSED TO THE CPU.
*
*         ENTRY  (NXTREC) = 0, IF RECORD LENGTH NOT KNOWN
*                         = RECORD LENGTH IF KNOWN AND BUFFERS ALLOCATED
*
*         EXIT   (A) = 0, IF NO ERRORS
*                    > 0, IF ERRORS
*                    < 0, IF BUFFERS ARE NOT AVAILABLE
*                (BUFLEN) = UNUSED PP WORDS IN FIRST BUFFER
*                (CM.CRB) = RMA OF CURRENT READ BUFFER
*                (DATADD) = RMA OF NEXT UNUSED WORD OF BUFFER
*                (EBYOFF) = 0, IF EVEN NUMBER OF BYTES IN RECORD
*                           1, IF ODD NUMBER OF BYTES IN RECORD
*                (EXPD) = LENGTH OF RECORD IN BYTES
*                (TCHFR) = TOTAL CHANNEL FRAMES TO READ
*                (RDCNT) = UNUSED BYTES IN FIRST BUFFER
*
*         USES   CML, P1 - P4, T2, T6, WC.
*
*         CALLS  ERR, GRB, GST, PAUS, QPR, SBI, USR.
          SPACE  4,10
 RRH70    STML   ERRCNT      SAVE WORDS NOT READ
          LDK    /RS/K.LREAD
          RJM    ERR         PROCESS ERROR
          UJN    RRHX        EXIT

 RRH80    DCN    CHN+40B     DISCONNECT
          LDML   ACTD+1
          STML   NXTREC
          TRACE
          LDC    5000
          RJM    PAUS        WAIT BEFORE GETTING STATUS
          RJM    GST         WAIT FOR BUSY
          NJN    RRH90       IF ERRORS
          RJM    QPR         QUEUE PREVIOUS READ
 RRH90    BSS    0
          LCN    0

 RRH      SUBR               ENTRY/EXIT
          LDN    4
          STDL   T6
 RRH10    LDN    0
          STML   EXPD-1,T6   CLEAR EXPECTED/ACTUAL
          SODL   T6
          NJN    RRH10       IF NOT DONE
          LDML   /HD/P.HLB,HDRTYP  LENGTH OF HEADER READ IN BYTES
          STML   EXPD+1
          SHN    -1
          IAM    IOBUF,CHN   READ HEADER
          NJK    RRH70       IF NOT ALL READ
          TRACE  (IOBUF,IOBUF+1,EXPD+1,ICATDDP,HDRTYP)
          LDML   /HD/P.ALF,HDRTYP  ADDRESS OF LENGTH FIELD
          STDL   T6

          LDML   0,T6
          ADML   /HD/P.ATL,HDRTYP  ADD HEADER LENGTH IF NOT INCLUDED
          STML   TBYTS       TOTAL BYTES IN RECORD
          STDL   BYTCNT
          STML   ACTD+1
          SBML   /HD/P.MRS,HDRTYP
          ZJN    RRH55       IF LENGTH = MAXIMUM
          MJN    RRH55       IF LENGTH < MAXIMUM
          LDC    /RS/K.LSMSE
          RJM    MLE         LOG MAXIMUM LENGTH EXCEEDED
          UJK    RRHX        EXIT

 RRH55    LDML   NXTREC
          NJN    RRH60       IF PREALLOCATED
          RJM    GRB         GET BUFFERS
          ZJK    RRH80       IF BUFFERS NOT AVAILABLE
          LDML   ACTD+1
          STML   TBYTS
          STML   NXTREC
 RRH60    SBML   TBYTS
          ZJN    RRH65       IF LENGTH OK
          LDML   NXTREC
          STML   EXPD+1
          LDC    /RS/K.LSMLV
          RJM    MLE         LOG MESSAGE VERIFICATION ERROR
          UJK    RRHX        EXIT

 RRH65    LDML   TBYTS
          LPN    1
          STML   EBYOFF      EVEN/ODD ENDING BYTE
          LDML   TBYTS       RECORD LENGTH
          STML   EXPD+1
          SBML   /HD/P.HLC,HDRTYP  MINUS BYTES WRITTEN TO CM
          ADN    1           ROUND TO EVEN BYTE
          SHN    -1          CONVERT TO CHANNEL FRAMES
          STML   TCHFR
          LDML   /HD/P.HLC,HDRTYP
          STML   ACTD+1
          ZJK    RRHX        EXIT IF HEADER NOT TRANSFERED TO CM
          SHN    -3
          STDL   WC
          SHN    3
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES READ IN RESPONSE
          LDML   OSOSI
          ZJK    RRHX        EXIT IF NOT OPERATIONAL

*         FILL FIRST BUFFER WITH AS MUCH OF THE HEADER AS IT CAN HOLD.

          LDK    IOBUF       FWA OF FIRST PART OF HEADER IN THE PP BUFFER
          STML   RRHA

          LDML   RS+/RS/P.DLEN   LENGTH OF FIRST BUFFER (CM BYTES)
          ADN    7           ROUND UP
          SHN    -3          CONVERT TO CM WORDS
          STDL   T2          LENGTH OF FIRST BUFFER (CM WORDS)
          LDDL   WC          LENGTH OF HEADER TO BE WRITTEN TO CM (CM WORDS)
          SBDL   T2          LENGTH OF FIRST BUFFER (CM WORDS)
          ZJN    RRH68       IF IT WILL ALL FIT IN THE FIRST BUFFER
          MJN    RRH68       IF IT WILL ALL FIT IN THE FIRST BUFFER
          STDL   WC          REMAINDER (FOR THE SECOND BUFFER)

          LRDL   DATADD      LOAD R UPPER FOR THE FIRST BUFFER FIRST DATA WORD
          LDDL   DATADD+1
          CWML   IOBUF,T2    WRITE FIRST PART OF HEADER TO FIRST BUFFER

          LDDL   T2          OFFSET TO SECOND PART OF HEADER (CM WORDS)
          SHN    2           OFFSET TO SECOND PART OF HEADER (PP WORDS)
          ADK    IOBUF       FWA OF SECOND PART OF HEADER IN THE PP BUFFER
          STML   RRHA

          AODL   CML         NEXT BUFFER
          RJM    SBI         SET BUFFER INFORMATION

*         FILL THE BUFFER WITH THE REMAINDER OF THE HEADER.

 RRH68    BSS    0
          LRDL   DATADD      LOAD R UPPER
          LDDL   DATADD+1
          CWML   IOBUF,WC    WRITE HEADER TO BUFFER
 RRHA     EQU    *-1         STARTING ADDRESS ROUNDED BACK TO A WORD BOUNDARY
          STDL   DATADD+1
          LDDL   WC          SIZE OF THE REMAINDER OF THE HEADER (CM WORDS)
          SHN    2
          STDL   T6          SAVE PP WORD COUNT
          LDDL   BUFLEN
          SBDL   T6
          STDL   BUFLEN      UPDATE BUFFER LENGTH
          LDML   RDCNT
          SBML   /HD/P.HLC,HDRTYP
          STML   RDCNT       UPDATE BYTES IN BUFFER
          LDN    0
          UJK    RRHX        EXIT
          SPACE  4,10
**        RSE - RESET STATUS ERROR
*
*         THIS ROUTINE LOGS A RESET STATUS ERROR
*
*         ENTRY  NONE
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  SEI IGS SSC SLM
          SPACE  4,10
 RSE      SUBR               ENTRY/EXIT
          LDK    /RS/K.LODF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDK    /RS/K.LSGSE
          RJM    SSC         SET SYMPTOM CODE
          LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          UJN    RSEX        EXIT
 SBI      SPACE  4,14
**        SBI - SET BUFFER INFORMATION.
*
*         THIS ROUTINE WILL INITIALIZE BUFFER POINTERS
*         USED TO MOVE DATA TO CENTRAL MEMORY.
*
*         ENTRY  (BPRMA)  = BUFFER POOL BUFFER RMA TABLE.
*                (CML)    = OFFSET TO THE LENGTH/ADDRESS PAIR (TO SET BUFFER
*                           INFORMATION FOR).
*                (FBSIZE) = MAXIMUM SIZE OF FIRST BUFFER POOL BUFFER.
*
*         EXIT   (DATADD) = REFORMATTED BUFFER FIRST DATA ADDRESS.
*                (RDCNT) = LENGTH OF BUFFER (CM BYTES).
*                (BUFLEN) = LENGTH OF BUFFER (PP WORDS).
*                (A) = LENGTH OF BUFFER (PP WORDS).
*
*         USES   T2, T3, T4.
*
*         MACRO  LOADF.


 SBI      SUBR               ENTRY/EXIT
          LDML   CML         LENGTH/ADDRESS PAIR OFFSET (ENTRY)
          SHN    1
          STDL   T2          BUFFER RMA TABLE OFFSET
          SHN    1
          STDL   T3          LENGTH/ADDRESS PAIR OFFSET (PP WORDS)

          IFEQ   DRTYP,1     IF MDI
          LOADF  BPRMA,T2    RMA OF BUFFER POOL BUFFER
          SRD    DATADD      SAVE R REQISTER
          STDL   DATADD+2    OFFSET OF FIRST DATA WORD
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   BPRMA,T2    RMA OF BUFFER POOL BUFFER
          LDML   BPRMA+1,T2
          SHN    -3
          SRDL   DATADD      SAVE R REGISTER
          STDL   DATADD+1    OFFSET OF FIRST DATA WORD
          ENDIF

          LDDL   T3          LENGTH/ADDRESS PAIR OFFSET (PP WORDS)
          NJN    SBI10       IF NOT FIRST BUFFER

*         THE FIRST BUFFER IS THE ONLY ONE THAT MAY BE PARTIALLY FILLED.
*         CALCULATE THE FIRST DATA ADDRESS FOR IT.

          LDML   RS+/RS/P.DLEN,T3   LENGTH OF FIRST BUFFER (CM BYTES)
          ADN    7           ROUND UP
          SHN    -3          CONVERT TO CM WORDS
          STDL   T4          LENGTH OF FIRST BUFFER (CM WORDS)

          LDML   FBSIZE      MAXIMUM SIZE OF FIRST BUFFER (CM BYTES)
          SHN    -3          CONVERT TO CM WORDS
          IFEQ   DRTYP,1     IF MDI
          ADDL   DATADD+2    OFFSET OF FIRST BUFFER WORD
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          ADDL   DATADD+1    OFFSET OF FIRST BUFFER WORD
          ENDIF
          SBDL   T4          LENGTH OF FIRST BUFFER (CM WORDS)
          IFEQ   DRTYP,1     IF MDI
          STDL   DATADD+2    OFFSET OF FIRST DATA WORD
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          STDL   DATADD+1    OFFSET OF FIRST DATA WORD
          ENDIF

 SBI10    BSS    0
          LDML   RS+/RS/P.DLEN,T3   LENGTH PART OF LENGTH/ADDRESS PAIR
          STML   RDCNT       LENGTH (CM BYTES)
          SHN    -1
          STDL   BUFLEN      LENGTH (PP WORDS)
          UJK    SBIX        EXIT
          SPACE  4,10
**        SCE - STATUS CONTENT ERROR
*
*         THIS ROUTINE LOGS A  STATUS CONTENT ERROR
*
*         ENTRY  A = ERROR IDENTIFIER OF COMMAND IN ERROR
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  IGS SLM
          SPACE  4,10
 SCE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.DATA1
          RJM    IGS         INCLUDE GENERAL STATUS
          LDK    /RS/K.LGSCF
          STML   LRS+/RS/P.ERRID  SET ERROR IDENTIFIER
          LDN    SC.PPD
          STDL   STCHNG      DOWN ICA
          RJM    SLM         SEND LOG MESSAGE
          UJN    SCEX        EXIT
 SDB      SPACE  4,25
**        SDB - SHIFT DATA BUFFER.
*
*         THIS ROUTINE SHIFTS THE DATA BUFFER IF AN ODD NUMBER OF BYTES OF
*         DATA IS RECEIVED FROM THE DI.  THE DATA IS SHIFTED SO THAT THE
*         LAST BYTE IS IN THE LOWER PORTION OF THE LAST PP WORD INSTEAD
*         OF THE UPPER PORTION.  THIS ENSURES THAT THE DATA WILL
*         END ON A PP WORD BOUNDARY.  THIS IS NEEDED TO GUARANTEE THAT THE
*         CM BUFFER PASSED TO THE CPU WILL BE FILLED TO THE END.
*
*         E.G.  ASSUME B1, B2, ETC. ARE CM DATA BYTES (8 BITS LONG).
*               IOBUF IS THE PP DATA BUFFER CONSISTING OF 2 CM DATA BYTES FOR
*               EACH PP WORD (16 BITS LONG).
*
*                  FROM DI           SDB            TO CPU
*
*               IOBUF   B1 B2       ---->       IOBUF      B1
*                       B3 B4                           B2 B3
*                       B5                              B4 B5
*
*
*         ENTRY  (BYTCNT) = NUMBER OF BYTES IN PP BUFFER.
*
*         EXIT   DATA IN PP DATA BUFFER SHIFTED.
*
*         USES   T1, T2.


 SDB      SUBR               ENTRY/EXIT
          LDDL   BYTCNT      NUMBER OF CM BYTES IN PP BUFFER
          SHN    -1          NUMBER OF PP WORDS IN PP BUFFER
          STDL   T2          OFFSET OF THE NEW DATA LOCATION
          SBN    1
          STDL   T1          OFFSET OF THE OLD DATA LOCATION

*         SET UP THE LAST DATA LOCATION (JUST THE LOWER CM BYTE PORTION).

          LDML   IOBUF,T2    LAST DATA LOCATION
          SHN    -8          MOVE DATA BYTE OVER (LOWER CM BYTE)
          STML   IOBUF,T2    LAST DATA LOCATION INITIALIZED (LOWER CM BYTE)

*         SHIFT THE REST OF THE PP DATA BUFFER.

 SDB10    BSSZ   0

*         SET UP THE NEW DATA LOCATION (UPPER CM BYTE PORTION).

          LDML   IOBUF,T1    OLD DATA LOCATION
          LPC    377B        LOWER CM BYTE MASK
          SHN    8           MOVE DATA BYTE TO BE THE UPPER CM BYTE
          RAML   IOBUF,T2    NEW DATA LOCATION INITIALIZED (UPPER CM BYTE)

*         SET UP THE OLD DATA LOCATION (LOWER CM BYTE PORTION).

          LDML   IOBUF,T1    OLD DATA LOCATION
          SHN    -8          MOVE DATA BYTE OVER (LOWER CM BYTE)
          STML   IOBUF,T1    OLD DATA LOCATION INITIALIZED (LOWER CM BYTE)

          SODL   T2          NEXT NEW DATA LOCATION
          SODL   T1          NEXT OLD DATA LOCATION
          PJK    SDB10       IF MORE TO SHIFT
          UJK    SDBX        EXIT
 TRACE    SPACE  4,10
**        TRACE - SAVE DATA IN TRACE BUFFER


 TRACE    SUBR
          STDL   0           SAVE (A)
          LDC    30000B
 TRACEA   EQU    *-1
          STML   TRACEC
          ADN    1
          STML   TRACEB
          ADN    1
          STML   TRACED
          ADN    1
          STML   TRACEF
          ADN    5
          STM    TRACEA
          LDDL   0           SAVE (A)            WORD 1
          STML   **
 TRACEB   EQU    *-1
          LDML   TRACE       SAVE CALL ADDRESS   WORD 0
          STML   **
 TRACEC   EQU    *-1
          STDL   0
          IAN.   14B
          STML   **          SAVE TIME           WORD 2
 TRACED   EQU    *-1
          AOML   TRACE       ADJUST RETURN ADDRESS
 TRACE1   LDIL   0           GET PARAMETER LIST
          ZJN    TRACE3      IF NO PARAMETERS
          STDL   0
 TRACE2   LDIL   0
          ZJN    TRACE3      IF END OF PARAMETERS
          STML   TRACEE
          AODL   0
          LDML   **
 TRACEE   EQU    *-1
 TRACE3   STML   **
 TRACEF   EQU    *-1
          AOML   TRACEF
          LPN    7
          NJN    TRACE2      IF NOT COMPLETE
          UJK    TRACEX
          SPACE  4,10
**        SLM - SEND LOG MESSAGE
*
*         THIS ROUTINE SENDS A LOG MESSAGE RESPONSE
*         GENERAL STATUS AND/OR DETAIL STATUS
*         INCLUDED IN RESPONSE DETERMINE LENGTH
*         OF RESPONSE
*
*         ENTRY  NONE
*
*         EXIT   NONE
*
*         USES   T9
*
*         CALLS  WRB UIP
*
          SPACE  4,10
 SLM      SUBR               ENTRY/EXIT
          TRACE  (SLM,LRS+/RS/P.ERRID,FUNCD)
          LDML   DEVID
          STML   LRS+/RS/P.DEVID
          LDDL   STCHNG
          SBN    SC.PPD
          NJN    SLM05       IF NOT DOWN
          LDK    /RS/K.DICA
          RAML   LRS+/RS/P.LGS  SET DOWN ICA FLAG
 SLM05    LDML   LRS+/RS/P.LGS
          LPK    /RS/K.LDS
          NJN    SLM10       IF DETAIL STATUS INCLUDED
          LDC    /RS/C.GENST*8+8  RESPONSE LENGTH
          UJN    SLM20       CONTINUE

          ERRPL  LDSPP-28    ASSUMES DETAILED STATUS < 28 WORDS
          ERRPL  LDSOSI-28   ASSUMES DETAILED STATUS < 28 WORDS
 SLM10    LDML   LDS,ICATDDP  DETAIL STATUS LENGTH
          SHN    1
          ADN    7
          LPN    70B
          ADC    /RS/C.GENST*8+8  RESPONSE LENGTH
 SLM20    STML   LRS+/RS/P.RESPL
          LDN    URC.LM
          STML   LRS+/RS/P.URC  SET LOG MESSAGE
          LDML   UNIT        SAVE LOGICAL UNIT
          STML   LRS+/RS/P.LU
          LDC    LRS
          RJM    WRB         WRITE RESPONSE BUFFER
          RJM    UIP         UPDATE INPUT POINTER
          RJM    ILR         INITIALIZE LOG RESPONSE
          UJK    SLMX        EXIT
          SPACE  4,10
**        SNF - SEND NORMAL FUNCTION
*
*         THIS ROUTINE SENDS A NORMAL FUNCTION TO THE
*         ICA EVERY 4 SECONDS.
*
*         EXIT   A = 0 IF NO ERRORS
*                  <> 0 IF ERRORS ON FUNCTION
*
*         CALLS  FAN
          SPACE  4,10
 SNF30    LDN    0

 SNF      SUBR               ENTRY/EXIT
          LDML   OSOSI
          ZJN    SNFX        IF NOT OPERATIONAL
 SNF10    IAN    14B         READ MICROSECONF COUNTER
          LPC    7777B
          SBM    TIMA
          PJN    SNF20       IF NO OVERFLOW
          ADC    10000B      COMPENSATE FOR CLOCK OVERFLOW
 SNF20    ADC    -1000
          MJN    SNF30       IF LESS THAN 1 MILLISECOND
          LDC    1000        ADVANCE BASE BY 1 MILLISECOND
          RAM    TIMA
          SOM    TIMB
          PJN    SNF10       IF NOT TIME FOR NORMAL FUNCTION
          LDC    F.NORM
          RJM    FAN         SEND NORMAL OPERATION FUNCTION
          UJN    SNFX        EXIT
 SOR      SPACE  4,10
**        SOR - SEND OPERATIONAL RESPONSE.
*
*         LOG MESSAGE INDICATING THAT THE ICA IS OPERATIONAL.
*
*         EXIT   (A) = 0 IF NO ERRORS
*                    <> 0 IF ERRORS
          SPACE  4,10
 SOR      SUBR               ENTRY/EXIT
          RJM    DST         GET DETAILED STATUS
          NJK    SORX        EXIT IF ERRORS
          LDK    /RS/K.LICAO LOG ICA OPERATIONAL
          STML   LRS+/RS/P.ERRID
          LDN    REC.IM
          STML   LRS+/RS/P.RETSUC INFORMATIVE MESSAGE
          RJM    IGS         INCLUDE GENERAL STATUS
          RJM    SLM         SEND LOG MESSAGE
          LDN    0
          UJN    SORX        EXIT
          SPACE  4,10
**        STE - STATE TRANSITION ERROR
*
*         THIS ROUTINE SETS A STATE TRANSITION ERROR
*         IN THE RESPONSE BUFFER AND DOWN THE ICA.
*
*         ENTRY  (A) = STATE REQUESTED
*
*         EXIT   NONE
*
*         USES   NONE
*
*         CALLS  SEI IGS SLM
          SPACE  4,10
 STE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.TSTAT
          LDK    /RS/K.LTF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          RJM    SLM         SEND LOG MESSAGE
          UJN    STEX        EXIT
          SPACE  4,10
**        UIP - UPDATE 'IN' POINTER
*
*         THIS ROUTINE UPDATES THE RESPONSE BUFFERS IN POINTER
*         AND INTERRUPTS THE CP. THE CP IS INTERRUPTED FOR EVERY
*         UNSOLICITED RESPONSE AND EVERY EIGHTH SOLICITED RESPONSE.
*
          SPACE  4,10
 UIP      SUBR               ENTRY/EXIT

*         UPDATE THE 'IN' POINTER.

          LDN    0
          STDL   P1
          STDL   P2
          STDL   P3
          LDDL   INPNT       NEW 'IN' POINTER
          STDL   P4
          LRDL   CM.PIT      LOAD ADDRESS OF PP INTERFACE TABLE
          LDDL   CM.PIT+1
          ADN    /PIT/C.IN   OFFSET OF 'IN' POINTER
          CWDL   P1          WRITE NEW 'IN' POINTER TO CM

*         INTERRUPT PROCESSOR. WRB ROUTINE SETS UP -INTPRC-.

          LRML   CM.INT      CM ADDRESS OF INTERRUPT WORD
          LDML   CM.INT+1
          CWDL   PPNO-3      SET LAST BYTE NON-ZERO
          LDDL   RESPC
          ZJN    UIP10       IF UNSOLICITED RESPONSE
          LDDL   LSTATE
          LMK    ST.OPER
          NJN    UIP10       IF NOT OPERATIONAL
          SOML   INTRRPT
          NJN    UIP20       IF NOT TIME TO INTERRUPT
 UIP10    BSS    0
          LDN    0           FOR S0 HARDWARE PROBLEM
 INTPRC   PSN                PSN OR INTERRUPT
          LDN    8
          STML   INTRRPT     RESET INTERRUPT INTERVAL
 UIP20    UJK    UIPX


 INTRRPT  BSSZ   1           INTERRUPT INTERVAL
          SPACE  4,10
**        WRB - WRITE RESPONSE BUFFER TO CM RESPONSE BUFFER
*               THERE ARE TWO PP RESPONSE BUFFERS.
*
*         ENTRY  (A) = PP RESPONSE BUFFER ADDRESS
*
*         USES   P1 - P5, T1, T2, T3, T4, T5, T9.
*


          SPACE  4,10
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  6
 WRB      SUBR               ENTRY/EXIT
          STDL   T9
          STML   WRB55       INSTRUCTION MODIFICATION FOR BUFFER

*         READ IN AND OUT POINTERS OF RESPONSE BUFFER.

 WRB10    LRDL   CM.PIT      LOAD ADDRESS OF PP INTERFACE TABLE
          LDDL   CM.PIT+1
          ADN    /PIT/C.OUT  OFFSET OF OUT POINTER
          CRDL   P2          READ OUT POINTER
          SBN    /PIT/C.OUT-/PIT/C.IN  OFFSET OF 'IN' POINTER
          CRDL   P1          READ 'IN' POINTER

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

          LDDL   INP
          SBDL   OUTP
          MJN    WRB20       IF IN .LT. OUT
          LDDL   LIM         IN .GE. OUT, SET OUT = OUT + LIMIT
          RADL   OUTP
 WRB20    LDML   /RS/P.RESPL,T9  GET RESPONSE LENGTH
          STDL   INPNT
          LDN    0
          STDL   T2          FLAG TO DETERMINE IF 1 OR 2 BLOCK WRITES
          LDDL   INP
          RADL   INPNT       IN + RESPONSE LENGTH
          SBDL   OUTP        CHECK IF ENOUGH ROOM IN BUFFER FOR RESPONSE
          PJK    WRB10       IF NOT ENOUGH ROOM IN BUFFER, LOOP
          LDDL   INPNT
          SBDL   LIM
          MJN    WRB40       IF IN + RESPONSE LENGTH .LT. LIMIT
          STDL   INPNT       IN + RESPONSE LENGTH - LIMIT = NEW 'IN' POINTER
          AODL   T2          2 BLOCK WRITES REQUIRED

*         WRITE RESPONSE TO CM.

 WRB40    LDDL   INP
          SHN    -3
          STDL   T3          'IN' POINTER IN WORDS
          LDML   /RS/P.RESPL,T9 CONVERT RESPONSE LENGTH TO WORDS
          SHN    -3
          STDL   T4          RESPONSE LENGTH IN WORDS
          STDL   T5
          LDDL   T2
          ZJN    WRB50       IF ONLY 1 BLOCK WRITE REQUIRED
          LDDL   LIM         FIRST BLOCK WRITE = (LIMIT - IN) WORDS
          SBDL   INP
          SHN    -3
          STDL   T4          NUMBER OF WORDS TO TRANSFER ON 1ST BLOCK
          SHN    2           CONVERT TO NUMBER OF PP WORDS
          ADDL   T9
          STML   WRBB        RESPONSE ADDRESS FOR SECOND BLOCK WRITE
 WRB50    LRDL   CM.RS       LOAD CM ADDRESS OF RESPONSE BUFFER
          LDDL   CM.RS+1
          STDL   T6          SAVE CM ADDRESS
          ADDL   T3          ADD 'IN' OFFSET
          CWML   RS,T4       WRITE RESPONSE TO CM
 WRB55    EQU    *-1
          LDDL   T5          RESPONSE LENGTH
          SBDL   T4
          ZJN    WRB70       IF ONLY 1 BLOCK WRITE REQUIRED
          STDL   T5          RESPONSE LENGTH - (LIMIT - IN)
          LDDL   T6          LOAD ADDRESS OF RESPONSE BUFFER
          CWML   **,T5       WRITE 2ND PART OF RESPONSE TO CM
                             (BEGINNING OF RESPONSE BUFFER)
 WRBB     EQU    *-1

*         SET UP INTERRUPT PROCESSOR INSTRUCTION IF INTERRUPT IS SELECTED.

 WRB70    LDML   RS+/RS/P.INT  CHECK IF INTERRUPT WAS SELECTED
          LPK    /RS/K.INT
          ZJN    WRB80       IF INTERRUPT WAS NOT SELECTED

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

          LDML   RS+/RS/P.PORT  GET PROCESSOR PORT NUMBER TO INTERRUPT
          SHN    -16+/RS/L.PORT+/RS/N.PORT
          LPN    /RS/M.PORT
          ADC    102600B     INPN INSTRUCTION
          STML   INTPRC
 WRB80    UJK    WRBX        EXIT


 SAVEA    SUBR
          STML      ASAVE+1
          SHN       -16
          STML      ASAVE
          UJK       SAVEAX


 ARES     SUBR
          LDML      ASAVE
          SHN       16
          ADML      ASAVE+1
          UJK       ARESX


          SPACE  4,10
***       CRM   HELPER TO SIMULATE CMCH
*         ENTRY  CRM99 = FWA
*                CRM97 = PP WORDS
*
*         EXIT   CRM99 = LWA + 1
*                CRM97 = PP WORDS NOT XFERED
*
 CRM      SUBR
 CRM10    LDML   CRM99
*         SMB
          CRML   IOBUF+4,ONE
          STML   CRM99
          LDML   CRM97
          SBN    4
          MJN    CRM20
          LDN    4
          UJN    CRM30
 CRM20    LDML   CRM97
 CRM30    STML   CRM98
          SIMM   CRM33
          OAM    IOBUF+4,CHN
 CRM33    NJN    CRMX
          LDML   CRM97
          SBML   CRM98
          STML   CRM97
          NJN    CRM10
          UJK    CRMX

 CRM97    BSSZ   1
 CRM98    BSSZ   1
 CRM99    BSSZ   1

          SPACE  4,10
**        CWM  HELPER TO SIMULATE CHCM
*         ENTRY  CWM98 = PP WORDS
*                CWM99 = FWA
*
*         EXIT   CWM98 = PP WORDS NOT READ
*                CWM99 = LWA + 1
*
 CWM      SUBR
 CWM01    LDML   CWM98
          SBN    4
          MJN    CWM05
          LDN    4
          UJN    CWM10
 CWM05    LDML   CWM98
 CWM10    STML   CWM96
          SIMM   CWM15
          IAM    IOBUF+4,CHN
 CWM15    STML   CWM97
          LDML   CWM99
*         SMB
          CWML   IOBUF+4,ONE
          STML   CWM99
          LDML   CWM97
          ZJN    CWM30
          LDML   CWM98
          SBML   CWM96
          ADML   CWM97
          STML   CWM98
          UJK    CWMX

 CWM30    LDML   CWM98
          SBML   CWM96
          STML   CWM98
          NJK    CWM01
          UJK    CWMX

 CWM96    BSSZ   1
 CWM97    BSSZ   1
 CWM98    BSSZ   1
 CWM99    BSSZ   1
          EJECT
 RPM      SPACE  4,10
**        RPM - READ PP MEMORY.
*
*         THIS PP REQUEST READS PP MEMORY CHANGES.
*
*         EXIT   (A) = 0.
*
*         USES   T5.
          SPACE  2
 RPM      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.LEN GET LENGTH OF OVERLAY
          ADK    7
          SHN    -3          CONVERT LENGTH TO LENGTH IN CM WORDS
          STDL   T5          SAVE OVERLAY LENGTH FOR TRANSFER
          IFEQ   DRTYP,1     IF MDI
          LOADF  CM+/CM/P.RMA REFORMAT CM ADDRESS
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   CM+/CM/P.RMA REFORMAT CM ADDRESS
          LDML   CM+/CM/P.RMA+1
          SHN    -3
          ENDIF
          CRML   *,T5        READ IN CHANGES.
 RPMA     EQU    *-1
          LDN    0
          UJN    RPMX        EXIT
 SPA      SPACE  4,10
**        SPA - SELECT PP MEMORY.
*
*         THIS PP REQUEST MOFDIFIES READ AND WRITE
*         INSTRUCTIONS FOR READ AND WRITE MEMORY REQUESTS.
*
*         EXIT   (A) = 0.
          SPACE  2,10
 SPA      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.RMA+1  GET SECOND HALF OF PP MEM ADDR
          STML   RPMA        MODIFY READ INSTRUCTION
          STML   WPMA        MODIFY WRITE INSTRUCTION
          LDN    0
          UJN    SPAX        EXIT
 WPM      SPACE  4,10
**        WPM - WRITE PP MEMORY.
*
*         THIS PP REQUEST WRITES REQUESTED PP MEMORY
*         TO CENTRAL MEMORY.
*
*         INPUT  (SPAADD) = PP MEMORY ADDRESS.
*
*         EXIT   (A) = 0.
*
*         USES   T5, T6.
          SPACE  2,10
 WPM      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.LEN GET BYTE COUNT
          ADN    1
          SHN    -1          GET PP WORD COUNT
          STDL   T6          SAVE PP WORD COUNT
          LDC    37777B      GET MAX PP MEMORY ADDRESS
          SBML   WPMA        SUBTRACT STARTING POINT 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
          ADN    3
          SHN    -2          CONVERT PP WORD COUNT TO CPU WORD COUNT
          STDL   WC          SAVE CPU WORD COUNT FOR CM WRITE
          IFEQ   DRTYP,1     IF MDI
          LOADF  CM+/CM/P.RMA REFORMAT CM ADDRESS
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   CM+/CM/P.RMA REFORMAT CM ADDRESS
          LDML   CM+/CM/P.RMA+1
          SHN    -3
          ENDIF
          CWML   **,WC       COPY PP MEMORY TO CM
 WPMA     EQU    *-1
          LDN    0
          UJK    WPMX        EXIT
 TRACE    SPACE  4,10
**        TRACE PARAMETER LISTS.


          LIST   G
 TRACE    HERE
          LIST   *
*copy nai$network_common_deck
          TITLE  INITIALIZATION ROUTINES
**        INT - INITIALIZE PP DRIVER.
*
*         ESTABLISHES ACCESS TO CENTRAL MEMORY TABLES AFTER DEADSTART.
*
*         ENTRY  DSRTP = CENTRAL MEMORY ADDRESS OF WORD CONTAINING
*                          POINTER TO SP-ADDRS-ARRAY.


 INT      BSS    0           ENTRY
          LDDL   P1
          STML   DRNAME
          LDDL   P2
          STML   DRNAME+1
          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    IDP         IDLE THE PP
          RJM    ILR         INITIALIZE LOG RESPONSE
          LDML   DEVID
          STML   RS+/RS/P.DEVID
          UJK    DCS         DETERMINE CURRENT ICA STATE
          EJECT
 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.
*                (C.MCT) = LENGTH OF MASTER CONTROL TABLE.
*
*         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    DBP         DEFINE 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  DSRTP = CENTRAL MEMORY BYTE ADDRESS OF PP INTERFACE TABLE.
*


 LPT      SUBR               ENTRY/EXIT

*         READ PP INTERFACE TABLE

          LDN    C.PIT       LENGTH OF PP INTERFACE TABLE
          STDL   WC
          LRDL   DSRTP
          SRDL   CM.PIT
          LDDL   DSRTP+1
          SHN    -3
          STDL   CM.PIT+1
          CRML   IPIT,WC
          RJM    CVR         CHECK FOR VALID RESPONSE BUFFER
          NJN    *           IF INVALID RESPONSE BUFFER  --HANG--
          RJM    ZRE         ZERO OUT RESPONSE BUFFER
          RJM    CVP         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

          LDML   IPIT+/PIT/P.INT
          STML   CM.INT
          LDML   IPIT+/PIT/P.INT+1
          SHN    -3
          STML   CM.INT+1

          LDML   IPIT+/PIT/P.CHAN
          STML   CM.CHAN
          LDML   IPIT+/PIT/P.CHAN+1
          SHN    -3
          STML   CM.CHAN+1
          UJK    LPTX
          EJECT
 LUT      SPACE  4,10
**        LUT - LOCATE UNIT INTERFACE TABLE.
*
*         ESTABLISHES ACCESS TO THE UNIT INTERFACE TABLE.
*
*         ENTRY  CM.PIT - CM.PIT+2 = CM ADDRESS OF PP INTERFACE TABLE.
*
*         EXIT   CM.UIT - CM.UIT+2 = CM ADDRESS OF UNIT INTERFACE TABLE.
*                UD = UNIT DESCRIPTOR ACCESSIBLE BY THIS PP.


 LUT      SUBR           ENTRY/EXIT
          LDN    C.UD    UNIT DESCRIPTOR LENGTH
          STDL   WC
          LRDL   CM.PIT
          LDDL   CM.PIT+1
          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   UNIT        LOGICAL UNIT NUMBER
          LDN    C.UIT       UNIT INTERFACE TABLE LENGTH
          STDL   WC
          LRML   UD+/UD/P.UQT  REFORMAT CM ADDRESS OF UNIT INTERFACE TABLE
          LDML   UD+/UD/P.UQT+1
          SHN    -3
          CRML   UBUF,WC  READ UNIT INTERFACE TABLE
          RJM    CVU         CHECK FOR VALID UNIT INTERFACE TABLE
          NJN    *           IF INVALID UNIT INTERFACE TABLE  --HANG--
          UJK    LUTX        EXIT
          EJECT
**        SAVAD - SAVE REFORMATTED CM ADDRESSES
*
*         THIS ROUTINE IS CALLED ONLY DURING INITIALIZATION
*         AND ONLY BY THE *REFAD* MACRO.
*
*         USES   T2


*SAVAD    SUBR               ENTRY/EXIT
*         STML   2,T2
*         LDDL   CMADR
*         STI    T2
*         LDDL   CMADR+1
*         STML   1,T2
*         UJN    SAVADX
          SPACE  4,10
**        CHG - CHANGE CHANNEL INSTRUCTIONS.
*
*         CHANGE ALL CHANNEL INSTRUCTIONS TO USE THE SPECIFIED CHANNEL.
*
*         ENTRY  CHAN = NEW CHANNEL NUMBER TO BE USED.
*                CONCH = ADDRESS OF CHANNEL INSTRUCTIONS.
*
*         USES   T1 - T2.



 CHG      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1          CHANGE ICA CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGX        END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMML   CHAN       CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJN    CHG10
          SPACE  4,10
 CONCH    BSS                ICA CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
 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
          IFEQ   DRTYP,1     IF MDI
          LOADC  CM.URQ,CM.MCT   FIRST WORD ADDRESS OF MASTER CONTROL TABLE
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRDL   CM.URQ      FIRST WORD ADDRESS OF MASTER CONTROL TABLE
          LDML   CM.MCT
          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       SAVE DEVICE IDENTIFIER

*         RESERVED FIELD OF UNIT REQUEST QUEUE DESCRIPTOR.

          LDML   UBUF+/UIT/P.NEXTPV-1
          ADML   UBUF+/UIT/P.NEXT-2
          ADML   UBUF+/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    E305        RESERVED FIELD OF UNIT REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
          LOC    *O
          SPACE  4,10
**        CVP - CHECK FOR VALID PP INTERFACE TABLE
*
*
*         EXIT   (A) = 0, IF VALID PP INTERFACE TABLE,
*                    <> 0, IF INVALID.
          SPACE  4,10
 CVP      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1
          LDML   IPIT+/PIT/P.CBUFL  COMMUNICATION BUFFER LENGTH
          LPN    7
          NJK    CVP10       IF LENGTH NOT A MULTIPLE OF WORDS

          AODL   T1
          LDML   IPIT+/PIT/P.CBUFL-1  RESERVED WORD OF PP COMMUNICATION
                             BUFFER DESCRIPTOR
          NJN    CVP10       IF RESERVED WORD NOT ZERO

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

          AODL   T1
          LDML   IPIT+/PIT/P.PPQPVA-1  RESERVED FIELD OF PP REQUEST
                             QUEUE DESCRIPTOR
          ADML   IPIT+/PIT/P.PPQ-2
          ADML   IPIT+/PIT/P.PPQ-1
          NJN    CVP10       IF RESERVED FIELD NOT ZERO

          AODL   T1
          LDML   IPIT+/PIT/P.INT+1  INTERRUPT WORD (RMA)
          LPN    7
          NJN    CVP10       IF INTERRUPT WORD NOT A WORD BOUNDARY

          AODL   T1
          LDML   IPIT+/PIT/P.CHAN+1  CHANNEL INTERLOCK TABLE (RMA)
          LPN    7
          NJN    CVP10       IF PP INTERFACE TABLE INVALID

          AODL   T1
          RJM    VMF         VERIFY MICROCODE
          ZJN    CVP15       IF MICROCODE OK


 CVP10    LDML   CVP20,T1    INTERFACE ERROR CODE
          RJM    PIE         PROCESS INTERFACE ERROR
          LDN    URC.IE
          STDL   UNSC        UNSOLICITED RESPONSE CODE
          RJM    USR         SEND UNSOLICITED RESPONSE
          LCN    0
 CVP15    UJK    CVPX        EXIT

 CVP20    CON    E20B        COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF WORDS
          CON    E204        RESERVED WORD OF PP COMMUNICATION
                             BUFFER DESCRIPTOR NOT ZERO
          CON    E203        PP COMMUNICATION BUFFER NOT A WORD BOUNDARY
          CON    E205        RESERVED FIELD OF PP REQUEST QUEUE
                             DESCRIPTOR NOT ZERO
          CON    E211        RMA OF INTERRUPT WORD NOT A WORD BOUNDARY
          CON    E212        RMA OF CHANNEL INTERLOCK TABLE NOT A WORD BOUNDARY
          CON    E507        MICROCODE LENGTH NOT VALID
          SPACE  4,10
**        CVD - CHECK FOR VALID UNIT DESCRIPTOR
*
*         EXIT   (A) = 0, IF VALID UNIT DESCRIPTOR,
*                    <> 0, IF INVALID.
*
          SPACE  4,10
 CVD      SUBR               ENTRY/EXIT
          LDN    0
          LDML   UD+/UD/P.LU  LOGICAL UNIT
          SBML   IPIT+/PIT/P.FLU  FIRST LOGICAL UNIT
          PJN    CVD10
          LDC    E208        LOGICAL UNIT NOT IN RANGE
          UJK    CVD60

 CVD10    LDML   UD+/UD/P.CHAN  CHANNEL NUMBER
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    37B
          SBN    6           VALID CHANNELS ARE 0 - 5B AND 20B - 25B
          MJN    CVD40       CHANNEL OK
          SBN    20B-6B
          PJN    CVD30
 CVD20    LDC    E20A        INVALID CHANNEL NUMBER
          UJN    CVD60

 CVD30    SBN    26B-20B
          PJN    CVD20

 CVD40    LDML   UD+/UD/P.UQT+1  UNIT INTERFACE TABLE ADDRESS
          LPN    7
          ZJN    CVDX
          LDC    E209        UNIT INTERFACE TABLE NOT A WORD BOUNDARY

 CVD60    RJM    PIE         PROCESS INTERFACE ERROR
          LDN    URC.IE
          STDL   UNSC        UNSOLICITED RESPONSE CODE
          RJM    USR         SEND UNSOLICITED RESPONSE
          LCN    0
          UJK    CVDX        EXIT
          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.
*
*         CALLS  STB
          SPACE  4,10
 CVU      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1
          LDML   UBUF+/UIT/P.LU  LOGICAL UNIT NUMBER
          SBML   UD+/UD/P.LU
          NJN    CVU20       LOGICAL UNIT NUMBER MISMATCH

          AODL   T1
          LDML   UBUF+/UIT/P.UTYPE  UNIT TYPE
          STML   STBI
          LDC    TITDDP-2
          RJM    STB
          ZJK    CVU40       IF UNIT TYPE SPECIFIED IS NOT AN ICA
          STDL   ICATDDP

*         RESERVED FIELD OF MASTER CONTROL TABLE DESCRIPTOR

          AODL   T1
          LDML   UBUF+/UIT/P.MBUFL-1  RESERVED FIELD OF
                             MASTER CONTROL TABLE DESCRIPTOR
          NJK    CVU40       RESERVED FIELD IS NOT ZERO

          AODL   T1
          LDML   UBUF+/UIT/P.MBUFL  MASTER CONTROL TABLE LENGTH
          ADC    -B.MCT      COMPARE WITH EXPECTED MASTER CONTROL TABLE LENGTH
          MJN    CVU20       IF BUFFER NOT LONG ENOUGH
          LPN    7
          ZJN    CVU30
 CVU20    UJK    CVU40

 CVU30    AODL   T1
          LDML   UBUF+/UIT/P.MBUF+1  MASTER CONTROL TABLE
          LPN    7
          NJK    CVU40       NOT A WORD BOUNDARY
 CVU35    BSS    0
          IFEQ   DRTYP,1     IF MDI
          LOADF  UBUF+/UIT/P.MBUF
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   UBUF+/UIT/P.MBUF
          LDML   UBUF+/UIT/P.MBUF+1
          ENDIF
          SHN    -3
          STDL   CM.URQ+1
          STML   CM.MCT
          SRDL   CM.URQ
          LDN    0           VALID UNIT INTERFACE TABLE
 CVU38    UJK    CVUX        EXIT

 CVU40    LDML   CVU50,T1    INTERFACE ERROR CODE
          RJM    PIE         PROCESS INTERFACE ERROR
          LDN    URC.IE
          STDL   UNSC        UNSOLICITED RESPONSE CODE
          RJM    USR         SEND UNSOLICITED RESPONSE
          LCN    0
          UJK    CVU38

 CVU50    CON    E301        LOGICAL UNIT NUMBER MISMATCH
          CON    E306        INVALID UNIT TYPE
          CON    E303        RESERVED FIELD OF MASTER CONTROL TABLE
                             DESCRIPTOR IS NOT ZERO
          CON    E307        MASTER CONTROL TABLE LENGTH NOT A
                             MULTIPLE OF WORDS
          CON    E302        MASTER CONTROL TABLE NOT A WORD BOUNDARY
          SPACE  4,10
**        TABLE OF ICA TYPE DEPENDENT DATA POINTERS.
*

 TITDDP   CON    U.I2TYPE,OSITDD
          CON    0
          SPACE  4,10
**        CVR - CHECK FOR VALID RESPONSE BUFFER
*
*         EXIT   (A) = 0, IF VALID RESPONSE BUFFER,
*                         CM.RS - CM.RS+2 = CM ADDRESS OF RESPONSE BUFFER,
*                    <> 0, IF INVALID.
          SPACE  4,10
 CVR      SUBR               ENTRY/EXIT
          LDML   IPIT+/PIT/P.RSBUF-2  RESERVED WORD OF RESPONSE
                             BUFFER DESCRIPTOR
          ADML   IPIT+/PIT/P.RSBUF-1
          ADML   IPIT+/PIT/P.RSPVA-1
          NJK    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    NJK    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
          NJK    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
          NJK    CVR10       IF RESERVED FIELD NOT ZERO

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

          LDML   IPIT+/PIT/P.RSBUF REFORMAT ADDRESS OF REPONSE BUFFER
          STDL   CM.RS
          LDML   IPIT+/PIT/P.RSBUF+1
          SHN    -3
          STDL   CM.RS+1
          LDML   IPIT+/PIT/P.LIMIT
          STDL   LIM         LIMIT OF RESPONSE BUFFER

          LDN    0
 CVR10    UJK    CVRX        EXIT
 DBP      SPACE  4,16
**        DBP - DEFINE BUFFER POOLS PROCESSOR.
*
*         THIS ROUTINE DOES THE INITIAL PROCESSING OF BUFFER POOL
*         DESCRIPTORS.  A TABLE CONTAINING THE LENGTHS OF THE
*         BUFFERS IN THE POOLS IS CREATED AT LOCATION
*         *BPDSIZE*.  THE CM ADDRESS OF THE FIRST DESCRIPTOR
*         IS ALSO SET UP.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF ERRORS.
*
*         USES   P1, P2, WC.
*
*         CALLS  PIE.
*
*         MACROS LOADC, LOADF.


 DBP      SUBR               ENTRY/EXIT
          ERRNG  MAXBPD-1    NO BUFFER POOLS
          LDK    MAXBPD
          STML   NUMBP       NUMBER OF BUFFER POOLS
          STDL   P2

          LDN    0
          STDL   FSTBD       RESET FSTBD
          LDN    C.BPD
          STDL   WC          LENGTH OF BUFFER POOL DESCRIPTOR
          IFEQ   DRTYP,1     IF MDI
          LOADF  MCT+/MCT/P.BP  REFORMAT CM ADDRESS OF FIRST BUFFER DESCRIPTOR
          STDL   CM.BPD+2
          SRD    CM.BPD
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRML   MCT+/MCT/P.BP  REFORMAT CM ADDRESS OF FIRST BUFFER DESCRIPTOR
          LDML   MCT+/MCT/P.BP+1
          SHN    -3
          STDL   CM.BPD+1
          SRDL   CM.BPD
          ENDIF

 DBP10    CRML   BPD,WC      READ BUFFER POOL DESCRIPTOR
          STDL   P1          (A) OFFSET TO NEXT BUFFER POOL DESCRIPTOR
          LDML   BPD+/BPD/P.LEN
          NJN    *           IF BUFFER LENGTH TOO BIG
          LDML   BPD+/BPD/P.LEN+1
          PJN    DBP15       IF VALID BUFFER LENGTH
          LDC    E50B        INVALID PARAMETER SPECIFICATION
 DBP12    UJK    DBPX        EXIT

 DBP15    STML   BPDSIZE,FSTBD  SAVE BUFFER LENGTH
          SODL   P2          DECREMENT NUMBER OF POOLS REMAINING
          ZJK    DBP12       IF NO MORE POOLS
          AODL   FSTBD
          IFEQ   DRTYP,1     IF MDI
          LOADC  CM.BPD,P1   CM ADDRESS OF NEXT DESCRIPTOR
          ENDIF
          IFEQ   DRTYP,2     IF ICA2
          LRDL   CM.BPD      CM ADDRESS OF NEXT DESCRIPTOR
          LDDL   P1
          ENDIF
          UJK    DBP10       LOOP
          SPACE  4,10
**        VMF - VERIFY MICROCODE FILE
*
*         VERIFY THAT THE LENGTH FIELD IN THE HEADER
*         OF THE MICROCODE LOAD FILE AGREES WITH THE
*         COMMAND PASSED IN THE COMMUNICATIONS BUFFER.
*         THIS COMMAND IS IN THE SAME FORMAT AS THE INDIRECT
*         COMMAND LIST. THE MICROCODE LENGTH FIELD IS IN THE
*         FIRST FOUR BYTES.
*
*
*         ENTRY  IPIT = PP INTERFACE TABLE
*
*         EXIT   (A) = 0 IF NO ERRORS
*                  <> 0 IF ERRORS
*
*         USES   P1 P2 P3 P4
*
 VMF      SUBR               ENTRY/EXIT
          LRML   IPIT+/PIT/P.CBUF
 VMF05    LDML   IPIT+/PIT/P.CBUF+1
          SHN    -3          FWA OF COMMUNICATION BUFFER
          ADN    /CB/C.CWLEN FWA OF ICA MICROCODE
          CRDL   P1          READ MICROCODE LEN/RMA PAIR

*         COMMAND NOT IN BUFFER UNTIL COMMAND CODE IS EQUAL TO C(16)

          LDDL   P1
          SHN    -8
          SBN    14B
          NJN    VMF05       IF NOT IN BUFFER YET

*         REFORMAT AND SAVE ADDRESS OF LENGTH/RMA LIST

          LDDL   P3          SAVE R REGISTER PORTION
          STML   CM.LOAD-1+/CM/P.RMA
          LDDL   P4
          SHN    -3          REFORMAT FIRST WORD ADDRESS
          STML   CM.LOAD-1+/CM/P.RMA+1
          LDN    0
          STDL   CML
          LDDL   P2
          SHN    -3
          STDL   CMLISTL     SAVE LENGTH OF LIST
 VMF20    LRML   CM.LOAD-1+/CM/P.RMA
          LDML   CM.LOAD-1+/CM/P.RMA+1
          ADDL   CML
          CRDL   P1          GET ONE PAIR
          LDDL   CML
          NJK    VMF30       IF NOT FIRST PAIR

*         READ HEADER OF MICROCODE FILE TO VERIFY LENGTH.

          LRDL   P1+/CM/P.RMA
          LDDL   P1+/CM/P.RMA+1
          SHN    -3          READ FIRST WORD
          CRML   IOBUF,ONE   TO GET LENGTH

*         SAVE LENGTH FOR TWO WORD DECREMENT ROUTINE

          LDML   IOBUF
          STML   LIOC
          STML   LFLEN
          LDML   IOBUF+1
          STML   LIOC+1
          STML   LFLEN+1
 VMF30    LDDL   P1+/CM/P.LEN
          ZJN    VMF35       IF END OF LIST
          STDL   ERRCNT      SAVE LENGTH FOR DECREMENT ROUTINE
          RJM    DLC         DECREMENT LENGTH BY LENGTH OF
*                            THIS SEGMENT
          AODL   CML
          SBDL   CMLISTL
          NJK    VMF20       IF MORE TO READ
 VMF35    LDDL   CML         SAVE LENGTH OF LIST
*                            ACTUAL LENGTH OF LIST IS SAVED AS
*                            THE LENGTH SENT IS GREATER THAN ACTUAL
          STML   CM.LOAD-1+/CM/P.LEN
          LDML   LIOC        LENGTH SHOULD BE DECREMENTED TO ZERO
          ADML   LIOC+1
          UJK    VMFX        EXIT A=0 IF NO ERR0RS
          SPACE  4,10
**        BUFFERS USED AT INITIALIZATION
          SPACE  4,10
 IPIT     BSSZ   P.PIT       PP INTERFACE TABLE
 UBUF     BSSZ   P.UIT       UNIT INTERFACE TABLE
 UD       BSSZ   P.UD        UNIT DESCRIPTOR
          SPACE  4,10
          TITLE  BUFFER AREA
 RS       BSSZ   MAXRS*4     RESPONSE BUFFER
 LRS      BSSZ   P.RS+4      LOGGING RESPONSE BUFFER
 MCT      BSSZ   P.MCT       MASTER CONTROL TABLE
          SPACE  4,10
**        LOCATIONS OF BUFFERS USED AFTER INITIALIZATION ARE DEFINED
*         HERE. THE USE OF ANY OF THESE BUFFERS WILL OVERWRITE THE
*         INITIALIZATION CODE.
          SPACE  4,10
 RESEND   EQU    *           END OF RESIDENT CODE

 BP       BSSZ   P.BP        BUFFER POOL TABLE ENTRY
 BPD      BSSZ   P.BPD       BUFFER POOL DESCRIPTOR
 BPDSIZE  BSSZ   MAXBPD      BUFFER POOL SIZES
 BPRMA    BSSZ   MAXRS*2-/RS/C.BUFPVA*2   BUFFER POOL CONTAINER RMAS

 INTOV    EQU    *           FIRST WORD ADDRESS OF INITIALIZATION ROUTINES
 RQ       EQU    INTOV       REQUEST BUFFER
 CM       EQU    RQ+/RQ/P.CMND  COMMAND PORTION OF REQUEST

 IOBUF    EQU    RQ+MAXURQ*4 I/O BUFFER
 IOBLEN   EQU    MINLEN      I/O BUFFER SIZE
 I1       EQU    IOBLEN*2*2/3
          IFPL   I1*3-IOBLEN*2*2
 CHCNT    EQU    I1
          ELSE
 CHCNT    EQU    I1+1
          ENDIF
 BUFEND   EQU    IOBUF+MINLEN  MINIMUM BUFFER SPACE REQUIRED
 BPDEND   EQU    BUFEND

          SPACE  4,10
          END    ICAD
/EOR
