          IDENT  NETW,0
          CIPPU  J
          TITLE  NAM$MDI DRIVER (NETW).
          COMMENT *SMD* LVL=01
          COMMENT  COPYRIGHT FIDES INFORMATION SERVICES. 2003
          SPACE  4,10
***       NETW - NETWORK DRIVER.
*         J. A. NAUMAN.  82/10/23.
*         J. P. KELLER.  83/2/3.
          SPACE  4,30
***       NETW PROVIDES FOR COMMUNICATION BETWEEN NAM/VE AND A MAINFRAME DEVICE
*         INTERFACE.  NETW COMMUNICATES THROUGH A C170 CHANNEL TO THE MCI
*         HARDWARE.  THE STATUS OF THE MCI INTERFACE CAN BE DETERMINED FROM THE
*         GENERAL STATUS.  THE GENERAL STATUS WILL INDICATE WHICH OF 5 POSSIBLE
*         STATES THE MCI INTERFACE IS IN.  THE 5 STATES ARE:  MFI RESET,
*         DIAGNOSTICS, STARTING, LOADING, OPERATIONAL.  TRANSITIONS OUT OF ANY
*         OF THESE STATES CAN OCCUR AT ANY TIME.  DATA TRANSFER IS ALLOWED ONLY
*         IN LOADING OR OPERATIONAL STATES.  DATA TRANSFER TO THE MDI IS
*         INITIATED VIA A WRITE BYTES (CHANNELNET RECORD) OR WRITE RECORD
*         (CHANNEL CONNECTION RECORD) 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
*         MDI IS INITIATED BY THE MDI SETTING THE DATA-AVAILABLE BIT IN GENERAL
*         STATUS.  THE STATE BITS IN GENERAL STATUS ARE ALSO USED TO INDICATE
*         THE TYPE OF DATA TO BE READ (CHANNELNET OR CHANNEL CONNECTION).  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.  NOTE THAT IF THE NUMBER OF BUFFER
*         SIZES IS INCREASED BEYOND 2 THE EQUATE *MAXBPD* MUST BE CHANGED.
*
*         NETW UTILIZES THE OVERLAY CAPABILITY OF NOS/VE WHICH PASSES A POINTER
*         TO THE OVERLAYS IN THE PP COMMUNICATION BUFFER. THE OVERLAYS ARE
*         ARRANGED SUCH THAT OVERLAYS 1 AND 2 ARE THE OVERLAYS NORMALY LOADED
*         IN OPERATIONAL STATE. THE OTHER OVERLAYS ARE ONLY LOADED DURING MDI
*         STATE CHANGES, PP REQUESTS, AND ERROR RECOVERY.

          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
*copy iodmac1
*copy iodmac4
*copy iodmac5
          SPACE  4,10
*************************************************************************
*                                                                       *
*  THE OP MACRO IS REDEFINED HERE, THE VERSION FROM IODMAC4 IS NOT USED.*
*                                                                       *
*************************************************************************
** NAME-- AJM,SCF,IJM,CCF,FJM,SFM,EJM,CFM,IAN,IAM,OAN,OAM,ACN,DCN
*         FAN,FNC,FSJM,FCJM,IAPM,OAPM,CMCH,CHCM
*
** PURPOSE-- REDEFINE I/O INSTRUCTIONS SO THAT THE ADDRESS OF CHANNEL
*            INSTRUCTIONS CAN BE SAVED IN A TABLE.
NEWOP     ECHO   ,OP=(AJM,SCF,IJM,DCN,FJM,SFM,EJM,CFM,IAN,IAM,OAN,OAM,AC
,N,FAN,FNC,FSJM,FCJM,IAPM,OAPM,CCF,CMCH,CHCM)
*
          PURGMAC OP
OP        MACRO  P1,P2
          LOCAL  TAG
L         IFC    EQ,$P2$$
TAG       EQU    *O
          OP_.   P1
T_P1      RMT                IAN,OAN,ACN,DCN,FAN
          CON    TAG
          RMT
L         ELSE
TAG       EQU    *O
          OP_.   P1,P2
T_P2      RMT                AJM,IJM,FJM,EJM,IAM,OAM,FCN,IAPM,OAPM,
                             SCF,CCF,SFM,CFM,FSJM,FCJM,CMCH,CHCM
          CON    TAG
          RMT
L         ENDIF
OP        ENDM
NEWOP     ENDD
          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
          LDK    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
 OVERFLOW SPACE  4,10
**        OVERFLOW - CHECK FOR OVERFLOW.
*
*         OVERFLOW  ADDR
*
*         REPORT AN OVERFLOW IF *+7 OVERLAPS *ADDR*.


          PURGMAC  OVERFLOW
 OVERFLOW MACRO  ADDR
          USE    OVERFLOW
          LIST   M
          ERRPL  *+7-ADDR    CODE OVERFLOWS INTO *ADDR*
          LIST   *
          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
 E505     EQU    2405B       INVALID LENGTH SPECIFICATION
                             IN COMMAND
 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  GENERAL EQUATES.
**        GENERAL EQUATES.
*


 CHN      EQU    15B         CHANNEL NUMBER
 DCLEN    EQU    2           LENGTH OF DIAGNOSTICS COMMAND READ
 END      EQU    7776B       END OF MEMORY
 FTRY     EQU    3           NUMBER OF RETRIES ON FUNCTION TIMEOUT
 LDS170   EQU    18          DETAILED STATUS LENGTH IN 12 BIT WORDS
 MAXCHN   EQU    1024D       MAX NUMBER OF CHANNEL FRAMES TO XFER IN DIAG STATE
 PKDCHN   EQU    8           NUMBER OF CHANNEL FRAMES TO XFER DURING READ/PACK (DIAG STATE)
 MDITYP   EQU    8           SPAA TYPE ENTRY FOR MDI
 MINLEN   EQU    1400B       MINIMUM LENGTH OF I/O BUFFER
 MAXBPD   EQU    2           MAXIMUM BUFFER POOL DESCRIPTORS
 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)
 DRTYP    EQU    1           =1, IF MDI DRIVER
*                            =2, IF ICA DRIVER
 .INPN    EQU    102600B
 .SBN     EQU    1700B
 .SOML    EQU    105700B
 PRGNAM   MICRO  1,4,*NETW*

 DEBUG    EQU    0           =1, IF DEBUGGING CODE ON
 SIM      EQU    0           =1, IF RUNNING ON SIMULATOR
 BRK      EQU    0           =1, IF PP BREAKPOINT CODE IS ASSEMBLED
          SPACE  4,10
**        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.RPM    EQU    6           READ PP MEMORY
 C.READY  EQU    7           START READY SCAN
 C.SREADY EQU    10B         STOP READY SCAN
 C.PPAD   EQU    11B         SELECT PP MEMORY ADDRESS
 C.PPMEM  EQU    12B         COPY 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.WRTB   EQU    120B        WRITE CHANNELNET RECORD
 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 MCI
 C.WRITEV EQU    200B        WRITE VERIFY
          SPACE  4,10
**        DIAGNOSTIC COMMAND CODES.
*


 DC.TMRQ  EQU    1           TEST MODE REQUEST
 DC.DTPP  EQU    2           DATA TRANSFER TO PP REQUEST
 DC.RDPP  EQU    4           RETURN DATA FROM PP REQUEST
 DC.SBYP  EQU    10B         SET BYTE PACKING
 DC.RPBY  EQU    12B         READ + PACK BYTE DATA REQUEST
 DC.SBP   EQU    30B         SET BIT PACKING
 DC.RPBD  EQU    32B         READ + PACK BIT DATA REQUEST
          SPACE  4,10
**        MCI DIRECT FUNCTION CODES.
*


 F.MCLEAR EQU    0400B       MASTER CLEAR
 F.GS     EQU    0410B       GENERAL STATUS
 F.WRITE  EQU    0420B       WRITE DATA
 F.READ   EQU    0430B       READ DATA
 F.BITPM  EQU    0440B       BIT PACKING MODE
 F.BYTEPM EQU    0441B       BYTE PACKING MODE
          SPACE  4,10
**        MCI TRANSPARENT FUNCTION CODES.
*


 F.DS     EQU    0001B       DETAILED STATUS
 F.SHTDN  EQU    0002B       SHUT DOWN
 F.RERR   EQU    0003B       READ ERROR
 F.INTRES EQU    0004B       INTERFACE RESET
 F.STREG  EQU    0005B       START REGULATION
 F.SPREG  EQU    0006B       STOP REGULATION
 F.RQDIAG EQU    0007B       REQUEST DIAGNOSTICS
 F.RQDCMD EQU    0010B       REQUEST DIAGNOSTIC COMMAND
 F.DERR   EQU    0012B       DIAGNOSTIC ERROR DETECTED
 F.DMERR  EQU    0013B       DIAGNOSTIC MEMORY ERROR DETECTED
 F.ABDSEQ EQU    0015B       ABORT DIAGNOSTIC SEQUENCE
 F.USEBYT EQU    0021B       USE BYTE MODE TESTING
 F.USEBIT EQU    0022B       USE BIT MODE TESTING
 F.USEBOT EQU    0023B       USE BOTH BIT + BYTE MODE TESTING
 F.SETPV  EQU    0032B       SET PROTOCOL VERSION
 F.ILTO   EQU    0040B       IN-LINE TIMEOUT
 F.UNRM   EQU    0041B       UNABLE TO READ IN-LINE TEST MESSAGE
 F.NORM   EQU    0042B       NORMAL OPERATION
 F.FCON   EQU    0043B       FLOW CONTROL ON
 F.FCOFF  EQU    0044B       FLOW CONTROL OFF
 F.CCW    EQU    0045B       CHANNEL CONNECTION WRITE
 F.CNW    EQU    0046B       CHANNELNET WRITE
          SPACE  4,10
**        FUNCTIONS FOR CONCURRENT CHANNEL
*


 F.CCCLR  EQU    100000B     MASTER CLEAR
 F.WRCR   EQU    111000B     WRITE CONTROL REGISTER
 F.RDESR  EQU    112000B     READ ERROR STATUS REGISTER
 INITCR   EQU    400B        CONTROL REGISTER VALUE
          SPACE  4,10
**        GENERAL STATUS BIT DEFINITIONS.
*
          SPACE  4,10
 S.EXPERR EQU    0           EXPECTED ERROR OCCURRED (DIAGNOSTIC STATE ONLY)
 S.NORMFC EQU    0           NORMAL FLOW CONTROL
 S.EXPMER EQU    1           EXPECTED MEMORY ERROR (DIAGNOSTIC STATE ONLY)
 S.RQSYNC EQU    1           REQUEST SYNCHRONIZATION
 S.STATE1 EQU    3           STATE BIT
 S.STATE2 EQU    4           STATE BIT
 S.STATE3 EQU    5           STATE BIT
 S.OPER   EQU    6           OPERATIONAL BIT
 S.BUSY   EQU    7           BUSY BIT
 S.SEND   EQU    8           SEND DATA
 S.DATAV  EQU    9           DATA AVAILABLE
 S.MEMERR EQU    10          MEMORY ERROR
 S.ERROR  EQU    11          ERROR BIT
 S.VALID  EQU    15          SOFTWARE FLAG INDICATING ERROR BITS INVALID

 LDMESS   EQU    4B          LOADING STATE MESSAGE
 CNMESS   EQU    10B         GENERAL STATUS BIT 3-6, INDICATING CHANNELNET MESSAGE
 CCMESS   EQU    11B         GENERAL STATUS BIT 3-6, INDICATING CHANNEL CONNECTION MESSAGE
 ILMESS   EQU    15B         GENERAL STATUS BIT 3-6, INDICATING IN-LINE MESSAGE

 VALID    EQU    100000B     VALUE TO SET GENERAL STATUS VALID
 STBITS   EQU    170B        MASK FOR STATE BITS
          SPACE  4,10
**        DIAGNOSTIC ERROR STATUS EQUATES.
*
*         BITS 0-1 = GENERAL STATUS BITS 0-1,
*         BITS 2-3 = GENERAL STATUS BITS 10-11.
*


 EXER     EQU    4011B       EXPECTED ERROR
 EXME     EQU    6012B       EXPECTED MEMORY ERROR
          SPACE  4,10
**        DETAILED STATUS WORD OFFSETS
*


 DS.PROV  EQU    0           CHANNEL PROTOCOL VERSION
 DS.MPS   EQU    11          MAXIMUM PDU SIZE
          SPACE  4,10
**        IN-LINE DIAGNOSTICS TEST HEADER BIT DEFINITIONS.
*


 IL.RAREG EQU    0           READ NEXT MESSAGE USING A-REG I/O (NOT SUPPORTED)
 IL.RBLK  EQU    1           READ NEXT MESSAGE USING BLOCK I/O
 IL.WDLY  EQU    2           WRITE MESSAGE WITH DELAYS
 IL.WAREG EQU    3           WRITE MESSAGE USING A-REG I/O (NOT SUPPORTED)
 IL.WBLK  EQU    4           WRITE MESSAGE USING BLOCK I/O
 IL.DSCRD EQU    5           DISCARD MESSAGE
          SPACE  4,10
**        MDI DRIVER STATES.
*
          SPACE  2,10
 ST.MDIR  EQU    0           MDI RESET
 ST.DIAG  EQU    1           DIAGNOSTICS
 ST.STRT  EQU    3           STARTING
 ST.LOAD  EQU    4           LOADING
 ST.OPER  EQU    10B         OPERATIONAL
 ST.IDLE  EQU    11B         IDLE
 ST.ILD   EQU    12B         IN-LINE DIAGNOSTICS
 ST.PPR   EQU    13B         RESET BY PP
 ST.MDI   EQU    14B         RESET BY MDI
 ST.PPD   EQU    15B         DOWNED BY PP
          SPACE  4,10
***       WAIT TIMES IN MILLISECONDS.
*

 FTOLEN   EQU    20          FUNCTION TIMEOUT LENGTH
 GSBUSY   EQU    5000        MAXIMUM WAIT FOR NOT BUSY
 GSFULL   EQU    1           WAIT FOR FULL ON GENERAL STATUS
 WTDEACT  EQU    1           WAIT FOR CHANNEL TO DEACTIVATE
 WTEMPTY  EQU    1           MAXIMUM WAIT FOR CHANNEL EMPTY
 WTFULL   EQU    1           WAIT FOR CHANNEL FULL
 WTDAV    EQU    1000        WAIT FOR DATA AVAILABLE
 WTSD     EQU    1000        WAIT FOR SEND DATA AVAILABLE

          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
***       FUNCTION TIMEOUT STATUS EQUATES.
*

 FTO.RC   EQU    0           RETRY COUNT
 FTO.SC   EQU    1           SYMPTOM CODE
          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           NO DETAILED STATUS
 RC.REC   EQU    1           DETAILED STATUS

          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
**        UNSOLICITED RESPONSE CODES.
*
          SPACE  4,10
 URC.RN   EQU    1           CHANGE FROM READY TO MDI RESET
 URC.NR   EQU    2           CHANGE FROM NOT READY TO LOADING
 URC.IE   EQU    3           INTERNAL OR INTERFACE ERROR
 URC.RD   EQU    7           CHANNELNET 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,10
**        CHANNEL PROTOCOL EQUATES.
*

 PR.MIN   EQU    0#42        MINIMUM PROTOCOL SUPPORTED BY DRIVER
 PR.MAX   EQU    0#44        MAXIMUM PROTOCOL SUPPORTED BY DRIVER
 PR.BASE  EQU    0#80        BASE FOR PROTOCOL NEGOTIATION

          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,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$

 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 - NO DETAILED STATUS
                               1 - DETAILED STAUS
          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 - MDI CHANNELNET READ COMPLETE
                               8 - MDI DEVICE ERROR
                               9 - LOG PP MESSAGE
                               13 - MDI 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

 BITC     SET    P.LASTC*16
          ALIGN  0,64
 PROV     PPWORD             CHANNEL PROTOCOL VERSION
          ALIGN  32,64
 MAXRS    STRUCT 4           MAXIMUM RECORD SIZE
 ID       STRUCT 6

 BITC     SET    P.LASTC*16
          ALIGN  0,64
 ERRID    PPWORD             ERROR IDENTIFIERS
 OPTP     PPWORD             OPERATION 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
 LSIT     BOOLEAN            INCOMPLETE TRANSFER
 LSMT     BOOLEAN            MESSAGE CONTENT ERROR
 LSMSE    BOOLEAN            MAXIMUM SIZE EXCEEDED
          ALIGN  47,64
 LSGSI    BOOLEAN            INTERNAL TO DRIVER ONLY
          ALIGN  48,64
 FUNTO    PPWORD             FUNCTION CODE IF FUNCTION TIMEOUT ERROR
 PFUNC    PPWORD             PREVIOUS FUNCTION
 CURST    PPWORD             CURRENT STATE
 P.ERRW1  EQU    P.CURST     ERROR WORD 1
 PREST    PPWORD             PREVIOUS STATE
 P.ERRW2  EQU    P.PREST     ERROR WORD 2
 GENST    PPWORD             GENERAL STATUS OF THE FIRST TIME ERROR
                               WAS ENCOUNTERED
 EXPD     STRUCT 4           EXPECTED MESSAGE LENGTH
 ACTD     STRUCT 4           ACTUAL MESSAGE LENGTH
 P.DATA1  EQU    P.EXPD      BYTES READ
 P.DATA2  EQU    P.ACTD      BYTES WRITTEN
 RETSUC   PPWORD             RETRY SUCCESS
*                            0 = RECOVERED ERROR
*                            1 = UNRECOVERED ERROR
*                            2 = INTERMEDIATE ERROR
*                            3 = INFORMATIVE MESSAGE
 RETCT    PPWORD             RETRY COUNT
 LDS      BOOLEAN            DETAIL STATUS INCLUDED
 LGS      BOOLEAN            GENERAL STATUS INCLUDED
 DICA     BOOLEAN            DOWN MDI
          ALIGN  48,64
 DETAIL   STRUCT 1           START OF DETAILED STATUS - MCI CHANNEL PROTOCOL ID
 SLOTNM   STRUCT 1           SLOT NUMBER
 SYSVER   PPWORD             SYSTEM VERSION
 SYSID    STRUCT 6           SYSTEM ID
 LSTOP    STRUCT 1           LAST I/O OPERATION
 LSTTFC   STRUCT 1           LAST TRANSPARENT FUNCTION
 LSTFUN   PPWORD             LAST FUNCTION
 LLFUN    PPWORD             LAST BUT ONE PP FUNCTION
 SUMFLG   SUBRANGE 0,17B     SUMMARY FLAGS
 MGENST   SUBRANGE 0,7777B   MCI GS AS KNOWN BY MCI SOFTWARE
 HWSTS1   STRUCT 1           MCI HW STATUS REGISTER 1
 HWSTS2   STRUCT 1           MCI HW STATUS REGISTER 3
 SOFTFG   PPWORD             SOFTWARE STATUS FLAGS
 RESERV   STRUCT 4           RESERVED FIELDS


          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

*         ERROR ID CODES.

 K.LFTO   EQU    1           FUNCTION TIMEOUT ERROR
 K.LGSBTO EQU    2           GENERAL STATUS BUSY TIME OUT
 K.LOF    EQU    3           OPERATION FAILURE
 K.LGSSDT EQU    4           GENERAL STATUS SEND DATA TIMEOUT
 K.LGSAT  EQU    5           GENERAL STATUS AVAILABLE TIMEOUT
 K.LGSCF  EQU    6           GENERAL STATUS CONTENT FAILURE
 K.LGSDAT EQU    7           GENERAL STATUS DATA AVAILABLE TIMEOUT
 K.LUD    EQU    8           USAGE DATA
 K.LIVST  EQU    9           INVALID STATE TRANSITION
 K.LMDIA  EQU    10          MDI AVAILABLE
 K.LMDIR  EQU    11          MDI RESET
 K.LPROER EQU    12          PROTOCOL NEGOTIATION ERROR
 K.LMCF   EQU    13          MASTER CLEAR FAILURE
 K.LMTE   EQU    15          MESSAGE TYPE ERROR

*         OPERATION CODES.

 K.LWRT   EQU    1           WRITE
 K.LREAD  EQU    2           READ
 K.LRDS   EQU    3           READ DETAILED STATUS
 K.LRDC   EQU    4           READ DIAGNOSTIC COMMAND
 K.LRGS   EQU    5           READ GENERAL STATUS
 K.LILWRT EQU    6           INLINE WRITE
          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  LSIT
 K.LSIT   EQU    MSK
          MASKP  LSMT
 K.LSMT   EQU    MSK
          MASKP  LSMSE
 K.LSMSE  EQU    MSK
          MASKP  LSGSI
 K.LSGSI  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
**        PPIT COMMUNICATION BUFFER.
*
*         THE MAXIMUM SIZE ALLOWED FOR COMMUNICATION BUFFER IS
*         *NAC$COMMUNICATION_BUFFER_SIZE* DEFINED IN DECK
*         NAM$INTRANET_LAYER_MGMT_R3

 CB       RECORD PACKED

          ALIGN  31,64
 SLAVE    BOOLEAN            NONZERO IF SLAVE PP
 PARTNR   RMA                PARTNER-S COMMUNICATION BUFFER (RMA)

          ALIGN  16,64
 CWLEN    PPWORD             LENGTH OF CONTROLWARE ADDRESS LIST
 CWRMA    RMA                ADDRESS OF FIRST ENTRY
          STRUCT 8           NOT USED
          ALIGN  32,64
 DRMA     RMA                OVERLAY DIRECTORY RMA
 CB       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
**        IEEE 802.2 HEADER.
*

 H802.2   RECORD PACKED

 DSAP     STRUCT 1           DESTINATION SAP
 SSAP     STRUCT 1           SOURCE SAP
 CNTRL    STRUCT 1           CONTROL FIELD

 H802.2   RECEND


 F1       EQU    B.H802.3*2+2
 F.H802.3 EQU    F1/3        CHANNEL FRAMES IN HEADER
          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

 F2       EQU    B.HCC*2+2
 F.HCC    EQU    F2/3        CHANNEL FRAMES IN HEADER
          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
 HLC      PPWORD             HEADER LENGTH IN CHANNEL FRAMES
 ALF      PPWORD             OFFSET 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)

 UQD      RECEND
          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 BUFER (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
          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
          SPACE  4,10
**        CHANNEL INTERLOCK TABLE
*

 CIT      RECORD PACKED

 LOCK     STRUCT 256
 FLAGS    STRUCT 256
 CONC     EQU    15          BIT 15 SET IF CONCURRENT
 CIT      RECEND

          TITLE  DIRECT CELL DEFINITIONS.
**        DIRECT CELLS.
*


          ORG    0
          CON    INT-1       STARTING ADDRESS
 CM.PPR   BSSZ   3           CM ADDRESS OF PREVIOUS PERIPHERAL REQUEST (REFORMATTED)
 CM.PIT   BSSZ   3           CM ADDRESS OF PP INTERFACE TABLE (REFORMATTED)
 CM.URQ   BSSZ   3           CM ADDRESS OF UNIT REQUEST QUEUE (REFORMATTED)
 CM.RS    BSSZ   3           CM ADDRESS OF RESPONSE BUFFER (REFORMATTED)
 CM.QT    BSSZ   3           CM ADDRESS OF UNIT QUEUE TAIL POINTER (REFORMATTED)
 CM.BPD   BSSZ   3           CM ADDRESS OF BUFFER POOL DESCRIPTOR (REFORMATTED)

 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

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

 P1       DATA   H*NE*
 P2       DATA   H*TW*
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
 WC       BSSZ   1           WORD COUNT TO READ/WRITE CM WORDS

 BUFLEN   BSSZ   1           CM BUFFER LENGTH IN PP WORDS
 BYTS     BSSZ   1           NUMBER OF BYTES TO TRANSFER TO/FROM CM
 CMADR    BSSZ   3           CM ADDRESS
 CMLISTL  BSSZ   1           NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST
 CURBUF   BSSZ   1           CURRENT PP BUFFER ADDRESS
 DATADD   BSSZ   3           CM ADDRESS OF DATA AREA
 ERRRCP   BSSZ   1           POINTER TO ERROR RECOVERY COUNTER
 FSTBD    BSSZ   1           INDEX TO BUFFER DESCRIPTOR
 FUNCD    BSSZ   1           FUNCTION CODE
 GNSTAT   BSSZ   1           GENERAL STATUS
 HDRTYP   BSSZ   1           INDEX INTO HEADER CHARACTERISTIC TABLE
 LSTATE   BSSZ   1           LAST STATE MDI WAS KNOWN TO BE IN
 PPNO     CON    1           LOGICAL PP NUMBER
 RBYTS    BSSZ   1           REMAINING BYTES
 RESPC    BSSZ   1           RESPONSE CODE
 SBYOFF   BSSZ   1           STARTING BYTE OFFSET IN CM BUFFER
*                            THE LOADB MACRO STORES INTO THIS LOCATION
 STCHNG   CON    ST.IDLE     NON_ZERO IF PP CHANGING MDI STATE OR IDLE
 UNSC     BSSZ   1           UNSOLICITED RESPONSE CODE
          SPACE  3
          ORG    72B

 DSRTP    CON    0           HCS REAL MEMORY WORD-ADDRESS
          CON    1
 TBYTS    EQU    DSRTP       TOTAL NUMBER OF BYTES TO ALLOCATE CM BUFFERS FOR
 INPNT    EQU    DSRTP+1     IN POINTER FOR RESPONSE BUFFER
 ERRCNT   BSSZ   1           NUMBER OF BYTES NOT TRANSFERRED ON I/O REQUEST
 ERRT1    BSSZ   1           TEMPORARY STORAGE FOR ERROR CHECK
          ORG    76B
          CON    5           TEMPORARY, PP TYPE USED BY DEADSTART
 BYTCNT   EQU    76B         BYTE COUNT OF TRANSFER
 IOCNT    BSSZ   1           NUMBER OF CHANNEL WORDS TO TRANSFER
          SPACE  4,10
*         *DRNAME* IS WRITTEN WITH THE DRIVER NAME (NETW) AT
*         INITIALIZATION TIME.

          ORG    100B
 DRNAME   LJM    INT         INITIALIZE DRIVER
          SPACE  4,10

 ABSC     BSSZ   1           ABNORMAL STATUS CODE
 AVAIL    CON    URC.RN      = LAST UNSOLICITED RESPONSE CODE SENT
*                            INDICATING MDI AVAILABILITY
 BWRT     BSSZ   1           NUMBER OF BYTES TO WRITE TO CM BUFFER
 CHAN     BSSZ   1           CHANNEL NUMBER
 CML      BSSZ   1           INDEX TO CMLIST
 CHLOCK   BSSZ   1           NON ZERO IF CHANNEL LOCKED
 CHTYP    CON    1           =1 IF NOT CONCURRENT CHANNEL
 CM.CB    BSSZ   3           CM ADDRESS OF COMMUNICATIONS BUFFER (REFORMATTED)
 CM.CHAN  BSSZ   3           CM ADDRESS OF CHANNEL INTERLOCK TABLE (REFORMATTED)
 CM.INT   BSSZ   3           CM ADDRESS OF INTERRUPT WORD (REFORMATTED)
*
*    A REGISTER PORTION OF REFORMATTED ADDRESS OF MASTER CONTROL TABLE.
*
 CM.MCT   BSSZ   1
 CSDTIME  BSSZ   1           SEND DATA TIMER
 CSDTMP   BSSZ   1           SEND DATA MULTIPLIER
 DEVID    BSSZ   1           DEVICE IDENTIFIER
 DBUGM    CON    1           = 0 IF DEBUG MODE ON
*                            = 1 IF DEBUG MODE OFF
 DH       BSSZ   3           DIRECTORY HEADER
 EBYOFF   BSSZ   1           ENDING BYTE OFFSET VALUE (ODD OR EVEN)
 ERRT2    BSSZ   1           TEMPORARY STORAGE FOR ERROR CHECK
 EXPD     BSSZ   2           EXPECTED/ACTUAL LENGTH OF MESSAGE
 ACTD     EQU    EXPD+1
 FBSIZE   BSSZ   1           MAXIMUM SIZE OF FIRST BUFFER POOL BUFFER
 FSTRD    BSSZ   1           <> 0, IF FIRST READ HAS BEEN DONE AND ANOTHER READ REQUIRED
 GFCFC    CON    F.FCOFF     FLOW CONTROL FUNCTION TO BE SENT AFTER READY
 IERC     BSSZ   1           INTERFACE ERROR CODE
 INLINE   BSSZ   1           <> 0, IF IN-LINE DIAGNOSTIC MESSAGE AWAITING OUTPUT
 LASTUR   CON    C.WRTR      LAST UNIT REQUEST
 LIM      BSSZ   1           LIMIT OF CIRCULAR RESPONSE BUFFER
 MSGTYP   BSSZ   1           =0, IF IN-LINE DIAGNOSTIC MESSAGE,
*                            <>0, IF NORMAL NETWORK MESSAGE
 NEGPR    CON    1           <> 0 IF PROTOCOL NEGOTIATION REQUIRED
 NIL      VFD    48/0#FFFF80000000,16/0  CYBIL NIL POINTER
 NUMBP    BSSZ   1           NUMBER OF BUFFER POOLS
 NUMPRI   BSSZ   1           NUMBER OF CONSECUTIVE PRIORITY REQUESTS
 NXTREC   BSSZ   1           SIZE OF NEXT RECORD TO READ
 ODDSTR   BSSZ   1           ODD BYTE START IN PP BUFFER (170 OAM NEEDED)
 OTYPE    BSSZ   1           OPERATION TYPE
 OVNUM    BSSZ   1           NUMBER OF OVERLAY LAST LOADED
 PREFC    BSSZ   1           PREVIOUS FUNCTION CODE
 PREST    BSSZ   1           PREVIOUS STATE
 PROV     BSSZ   1           VERSION OF CHANNEL PROTOCOL MDI SUPPORTS
 PVA      BSSZ   8           PVA - RMA ADDRESS PAIR STORAGE AREA
 RMA      EQU    PVA+/RQ/P.NEXT
 RCON     BSSZ   1           RESPONSE CONDITION
 RDRTY    CON    FTRY        DECREMENTED BY ONE EACH TIME A READ ERROR
*                            OCCURS, SET TO ZERO ON UNRECOVERED ERROR
 RDSYN    BSSZ   1           READ SYNCHRONIZATION WORD
 REMBYT   BSSZ   1           REMAINING BYTES IN PP BUFFER AFTER OUTPUT
 REQTYP   BSSZ   1           =0, IF PROCESSING PP REQUEST
*                            <> 0, IF PROCESSING UNIT REQUEST
 RETRY    BSSZ   1           RETRY COUNT
 RWA      BSSZ   1           READ WRITE ADDRESS
 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
          VFD    16/F.HCC    CC HEADER LENGTH IN FRAMES
          VFD    16/IOBUF+/HCC/P.DLEN ADDRESS OF LENGTH FIELD
          VFD    16/0        HEADER IS INCLUDED IN LENGTH
          VFD    16/URC.CR   CC RESPONSE CODE
          VFD    16/0        SET AT PROTOOCOL NEGOTIATION
          LOC    *O
*
*         TCNH   DEFINES THE CHANNELNET HEADER
*
 TCNH     BSS    0
          LOC    0
          VFD    16/B.H802.3  CHANNELNET HEADER LENGTH IN BYTES
          VFD    16/F.H802.3  CHANNELNET HEADER LENGTH IN FRAMES
          VFD    16/IOBUF+/H802.3/P.DLEN  ADDRESS OF LENGTH FIELD
          VFD    16/B.H802.3  ADD HEADER LENGTH TO LENGTH
          VFD    16/URC.RD   CHANNELNET RESPONSE CODE
          VFD    16/MINLEN*2  CHANNELNET MAXIMUM LENGTH
          LOC    *O
 TI       CON    1           SET TO 2 IF 2XPP
 TIMA     BSSZ   1           MOST RECENT CLOCK VALUE
 TIMB     BSSZ   1           NORMAL FUNCTION TIMER
 UNIT     BSSZ   1           LOGICAL UNIT NUMBER
 WRRTY    CON    FTRY        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
          IFEQ   DEBUG,1
 BUFCNT   BSSZ   MAXBPD      TOTAL CM BUFFERS USED
 EMPBUF   BSSZ   MAXBPD      NUMBER OF TIMES BUFFER POOL WENT EMPTY
 HISTINX  BSSZ   1           FUNCTION HISTORY INDEX
 FUNHIST  BSSZ   8           FUNCTION HISTORY TABLE
 LSTFUNC  BSSZ   1           LAST FUNCTION CODE SAVED IN TABLE
          ENDIF
          TITLE  DCS - DETERMINE CURRENT STATE.
**        DCS - DETERMINE CURRENT STATE.
*
*         THIS IS THE MAIN ROUTINE OF THE PP.  THIS ROUTINE DETERMINES THE
*         CURRENT STATE OF THE MDI DRIVER AND CALLS THE APPROPRIATE STATE
*         PROCESSOR.  WHEN A STATE TRANSITION OCCURS THE STATE PROCESSOR
*         RETURNS AND THE PROCESS RESTARTS.  ALL STATES EXCEPT IDLE, PP MCI
*         RESET, PP DOWN,AND INLINE ARE DETERMINED DIRECTLY FROM THE GENERAL
*         STATUS.  IDLE STATE IS A SOFTWARE IDLE OF THE PP; TRANSITIONS TO/FROM
*         THIS STATE ARE INITIATED BY A CP REQUEST.  INLINE STATE IS ENTERED
*         WHEN THE PP IS HOLDING AN IN-LINE MESSAGE AND WAITING TO RETURN IT,
*         GENERAL STATUS MUST SHOW OPERATIONAL STATE.  PP MCI RESET IS AN ERROR
*         RECOVERY PROCESS USED TO REINITIALIZE THE MCI.  PP DOWN IS A SOFTWARE
*         STATE ENTERED WHEN THE PP HAS DOWNED THE MDI.
          SPACE  4,10
 DCS      LDN    0
          STML   TIMB
          STDL   ERRT1       RESET ERROR REGISTER POINTER
          LDC    GERT
          STML   GERT
          LDN    FTRY
          STML   RDRTY
          STML   WRRTY
          LDDL   STCHNG
          ZJN    DCS20       IF NOT IDLE OR STATE CHANGE BY DRIVER
          STDL   LSTATE
          LMN    ST.IDLE
          ZJN    DCS10       IF IDLE
          LMN    ST.PPD&ST.IDLE
          ZJN    DCS10       IF DOWN
          LDN    0
          STDL   STCHNG
 DCS10    STML   INLINE      CLEAR INLINE MESSAGE QUEUED
          LCN    0
          STML   CSDTIME     RESET SEND DATA TIMER
          LDN    17B
          STML   CSDTMP      RESET SEND DATA MULTIPLIER
          LDDL   STCHNG
          NJK    DCS60       IF IDLE OR DOWN
          UJN    DCS50       STATE CHANGED BY SOFTWARE

 DCS20    RJM    GST         GENERAL STATUS
          NJK    DCS         IF STATUS NOT READ SUCCESSFULLY
          LDDL   LSTATE
          STML   PREST       SAVE PREVIOUS STATE IN CASE OF ERROR
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.OPER
          MJN    DCS30       IF OPERATIONAL STATE
          SHN    4
          LPN    7
          STDL   LSTATE      SAVE LAST STATE
          LDC    C.WRTR
          STML   LASTUR      SET TO CHANNEL CONNECTION
          LDN    0
          STML   INLINE      CLEAR INLINE MESSAGE QUEUED
          UJN    DCS50       PROCESS STATE

 DCS30    LDML   INLINE
          NJN    DCS40       IF INLINE MESSAGE AWAITING OUTPUT
          LDN    ST.OPER
 DCS40    STDL   LSTATE
 DCS50    LDN    OV7O
          RJM    RDO         LOAD OVERLAY
          LDDL   LSTATE
          SBN    ST.OPER
          NJN    DCS55       IF NOT OPERATIONAL STATE
          LDML   NEGPR
          ZJN    DCS55       IF PROTOCOL NEGOTIATED
          LDN    OV4O
          RJM    RDO         LOAD OVERLAY
          RJM    INV         LOG INVALID STATE CHANGE
          UJN    DCS70       LOOP

 DCS55    RJM    SAC         SEND AVAILABILITY CHANGE
          NJN    DCS70       IF ERRORS GETTING DETAILED STATUS
          LDN    OV1O
          RJM    RDO         GET OVERLAY 1 IN CASE THIS IS IN_LINE
 DCS60    LDML   SPT,LSTATE
          SHN    -12
          RJM    RDO         READ OVERLAY
          LDML   SPT,LSTATE
          STD    T1
          RJM    0,T1        RETURN JUMP TO STATE PROCESSOR
 DCS70    UJK    DCS         LOOP
 SPT      SPACE  4,25
**        STATE PROCESSOR TABLE.
*
*         THE STATE TABLE HAS THE FOLLOWING FORMAT
*         BITS 48 - 51   OVERLAY PROCESSOR RESIDES IN
*         BITS 52 - 63   ENTRY ADDRESS
*
          SPACE  4,10
 SPT      BSS    0
          VFD    4/OV4O,12/MFR         MDI RESET STATE PROCESSOR
          VFD    4/OV3O,12/DIA         DIAGNOSTIC STATE PROCESSOR
          VFD    4/OV4O,12/INV         INVALID STATE PROCESSOR
          VFD    4/OV7O,12/NCP         STARTING STATE PROCESSOR
          VFD    4/OV1O,12/AVA         LOADING STATE
          VFD    4/OV4O,12/INV         INVALID STATE PROCESSOR
          VFD    4/OV4O,12/INV         INVALID STATE PROCESSOR
          VFD    4/OV4O,12/INV         INVALID STATE PROCESSOR
          VFD    4/OV1O,12/AVA         OPERATIONAL STATE
          VFD    4/OV4O,12/IDL         IDLE STATE PROCESSOR
          VFD    4/OV5O,12/ILD         IN-LINE DIAGNOSTICS STATE PROCESSOR
          VFD    4/OV4O,12/MCM         MASTER CLEAR MCI
          VFD    4/OV4O,12/MFR         MDI RESET
          VFD    4/OV4O,12/IDL         DOWNED BY PP
          TITLE  AVA - LOADING AND OPERATIONAL STATE PROCESSOR.
**        AVA - LOADING AND OPERATIONAL STATE PROCESSOR.
*
*         THIS ROUTINE PERFORMS PROCESSING FOR BOTH LOADING
*         AND OPERATIONAL STATES.
*
*         CALLS  CSC,IFR,PPR,PRD,PUR,SSM.


 AVA      SUBR               ENTRY/EXIT
          LDN    0
          STML   NXTREC
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          NJN    AVA20       IF NOT OPERATIONAL STATE
          LDML   GFCFC
          RJM    IFR         SEND FLOW CONTROL FUNCTION
          NJN    AVAX        IF ERRORS
 AVA10    BSS    0
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
 AVA20    NJN    AVA40       IF NOT OPERATIONAL STATE
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.RQSYNC
          MJN    AVA35       IF SYNCHRONIZATION REQUESTED
          IAN    14B         READ MICROSECOND COUNTER
          LPC    7777B
          SBM    TIMA
          PJN    AVA30       IF NO OVERFLOW
          ADC    10000B      COMPENSATE FOR CLOCK OVERFLOW
 AVA30    ADC    -1000
          MJN    AVA40       IF LESS THAN 1 MILLISECOND
          LDC    1000        ADVANCE BASE BY 1 MILLISECOND
          RAM    TIMA
          SOM    TIMB
          PJN    AVA10       IF NOT TIME FOR NORMAL FUNCTION
 AVA35    LDN    F.NORM
          RJM    IFR         SEND NORMAL OPERATION FUNCTION
          STML   RDSYN       CLEAR READ SYNCH IF SUCCESSFUL
 AVA40    RJM    PPR         PROCESS PP REQUESTS
          RJM    CSC         CHECK IF STATE CHANGE
          NJN    AVA60       IF STATE CHANGE
          RJM    PRD         PROCESS READ
          RJM    CSD         CHECK IF STATE CHANGE OR SEND DATA
          MJN    AVA60       IF SEND DATA TIMEOUT
          NJN    AVA50       IF SEND DATA NOT INDICATED
          RJM    DFC         DETERMINE FLOW CONTROL
          RJM    PUR         PROCESS UNIT REQUEST
 AVA50    RJM    CSC         CHECK IF STATE CHANGE
          ZJK    AVA10       IF NO STATE CHANGE
 AVA60    UJK    AVAX        EXIT

*copy iodmac6
          TITLE  MAIN ROUTINES - LOADING + OPERATIONAL STATES.
 GPR      SPACE  4,10
**        GPR - GET PP REQUEST.
*
*         EXIT   (A) = 0 IF NO PP REQUESTS.
*                (A) <> 0 IF PP REQUEST WAS FOUND.
*
*         USES   P1 - P4.
*
*         CALLS  CPL, IRP, SPL.
*
*         MACROS LOADC, LOADF.


 GPR      SUBR               ENTRY/EXIT
          LCN    0
          STDL   P1
          STDL   P2
          STDL   P3
          LDC    0#7FFF
          STDL   P4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDCL   P1          CLEAR ACTIVE CHECK BIT
          ADN    /PIT/C.PPQ  CM ADDRESS OF PP REQUEST QUEUE POINTER
          CRDL   P1          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    BSS    0
          LDN    2
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA
          CRML   RS,WC       READ PVA AND RMA OF FIRST REQUEST IN CHAIN
          LDN    C.RQ
          STDL   WC
          LOADF  RS+/RS/P.REQ  CM ADDRESS OF FIRST PP REQUEST
          CRML   RQ,WC       READ PP REQUEST
          RJM    CPL         CLEAR PP QUEUE LOCKWORD
          RJM    IRP         INITIALIZE REQUEST PROCESSING
          LCN    0
          UJK    GPRX        EXIT
 GUR      SPACE  4,16
**        GUR - GET UNIT REQUEST.
*
*         THIS ROUTINE WILL GET THE NEXT REQUEST ON A
*         UNIT QUEUE.
*
*         ENTRY  (CM.URQ) = REFORMATTED ADDRESS OF UNIT
*                           QUEUE TO SEARCH.
*
*         EXIT   (A) = 0, IF NO REQUESTS TO PROCESS,
*                    <> 0, IF REQUEST TO PROCESS.
*
*         USES   P1 - P4, T2, WC.
*
*         CALLS  IRP.
*
*         MACROS LOADC, LOADF.


 GUR      SUBR               ENTRY/EXIT

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

          LOADC  CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          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.

          LOADF  P3          CM ADDRESS OF THE NEXT REQUEST
          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
 PPC      SPACE  4,12
**        PPC - PROCESS PP COMMANDS.
*
*         THIS ROUTINE PROCESSES ALL PP COMMANDS.  AT THE
*         PRESENT TIME VALID COMMANDS ARE - C.IDLE, C.RESUME,
*         C.RDY, C.GFC, C.DBUG, C.RESET, C.PPAD, C.RPM, C.PPMEM.
*
*         ENTRY  (CM) - COMMAND.
*                (RQ) - PP REQUEST.
*
*         USES   P2.
*
*         CALLS  PIE, RDO, 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    TPPC-2      ADDRESS-2 OF PP COMMAND TABLE
          RJM    STB         SEARCH TABLE
          NJN    PPC20       IF MATCH FOUND

*         PROCESS INVALID COMMAND.

          LDC    E501        INTERFACE ERROR
          RJM    PIE         PROCESS INTERFACE ERROR
          UJN    PPC30

*         PROCESS VALID COMMAND.

 PPC20    STD    P2
          SHN    -12
          RJM    RDO         READ OVERLAY
          RJM    0,P2        CALL COMMAND PROCESSOR
 PPC30    LDN    OV2O
          RJM    RDO         LEAVE IO OVERLAY LOADED
          UJK    PPCX        EXIT
          SPACE  4,32
**        TPPC - PP COMMAND TABLE.
*
*         THE COMMAND TABLE CONTAINS TWO WORD ENTRIES IF THE FOLLOWING FORMAT
*         BITS 32 - 47   PP COMMAND CODE
*         BITS 48 - 51   OVERLAY PROCESSOR RESIDES IN
*         BITS 52 - 63   ENTRY ADDRESS
*
          SPACE  4,10
 TPPC     VFD    16/C.IDLE,4/OV9O,12/IDP  IDLE PROCESSOR
          VFD    16/C.RESUME,4/OV9O,12/REP  RESUME PROCESSOR
          VFD    16/C.RDY,4/OV9O,12/NRA     SYNCHRONIZE NOT READY
          VFD    16/C.GFC,4/OV8O,12/GFC  GLOBAL FLOW CONTROL
          VFD    16/C.DBUG,4/OV9O,12/SDM  DEBUG MODE
          VFD    16/C.RESET,4/OV9O,12/RFC  RESET MCI
          VFD    16/C.PPAD,4/OVAO,12/SPA  SELECT PP ADDRESS
          VFD    16/C.RPM,4/OVAO,12/RPM   READ PP MEMORY
          VFD    16/C.PPMEM,4/OVAO,12/WPM   WRITE PP MEMORY
          IFEQ   BRK,1
          VFD    16/C.DEFBA,4/OVAO,12/DBA DEFINE PP BKPT AREA IN CM
          ENDIF
          CON    0


          TTL    NAM$MDI DRIVER (NETW).
          TITLE  MISCELLANEOUS ROUTINES.
 CHG      SPACE  4,10
**        CHG - CHANGE CHANNEL INSTRUCTIONS.
*
*         CHANGE ALL CHANNEL INSTRUCTIONS TO USE THE SPECIFIED CHANNEL.
*
*         ENTRY  (CHAN) = NEW CHANNEL NUMBER TO BE USED.
*                (A) = 0 IF CHANGING MAIN PROGRAM,
*                      OVERLAY NUMBER IF OVERLAY.
*
*         USES   T1, T2.
          SPACE  2
 CHG      SUBR               ENTRY/EXIT
          STDL   T1
          LDML   TCHG,T1     GET INSTRUCTION ADDRESS
          STML   CHGA
          LDN    0
          STDL   T1          CHANGE MDI CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
 CHGA     EQU    *-1         ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGX        IF END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMML   CHAN        CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJN    CHG10
          SPACE  4,10
**        TCHG - TABLE OF POINTERS TO CHANNEL INSTRUCTION LIST.
*
*         POINTERS TO THE LIST OF CHANNEL INSTRUCTIONS USED IN
*         EACH OVERLAY.


 TCHG     CON    CONCH
          CON    OV1CH
          CON    OV2CH
          CON    OV3CH
          CON    OV4CH
          CON    OV5CH
          CON    OV6CH
          CON    OV7CH
          CON    OV8CH
          CON    OV9CH
          CON    OVACH
 CFT      SPACE  4,25
**        CFT - CHECK FUNCTION TIMEOUT.
*
*         THIS ROUTINE CHECKS FOR FUNCTION TIMEOUT ERRORS.
*         IF ERRORS OCCURRED THEY ARE LOGGED AND THE PROPER
*         RECOVERY ACTION IS INITIATED.
*
*         ERROR RECOVERY ON FUNCTION TIMEOUT IS HANDLED AS FOLLOWS.
*         1. ALL FUNCTIONS ARE RETRIED UP TO TWO MORE TIMES.
*         2. ALL FUNCTION TIMEOUTS (EXCEPT GENERAL STATUS) ARE LOGGED.
*         3. IF FAILING FUNCTION WAS GENERAL STATUS SET MDI STATE TO RESET.
*         4. IF FAILING FUNCTION WAS MASTER CLEAR SET MDI STATE TO DOWN.
*         5. FOR FUNCTION TIMEOUT IN DIAGNOSTIC STATE DOWN MDI.
*         6. FOR ALL MDI STATES OTHER THAN DIAGNOSTIC THE MCI IS RESET.
*
*
*         ENTRY  (A) = POINTER TO STATUS RETURN AREA(SRA).
*                (FUNCD) = FUNCTION CODE.
*
*         EXIT   (A) = 0, FUNCTION ISSUED, NORMAL COMPLETION.
*                (A) <> 0, FUNCTION TIMEOUT.
*
*         USES   T5.
*
*         CALLS  SLM, SRU, SSC.


 CFT05    LDML   FTO.RC,T5
          NJN    CFT07       IF RECOVERED GENERAL STATUS
          LDN    ST.MDI
          STDL   STCHNG      CHANGE STATE TO RESET

 CFT      SUBR               ENTRY/EXIT
          STDL   T5          SAVE STATUS AREA
          LDC    F.GS
          SBDL   FUNCD
          ZJN    CFT05       IF GENERAL STATUS
          LDDL   FUNCD
          STML   LRS+/RS/P.FUNTO  PUT FUNCTION CODE IN RESPONSE
          LDML   FTO.SC,T5
          RJM    SSC         SET SYMPTOM CODE
          LDML   FTO.RC,T5
          RJM    SRU         SET RECOVERY STATUS
          LDK    /RS/K.LFTO
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDML   FTO.RC,T5
          ZJN    CFT10       IF UNRECOVERED
          RJM    SLM         SEND LOG MESSAGE
 CFT07    LDN    0
          UJK    CFTX        EXIT

 CFT10    LDC    F.MCLEAR
          SBDL   FUNCD
          ZJN    CFT20       IF MASTER CLEAR
          LDDL   LSTATE
          SBN    ST.DIAG
          ZJN    CFT20       IF DIAGNOSTIC STATE DOWN MDI
          LDN    ST.PPR
          UJN    CFT25       RESET MCI

 CFT20    LDN    ST.PPD      DOWN MDI
 CFT25    STDL   STCHNG
          RJM    SLM         SEND LOG MESSAGE
          UJK    CFTX        RETURN ERROR
 CSC      SPACE  4,10
**        CSC - CHECK IF STATE CHANGE.
*
*         THIS ROUTINE WILL CHECK IF THE MDI HAS
*         CHANGED STATES OR HAS BEEN IDLED.
*
*         EXIT   (A) = 0, NO STATE CHANGE.
*                (A) <> 0, STATE CHANGE OR MDI NOT AVAILABLE.
*
*         CALLS  GST.


 CSC      SUBR               ENTRY/EXIT
          LDDL   STCHNG
          NJN    CSC10       IF STATE CHANGE OR IDLE
          RJM    GST
          NJN    CSCX        RETURN IF STATUS CAN NOT BE READ
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.OPER
          MJN    CSC20       IF IN OPERATIONAL STATE
          SHN    4
          LPN    7B
 CSC10    BSS    0
          LMDL   LSTATE      LAST KNOWN STATE
          UJN    CSCX        EXIT

 CSC20    BSS    0
          LDML   INLINE
          NJN    CSC10       IF IN-LINE MESSAGE AWAITING RETURN TO MDI
          LDN    ST.OPER
          UJN    CSC10
 CSD      SPACE  4,17
**        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 MDI WITHIN 1 SECOND.
*         IT IS ASSUMED THIS ROUTINE CAN ONLY BE CALLED
*         ONCE PER MICROSECOND. THIS TIMEOUT IS ONLY DONE
*         DURING DIAGNOSTIC'S AND LOADING STATES, AND IN
*         OPERATIONAL STATE WHEN AN IN-LINE DIAGNOSTICS
*         MESSAGE IS AWAITING RETURN.
*
*         EXIT   (A) = 0, IF SEND DATA UP,
*                    > 0, IF SEND DATA NOT UP,
*                    < 0, IF TIMEOUT EXPIRED.
*
*         CALLS  CSC, IGS, GDS, SLM.


 CSD30    LCN    0
          STML   CSDTIME     RESET TIMER
          LDN    17B
          STML   CSDTMP      RESET MULTIPLIER
          LDN    0

 CSD      SUBR               ENTRY/EXIT
          RJM    CSC
          NJN    CSDX        EXIT IF STATUS CAN NOT BE READ
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.SEND
          MJK    CSD30       IF SEND DATA UP
          LDDL   LSTATE      LAST DI STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          ADML   INLINE
          ZJN    CSD03       IF OPERATIONAL STATE AND NO IN-LINE MESSAGE
          SOML   CSDTIME     DECREMENT TIMER
          NJN    CSDX        IF NOT TIMED OUT
          SOML   CSDTMP
          ZJN    CSD05       IF TIME EXAUSTED
          LCN    0
          STML   CSDTIME
 CSD03    LDN    1
          UJN    CSDX        EXIT

 CSD05    LDC    /RS/K.LGSSDT
          STML   LRS+/RS/P.ERRID SET ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDDL   LSTATE
          LMK    ST.DIAG
          NJN    CSD10       IF NOT DIAGNOSTIC STATE
          LDML   PREBUF      DIAGNOSTIC COMMAND
          STML   LRS+/RS/P.ERRW2
          LDK    ST.PPD      DOWN MDI
          UJN    CSD20       CONTINUE

 CSD10    RJM    GDS         GET DETAIL STATUS
          LDN    ST.PPR      RESET MCI
 CSD20    STDL   STCHNG
          RJM    SLM         SEND LOG MESSAGE
          LCN    0
          UJK    CSDX        EXIT
 DFC      SPACE  4,14
**        DFC - DETERMINE FLOW CONTROL.
*
*         THIS ROUTINE DETERMINES IF THE MDI 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   (NUMPRI) = 0, IF FLOW CONTROL CHANGED FROM ON TO OFF,
*                         > MAXPR IF FLOW CONTROL ON.
*


 DFC10    LDN    MAXPR+1
 DFC20    STML   NUMPRI

 DFC      SUBR               ENTRY/EXIT
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-S.OPER
          PJN    DFCX        IF NOT OPERATIONAL
          SHN    17-S.NORMFC-17+S.OPER
          MJN    DFC10       IF FLOW CONTROL ON
          LDN    MAXPR
          SBML   NUMPRI
          PJN    DFCX        IF NO SWITCH IN FLOW CONTROL
          LDN    0
          UJN    DFC20       EXIT

 DLR      SPACE  4,16
**        DLR - DELINK REQUEST FROM QUEUE.
*
*         THIS ROUTINE DELINKS THE CURRENT REQUEST
*         FROM THE APPROPRIATE QUEUE.
*
*         ENTRY  (CM.URQ) = REFORMATTED ADDRESS OF REQUEST
*                           QUEUE IF *REQTYP* <> 0.
*                (REQTYP) = 0, IF PP REQUEST,
*                         <> 0, IF UNIT REQUEST.
*
*         USES   WC.
*
*         CALLS  CPL, DUR, FDR, SPL.
*
*         MACROS LOADC.


 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
          LOADC  CM.PIT
          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
 DMT      SPACE  4,18
**        DMT - DETERMINE MESSAGE TYPE.
*
*         THIS ROUTINE DETERMINES THE TYPE OF MESSAGE TO BE
*         READ NEXT.  IT DOES SO BY EXAMINING THE LAST GENERAL
*         STATUS TAKEN.
*
*         ENTRY  (GNSTAT) = GENERAL STATUS, DATA AVAILABLE BIT IS SET.
*
*         EXIT   (A) = 0 IF NO ERRORS,
*                    <> 0 IF MESSAGE TYPE ERRORS.
*                (MSGTYP) = 0, IF IN-LINE DIAGNOSTIC MESSAGE TO BE READ,
*                         <> 0, IF NORMAL NETWORK MESSAGE TO BE READ.
*                (HDRTYP) = ADDRESS OF HEADER DESCRIPTOR TABLE.
*
*         CALLS  IGS, SLM.
          SPACE  2
 DMT10    LDC    TCNH
 DMT20    STDL   HDRTYP
          LDN    0

 DMT      SUBR               ENTRY/EXIT
          LDDL   GNSTAT      GENERAL STATUS
          SHN    -S.STATE1
          LPN    17B         LOOK AT STATE AND OPERATIONAL BITS (3-6)
          LMN    ILMESS
          STML   MSGTYP
          ZJN    DMT10       IF IN_LINE DIAGNOSTIC
          LMN    CCMESS&ILMESS
          NJN    DMT30       IF NOT CHANNEL CONNECTION
          LDC    TCCH
          UJN    DMT20       EXIT

 DMT30    LMN    CNMESS&CCMESS
          ZJN    DMT10       IF CHANNELNET
          LMN    LDMESS&CNMESS
          ZJN    DMT10       IF LOADING STATE
          LDC    /RS/K.LMTE  SET ILLEGAL MESSAGE TYPE
          STML   LRS+/RS/P.ERRID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    ST.PPR
          STDL   STCHNG      RESET MCI
          RJM    SLM         SEND LOG MESSAGE
          UJN    DMTX        EXIT
 DUR      SPACE  4,16
**        DUR - DELINK UNIT REQUEST FROM QUEUE.
*
*         THIS ROUTINE DELINKS THE CURRENT UNIT REQUEST
*         FROM THE APPROPRIATE QUEUE AND UPDATES THE UNIT QUEUE HEAD POINTER
*         TO POINT TO THE NEXT REQUEST IN THE QUEUE.
*
*         ENTRY  (CM.URQ) = REFORMATTED ADDRESS OF REQUEST QUEUE.
*
*         USES   P5, T1 - T4, T5, T7, WC.
*
*         CALLS  CSW, CUL, SUL.
*
*         MACROS LOADC.

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

*         UPDATE UNIT QUEUE HEAD POINTER.

 DUR20    BSS    0
          LOADC  CM.URQ      CM ADDRESS OF UNIT REQUEST QUEUE
          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,WC   UPDATE UNIT QUEUE HEAD POINTER

          LDML   RQ+/URQ/P.NEXT     NEXT UNIT REQUEST (UPPER PART)
          ADML   RQ+/URQ/P.NEXT+1   NEXT UNIT REQUEST (LOWER PART)
          NJK    DURX        IF OTHER UNIT REQUESTS IN THIS QUEUE

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

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

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

          LDN    1
          STDL   WC          SIZE OF NEXTLN/NEXT (CM WORD)
          LOADF  RS+/RS/P.REQ  RMA OF THE CURRENT REQUEST
          ADN    /URQ/C.NEXT OFFSET TO NEXTLN/NEXT WORD
          CRML   RQ+/URQ/P.NEXTLN,WC   READ UNIT REQUEST NEXTLN/NEXT WORD
          UJK    DUR20       UPDATE UNIT QUEUE HEAD POINTER
 FAW      SPACE  4,13
**        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.
*
*         CALLS  CEE, CIE, IFR, SLM, STB.


 FAW      SUBR               ENTRY/EXIT
          STML   STBI        SAVE FUNCTION FOR ERROR PROCESSING
          RJM    IFR
          NJN    FAWX        RETURN IF FUNCTION TIMEOUT
          ACN    CHN
          LDC    WTFULL*1000
 FAW10    IJM    FAW40,CHN
          EJM    FAW30,CHN
          LDN    0
          UJN    FAWX        EXIT NORMAL COMPLETION

 FAW30    SBN    1
*         SBN    1           (IF 4X PP SPEED)
*         SBN    2           (IF 2X PP SPEED)
 FAWA     EQU    *-1
          NJN    FAW10
          LDC    /RS/K.LSCE  CHANNEL DID NOT GO FULL
          UJN    FAW50       SEND MESSAGE AND RESET MCI

*         CHANNEL ERROR

 FAW40    LDC    /RS/K.LSCD  CHANNEL INACTIVE AFTER ACN
 FAW50    RJM    SSC         LOG SYMPTOM CODE
          LDC    FAWT-2      TABLE OF OP CODES
          RJM    STB         FIND OPERATION CODE
          STML   LRS+/RS/P.OPTP STORE OPERATION TYPE
          DCN    CHN+40B     DISCONNECT CHANNEL
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDDL   LSTATE
          SBN    ST.DIAG
          NJN    FAW60       IF NOT DIAGNOSTIC STATE
          LDN    ST.PPD
          UJN    FAW65       DOWN MDI

 FAW60    LDN    ST.PPR
 FAW65    STDL   STCHNG      RESET MCI
          RJM    SLM         SEND LOG MESSAGE
          UJK    FAWX        EXIT NORMAL COMPLETION
          SPACE  3
*         TABLE EQUATING FUNCTION CODES TO OPERATION CODES.

 FAWT     CON    F.DS,/RS/K.LRDS
          CON    F.READ,/RS/K.LREAD
          CON    F.RQDCMD,/RS/K.LRDC
          CON    0
 FDR      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.
*
*         MACROS LOADC, LOADF.


 FDR40    BSS    0
          LOADF  RMA
          CRML   PVA,WC      READ CURRENT REQUEST
          LOADC  CM.PPR
          CWML   PVA,WC      DELINK REQUEST

 FDR      SUBR               ENTRY/EXIT
 FDR10    BSS    0
          STDL   CM.PPR+2
          SRD    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
          ZJK    FDR40       IF REQUEST FOUND
 FDR30    LOADF  RMA
          UJK    FDR10
 FORMA    SPACE  4,12
**        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.
*
*         USES   T1.


 FORMA    SUBR               ENTRY/EXIT
          STDL   T1
          LDIL   T1
          LPN    37B
          SHN    16
          LMML   1,T1
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STDL   CMADR+2
          LDIL   T1
          SHN    -5
          STD    CMADR
          LRD    CMADR
          LDDL   CMADR+2
          LMC    400000B
          UJN    FORMAX      EXIT
 FTO      SPACE  4,18
**        FTO - FUNCTION AND TIMEOUT.
*
*         THIS ROUTINE WILL FUNCTION THE MDI AND WAIT FOR THE
*         CHANNEL TO GO INACTIVE.
*
*         ENTRY  (A) = POINTER TO STATUS RETURN AREA(SRA).
*                (FUNCD) = FUNCTION CODE.
*
*         EXIT   (A) = 0 IF NO RETRIES.
*                    < 0 IF FUNCTION WAS RETRIED.
*                (SRA WORD 1) = FTRY  IF NO ERRORS.
*                             = 0, UNRECOVERED ERROR.
*                             = FTRY - RETRIES, IF RECOVERED ERROR.
*                (SRA WORD 2) = /RS/K.LSCEF IF CHANNEL ERROR FLAG SET.
*                             = 0 IF NO CHANNEL ERROR.
*
*         USES   T9.
*
*         CALLS  GER
          SPACE  4,10
 FTO30    LDML   FTO.RC,T9
          SBN    FTRY

 FTO      SUBR               ENTRY/EXIT
          STDL   T9          SAVE STATUS RETURN POINTER
          LDN    0
          STML   FTO.RC,T9   CLEAR STATUS RETURN
          STML   FTO.SC,T9
          IFEQ   DEBUG,1
          LDC    F.GS
          SBDL   FUNCD
          NJN    FTO03       IF FUNCTION TO BE ISSUED IS NOT G.S.
          LDML   LSTFUNC     LAST FUNCTION CODE SAVED
          SBDL   FUNCD
          ZJN    FTO05       ONLY SAVE ONE OCCURANCE OF GENERAL STATUS
 FTO03    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
 FTO05    BSS    0
          ENDIF
          LDC    F.GS
          SBDL   FUNCD
          ZJN    FTO07       IF GENERAL STATUS
          LDDL   FUNCD
          STML   PREFC       SAVE LAST NON GENERAL STATUS FUNCTION CODE
 FTO07    LDN    FTRY
          STML   FTO.RC,T9   RETRY COUNTER
 FTO10    LDDL   FUNCD
          FAN    CHN         ISSUE FUNCTION
 FTO18    LDC    FTOLEN*600
 FTO20    IJM    FTO30,CHN    EXIT IF CHANNEL INACTIVE
          SBN    1
*         SBN    1           (IF 4X PP SPEED)
*         SBN    2           (IF 2X PP SPEED)
 FTOA     EQU    *-1
          NJN    FTO20
          DCN    CHN+40B
          SOML   FTO.RC,T9   DECREMENT RETRY COUNTER
          ZJK    FTO30       IF UNRECOVERED ERROR
          SBN    FTRY-1
          NJN    FTO10       IF NOT FIRST ERROR
          CFM    FTO10,CHN   IF NOT CHANNEL ERROR
          RJM    GER         RECORD ERROR REGISTER
          STML   FTO.SC,T9   SET CHANNEL ERROR FLAG
          UJK    FTO10       RETRY FUNCTION
 GBT      SPACE  4,15
**        GBT - GENERAL STATUS BUSY TIMEOUT.
*
*         THIS ROUTINE IS CALLED WHEN THE GENERAL STATUS
*         BUSY BIT IS SET.  IF BUSY TIMEOUT IS REACHED A LOG
*         MESSAGE IS GENERATED AND THE MCI IS RESET UNLESS
*         THE LAST STATE WAS DIAGNOSTIC, IN WHICH CASE THE MDI
*         IS DOWNED.
*
*         ENTRY  (GBTL) = COUNT REMAINING IN DELAY LOOP.
*                (GBTM) = COUNT REMAINING IN MULTIPLIER LOOP.
*
*         EXIT   (A) = 0 IF NOT TIMEOUT.
*                    < 0 IF TIMEOUT.
*
*         CALLS  IGS, SLM.


 GBT10    LDN    0
 GBT      SUBR               ENTRY/EXIT
          LDML   DBUGM
          ZJN    GBTX        IF DEBUG MODE ON
          SOML   GBTL        TIMEOUT COUNTER
          UJN    *+2
          CON    GBTL
*         UJN    *+2         (IF 4X PP SPEED)
*         CON    GBTL        (IF 4X PP SPEED)
*         SOML   GBTL        (IF 2X PP SPEED)
 GBTA     EQU    *-2
          PJK    GBT10       IF NOT TIMEOUT EXIT
          LCN    0
          STML   GBTL
          SOML   GBTM
          PJN    GBT10       IF NOT TIMEOUT EXIT
          DCN    CHN+40B     DISCONNECT CHANNEL
          LDDL   LSTATE
          SBN    ST.DIAG
          NJN    GBT20       IF NOT DIAGNOSTIC STATE
          LDN    ST.PPD
          UJN    GBT30

 GBT20    LDN    ST.PPR
 GBT30    STDL   STCHNG      RESET MCI
          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
          UJK    GBTX        EXIT
          SPACE  2
 GBTL     BSSZ   1           BUSY TIMEOUT LOOP
 GBTM     BSSZ   1           BUSY TIMEOUT MULTIPLIER
          SPACE  4,10
**        GDS - GET DETAILED STATUS.
*
*         THIS ROUTINE LOADS THE DETAILED STATUS OVERLAY AND CALLS
*         THE ROUTINE *DST*. ON RETURN FROM DST OV2 IS RELOADED AND
*         THE STATUS FROM DST IS RETURNED TO THE CALLER.
*
*         EXIT   (A) = DST STATUS.
*
*         USES   T10.
*
*         CALLS  DST, RDO.
          SPACE  2,10
 GDS      SUBR               ENTRY/EXIT
          LDN    OV6O
          RJM    RDO         READ DEATAILED STATUS OVERLAY
          RJM    DST         GET DETAILED STATUS
          STML   GDSA
          LDN    OV2O
          RJM    RDO         GET MISCELLANEOUS ROUTINES
          LDC    0
 GDSA     EQU    *-1         DST STATUS
          UJN    GDSX        RETURN
          SPACE  4,10
**        GER - GET ERROR REGISTER.
*
*         THIS ROUTINE OBTAINS THE ERROR REGISTER OF A CONCURRENT
*         CHANNEL. THE ERROR REGISTER VALUE IS STORED IN THE NEXT
*         AVAILABLE ENTRY IN *GERT*. CALLERS OF *GER* MUST CALL
*         *SSC* TO LOG THIS DATA BEFORE RETURNING TO THEIR CALLER.
*
*         EXIT   (A) = /RS/K.LSCEF.
*                (GERT) = CONCURRENT CHANNEL ERROR REGISTER.
*
*         USES   T10.
          SPACE  2,10
 GER20    IAN    CHN
 GER30    DCN    CHN+40B
          STIL   T10         SAVE REGISTER FOR LOGGING
 GER40    LDC    /RS/K.LSCEF

 GER      SUBR               ENTRY/EXIT
          AOML   GERT        ADVANCE TABLE POINTER
          STDL   T10
          LDML   CHTYP
          NJN    GER40       IF NOT CONCURRENT
          DCN    CHN+40B
          LDC    F.RDESR
          RJM    FAW         FUNCTION FOR ERROR REGISTER READ
          ZJN    GER20       IF NO ERRORS
          LDN    0
          UJN    GER30       RETURN
          SPACE  4,2
 GERT     CON    GERT
          BSSZ   3
 GST      SPACE  4,24
**        GST - GENERAL STATUS.
*
*         THIS ROUTINE OBTAINS THE MCI GENERAL STATUS, AND WAITS FOR
*         BUSY TO CLEAR.  THE WAIT FOR BUSY IS EQUAL TO *GSBUSY*
*         MILLISECONDS.  BUSY TIMEOUT IN DIAGNOSTIC MODE CAUSES THE
*         MDI TO BE DOWNED.  ERRORS THAT OCCUR WHILE READING STATUS
*         ARE LOGGED WITH UNRECOVERED ERRORS, CHANGING THE MDI STATE TO
*         DOWN. DISCONNECTING THE CHANNEL DURING ERROR RECOVERY CAUSES THE
*         ERROR BITS IN GENERAL STATUS TO BE CLEARED.  IN THE CASE OF
*         RECOVERED ERRORS WHERE THE CHANNEL HAS BEEN DISCONNECTED AS
*         PART OF RECOVERY, BIT *S.VALID* IN *GNSTAT* IS SET TO INDICATE
*         THIS CONDITION.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                    <> 0, IF ERROR.
*                (GNSTAT) = GENERAL STATUS IF NO ERRORS.
*
*         USES   T2, T7, T8, P6.
*
*         CALLS  CFT, FTO, GBT, GER, LGE, SSC.
          SPACE  4,10
 GST      SUBR               ENTRY/EXIT
          LDN    FTRY
          STDL   T7          RETRY COUNTER
          LDN    0
          STDL   T8          CLEAR VALID STATUS INDICATOR
          STDL   P6
          LCN    0
          STDL   GNSTAT
 GST20    DCN    CHN+40B
          LDC    F.GS        GENERAL STATUS
          STDL   FUNCD
          LDC    GSTB        STATUS RETURN
          RJM    FTO         FUNCTION CHANNEL
          ZJN    GST25       IF NO RETRIES
          LDC    GSTB
          RJM    CFT         CHECK FOR FUNCTION TIMEOUT
          NJN    GSTX        EXIT IF FUNCTION TIMEOUT
 GST25    ACN    CHN
          LDK    GSBUSY/500  SET BUSY TIMER
          STML   GBTM
          LCN    0
          STML   GBTL
 GST30    LDC    GSFULL*400  WAIT FOR FULL
 GST40    IJM    GST92,CHN    IF CHANNEL INACTIVE

 GST50    FJM    GST60,CHN   IF CHANNEL FULL
          SBN    1
*         SBN    1           (IF 4X PP SPEED)
*         SBN    2           (IF 2X PP SPEED)
 GSTA     EQU    *-1
          NJN    GST40       IF NOT TIMED OUT
          UJK    GST100      LOG ERROR AND CHECK RECOVERY STATUS

 GST60    IAN    CHN+40B     INPUT STATUS
          IJM    GST92,CHN    IF CHANNEL INACTIVE
          CFM    GST70,CHN   IF NO CHANNEL ERROR
          LDDL   T7
          SBN    FTRY
          NJN    GST65       IF NOT FIRST ERROR
          RJM    GER         RECORD ERROR REGISTER
 GST65    UJK    GST100      RETRY IF NOT UNRECOVERED

 GST70    STDL   GNSTAT
          SHN    17-S.BUSY
          PJN    GST90       IF NOT MCI BUSY
          RJM    GBT         CHECK BUSY TIMEOUT
          NJN    GST91       IF TIMEOUT
 GST80    UJK    GST30       RETRY

 GST90    DCN    CHN+40B
          LDDL   T7
          SBN    FTRY
          NJN    GST130      IF RECOVERED ERROR
 GST91    UJK    GSTX        EXIT NO ERRORS

*         ERROR ENCOUNTERED READING STATUS
*         DETERMINE RECOVERY ACTION.

 GST92    LDK    /RS/K.LSCD  LOG CHANNEL NOT ACTIVE
 GST100   STDL   P6          SAVE SYMPTOM CODE
          SODL   T7
          ZJN    GST130      IF UNRECOVERED ERROR
          SBN    FTRY-1
          NJN    GST120      IF NOT FIRST ERROR
          LDDL   P6
          STDL   T2          SYMPTOM CODE
 GST120   LDC    VALID
          STDL   T8          SAVE ERROR STATUS NOT CORRECT
          UJK    GST20       SEND FUNCTION AGAIN

 GST130   DCN    CHN+40B
          LDDL   GNSTAT

*         SET INVALID BIT INDICATING RECOVERY DISCONNECTED MCI.

          LMDL   T8
          STDL   GNSTAT
          LDDL   T2
          RJM    SSC         SET SYMPTOM CODE
          RJM    LGE         COMPLETE LOGGING ERROR
          UJK    GST91       EXIT
          SPACE  2
 GSTB     BSSZ   2
 IFR      SPACE  4,12
**        IFR - INITIATE FUNCTION REQUEST.
*
*         THIS ROUTINE INITIATES A FUNCTION REQUEST
*         ON THE CHANNEL.
*
*         ENTRY  (A) = FUNCTION CODE.
*
*         EXIT   (A) = 0, FUNCTION ISSUED, NORMAL COMPLETION.
*                (A) <> 0, FUNCTION TIMEOUT.
*
*         CALLS  CFT, CSC, FTO.


 IFR      SUBR               ENTRY/EXIT
          STDL   FUNCD       SAVE FUNCTION CODE
          STML   IFRSV
          LDC    IFRST       STATUS AREA POINTER
          RJM    FTO         FUNCTION AND TIMEOUT
          ZJN    IFRX        IF NO RETRIES
          LDML   IFRST+FTO.RC
          NJN    IFR10       IF NOT UNRECOVERED ERROR
          RJM    CSC         CHECK STATE CHANGE
          NJN    IFRX        EXIT IF STATE CHANGE
          LDML   DBUGM
          SBN    1
          NJN    IFRX        IGNORE ERROR IF DEBUG MODE
          LDML   IFRSV
          STDL   FUNCD       RESTORE FUNCTION CODE
 IFR10    LDC    IFRST
          RJM    CFT         CHECK FOR FUNCTION TIMEOUT
          UJK    IFRX        RETURN
          SPACE  4
 IFRST    BSSZ   2           STATUS RETURN AREA
 IFRSV    BSSZ   1           SAVE FUNCTION CODE
 ILR      SPACE  4,10
**        ILR - INITIALIZE LOG RESPONSE.
*
*         INITIALIZE THE BUFFER FOR SENDING LOG RESPONSES.
*
*         USES   T9.


 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
 IRE      SPACE  4,10
**        IRE - ISSUE READ ERROR FUNCTION.
*
*         THIS ROUTINE IS CALLED WHEN A READ ERROR HAS
*         OCCURRED, BUT THE MDI IS UNAWARE OF IT.  THE
*         READ ERROR FUNCTION IS ISSUED TO NOTIFY THE MDI
*         OF THIS FACT.
*
*         CALLS  IFR.


 IRE      SUBR               ENTRY/EXIT
          LDN    F.RERR      READ ERROR FUNCTION
          RJM    IFR         ISSUE FUNCTION
          UJK    IREX        EXIT
 LGE      SPACE  4,16
**        LGE - LOG GENERAL STATUS ERRORS.
*
*         THIS ROUTINE COMPLETES LOGGING OF ERRORS ENCOUNTERED
*         WHILE READING GENERAL STATUS.
*
*         ENTRY  (T7) = 0 IF UNRECOVERED ERROR.
*                    = FTRY - RETRIES IF RECOVERED ERROR.
*                (LRS+/RS/P.LSGSE) = SYMPTOM CODE.
*
*         EXIT   (A) = 0 IF NO ERRORS OR RECOVERED ERRORS.
*                    <> 0 IF UNRECOVERED ERRORS.
*
*         USES   T7.
*
*         CALLS  SLM, SRU.


 LGE10    LDN    1

 LGE      SUBR               ENTRY/EXIT
          LDML   LRS+/RS/P.LSGSE
          NJN    LGE30       IF NOT AVAILABLE TIMEOUT

*         A GENERAL STATUS AVAILABLE TIMEOUT CAN OCCUR IF THE MDI
*         RESETS AFTER ACCEPTING THE FUNCTION BUT BEFORE THE STATUS
*         IS INPUT.  IN THIS CASE IF WE RECOVERED AND THE STATE IS
*         EQUAL TO RESET WE IGNORE THE ERROR.

          LDDL   T7
          SBN    FTRY-1
          NJN    LGE20       IF NOT RETRY COUNT OF ONE
          LDDL   GNSTAT
          LPC    STBITS
          ZJK    LGEX        IF ONLY ONE UNAVAILABLE ERROR, IGNORE
 LGE20    LDN    /RS/K.LGSAT
          STML   LRS+/RS/P.ERRID
          LDML   PREFC
          STML   LRS+/RS/P.PFUNC SAVE PREVIOUS FUNCTION CODE
          LDDL   LSTATE
          STML   LRS+/RS/P.ERRW2
          UJN    LGE40

 LGE30    LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDK    /RS/K.LRGS
          STML   LRS+/RS/P.OPTP  STORE OPERATION TYPE
 LGE40    LDDL   T7
          NJN    LGE50       IF NOT UNRECOVERED
          LDN    ST.PPD
          STDL   STCHNG      DOWN MDI
          LDDL   T7
 LGE50    RJM    SRU         SET RESPONSE STATUS
          RJM    SLM         SEND LOG MESSAGE
          LDDL   T7
          ZJK    LGE10       IF UNRECOVERED EXIT
          LDN    0
          UJK    LGEX        EXIT NO ERRORS
 RDO      SPACE  4,12
**        RDO - READ OVERLAY.
*
*         THIS ROUTINE WILL READ THE APPROPRIATE OVERLAY.
*
*         ENTRY  (A) = NUMBER OF OVERLAY TO LOAD.
*                    = 0 IF NOT IN OVERLAY.
*                (OVNUM) = NUMBER OF LAST OVERLAY LOADED.
*
*         EXIT   (OVNUM) = NUMBER OF OVERLAY LOADED.
*
*         USES   T1, WC.
*
*         CALLS  CHG, LNO.


 RDO      SUBR               ENTRY/EXIT
          ZJN    RDOX        IF NOT IN OVERLAY
          STDL   T1          SAVE OVERLAY NUMBER
          SBML   OVNUM
          ZJN    RDOX        IF ALREADY LOADED
          LDDL   T1
          STML   OVNUM       SAVE NEW OVERLAY NUMBER
          RJM    LNO         LOAD OVERLAY
          LDML   OVNUM
          RJM    CHG         CHANGE CHANNEL INSTRUCTIONS
          UJN    RDOX        EXIT
 SLM      SPACE  4,15
**        SLM - SEND LOG MESSAGE.
*
*         THIS ROUTINE SENDS A LOG MESSAGE RESPONSE
*         GENERAL STATUS AND/OR DETAILED STATUS
*         INCLUDED IN RESPONSE DETERMINE LENGTH
*         OF RESPONSE.
*
*         EXIT   (A) < 0.
*
*         USES   T9.
*
*         CALLS  ILR, UIP, WRB.


 SLM      SUBR               ENTRY/EXIT
          LDDL   STCHNG
          SBN    ST.PPD
          NJN    SLM10       IF NOT DOWN
          LDC    /RS/K.DICA
          RAML   LRS+/RS/P.LGS  SET DOWN MDI FLAG
 SLM10    LDML   LRS+/RS/P.LGS
          LPC    /RS/K.LDS
          NJN    SLM20       IF DETAILED STATUS INCLUDED
          LDC    /RS/C.RETSUC*8+8  RESPONSE LENGTH
          UJN    SLM30       CONTINUE

 SLM20    LDC    C.RS*8      RESPONSE LENGTH
 SLM30    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
 UIP      SPACE  4,12
**        UIP - UPDATE THE IN POINTER OF THE CM RESPONSE BUFFER.
*
*         ENTRY  (INPNT) = NEW IN POINTER.
*
*         USES   P1 - P4.
*
*         MACROS LOADC.
*         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.
*


 UIP      SUBR               ENTRY/EXIT

*         UPDATE THE IN POINTER.

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

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

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   PPNO-3      SET LAST BYTE NON-ZERO
          LDDL   RESPC
          ZJN    UIP10       IF UNSOLICITED RESPONSE
          SOML   INTRRPT
          PJN    UIP20       IF NOT TIME TO INTERRUPT
 UIP10    BSS    0
          LDML   CM.INT+2    ** KLUDGE FOR I4 CHECKING OS BOUNDS ON INTERRUPT
          LMC    400000B     ** KLUDGE FOR I4 BUG
 INTPRC   PSN                PSN OR INTERRUPT
          CRDL   P1          FOR S1CR HARDWARE PROBLEM
          LDN    8
          STML   INTRRPT     RESET INTERRUPT INTERVAL
 UIP20    UJK    UIPX


 INTRRPT  BSSZ   1           INTERRUPT INTERVAL
 WRB      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.
*
*         MACROS LOADC.


 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  2
 WRB      SUBR               ENTRY/EXIT
          STDL   T9
          STML   WRBA        INSTRUCTION MODIFICATION FOR BUFFER

*         READ IN AND OUT POINTERS OF RESPONSE BUFFER.

 WRB10    BSS
          LOADC  CM.PIT      LOAD ADDRESS OF PP INTERFACE TABLE
          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
          LDML   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
          PJN    WRB10       IF NOT ENOUGH ROOM IN BUFFER, LOOP
          LDDL   INPNT
          SBML   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
          LDML   LIM         FIRST BLOCK WRITE = (LIMIT - IN) WORDS
          SBDL   INP
          SHN    -3
          STDL   T4          NUMBER OF WORDS TO TRANSFER ON FIRST BLOCK
          SHN    2           CONVERT TO NUMBER OF PP WORDS
          ADDL   T9
          STML   WRBB        RESPONSE ADDRESS FOR SECOND BLOCK WRITE
 WRB50    LOADC  CM.RS       LOAD CM ADDRESS OF RESPONSE BUFFER
          STDL   T6          SAVE CM ADDRESS
          ADDL   T3          ADD IN OFFSET
          CWML   RS,T4       WRITE RESPONSE TO CM

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

 WRBA     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
          LMC    400000B
          CWML   **,T5       WRITE SECOND PART OF RESPONSE TO CM
                             (BEGINNING OF RESPONSE BUFFER)
 WRBB     EQU    *-1

*         SET UP INTERRUPT PROCESSOR INSTRUCTION IF INTERRUPT IS SELECTED.

 WRB70    BSS
          LDML   RS+/RS/P.INT  CHECK IF INTERRUPT WAS SELECTED
          LPC    /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    .INPN
          STML   INTPRC
 WRB80    BSS    0
          UJK    WRBX        EXIT
*copy nai$network_common_deck
          TITLE  BUFFER AREA.
**        LOCATIONS OF BUFFERS USED AFTER INITIALIZATION ARE DEFINED
*         HERE.  OVERLAY 2 IS ASSEMBLED IN THESE BUFFERS AND MUST BE
*         MOVED BEFORE THEY ARE USED.
          SPACE  4,25
 RS       BSSZ   MAXRS*4     RESPONSE BUFFER
 LRS      BSSZ   P.RS+4      LOGGING RESPONSE BUFFER
 MCT      BSSZ   P.MCT       MASTER CONTROL TABLE
 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
 PREBUF   EQU    RQ+MAXURQ*4 I/O BUFFER PREFIX USED WHEN 170 OAM IS NEEDED
 IOBUF    EQU    PREBUF+2    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    BPDSIZE+MAXBPD

          LOC    INTOV

          ERRMI  END-BUFEND  RESIDENT TOO LARGE
          TTL    NAM$MDI DRIVER (NETW).
          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    ILC         INITIALIZE LOOP COUNTERS
          RJM    LUT         LOCATE UNIT INTERFACE TABLE
          RJM    LMT         LOCATE MASTER CONTROL TABLE
*         LDN    0
          RJM    CHG         SET UP CHANNEL INSTRUCTIONS
          RJM    ZRE         ZERO OUT RESPONSE BUFFER
          RJM    ILR         INITIALIZE LOG RESPONSE
          UJK    DCS         DETERMINE CURRENT MDI 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.
*
*         USES   WC.
*
*         CALLS  CVP, CVR.
*
*         MACROS LOADC, REFAD.


 LPT      SUBR               ENTRY/EXIT
          REFAD  DSRTP,CM.PIT  REFORMAT PP INTERFACE TABLE ADDRESS

*         READ PP INTERFACE TABLE.

          LDN    C.PIT       LENGTH OF PP INTERFACE TABLE
          STDL   WC
          LOADC  CM.PIT
          CRML   IPIT,WC
          RJM    CVR         CHECK FOR VALID RESPONSE BUFFER
          NJN    *           IF INVALID RESPONSE BUFFER  --HANG--
          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.

          REFAD  IPIT+/PIT/P.INT,CM.INT  REFORMAT INTERRUPT WORD ADDRESS
          REFAD  IPIT+/PIT/P.CHAN,CM.CHAN  REFORMAT CHANNEL TABLE ADDRESS
          REFAD  IPIT+/PIT/P.CBUF,CM.CB  REFORMAT COMMUNICATION TABLE ADDRESS
          LOADC  CM.CB
          ADN    /CB/C.DRMA
          CRDL   P1
          REFAD  P3,DH       REFORMAT OVERLAY DIRECTORY RMA
          UJK    LPTX
          EJECT
 LUT      SPACE  4,15
**        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   (A) = 0.
*                (UD) = UNIT DESCRIPTOR ACCESSIBLE BY THIS PP.
*
*         USES   WC.
*
*         CALLS  CVD, CVU.
*
*         MACROS LOADC, LOADF.


 LUT      SUBR               ENTRY/EXIT
          LDN    C.UD        UNIT DESCRIPTOR LENGTH
          STDL   WC
          LOADC  CM.PIT
          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
          LOADF  UD+/UD/P.UQT  REFORMAT CM ADDRESS OF UNIT INTERFACE TABLE
          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.
          SPACE  2
 SAVAD    SUBR               ENTRY/EXIT
          STML   2,T2
          LDDL   CMADR
          STI    T2
          LDDL   CMADR+1
          STML   1,T2
          UJN    SAVADX      EXIT
 CVM      SPACE  4,10
**        CVM - CHECK FOR VALID MASTER CONTROL TABLE.
*
*         ENTRY  (CM.URQ - CM.URQ+1) = (R) PART OF MASTER CONTROL TABLE FWA.
*                (CM.MCT) = (A) PORTION OF MASTER CONTROL TABLE FWA.
*
*         EXIT   (A) = 0, IF VALID MASTER CONTROL TABLE.
*                    <> 0, IF INVALID.
*
*         USES   P1 - P4, T1, WC.


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

*         READ MASTER CONTROL TABLE.

          LDN    C.MCT       LENGTH OF MASTER CONTROL TABLE
          STDL   WC

 CVM20    BSS    0
          LOADC  CM.URQ,CM.MCT   FIRST WORD ADDRESS OF MASTER CONTROL TABLE
          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
 CONCH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          SPACE  4,10

**        BUFFERS USED AFTER CVP IS EXECUTED ARE PLACED HERE

 UBUF     EQU    *           UNIT INTERFACE TABLE
 UD       EQU    UBUF+P.UIT  UNIT DESCRITOR
 UDEND    EQU    UD+P.UD     END OF UNIT DESCRIPTOR
 CVP      SPACE  4,10
**        CVP - CHECK FOR VALID PP INTERFACE TABLE.
*
*         EXIT   (A) = 0, IF VALID PP INTERFACE TABLE.
*                    <> 0, IF INVALID.
*
*         USES   T1.


 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
          LDML   IPIT+/PIT/P.CBUFL  COMMUNICATION BUFFER LENGTH
          SHN    -3
          ADC    -C.CB
          MJN    CVP10       IF NOT LARGE ENOUGH
          AODL   T1

*         RESERVED WORD OF PP COMMUNICATION BUFFER DESCRIPTOR

          LDML   IPIT+/PIT/P.CBUFL-1
          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

*         RESERVED FIELD OF PP REQUEST QUEUE DESCRIPTOR

          LDML   IPIT+/PIT/P.PPQPVA-1
          ADML   IPIT+/PIT/P.PPQ-2
          ADML   IPIT+/PIT/P.PPQ-1
          NJN    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
          ZJN    CVP15       IF PP INTERFACE TABLE VALID
 CVP10    LDML   TPEC,T1     INTERFACE ERROR CODE
 CVP15    UJK    CVPX        EXIT

**        TPEC - TABLE OF PP INTERFACE ERROR CODES.

 TPEC     BSS    0
          LOC    0
          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
          LOC    *O
          ERRMI  *-UDEND     IF BUFFERS LARGER THAN CVD
 CVD      SPACE  4,10
**        CVD - CHECK FOR VALID UNIT DESCRIPTOR.
*
*         EXIT   (A) = 0, IF VALID UNIT DESCRIPTOR.
*                    <> 0, IF INVALID.


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

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

 CVD30    BSS
          SBN    34B-20B
          PJN    CVD20       IF INVALID CHANNEL
 CVD40    BSS
          LDML   UD+/UD/P.UQT+1  UNIT INTERFACE TABLE ADDRESS
          LPN    7
          ZJN    CVDX
          LDC    E209        UNIT INTERFACE TABLE NOT A WORD BOUNDARY
 CVD60    BSS
          UJK    CVDX        EXIT
 CVU      SPACE  4,10
**        CVU - CHECK FOR VALID UNIT INTERFACE TABLE.
*
*         EXIT   (A) = 0, IF VALID UNIT INTERFACE TABLE,
*                    <> 0, IF INVALID.
*                (CM.URQ - CM.URQ+1) = (R) PART OF MASTER CONTROL TABLE FWA.
*                (CM.MCT) = (A) PORTION OF MASTER CONTROL TABLE FWA.
*
*         USES   T1.


 CVU      SUBR               ENTRY/EXIT
          LDN    0
          STDL   T1
          LDML   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
          ADC    -1000B
          NJK    CVU40       IF INVALID UNIT TYPE
          AODL   T1

*         RESERVED FIELD OF MASTER CONTROL TABLE DESCRIPTOR

          LDML   UBUF+/UIT/P.MBUFL-1
          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       IF BUFFER ON WORD BOUNDRY
 CVU20    UJK    CVU40       INTERFACE ERROR

 CVU30    BSS
          AODL   T1
          LDML   UBUF+/UIT/P.MBUF+1  MASTER CONTROL TABLE
          LPN    7
          NJN    CVU40       NOT A WORD BOUNDARY
          LOADF  UBUF+/UIT/P.MBUF
          STDL   CM.URQ+2
          SRD    CM.URQ
          STML   CM.MCT
          LDN    0           VALID UNIT INTERFACE TABLE
 CVU38    UJK    CVUX        EXIT

 CVU40    BSS
          LDML   TUEC,T1     INTERFACE ERROR CODE
          UJK    CVU38

**        TUEC - TABLE OF UNIT INTERFACE ERROR CODES.

 TUEC     BSS    0
          LOC    0
          CON    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
          LOC    *O
 CVR      SPACE  4,10
**        CVR - CHECK FOR VALID RESPONSE BUFFER.
*
*         EXIT   (A) = 0, IF VALID RESPONSE BUFFER.
*                    <> 0, IF INVALID.
*                (CM.RS - CM.RS+2) = CM ADDRESS OF RESPONSE BUFFER.
*
*         MACROS LOADF.


 CVR      SUBR               ENTRY/EXIT

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

          LOADF  IPIT+/PIT/P.RSBUF REFORMAT ADDRESS OF REPONSE BUFFER
          STDL   CM.RS+2
          SRD    CM.RS
          LDML   IPIT+/PIT/P.LIMIT
          STML   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
          LOADF  MCT+/MCT/P.BP  REFORMAT CM ADDRESS OF FIRST BUFFER DESCRIPTOR
          STDL   CM.BPD+2
          SRD    CM.BPD
 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
          LOADC  CM.BPD,P1   CM ADDRESS OF NEXT DESCRIPTOR
          UJK    DBP10       LOOP
 ILC      SPACE  4,11
**        ILC - INITIALIZE LOOP COUNTERS BASED ON PP SPEED.
*
*         THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE ALL
*         TIMERS IN THE PP TO PROVIDE CONSISTENT TIMING BETWEEN
*         2XPP AND 4XPP.
*
*         USES   T1, T2.
*
*         NOTE   12-BIT STORE AND LOAD INSTRUCTIONS ARE USED
*                IN THIS ROUTINE TO SUPPORT BOTH 12-BIT AND 16-BIT
*                MICROSECOND CLOCK CHANNELS.


 ILC      SUBR
          IAN    14B         GET MICROSECOND CLOCK
          STD    T1
          LDC    500
 ILC10    SBN    1
          NJN    ILC10       IF DELAY NOT COMPLETE
          IAN    14B         GET CURRENT TIME
          STD    T2
          LDD    T2
          SBD    T1

*         THESE TIMES SHOULD NEVER BE EQUAL.

          PJN    ILC20       IF CLOCK DID NOT WRAP
          ADC    7777B       COMPUTE THE ACTUAL CLOCK DIFFERENCE
 ILC20    ADC    -400
          MJN    ILCX        IF THE TIME < 400 MICS THEN SHOULD BE 4XPP
          LDK    .SBN+2      SWITCH TO DECREMENT BY 2 FOR 2XPP
          STML   FAWA
          STML   FTOA
          STML   GSTA
          LDN    2
          STML   TI
          LDK    .SOML
          STML   GBTA        BUSY TIMEOUT LOOP
          UJK    ILCX
          SPACE  4,10
**        THE FOLLOWING BUFFER IS USED BEFORE THE OVERLAYS CAN BE WRITTEN.

 IPIT     BSSZ   P.PIT       PP INTERFACE TABLE

          ERRPL  *-7777B     DRIVER OVERFLOWS PP MEMORY

          OVERLAY  (INPUT/OUTPUT OVERLAY),BUFEND
          ROUTINE  OV1
          TITLE  INPUT - OUTPUT ROUTINES.
**        THE FOLLOWING CODE IS OVERLAYED IN NON-DATA TRANSFER MODE
*

 CEC      SPACE  4,13
**        CEC - COMPLETE ERROR CHECKING.
*
*         THIS ROUTINE WILL COMPLETE ERROR CHECKING BY
*         LOGGING THE ERROR IF APPLICABLE.
*
*         ENTRY  (ERRT1) = SYMPTOM CODE(S) OF ERROR.
*                (OTYPE) = OPERATION CODE.
*                (ERRRCP) = POINTER TO RECOVERY COUNTER.
*
*         EXIT   (A) <> 0.
*
*         CALLS  IGS, SIU, SLM, SSC.


 CEC      SUBR               ENTRY/EXIT
          LDDL   ERRT1
          LPC    177777B-/RS/K.LSGSI
          NJN    CEC30       IF I/O ERRORS

*         IF INVALID STATUS ONLY ERROR DO NOT LOG.

          LDN    1
          UJK    CECX

 CEC30    RJM    IGS         INCLUDE GENERAL STATUS IN RESPONSE
          LDDL   ERRT1
          RJM    SSC         SET SYMPTOM CODE
          LDDL   ERRT1
          LPC    /RS/K.LSMLV&/RS/K.LSMSE
          ZJN    CEC40       IF NOT MESSAGE LENGTH ERROR
          LDML   EXPD
          STML   LRS+/RS/P.EXPD+1  INCLUDE EXPECTED LENGTH
          LDML   ACTD
          STML   LRS+/RS/P.ACTD+1  INCLUDE ACTUAL LENGTH
 CEC40    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    CEC50       IF NOT READ
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          NJN    CEC50       IF NOT OPERATIONAL STATE
          AOIL   ERRRCP
          STML   LRS+/RS/P.RETCT
          LDN    REC.I
          STML   LRS+/RS/P.RETSUC
          UJN    CEC60       SEND MESSAGE

 CEC50    SOIL   ERRRCP
          RJM    SIU         SET RECOVERY SUCCESS
 CEC60    RJM    SLM         SEND LOG MESSAGE
          UJK    CECX        EXIT
 ERR      SPACE  4,26
**        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            OPERATION
*         -------            ---------
*         WRRTY              WRITE OPERATION
*         RDRTY              READ
*         ILRTY              IN-LINE WRITE OPERATION
*
*
*         ENTRY  (A) = OPERATION CODE.
*                (ERRCNT) = WORDS NOT TRANSFERRED.
*
*         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.
*
*
*         CALLS  CEC, CSC, GDS, GER, IER, REC, WEC.
          SPACE  4,10
 ERR      SUBR               ENTRY/EXIT
          STML   OTYPE
          SBN    /RS/K.LREAD
          NJN    ERR10       IF WRITE
          RJM    REC         READ ERROR CHECK
          ZJN    ERRX        IF NOT LAST BLOCK
          UJN    ERR20

 ERR10    RJM    WEC         WRITE ERROR RECOVERY
 ERR20    DCN    CHN+40B     DISCONNECT
          CFM    ERR30,CHN   IF NO CHANNEL ERROR
          RJM    GER         RECORD ERROR REGISTER
          RADL   ERRT1       SET CHANNEL ERROR FLAG
 ERR30    RJM    GST         GET GENERAL STATUS
          NJN    ERRX        IF ERRORS GETTING STATUS
          LDDL   GNSTAT
          SHN    17-S.VALID
          PJN    ERR40       IF STATUS VALID
          LDN    /RS/K.LSGSI
          RADL   ERRT1       SET STATUS INVALID
          UJN    ERR50       DO NOT CHECK GENERAL STATUS

 ERR40    SHN    17-S.ERROR-17+S.VALID
          PJN    ERR50       IF NO GENERAL STATUS ERRORS
          LDC    /RS/K.LSGSE
          RADL   ERRT1       SET GENERAL STATUS ERRORS
          LDDL   GNSTAT
          STML   ERRT2       SAVE STATUS
          RJM    GDS         GET DETAILED STATUS

*         IGNORE DETAILED STATUS ERRORS FOR NOW.

          LDML   ERRT2
          STDL   GNSTAT      RESTORE GENERAL STATUS
 ERR50    LDDL   ERRT1
          NJN    ERR60       IF ERRORS
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          NJN    ERR55       IF NOT OPERATIONAL STATE
          LDML   OTYPE
          SBN    /RS/K.LREAD
          NJN    ERR55       IF NOT READ
          UJN    ERR57       RESET RECOVERY COUNTER

 ERR55    LDN    FTRY
 ERR57    STIL   ERRRCP      RESET RECOVERY COUNTER
          LDN    0
          UJN    ERR70       EXIT NO ERRORS

 ERR60    RJM    CEC         COMPLETE ERROR CHECKING
 ERR70    UJK    ERRX        EXIT
 PFR      SPACE  4,34
**        PFR - PERFORM READ.
*
*         THIS ROUTINE READS IN DATA FROM THE MDI.  THE TOTAL LENGTH OF THE
*         TRANSFER IS NOT KNOWN UNTIL THE MESSAGE HAS BEEN READ.  TWO TYPES OF
*         RECORDS (CHANNELNET AND CHANNEL CONNECTION), EACH WITH A DIFFERENT
*         HEADER FORMAT ARE ACCEPTED (CHANNELNET RECORDS ARE ONLY ACCEPTED
*         IN LOADING STATE AND DISCARDED OTHERWISE).  DIFFERENT UNSOLICITED
*         RESPONSE CODES ARE USED TO INDICATE THE RECORD TYPE.  THE NUMBER OF
*         BYTES TRANSFERRED IS VERIFIED AGAINST THE LENGTH FIELD IN THE HEADER.
*
*         NOTE:  DUE TO A HARDWARE PROBLEM IN THE MCI IT IS NECESSARY TO NOTIFY
*                THE MCI THAT THE PREVIOUS READ OPERATION COMPLETED WITHOUT ERROR.
*                THIS IS DONE EITHER IMPLICITLY BY COMPLETION OF A WRITE OPERATION
*                OR EXPLICITLY BY SENDING A NORMAL FUNCTION.
*
*         ENTRY  DATA AVAILABLE BIT SET IN GENERAL STATUS.
*                (HDRTYP) = ADDRESS OF HEADER DESCRIPTOR TABLE.
*                (MSGTYP) = 0, IF IN-LINE DIAGNOSTIC MESSAGE TO BE READ,
*                         <> 0, IF NORMAL NETWORK MESSAGE TO BE READ.
*                (NXTREC) = 0 IF RECORD SIZE NOT KNOWN,
*                         = RECORD LENGTH IF RECORD LENGTH KNOWN BUT
*                           BUFFERS WERE NOT AVAILABLE ON INITIAL READ.
*                (RDSYN) <> 0, IF NORMAL FUNCTION SHOULD BE SENT TO
*                           SYNCHRONIZE READ.
*
*         EXIT   (INLINE) = 0, IF NO IN-LINE MESSAGE AWAITING RETURN TO MDI,
*                      <> 0, IF IN-LINE MESSAGE AWAITING RETURN TO MDI.
*
*         USES   T2, T3, UNSC.
*
*         CALLS  CDA, ERR, FAW, GRB, IRE, MDC, USR, ZRE.


 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
          STML   FSTRD       FIRST READ HAS NOT OCCURRED YET
          LDML   NXTREC
          ZJN    PFR20       IF RECORD LENGTH NOT KNOWN
          STDL   TBYTS       RECORD LENGTH
          RJM    GRB         GET BUFFERS FROM POOL
          ZJN    PFR24       IF BUFFERS NOT AVAILABLE


*         ISSUE READ FUNCTION.

 PFR20    BSS    0
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          NJN    PFR23       IF NOT OPERATIONAL STATE
          LDML   RDSYN
          ZJN    PFR23       IF SYNCHRONIZATION NOT NEEDED
          LDN    F.NORM
          RJM    IFR         ISSUE NORMAL FUNCTION
          NJN    PFR24       IF ERRORS ON FUNCTION
          STML   RDSYN       CLEAR SYNCHRONIZATION FLAG
          RJM    CDA         CHECK DATA AVAILABLE STILL SET
          PJN    PFR24       IF NOT DATA AVAILABLE
 PFR23    RJM    DMT         DETERMINE MESSAGE TYPE
          ZJN    PFR25       IF NO MESSAGE TYPE ERROR
 PFR24    UJK    PFR90       RELEASE BUFFERS

 PFR25    LDC    F.READ
          RJM    FAW         ISSUE FUNCTION AND ACTIVATE CHANNEL
          NJK    PFR24       IF ERRORS ON FUNCTION
 PFR40    LDC    CHCNT       CHANNEL COUNT
          IAPM   IOBUF,CHN
          STDL   ERRCNT      CHANNEL FRAMES NOT READ
          LDK    /RS/K.LREAD
          RJM    ERR         CHECK FOR ERRORS
          ZJN    PFR60       IF NO ERRORS
          LDDL   STCHNG
          NJK    PFR24       IF STATE CHANGING
          LDDL   ERRT1
          LPC    /RS/K.LSGSE
          NJN    PFR24       IF GENERAL STATUS ERROR BIT, RELEASE BUFFERS
          UJK    PFR80       NOT GENERAL STATUS ERROR BIT

 PFR60    LDML   MSGTYP
          ZJK    PFR120      IF IN-LINE DIAGNOSTIC MESSAGE READ
          LDDL   HDRTYP      PDU TYPE
          LMK    TCCH
          ZJN    PFR65       IF CC PDU

*         CHANNELNET PDU WILL NOT BE PROCESSED IF MCI IS IN OPERATIONAL STATE.

          LDDL   LSTATE      LAST KNOWN STATE OF MCI
          LMN    ST.OPER
          ZJK    PFR130      IF OPERATIONAL STATE
 PFR65    BSS    0
          LDML   NXTREC
          NJN    PFR70       IF BUFFERS ALLOCATED
          LDDL   TBYTS
          STML   NXTREC
          RJM    GRB         GET CM BUFFERS
          ZJN    PFR80       IF UNABLE TO GET BUFFERS
 PFR70    BSS    0
          RJM    MDC         MOVE DATA TO CM
          LDDL   IOCNT
          NJK    PFR40       IF MORE TO READ
          STML   NXTREC
          LDML   /HD/P.RRC,HDRTYP  READ RESPONSE CODE
          STML   RDSYN       SEND NORMAL FUNCTION IF NO WRITE
          UJK    PFR100      SEND RESPONSE

 PFR80    DCN    CHN+40B
          RJM    GST         WAIT FOR BUSY
          NJN    PFR90       IF ERROR ON GENERAL STATUS
          RJM    IRE         ISSUE READ ERROR FUNCTION

 PFR90    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    PFR92       IF DEVICE ERROR REQUIRED
          UJK    PFR130      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.

 PFR92    BSS    0
          LDML   RS+/RS/P.DLEN   LENGTH OF FIRST BUFFER POOL BUFFER
          NJN    PFR98       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

 PFR95    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    PFR95       IF MORE TO MOVE

 PFR98    BSS    0
          LDN    URC.DE      READ ERROR
 PFR100   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
          IFEQ   SIM,1
          LDC    500B
          STML   STAT
          ENDIF
          UJN    PFR140      EXIT
          SPACE  1,4
*         AN IN-LINE DIAGNOSTIC MESSAGE HAS BEEN READ, THE PP MUST LOOK AT THE
*         TEST MESSAGE HEADER TO DETERMINE IF THE MESSAGE IS TO BE SENT BACK AT
*         THE NEXT OPPORTUNITY OR DISCARDED.

 PFR120   BSS    0
          LDML   IOBUF+P.H802.3+P.H802.2  IN-LINE DIAGNOSTIC TEST HEADER
          SHN    17-IL.DSCRD-8
          MJN    PFR130      IF IN-LINE MESSAGE TO BE DISCARDED
          LDN    ST.ILD
          STML   INLINE      IN-LINE MESSAGE AWAITING RETURN
 PFR130   RJM    ZRE         RESET RESPONSE BUFFER
 PFR140   UJK    PFRX        EXIT
 WRP      SPACE  4,18
**        WRP - WRITE PROCESSOR.
*
*         THIS ROUTINE PROCESSES THE WRITE BYTES AND
*         WRITE RECORD COMMANDS. THE WRITE BYTES COMMAND
*         IS USED TO SEND CHANNELNET PDU'S AND THE WRITE
*         RECORD COMMAND IS USED TO SEND CHANNEL
*         CONNECTION PDU'S.
*
*         ENTRY  (CM) - COMMAND.
*                (LASTUR) = LAST UNIT REQUEST PROCESSED.
*                (STBI) = UNIT REQUEST.
*
*         USES   WC.
*
*         CALLS  ERR, FPB, IFR, STR, SWF, ZRE.
*
*         MACROS LOADB.


 WRP      SUBR               ENTRY/EXIT
          LDML   RQ+/URQ/P.URQLEN   UNIT REQUEST LENGTH
          SBN    /URQ/C.MBRMA*8   NUMBER OF REQUEST (CM) BYTES BEFORE LNG/ADDR LIST
          SHN    -3          8 CM BYTES FOR EACH LENGTH/ADDRESS PAIR
          STDL   CMLISTL     NUMBER OF CM LENGTH/ADDRESS PAIRS
          LDML   RQ+/URQ/P.MBLEN  LENGTH OF FIRST LENGTH/ADDRESS PAIR
          STDL   BUFLEN      CM BUFFER LENGTH IN BYTES
          LDN    0
          STML   CML         CURRENT CM LIST INDEX
          STML   REMBYT      INITIALIZE REMAINING BYTES COUNT
          LOADB  RQ+/URQ/P.MBRMA REFORMAT CM ADDRESS OF BUFFER AND
                                 SAVE STARTING BYTE OFFSET
          STDL   DATADD+2
          SRD    DATADD

*         ISSUE WRITE FUNCTION

          RJM    SWF         SELECT WRITE FORMAT
 WRP20    NJK    WRPX        EXIT - IF ERRORS
          LDC    F.WRITE
          RJM    IFR         ISSUE WRITE FUNCTION
          NJN    WRP20       IF FUNCTION ERRORS
          ACN    CHN
 WRP30    RJM    FPB         FILL PP BUFFER
          LDDL   IOCNT
          NJN    WRP40       IF DATA TO TRANSFER
          UJK    WRP75

 WRP40    BSS    0
          LDML   ODDSTR
          ZJN    WRP60       IF NOT ODD BYTE START IN PP BUFFER
          LDML   PREBUF      CONTAINS FIRST BYTE IN LOWER 8 BITS
          SHN    11-7
          SCN    17B
          STM    PREBUF      BYTE 1 IN BITS 52-59 (170 STM CLEARS UPPER 4 BITS)
          LDML   PREBUF+1
          STM    PREBUF+1    CLEAR UPPER 4 BITS IN PP WORD
          SHN    6
          LPN    17B
          RAML   PREBUF      ADD TOP 4 BITS OF BYTE 2
          LDDL   IOCNT
          STDL   P1
          SBN    2
          MJN    WRP50       IF ONLY ONE CHANNEL FRAME TO TRANSFER
          LDN    2
          STDL   P1
 WRP50    BSS    0
          LDDL   IOCNT
          SBDL   P1
          STDL   IOCNT       CHANNEL FRAMES LEFT TO TRANSFER AFTER OAM
          LDDL   P1
          IFEQ   SIM,1
          UJN    WRPP
          ENDIF
          OAM    PREBUF,CHN  OUTPUT 1 OR 2 CHANNEL FRAMES
          IFEQ   SIM,1
 WRPP     LDN    0
          ENDIF
          NJN    WRP75       IF NOT ALL DATA TAKEN
 WRP60    BSS    0
          LDDL   IOCNT       TRANSFER COUNT
          ZJN    WRP70       IF NO MORE DATA TO OUTPUT THIS PASS

          IFEQ   SIM,1
          STML   DATCNT
          UJN    XX
          ENDIF
          OAPM   IOBUF,CHN
          IFEQ   SIM,1
 XX       BSS    0
          LDN    0
          ENDIF
          NJN    WRP75       IF NOT ALL DATA TAKEN
 WRP70    BSS    0
          LDDL   BYTCNT      BYTES TRANSFERRED
          RAML   RS+/RS/P.XFER+1
          SHN    -16
          RAML   RS+/RS/P.XFER  UPDATE TRANSFER COUNT IN RESPONSE
          UJK    WRP30

 WRP75    STDL   ERRCNT      NUMBER OF WORDS NOT WRITTEN
          LDK    /RS/K.LWRT
          RJM    ERR         CHECK ERRORS
          NJN    WRP90       IF  ERRORS
          STML   RDSYN       CLEAR READ SYCHRONIZATION
          RJM    STR         SEND TERMINATION RESPONSE
 WRP80    UJK    WRPX        EXIT

 WRP90    RJM    ZRE         ZERO RESPONSE BUFFER
          LDDL   STCHNG
          NJN    WRP80       IF RESET
          LDML   WRRTY
          ZJN    WRP100      IF UNRECOVERED
          LDDL   ERRT1
          LMC    /RS/K.LSCEF
          ZJN    WRP100      IF ONLY ERROR WAS CEF
          LPN    /RS/K.LSGSI
          ZJN    WRP80       IF STATUS VALID
 WRP100   LDN    ST.PPR      RESET MCI
          STDL   STCHNG
          UJN    WRP80       EXIT
 FRC      SPACE  4,18
**        FRC - FIND RECOVERY COUNTER.
*
*         THIS ROUTINE WILL FIND AND RETURN THE ADDRESS OF
*         THE RECOVERY COUNTER FOR THE APPROPRIATE OPERATION.
*         THE FOLLOWING COUNTERS ARE DEFINED.
*
*         COUNTER               OPERATION
*         -------            -------------------
*         WRRTY              WRITE OPERATION
*         RDRTY              READ OPERATION
*         ILRTY              IN-LINE WRITE OPERATION
*
*         ENTRY  (A) = OPERATION TYPE.
*
*         EXIT   (A) = ADDRESS OF RECOVERY COUNTER.
*
*         CALLS  STB.


 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.LILWRT,RDRTY
          CON    0
 IER      SPACE  4,14
**        IER - INITIALIZE ERROR ROUTINE.
*
*         THIS ROUTINE WILL INITIALIZE FOR THE ERROR
*         RECOVERY LOGIC.
*
*         ENTRY  (OTYPE) = OPERATION CODE.
*
*         EXIT   (A) = 0.
*                (ERRRCP) = POINTER TO RECOVERY COUNTER.
*                (ERRT1) = 0.
*
*         CALLS  FRC.


 IER      SUBR               ENTRY/EXIT
          LDML   OTYPE
          RJM    FRC         FIND PROPER RECOVERY COUNTER
          STDL   ERRRCP      SAVE
          LDN    0
          STDL   ERRT1       ZERO ERROR WORD
          UJN    IERX        EXIT
 FPB      SPACE  4,22
**        FPB - FILL PP BUFFER
*
*         THIS ROUTINE FILLS THE PP I/O BUFFER WITH DATA FROM CM.  CM DATA IS
*         DEFINED VIA ADDRESS/LENGTH PAIRS.
*
*         ENTRY  (CML) = ADDRESS/LENGTH PAIR INDEX.
*                (CMLISTL) = ADDRESS/LENGTH PAIR COUNT.
*                (BUFLEN) = REMAINING DATA TO TRANSFER FROM CURRENT CM BUFFER.
*                (DATADD) = CM ADDRESS TO READ FROM.
*                (REMBYT) = REMAINING BYTES IN BUFFER AFTER LAST OUTPUT.
*
*         EXIT   (IOCNT) = NUMBER OF CHANNEL FRAMES TO TRANSFER.
*                (REMBYT) = REMAINING BYTES AFTER UPCOMING OUTPUT.
*                (BYTCNT) = NUMBER OF BYTES TO TRANSFER.
*                (CML) = OFFSET TO LAST LENGTH/ADDRESS PAIR.
*                (CMLISTL) = 0 (NUMBER OF LENGTH/ADDRESS PAIRS REMAINING).
*
*         USES   P1 - P4, T2, T3.
*
*         CALLS  CBY, IPB, MDP.
*
*         MACROS LOADB.


 FPB      SUBR               ENTRY/EXIT
          LDN    0
          STDL   BYTCNT
          LDDL   CMLISTL
          NJN    FPB10       IF CM DATA
          STDL   IOCNT       OUTPUT COMPLETE - NO MORE DATA TO SEND
          UJN    FPBX        EXIT

 FPB10    BSS    0
          RJM    IPB         INITIALIZE PP BUFFER
          LDC    IOBLEN*2    LENGTH OF PP BUFFER IN BYTES
          RADL   TBYTS       TOTAL LENGTH OF PP BUFFER
          SBDL   BYTCNT
 FPB20    BSS    0
          STDL   BYTS        FREE SPACE
          SBDL   BUFLEN      BYTES LEFT TO TRANSFER FROM CM
          MJN    FPB30       IF NOT ALL OF CM BUFFER FITS IN PP
          LDDL   BUFLEN
          STDL   BYTS
 FPB30    BSS    0
          LDDL   BYTS
          RJM    MDP         MOVE DATA TO PP BUFFER
          LDDL   BUFLEN
          SBDL   BYTS        BYTES TRANSFERRED
          STDL   BUFLEN      BYTES LEFT TO TRANSFER FROM CM
          ZJN    FPB40       IF CM BUFFER EMPTY
          UJK    FPB70       MORE BYTES TO TRANSFER FROM THIS CM BUFFER

 FPB40    BSS    0
          SODL   CMLISTL     DECREMENT LENGTH/ADDRESS PAIR COUNT
          NJN    FPB50       IF MORE CM DATA
          UJK    FPB70

*         MOVE THE NEXT LENGTH/ADDRESS PAIR TO *P1* - *P4*.

 FPB50    BSS    0
          AOML   CML         INCREMENT CM LIST INDEX
          SHN    2           OFFSET TO NEXT LENGTH/ADDRESS PAIR
          ADN    3           OFFSET TO LAST PP WORD OF NEXT LENGTH/ADDRESS PAIR
          STDL   T2
          LDN    3           4 PP WORDS PER LENGTH/ADDRESS PAIR (0..3)
          STDL   T3          NEXT OFFSET FOR COPYING THE LENGTH/ADDRESS PAIR

 FPB60    LDML   RQ+/URQ/P.MBLEN,T2   NEXT REQUEST LENGTH/ADDRESS PAIR
          STML   P1,T3
          SODL   T2          NEXT LENGTH/ADDRESS PAIR OFFSET
          SODL   T3          NEXT OFFSET FOR THE COPY
          PJK    FPB60       IF MORE TO DO

          LDDL   P1
          STDL   BUFLEN      CM BUFFER LENGTH
          LDDL   SBYOFF
          LPN    1           DETERMINE IF ODD OR EVEN
          STML   EBYOFF      ENDING BYTE OFFSET (ODD OR EVEN)
          LOADB  P1+/URQ/P.MBRMA-/URQ/P.MBLEN  REFORMAT CM ADDRESS AND
                                               SAVE STARTING BYTE OFFSET
          STDL   DATADD+2
          SRD    DATADD
          LDDL   SBYOFF      NEW STARTING BYTE OFFSET
          LPN    1           ODD OR EVEN
          LMML   EBYOFF
          NJN    FPB80       IF START OF NEXT BUFFER DOES NOT MATCH UP
          LDDL   TBYTS       TOTAL SIZE OF PP BUFFER IN BYTES
          SBDL   BYTCNT
          ZJN    FPB80       IF PP BUFFER FULL
          UJK    FPB20

 FPB70    BSS    0
          LDDL   SBYOFF
          LPN    1
          STML   EBYOFF      ENDING BYTE OFFSET (ODD OR EVEN)
 FPB80    BSS    0
          RJM    CBY         CONVERT BYTE COUNT TO CHANNEL COUNT
          LDDL   IOCNT       CHANNEL FRAMES TO TRANSFER
          NJN    FPB90       IF DATA TO TRANSFER
          UJK    FPB10

 FPB90    BSS    0
          LDDL   BYTCNT      BYTES IN PP BUFFER
          SBML   REMBYT      REMAINING BYTES (BYTES NOT TO BE TRANSFERRED)
          STDL   BYTCNT      ACTUAL NUMBER OF BYTES TO BE TRANSFERRED
          UJK    FPBX        EXIT
 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
          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
          SBDL   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
          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
          SBDL   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)
          LDDL   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.

          LDDL   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    STDL   TBYTS       UPDATE TOTAL BYTES TO ALLOCATE CM BUFFERS FOR
          NJK    GRB05       IF MORE TO ALLOCATE
          RJM    SBI         INITIALIZE BUFFER POINTERS
          UJK    GRBX        EXIT
 IPB      SPACE  4,14
**        IPB - INITIALIZE PP BUFFER.
*
*         THIS ROUTINE WILL SET UP THE PP BUFFER AND
*         THE CURRENT BUFFER POINTER, *CURBUF* FOR THE
*         UPCOMING CALL TO *MDP* (MOVE DATA TO PP).  THIS
*         INVOLVES MOVING ANY REMAINING BYTES IN THE
*         BUFFER NOT SENT OUT WITH THE LAST OUTPUT
*         INSTRUCTION, UP TO THE START OF THE BUFFER
*         AND UPDATING *CURBUF*.
*
*         ENTRY  (CURBUF) = CURRENT PP BUFFER POINTER.
*                (EBYOFF) = BYTE OFFSET (MOD 2) WHERE NEXT DATA EXPECTED TO START.
*                (REMBYT) = REMAINING BYTES LEFT IN PP BUFFER.
*                (SBYOFF) = STARTING BYTE OFFSET OF NEXT CM BYTE.


 IPB      SUBR               ENTRY/EXIT
          LDN    0
          STDL   TBYTS       INITIALIZE PP BUFFER SIZE
          LDML   REMBYT      REMAINING BYTES AFTER LAST OUTPUT
          STDL   BYTCNT      BYTES IN PP BUFFER
          NJN    IPB30       IF BYTES REMAINING
          LDDL   SBYOFF
          LPN    1
          ZJN    IPB10       IF STARTING BYTE OFFSET EVEN
          LDC    PREBUF      CURRENT BUFFER POINTER
          UJN    IPB20

 IPB10    BSS    0
          LDC    IOBUF       CURRENT BUFFER POINTER
 IPB20    UJK    IPB70

 IPB30    BSS    0
          SBN    1
          NJN    IPB40       IF 2 REMAINING BYTES
          LDML   EBYOFF
          ZJN    IPB35       IF ENDING BYTE OFFSET EVEN
          UJK    IPB60

 IPB35    BSS    0
          SODL   CURBUF
          LDIL   CURBUF
          SHN    8
          STML   IOBUF       MOVE REMAINING BYTE TO TOP OF BUFFER
          LDC    IOBUF       CURRENT BUFFER POINTER
          UJN    IPB20

 IPB40    BSS    0
          LDML   EBYOFF
          ZJN    IPB50       IF ENDING BYTE OFFSET EVEN
          LDIL   CURBUF
          SHN    10
          LPC    377B
          STML   IOBUF       MOVE SECOND REMAINING BYTE
          SODL   CURBUF      BACK UP TO GET FIRST REMAINING BYTE
          LDIL   CURBUF
          LPC    377B
          SHN    8
          RAML   IOBUF       MOVE FIRST REMAINING BYTE
          LDC    IOBUF+1     CURRENT BUFFER POINTER
          UJK    IPB70

 IPB50    BSS    0
          SODL   CURBUF
          LDIL   CURBUF
          SHN    8
          STML   PREBUF+1    MOVE SECOND REMAINING BYTE
 IPB60    BSS    0
          LDIL   CURBUF
          SHN    10
          STML   PREBUF      MOVE FIRST REMAINING BYTE
          LDC    PREBUF+1    CURRENT BUFFER POINTER
 IPB70    BSS    0
          STDL   CURBUF      UPDATE CURRENT BUFFER POINTER
          LDML   REMBYT      REMAINING BYTES
          LMDL   SBYOFF      STARTING BYTE OFFSET OF NEXT BYTE
          LPN    1
          ZJN    IPB80       IF ONLY NEED TO DO 1 OUTPUT
          LDN    3
          STDL   TBYTS       INCREASE TOTAL PP BUFFER SIZE
 IPB80    BSS    0
          STML   ODDSTR      SET FLAG FOR 170 OAM USE
          UJK    IPBX        EXIT
 MDC      SPACE  4,16
**        MDC - MOVE DATA TO CM.
*
*         THIS ROUTINE TRANSFERS DATA FROM THE PP I/O BUFFER
*         TO CM.
*
*         ENTRY  (BUFLEN) = REMAINING FREE BYTES IN CM BUFFER.
*                (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
          LDDL   BUFLEN      SPACE IN CM BUFFER
          NJN    MDC20       IF BUFFER NOT EMPTY
          AOML   CML         NEXT LENGTH/ADDRESS PAIR
          RJM    SBI         INITIALIZE FOR NEXT BUFFER

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

 MDC30    BSS    0
          LDDL   BYTS

 MDC40    STML   BWRT        BYTES TO WRITE TO CM
          LDDL   LSTATE      LAST STATE
          LMK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          ZJN    MDC45       IF OPERATIONAL STATE

          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
          SHN    -1          CONVERT FROM CM BYTES TO PP WORDS

 MDC45    BSS    0
          STDL   T1          NUMBER OF EXTRA PP WORDS 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
          LOADC  DATADD
          CWML   IOBUF,WC
 MDCW     EQU    *-1
          STDL   DATADD+2  UPDATE CM BUFFER ADDRESS
          LDDL   BUFLEN
          SBML   BWRT
          STDL   BUFLEN      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
 REC      SPACE  4,26
**        REC - READ ERROR CHECK.
*
*         THIS ROUTINE WILL PERFORM INITIAL ERROR CHECKS FOR READ
*         RECOVERY. AS THE RECORD MAY BE LONGER THAN THE PP BUFFER,
*         MULTIPLE CALLS CAN BE MADE.
*
*         ENTRY  (ACTD) = 0 ON INITIAL ENTRY FOR A RECORD,
*                       = BYTES READ TO THIS POINT ON SUBSEQUENT ENTRY.
*                (ERRCNT) = NUMBER OF WORDS NOT READ.
*                (FSTRD) = 0 IF FIRST BUFFER READ FOR THIS RECORD.
*                (HDRTYP) = ADDRESS OF HEADER DESCRIPTOR TABLE.
*                (NXTREC) = 0 IF BUFFERS NOT PREALLOCATED,
*                         <> 0 = SIZE OF BUFFER ALLOCATED.
*
*         EXIT   (A) = 0 IF NO ERRORS AND NOT END OF RECORD,
*                    <> 0 IF ERRORS OR END OF RECORD.
*                (ACTD) = TOTAL BYTES READ FOR THIS RECORD.
*                (BYTCNT) = NUMBER OF BYTES IN BUFFER.
*                (EXPD) = RECORD SIZE IN BYTES.
*                (ERRT1) = SYMPTOM CODES IF ERRORS.
*                (IOCNT) = NUMBER OF CHANNEL FRAMES TO READ.
*                (TBYTS) = RECORD SIZE IN BYTES.
*
*         USES   T1.
*
*         CALLS  CBY, IER.


 REC      SUBR               ENTRY/EXIT
          LDC    CHCNT
          SBDL   ERRCNT
          STDL   ERRCNT      SAVE CHANNEL FRAMES READ
          SHN    1
          ADDL   ERRCNT
          SHN    -1          BYTES READ
          STDL   BYTCNT
          RAML   ACTD
          LDML   FSTRD
          NJK    REC30       IF NOT FIRST READ
          RJM    IER         INITIALIZE ERROR PROCCESSING
          LDML   /HD/P.HLB,HDRTYP  LENGTH OF HEADER
          STML   FSTRD
          STML   EXPD
          LDDL   ERRCNT
          SBML   /HD/P.HLC,HDRTYP  HEADER LENGTH IN CHANNEL FRAMES
          MJK    REC10       IF HEADER NOT READ
          LDML   /HD/P.ALF,HDRTYP  ADDRESS OF LENGTH FIELD
          STDL   T1
          LDML   0,T1
          ADML   /HD/P.ATL,HDRTYP
          STDL   BYTCNT      BYTES IN RECORD
          STML   RS+/RS/P.XFER+1
          STDL   TBYTS
          STML   EXPD
          LDDL   TBYTS
          SBN    1
          SBML   /HD/P.MRS,HDRTYP
          PJK    REC110      IF RECORD .GT. MAXIMUM
          LDML   NXTREC
          ZJN    REC20       IF BUFFERS NOT PREALLOCATED
          SBML   EXPD
          ZJN    REC20       IF RECORD SIZE .EQ. BUFFERS
          LDML   EXPD
          STML   ACTD
          LDML   NXTREC
          STML   EXPD
 REC10    UJN    REC50       MESSAGE LENGTH ERROR

 REC20    RJM    CBY         CONVERT TO CHANNEL FRAMES
          LDML   ACTD
          STDL   BYTCNT      RESTORE BYTE COUNT
 REC30    LDDL   IOCNT
          SBDL   ERRCNT
          STDL   IOCNT
          MJN    REC50       IF RECORD LONGER THAN EXPECTED
          NJN    REC40       IF NOT LAST BLOCK
          LDML   EXPD
          SBML   ACTD
          RADL   BYTCNT      ADJUST FOR EXTRA BYTE
          UJN    REC70       COMPLETE PROCESSING

 REC40    LDC    CHCNT
          SBDL   ERRCNT
          NJN    REC90       IF LAST READ NOT FULL BUFFER
          AJM    RECX,CHN    IF CHANNEL ACTIVE
 REC50    LDC    /RS/K.LSMLV
 REC60    RADL   ERRT1       MESSAGE LENGTH VERIFICATION ERROR
          UJK    RECX        EXIT



 REC70    LDC    WTDEACT*600   WAIT FOR CHANNEL NOT ACTIVE
 REC80    IJM    RECX,CHN    IF CHANNEL NOT ACTIVE
          SBML   TI
          NJN    REC80       IF NOT TIMED OUT
          LDDL   ERRCNT
          NJN    REC90       IF TRANSFER NOT COMPLETE
          LDC    177777B     MESSAGE LARGER THAN EXPECTED
          STML   ACTD
          UJK    REC50       LOG ERROR

 REC90    IJM    REC50,CHN   MESSAGE LENGTH ERROR
          LDC    /RS/K.LSIT
 REC100   UJK    REC60       SET INCOMPLETE TRANSFER

 REC110   LDML   EXPD
          STML   ACTD
          LDN    ST.PPR
          STDL   STCHNG      RESET MDI
          LDC    /RS/K.LSMSE
          UJN    REC100      SET MAXIMUM SIZE EXCEEDED
 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.
*                (BUFLEN) = LENGTH OF BUFFER.
*                (A) = LENGTH OF BUFFER.
*
*         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)

          LOADF  BPRMA,T2    RMA OF BUFFER POOL BUFFER
          SRD    DATADD      SAVE R REQISTER
          STDL   DATADD+2    OFFSET OF FIRST DATA WORD

          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
          ADDL   DATADD+2    OFFSET OF FIRST BUFFER WORD
          SBDL   T4          LENGTH OF FIRST BUFFER (CM WORDS)
          STDL   DATADD+2    OFFSET OF FIRST DATA WORD

 SBI10    BSS    0
          LDML   RS+/RS/P.DLEN,T3   LENGTH PART OF LENGTH/ADDRESS PAIR
          STDL   BUFLEN
          UJK    SBIX        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    BSS    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
          SPACE  4,10
**        OVERLAY 5 MUST NOT OVERLAY SWF
*
 OV5END   EQU    *           MAXIMUM LENGTH OF OVERLAY 5
 SWF      SPACE  4,16
**        SWF - SELECT WRITE FORMAT.
*
*         THIS ROUTINE SENDS A FUNCTION TO THE MDI INDICATING THE
*         TYPE OF PDU WHICH WILL BE SENT ON SUCCEEDING WRITES.
*
*         ENTRY  (LASTUR) = VALUE OF LAST UNIT REQUEST.
*                (LSTATE) = LAST KNOWN MDI STATE.
*                (STBI) = VALUE OF UNIT REQUEST BEING PROCESSED.
*
*         EXIT   (A) = 0 IF NO ERRORS,
*                    <> 0 IF ERRORS ON FUNCTION.
*
*         CALLS  IFR.


 SWF10    LDK    F.CNW
 SWF20    RJM    IFR         SEND FUNCTION

 SWF      SUBR               ENTRY/EXIT
          LDDL   LSTATE      LAST STATE
          LPK    ST.OPER     COMPARE WITH OPERATIONAL STATE
          ZJK    SWFX        IF NOT OPERATIONAL STATE
          LDML   LASTUR
          LMML   STBI
          ZJN    SWFX        IF NO CHANGE FROM LAST
          LDML   STBI
          STML   LASTUR
          LMC    C.WRTB
          ZJN    SWF10       IF CHANNELNET PDU
          LDK    F.CCW
          UJN    SWF20       CHANNEL CONNECTION
 WEC      SPACE  4,10
**        WEC - WRITE ERROR CHECK.
*
*         THIS ROUTINE WILL PERFORM INITIAL ERROR CHECKS
*         FOR WRITE RECOVERY.
*
*         ENTRY  (ERRCNT) = NUMBER OF WORDS NOT READ.
*
*         EXIT   (ERRT1) = SYMPTOM CODES IF ERRORS.
*
*         CALLS  IER.


 WEC      SUBR               ENTRY/EXIT
          RJM    IER         INITIALIZE ERROR RECOVERY
          STDL   CMLISTL
          AJM    WEC10,CHN   IF CHANNEL ACTIVE
          LDC    /RS/K.LSCD
          RADL   ERRT1       SET CHANNEL NOT ACTIVE ERROR
          UJN    WECX        EXIT

 WEC10    LDDL   ERRCNT
          ZJN    WEC20       IF TRANSFER COMPLETE
          LDC    /RS/K.LSIT  SET INCOMPLETE TRANSFER
          RADL   ERRT1
 WEC20    LDC    WTEMPTY*600
 WEC30    EJM    WEC40,CHN   IF CHANNEL EMPTY
          SBML   TI
          NJN    WEC30       IF NOT TIMED OUT
          LDC    /RS/K.LSCF
          RADL   ERRT1       SET CHANNEL NOT EMPTY
 WEC40    UJN    WECX        EXIT
          SPACE  4,10
 OV1CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          SPACE  4,10
**        END OF OVERLAY
*

 OVEND    EQU    *+7
          SPACE  4,10

          OVERLAY  (MISCELLANEOUS INPUT/OUTPUT),OVEND
          ROUTINE  OV2
 CBP      SPACE  4,16
**        CBP - CHECK IF BUFFER IN POOL.
*
*         THIS ROUTINE WILL OBTAIN THE BUFFER POOL LOCK
*         AND DETERMINE IF A BUFFER IS AVAILABLE.
*         THE LOCK 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
          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 LOCK

*         GET BUFFER POOL DESCRIPTOR.

*         LDN    0
          STDL   T3          NUMBER OF BUFFERS OBTAINED
          LDN    C.BPD
          STDL   WC          LENGTH OF POOL DESCRIPTOR
          LOADC  CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
          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)
          LOADF  BPD+/BPD/P.BTRMA   BUFFER POOL TABLE FWA
          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 LOCK.

 CBP70    BSS    0
          LOADC  CM.BPD      ADDRESS OF FIRST POOL DESCRIPTOR
          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 LOCK
          LDDL   T3          NUMBER OF BUFFERS OBTAINED
          UJK    CBPX        EXIT

 CBY      SPACE  4,12
**        CBY - CONVERT BYTE COUNT.
*
*         CONVERT BYTE COUNT TO 12-BIT CHANNEL COUNT.
*         THIS ROUTINE IS CALLED DURING BOTH READ AND WRITE
*         PROCESSING. WHEN CALLED DURING READ PROCESSING THE
*         CHANNEL COUNT IS ROUNDED UP TO INCLUDE *BYTCNT* BYTES.
*         WHEN CALLED FOR WRITE PROCESSING, THE CHANNEL COUNT
*         WILL BE ROUNDED UP ONLY IF THIS IS THE LAST FRAGMENT
*         TO BE OUTPUT (I.E., *CMLISTL* EQUALS ZERO.
*
*         ENTRY  (BYTCNT) = NUMBER OF BYTES.
*                (OTYPE) = TYPE OF OPERATION IN PROGRESS.
*                (CMLISTL) = 0, IF LAST WRITE BLOCK (I.E., ROUND UP CHANNEL COUNT)
*                          <> 0, IF NOT LAST WRITE BLOCK.
*
*         EXIT   (IOCNT) = NUMBER OF CHANNEL FRAMES REQUIRED TO SEND
*                        *BYTCNT* BYTES.
*                (REMBYT) = REMAINING BYTES IN PP BUFFER AFTER UPCOMING OUTPUT.
*
*         USES   T1, T2.


 CBY      SUBR               ENTRY/EXIT
          LDN    0
          STDL   IOCNT       CHANNEL COUNT
          LDDL   BYTCNT      BYTE COUNT
          ZJN    CBYX        IF ZERO BYTE COUNT
          STDL   T1
          LDN    3           DIVIDE BY 3
          SHN    14
          STDL   T2
 CBY10    BSS                DIVIDE LOOP
          LDDL   T1
          SBDL   T2
          MJN    CBY20
          STDL   T1
          AODL   IOCNT       INCREMENT CHANNEL COUNT
 CBY20    BSS
          LDDL   IOCNT
          SHN    1
          STDL   IOCNT       MULTIPLY BY 2
          LDDL   T2
          SHN    -1
          STDL   T2
          SBN    1
          NJN    CBY10       IF NOT DONE
          LDDL   T1
          STML   REMBYT      SAVE REMAINDER
          LDML   OTYPE       OPERATION TYPE
          SBN    /RS/K.LREAD
          ZJN    CBY25       IF READ OPERATION
          LDDL   CMLISTL
          NJN    CBY30       IF NOT LAST TRANSFER
 CBY25    LDML   REMBYT      REMAINING BYTES
          RADL   IOCNT       OUTPUT ALL DATA IN BUFFER
          LDN    0
          STML   REMBYT      ALL BYTES WILL BE TRANSFERRED
 CBY30    BSS    0
          UJK    CBYX        EXIT
 MDP      SPACE  4,18
**        MDP - MOVE DATA TO PP BUFFER.
*
*         THIS ROUTINE TRANSFERS DATA FROM CM TO THE PP
*         I/O BUFFER.
*
*         ENTRY  (A) = NUMBER OF BYTES TO TRANSFER.
*                (BYTCNT) = NUMBER OF BYTES IN PP BUFFER.
*                (CURBUF) = CURRENT PP BUFFER POINTER.
*                (SBYOFF) = STARTING BYTE OFFSET.
*
*         EXIT   (A) BYTES TRANSFERRED TO PP BUFFER.
*                (DATADD) AND (SBYOFF) UPDATED.
*
*         USES   WC.
*
*         CALLS  RPW.
*
*         MACROS LOADC.


 MDP      SUBR               ENTRY/EXIT
          STDL   RBYTS       REMAINING BYTES TO TRANSFER
          LDN    8-1
          SBDL   SBYOFF
          SBDL   RBYTS
          PJN    MDP10       IF LESS BYTES TO TRANSFER THAN IN FIRST WORD
          LDDL   SBYOFF      STARTING BYTE OFFSET
          ZJN    MDP20       IF WORD ALIGNED
 MDP10    BSS    0
          RJM    RPW         READ PARTIAL WORD
 MDP20    LDDL   RBYTS
          SHN    -3
          ZJN    MDP30       IF NO FULL WORDS TO TRANSFER
          STDL   WC
          LDDL   CURBUF      CURRENT BUFFER POINTER
          STML   MDPR        UPDATE PP ADDRESS FOR READ
          LOADC  DATADD
          CRML   IOBUF,WC
 MDPR     EQU    *-1
          STDL   DATADD+2    UPDATE CM ADDRESS
          LDDL   WC
          SHN    3
          RADL   BYTCNT      UPDATE PP BUFFER COUNT
          LDDL   WC
          SHN    2           PP WORDS READ IN
          RADL   CURBUF      UPDATE CURRENT BUFFER POINTER
 MDP30    LDDL   RBYTS
          LPN    7
          STDL   RBYTS
          ZJN    MDP40       IF DONE
          RJM    RPW         READ PARTIAL WORD
 MDP40    UJK    MDPX        EXIT
 RPW      SPACE  4,18
**        RPW - READ PARTIAL WORD.
*
*         THIS ROUTINE IS CALLED WHEN LESS THAN 1 FULL CM WORD
*         OF VALID DATA NEEDS TO BE TRANSFERRED TO THE PP-S
*         I/O BUFFER.
*
*         ENTRY  (BYTCNT) = NUMBER OF BYTES IN PP BUFFER.
*                (DATADD) = CM ADDRESS OF DATA.
*                (RBYTS) = REMAINING BYTES TO TRANSFER.
*                (SBYOFF) = STARTING BYTE OFFSET.
*
*         EXIT   (RBYTS) TRANSFERRED TO PP BUFFER.
*                (DATADD) , (BYTCNT) AND (SBYOFF) UPDATED.
*
*         USES   P1 - P4, P5, P6, T7, T8.
*
*         MACROS LOADC.


 RPW      SUBR               ENTRY/EXIT
          LOADC  DATADD
          CRDL   P1          READ CM BUFFER WORD
          AODL   DATADD+2    RMA OF NEXT CM WORD
          LDN    8
          SBDL   SBYOFF
          STDL   P5          VALID BYTES IN WORD
          LDDL   RBYTS       REMAINING BYTES TO TRANSFER
          ZJN    RPWX        EXIT - IF NO DATA
          SBDL   P5
          PJN    RPW10       IF ALL VALID BYTES TO BE TRANSFERRED
          SODL   DATADD+2    CM BUFFER WORD MUST BE READ AGAIN LATER
          LDDL   RBYTS
          STDL   P5          BYTES TO TRANSFER
 RPW10    BSS    0
          LDDL   P5
          STDL   T7
          LDDL   CURBUF      CURRENT BUFFER POINTER
          STDL   P6          PP BUFFER ADDRESS
          LDDL   SBYOFF
          SHN    -1
          STDL   T8          STARTING PP WORD OFFSET
          LDDL   SBYOFF
          LPN    1
          ZJN    RPW20       IF EVEN BYTE BOUNDARY
          LDML   P1,T8
          LPC    377B
          STML   P1,T8       CLEAR UPPER BYTE
          LDIL   P6
          LPC    177400B     CLEAR LOWER BYTE
          ADML   P1,T8       ADD LOWER BYTE
          STIL   P6
          AODL   T8
          AODL   P6          INCREMENT PP BUFFER ADDRESS
          SODL   P5
          ZJN    RPW30       IF DONE
 RPW20    BSS    0
          LDML   P1,T8
          STIL   P6          MOVE TO PP BUFFER
          AODL   T8          INCREMENT PP WORD OFFSET
          SODL   P5
          ZJN    RPW30       IF DONE
          AODL   P6          INCREMENT PP BUFFER ADDRESS
          SODL   P5
          NJN    RPW20       IF MORE BYTES TO MOVE
 RPW30    BSS    0
          LDDL   P6
          STDL   CURBUF      UPDATE CURRENT BUFFER POINTER
          LDDL   T7
          ADDL   SBYOFF
          LPN    7
          STDL   SBYOFF      NEW STARTING BYTE OFFSET
          LDDL   RBYTS
          SBDL   T7
          STDL   RBYTS       UPDATE REMAINING BYTE COUNT
          LDDL   T7
          RADL   BYTCNT      UPDATE PP BUFFER COUNT
          UJK    RPWX        EXIT
          SPACE  4,10
 OV2CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  END
          OVERLAY  (DIAGNOSTIC STATE PROCESSOR),BUFEND
          ROUTINE  OV3
          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
 DIA      SPACE  4,14
**        DIA - DIAGNOSTIC STATE PROCESSOR.
*
*         THIS ROUTINE PERFORMS A NUMBER OF DIAGNOSTIC TESTS
*         TO DETERMINE THE CONDITION OF THE MCI AND THE CHANNEL.
*         AN OVERVIEW OF THE DIAGNOSTIC SEQUENCE FOLLOWS:
*         UPON SEEING GENERAL STATUS INDICATE DIAGNOSTIC STATE
*         THE PP ISSUES THE -REQUEST DIAGNOSTIC COMMAND- FUNCTION.
*         THE PP WILL THEN INPUT THE NEXT COMMAND AND EXECUTE
*         THE APPROPRIATE ROUTINE.  IF AN UNEXPECTED ERROR OCCURRED
*         THEN THE -ABORT DIAGNOSTIC SEQUENCE- FUNCTION IS ISSUED.
*
*         NOTE   DUE TO AN MCI HARDWARE PROBLEM SOME GENERAL STATUS
*                BITS CAN BE LEFT SET MOMENTARILY GIVING A FALSE
*                INDICATION OF DIAGNOSTIC STATE. THE TWO SECOND PAUSE
*                ON ENTRY ALLOWS FOR THIS CONDITION.
*
*         USES   P6.
*
*         CALLS  CSC, DEC, FAW, IFR, IGS, SLM, SSC, STB.


 DIA      SUBR               ENTRY/EXIT
*
*         PAUSE TWO SECONDS
*
          LDC    2000        WAIT TWO SECONDS
          STM    TIMB
 DIA01    RJM    CSC         CHECK IF STATE CHANGE
          NJN    DIAX        IF STATE CHANGE
 DIA02    IAN    14B         READ MICROSECOND COUNTER
          LPC    7777B
          SBM    TIMA
          PJN    DIA03       IF NO OVERFLOW
          ADC    10000B      COMPENSATE FOR CLOCK OVERFLOW
 DIA03    ADC    -1000
          MJN    DIA02       IF LESS THAN 1 MILLISECOND
          LDC    1000        ADVANCE BASE BY 1 MILLISECOND
          RAM    TIMA
          SOM    TIMB
          PJN    DIA01       IF NOT END OF PAUSE
 DIA10    BSS    0
          RJM    CSC         CHECK IF STATE CHANGE
          NJN    DIAX        IF NO STATE CHANGE
          LDDL   GNSTAT      GENERAL STATUS
          STML   STBI
          LMN    ST.DIAG*8
          NJK    DIA30       IF NOT PURE DIAGNOSTIC STATE
          LDN    F.RQDCMD    REQUEST DIAGNOSTIC COMMAND
          RJM    FAW
          NJN    DIA15       IF ERROR ON FUNCTION
          LDN    DCLEN
          IAPM   PREBUF,CHN
          RJM    DEC         CHECK FOR ERRORS
          NJN    DIA15       IF ERRORS READING COMMAND
          LDML   PREBUF
          SHN    -8
          STML   STBI        DIAGNOSTIC COMMAND
          LDC    DCT-2       COMMAND TABLE ADDRESS - 2
          RJM    STB         SEARCH TABLE
          ZJN    DIA20       IF INVALID COMMAND
          STDL   P6          PROCESSOR ADDRESS
          RJM    0,P6        PROCESS COMMAND
 DIA15    NJN    DIA35       IF PP DETECTED ERROR
          UJK    DIA10       GET NEXT COMMAND

 DIA20    LDK    /RS/K.LSMT
          RJM    SSC         SET SYMPTOM CODE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID
          LDK    /RS/K.LRDC
          STML   LRS+/RS/P.OPTP
          UJN    DIA50       COMPLETE LOGGING

 DIA30    LDC    DES-2       DIAGNOSTIC STATUS TABLE
          RJM    STB         SEARCH TABLE
          ZJN    DIA40       IF UNEXPECTED ERROR
          RJM    IFR         ISSUE FUNCTION
 DIA35    NJN    DIA60       IF ERROR ON FUNCTION
          UJK    DIA10

 DIA40    LDK    /RS/K.LGSCF
          STML   LRS+/RS/P.ERRID
 DIA50    LDML   PREBUF      LAST DIAGNOSTIC COMMAND
          STML   LRS+/RS/P.ERRW2
          RJM    IGS         INCLUDE GENERAL STATUS
          LDK    ST.PPD
          STDL   STCHNG      DOWN MDI
          RJM    SLM         SEND LOG MESSAGE
 DIA60    LDN    F.ABDSEQ    ABORT FUNCTION
          RJM    IFR         ISSUE ABORT FUNCTION AND IGNORE ERROR
          UJK    DIAX        EXIT
          SPACE  4,10
**        DIAGNOSTIC COMMAND/PROCESSOR TABLE.
*
*         EACH TWO WORD ENTRY IN *DCT* HAS THE FOLLOWING FORMAT.
*         WORD 1 = DIAGNOSTIC COMMAND.
*         WORD 2 = ADDRESS OF COMMAND PROCESSOR.

 DCT      BSS    0
          CON    DC.TMRQ,DTM   TEST MODE REQUEST
          CON    DC.DTPP,DDT   DATA TRANSFER TO PP
          CON    DC.RDPP,DRD   RETURN DATA FROM PP
          CON    DC.SBP,DSP    SET BIT PACKING
          CON    DC.RPBD,DRP   READ AND PACK BIT DATA
          CON    0
          SPACE  4,10
**        DIAGNOSTIC ERROR STATUS/FUNCTION CODE TABLE.
*
*         EACH TWO WORD ENTRY IN *DES* HAS THE FOLLOWING FORMAT.
*         WORD 1 = GENERAL STATUS ERROR CONDITION.
*         WORD 2 = FUNCTION CODE TO ISSUE AFTER ERROR.

 DES      BSS    0
          CON    EXME,F.DMERR  EXPECTED MEMORY ERROR
          CON    EXER,F.DERR   EXPECTED ERROR DETECTED
          CON    0
          TITLE  DIAGNOSTIC STATE ROUTINES.
**        DCE - DIAGNOSTIC CHANNEL ERROR.
*
*         THIS ROUTINE WILL LOG A CHANNEL ERROR IN DIAGNOSTIC
*         STATE.
*
*         ENTRY  (A) = OPERATION CODE.
*
*         EXIT   (A) <> 1.
*


*         CALLS  GER, SLM, SSC.
 DCE      SUBR               ENTRY/EXIT
          STML   LRS+/RS/P.OPTP
          RJM    GER         RECORD ERROR REGISTER
          RJM    SSC         SET SYMPTOM CODE
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID
          RJM    SLM         SEND LOG MESSAGE
          UJN    DCEX        EXIT
 DDT      SPACE  4,14
**        DDT - DIAGNOSTIC DATA TRANSFER.
*
*         THIS ROUTINE WILL WAIT FOR *DATA AVAILABLE* AND THEN
*         ATTEMPT TO INPUT 1024D CHANNEL FRAMES.  IF AN ERROR
*         IS DETECTED DURING THE TRANSFER, PROCESSING WILL
*         CONTINUE, AS THE MCI MAY HAVE FORCED THE ERROR.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF TRANSFER COULD NOT BE STARTED.
*                (IOCNT) = NUMBER OF CHANNEL FRAMES TRANSFERRED.
*
*         USES   T2.
*
*         CALLS  DCE, FAW, TDA.


 DDT      SUBR               ENTRY/EXIT
          RJM    TDA         TIMEOUT DATA AVAILABLE
          NJN    DDTX        IF ERRORS
          LDC    F.READ
          RJM    FAW         ISSUE READ FUNCTION
          NJN    DDTX        IF CHANNEL ERROR
          LDC    MAXCHN      MAXIMUM DATA TRANSFER LENGTH
          STDL   IOCNT
          IAPM   IOBUF,CHN
          ZJN    DDT10       IF ALL DATA READ
          STDL   T2          SAVE NUMBER OF WORD LEFT TO READ
          LDDL   IOCNT
          SBDL   T2
          STDL   IOCNT       CHANNEL FRAMES TRANSFERRED
 DDT10    DCN    CHN+40B
          LDM    DRDA        ** INSTRUCTION MODIFICATION **
          ADC    100000B
          STML   DRDA        CHANGE OUTPUT INSTR TO OAPM
          LDN    0
          CFM    DDTX,CHN    EXIT IF NO CHANNEL ERROR
          LDK    /RS/K.LREAD
          RJM    DCE         LOG CHANNEL ERROR
          UJK    DDTX        EXIT (A) <> 0
 DEC      SPACE  4,11
**        DEC - DIAGNOSTIC ERROR CHECK.
*
*         THIS ROUTINE WILL PERFORM INITIAL ERROR CHECKS
*         FOR READ RECOVERY IN DIAGNOSTIC MODE.
*
*         ENTRY  (A) = NUMBER OF WORDS NOT READ.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*


*         CALLS  CSC, GER, IGS, SLM, SSC.
 DEC      SUBR               ENTRY/EXIT
          STDL   ERRCNT      SAVE WORDS NOT READ
          LDC    WTDEACT*600 WAIT FOR CHANNEL NOT ACTIVE
 DEC10    IJM    DEC30,CHN   IF CHANNEL NOT ACTIVE
          SBML   TI
          NJN    DEC10       IF NOT TIMED OUT
          LDDL   ERRCNT
          NJN    DEC20       IF TRANSFER NOT COMPLETE
          LDC    100000B     MESSAGE LARGER THAN EXPECTED
          STML   ACTD
          DCN    CHN+40B
          UJN    DEC40       LOG ERROR

 DEC20    LDC    /RS/K.LSIT
          UJN    DEC50       SET INCOMPLETE TRANSFER

 DEC30    LDN    DCLEN       LENGTH OF READ
          STML   EXPD
          SBDL   ERRCNT
          STML   ACTD
          SBN    DCLEN
          ZJN    DEC60       IF LENGTH OK
 DEC40    LDC    /RS/K.LSMLV
 DEC50    RADL   ERRT1       MESSAGE LENGTH VERIFICATION ERROR
 DEC60    CFM    DEC70,CHN   IF NO CHANNEL ERROR
          RJM    GER         RECORD ERROR REGISTER
          RADL   ERRT1       CHANNEL ERROR
 DEC70    RJM    CSC         GET STATUS AND CHECK STATE CHANGE
          NJK    DECX        IF ERRORS
          LDDL   GNSTAT
          SHN    17-S.ERROR
          PJN    DEC80       IF NO GENERAL STATUS ERROR
          LDC    /RS/K.LSGSE
          RADL   ERRT1
 DEC80    LDDL   ERRT1
          ZJN    DEC100      IF NO ERRORS EXIT
          RJM    SSC         SET SYMPTOM CODE
          RJM    IGS         INCLUDE GENERAL STATUS
          LDML   EXPD
          STML   LRS+/RS/P.EXPD+1  INCLUDE EXPECTED LENGTH
          LDML   ACTD
          STML   LRS+/RS/P.ACTD+1  INCLUDE ACTUAL LENGTH
          LDK    /RS/K.LOF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          LDC    /RS/K.LRDC
          STML   LRS+/RS/P.OPTP STORE OPERATION TYPE
          LDDL   ERRT1
          LMK    /RS/K.LSCEF
          ZJN    DEC90       IF ONLY CHANNEL ERROR
          LDK    ST.PPD
          STDL   STCHNG      DOWN MDI
 DEC90    RJM    SLM         SEND LOG MESSAGE
 DEC100   UJK    DECX        EXIT
 DRD      SPACE  4,16
**        DRD - DIAGNOSTIC RETURN DATA.
*
*         THIS ROUTINE WILL WAIT FOR -SEND DATA- AND ATTEMPT
*         TO OUTPUT THE DATA IN THE PP BUFFER.  THE OUTPUT IS
*         DONE USING EITHER AN OAM OR AN OAPM DEPENDING ON
*         HOW THE DATA WAS READ IN.  IF AN ERROR OCCURS DURING
*         THE OUTPUT, PROCESSING WILL CONTINUE AS THE MCI MAY
*         HAVE FORCED THE ERROR.
*
*         ENTRY  (IOCNT) = NUMBER OF CHANNEL FRAMES TO TRANSFER.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF TRANSFER COULD NOT BE STARTED.
*
*         CALLS  CFE, CSC, CSD, IFR, SLM.


 DRD      SUBR               ENTRY/EXIT
 DRD10    RJM    CSC         CHECK STATE CHANGE
          NJN    DRDX        IF STATE CHANGE
          RJM    CSD         CHECK IF SEND DATA UP
          NJN    DRD10       IF SEND DATA NOT UP
          LDC    F.WRITE
          RJM    IFR         ISSUE WRITE FUNCTION
          NJN    DRDX        IF FUNCTION TIMEOUT
          ACN    CHN
          LDDL   IOCNT       CHANNEL FRAMES TO OUTPUT

          OAPM   IOBUF,CHN   IF IAPM USED FOR READ
*         OAM    IOBUF,CHN   IF IAM USED FOR READ
 DRDA     EQU    *-2
          LDK    WTEMPTY*600
 DRD30    EJM    DRD40,CHN   IF CHANNEL EMPTY
          SBML   TI
          NJN    DRD30       IF NOT TIMED OUT
          LDK    /RS/K.LWRT
          RJM    CFE         SET CHANNEL FULL ERROR
          LDK    ST.PPD
          STDL   STCHNG
          RJM    SLM         SEND LOG MESSAGE
          UJN    DRD50       RETURN ERRORS

 DRD40    LDN    0           RETURN NO ERROR
 DRD50    DCN    CHN+40B
          UJK    DRDX        EXIT
 DRP      SPACE  4,14
**        DRP - DIAGNOSTIC READ AND PACK.
*
*         THIS ROUTINE WILL WAIT FOR -DATA AVAILABLE- AND
*         THEN ATTEMPT TO INPUT 8 CHANNEL FRAMES.  IF INPUT
*         IS SUCCESSFUL THE DATA WILL BE PACKED AS DESCRIBED
*         IN THE *MAINTENANCE SOFTWARE ERS* - ARH5176.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF TRANSFER FAILED.
*                (IOCNT) = NUMBER OF CHANNEL FRAMES TRANSFERRED.
*
*         USES   T2, T3, T4, T5.
*
*         CALLS  DCE, FAW, TDA.


 DRP      SUBR               ENTRY/EXIT
          RJM    TDA         TIMEOUT DATA AVAILABLE
          NJN    DRPX        IF ERRORS
          LDC    F.READ      READ DATA
          RJM    FAW
          NJN    DRPX        IF CHANNEL ERROR
          LDN    PKDCHN      CHANNEL FRAMES TO TRANSFER
          STDL   IOCNT
          IAM    IOBUF,CHN
          ZJN    DRP10       IF ALL DATA READ
          STDL   T2
          LDDL   IOCNT
          SBDL   T2
          STDL   IOCNT       CHANNEL FRAMES TRANSFERRED
 DRP10    BSS    0
          DCN    CHN+40B
          LDM    DRDA        ** INSTRUCTION MODIFICATION **
          STML   DRDA        CHANGE OUTPUT INSTR TO OAM

*         PACK DATA FOR RETURN TO MCI

          LDDL   IOCNT
          ADN    1
          SHN    -1
          STDL   T5
          LDN    0
          STDL   IOCNT
          LDC    IOBUF
          STDL   T3
 DRP20    BSS    0
          LDIL   T3
          SHN    -4          PACK DATA
          SCN    17B
          STDL   T4
          AODL   T3
          LDIL   T3
          SHN    -8
          LMD    T4
          LMC    7400B
          STML   IOBUF,IOCNT
          AODL   T3
          AODL   IOCNT
          SBDL   T5
          NJN    DRP20       IF MORE DATA TO PACK
          CFM    DRPX,CHN    EXIT IF NO CHANNEL ERROR
          LDK    /RS/K.LWRT
          RJM    DCE         LOG CHANNEL ERROR
          UJK    DRPX        EXIT  (A)<> 0
 DSP      SPACE  4,10
**        DSP - DIAGNOSTIC SET PACKING.
*
*         THIS ROUTINE WILL ISSUE THE *SET BIT PACKING*
*         FUNCTION.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF FUNCTION TIMEOUT.
*
*         CALLS  IFR.


 DSP      SUBR               ENTRY/EXIT
          LDC    F.BITPM
          RJM    IFR         ISSUE BIT PACKING MODE FUNCTION
          UJN    DSPX
 DTM      SPACE  4,10
**        DTM - DIAGNOSTIC TEST MODE.
*
*         THIS ROUTINE WILL ISSUE THE *USE BIT MODE TESTING*
*         FUNCTION.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF FUNCTION TIMEOUT.
*
*         CALLS  IFR.


 DTM      SUBR               ENTRY/EXIT
          LDN    F.USEBIT
          RJM    IFR         ISSUE BIT MODE TESTING FUNCTION
          UJN    DTMX
 TDA      SPACE  4,10
**        TDA - TIMEOUT DATA AVAILABLE.
*
*         THIS ROUTINE WILL WAIT FOR DATA AVAILABLE
*         WHICH MUST BE PRESENT WITHIN ONE SECOND.  IF DATA
*         AVAILABLE IS NOT PRESENT IN GENERAL STATUS THE MDI IS DOWNED.
*
*         EXIT   (A) = 0, IF NO ERRORS.
*                (A) <> 0, IF ERRORS.
*
*         CALLS  CDA, IGS, SLM.


 TDA20    LDN    0

 TDA      SUBR               ENTRY/EXIT
          LDK    WTDAV*70
          STML   RETRY
 TDA10    RJM    CDA         CHECK SEND DATA AVAILABLE
          MJN    TDA20       IF SEND DATA AVAILABLE
          LDDL   STCHNG
          NJN    TDAX        IF STATE CHANGING
          SOML   RETRY
          NJN    TDA10       IF NOT TIMEOUT
          LDK    /RS/K.LGSDAT
          STML   LRS+/RS/P.ERRID
          RJM    IGS
          LDML   PREBUF      DIAGNOSTIC COMMAND
          STML   LRS+/RS/P.ERRW2
          LDK    ST.PPD
          STDL   STCHNG      DOWN MDI
          RJM    SLM         SEND LOG MESSAGE
          UJN    TDAX        EXIT WITH ERROR
          SPACE  4,10
 OV3CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  OVEND
          OVERLAY  (MISCELLANEOUS STATE PROCESSORS),BUFEND
          ROUTINE  OV4
          TITLE  IDL - IDLE STATE PROCESSOR.
**        IDL - IDLE STATE PROCESSOR.
*
*         THIS ROUTINE PROCESSES THE IDLE STATE.  THE IDLE STATE
*         IS UNRELATED TO THE MDI S STATE.  AN IDLE COMMAND FROM
*         THE CP CAUSES THIS STATE TO BE ENTERED, AND A RESUME
*         COMMAND CAUSES THE EXIT. IF THE MDI IS CONNECTED
*         TO A CONCURRENT CHANNEL, THE CHANNEL IS INITIALIZED
*         UPON RECEIPT OF A RESUME.
*
*         USES   T1 - T4.
*
*         CALLS  CCK, FAW, IFR, PPR, SCK.
 IDL      SUBR               ENTRY/EXIT
          LDML   CHLOCK
          ZJN    IDL10       IF CHANNEL NOT LOCKED
 IDL05    RJM    CCK         CLEAR CHANNEL LOCK
 IDL10    RJM    PPR         PROCESS PP REQUESTS
          LDDL   STCHNG
          NJN    IDL10       IF MDI DOWNED OR PP IDLE
 IDL20    RJM    SCK         SET CHANNEL LOCK
          NJN    IDL20       RETRY IF NOT LOCKED
          LOADC  CM.CHAN
          ADN    /CIT/C.FLAGS
          ADML   CHAN
          CRDL   T1          READ CHANNEL FLAG WORD
          LDDL   T1
          SHN    17-/CIT/CONC
          PJN    IDL90       IF NOT CONCURRENT
          DCN    CHN+40B
          LDC    F.CCCLR
          RJM    IFR         MASTER CLEAR CHANNEL
 IDL30    NJK    IDL05       IF ERRORS
          LDC    F.WRCR
          RJM    IFR         WRITE CONTROL REGISTER
          NJN    IDL30       IF ERRORS
          ACN    CHN
          LDC    INITCR
          OAN    CHN
          DCN    CHN+40B
          LDN    0
          STML   CHTYP
 IDL90    UJK    IDLX        EXIT
          TITLE  INV - INVALID STATE PROCESSOR.
**        INV - INVALID STATE PROCESSOR.
*
*         THIS ROUTINE PROCESSES AN MDI STATE SWITCH TO AN INVALID STATE.
*
*         CALLS  IGS, SLM.


 INV      SUBR               ENTRY/EXIT
          LDN    ST.PPR
          STDL   STCHNG      INITIATE A PP RESET
          LDDL   LSTATE
          STML   LRS+/RS/P.CURST  LOG CURRENT STATE
          LDML   PREST
          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
          UJK    INVX        EXIT
          TITLE  MCM - MASTER CLEAR MCI.
**        MCM - MASTER CLEAR MCI.
*
*         SENDS THE MASTER CLEAR DIRECT FUNCTION TO THE MCI.
*
*         CALLS  IFR, GST.


 MCM      SUBR               ENTRY/EXIT
          LDC    F.MCLEAR    MASTER CLEAR
          RJM    IFR         ISSUE FUNCTION REQUEST
          NJN    MCMX        EXIT - IF ERROR
          LCN    0
 MCM10    SBN    1
          NJN    MCM10       IF TIMEOUT NOT COMPLETE
          RJM    GST         GET STATUS
          NJN    MCMX        IF ERRORS
          LDDL   GNSTAT
          LPC    STBITS
          SHN    17-S.OPER
          MJN    MCM20       IF OPERATIONAL
          SHN    0-3-17+S.OPER
          LMN    ST.LOAD
          NJN    MCMX        EXIT - IF NOT LOADING STATE
 MCM20    LDN    /RS/K.LMCF
          STML   LRS+/RS/P.ERRID  STORE ERROR ID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    ST.PPD
          STDL   STCHNG      DOWN MDI
          RJM    SLM         SEND LOG MESSAGE
          UJK    MCMX        EXIT
          TITLE  MFR - MDI RESET STATE PROCESSOR.
**        MFR - MDI RESET STATE PROCESSOR.
*
*         CALLS  CSC, PPR.


 MFR      SUBR               ENTRY/EXIT
 MFR10    BSS    0
          RJM    PPR         PROCESS PP REQUESTS
          RJM    CSC         CHECK IF STATE CHANGE
          NJN    MFRX        IF STATE CHANGE - EXIT
          UJN    MFR10
          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
 OV4CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  OVEND
          OVERLAY  (RETURN INLINE MESSAGE),FPB
          ROUTINE  OV5
          TITLE  ILD - IN-LINE DIAGNOSTIC MESSAGE PROCESSOR.
 ILD      SPACE  4,7
**        ILD - IN-LINE DIAGNOSTIC MESSAGE PROCESSOR.
*
*         THIS ROUTINE IS ENTERED WHEN AN IN-LINE DIAGNOSTIC
*         MESSAGE HAS BEEN SUCCESSFULLY READ AND IS WAITING
*         TO BE RETURNED TO THE MDI.
*
*         CALLS  CSD, IFR, PPR, RIM.


 ILD      SUBR               ENTRY/EXIT
 ILD10    RJM    PPR         PROCESS PP REQUESTS
          RJM    CSC         CHECK STATE CHANGE
          NJN    ILD30       IF STATE CHANGE
          RJM    CSD         CHECK FOR SEND DATA
          ZJN    ILD20       IF SEND DATA UP
          PJN    ILD10       IF TIMEOUT NOT EXPIRED
          LDK    F.ILTO
          RJM    IFR         ISSUE TIMEOUT FUNCTION
          UJN    ILD30

 ILD20    RJM    RIM         RETURN IN-LINE MESSAGE TO MDI
 ILD30    LDN    0
          STML   INLINE      NO IN-LINE MESSAGE AWAITING RETURN
          UJN    ILDX        EXIT
 RIM      SPACE  4,18
**        RIM - RETURN IN-LINE MESSAGE.
*
*         THIS ROUTINE RETURNS THE IN-LINE DIAGNOSTIC
*         MESSAGE THAT IS IN THE PP BUFFER.  THE MESSAGE
*         CAN BE WRITTEN BACK IN ONE OF TWO MODES; THE
*         MODE TO BE USED IS DETERMINED BY EXAMINING THE
*         MESSAGE TEST HEADER.  THE MODES ARE: OUTPUT DATA
*         WITH A DELAY BETWEEN EVERY 4 CHANNEL FRAMES, OR
*         OUTPUT DATA IN ONE BLOCK.
*
*         ENTRY  SEND DATA BIT SET IN GENERAL STATUS.
*                (EXPD) = MESSAGE LENGTH IN BYTES.
*                (IOBUF) = START OF IN-LINE MESSAGE.
*
*         USES   T1 - T2.
*
*         CALLS  ERR, IFR, SWF.


 RIM      SUBR               ENTRY/EXIT
          LDC    C.WRTB
          STML   STBI
          RJM    SWF         SELECT WRITE FORMAT
          NJN    RIM07       IF FUNCTION ERRORS
          LDML   EXPD
          STDL   BYTCNT
          LDN    /RS/K.LILWRT  IN-LINE WRITE OPERATION
          STML   OTYPE
          RJM    CBY         CONVERT BYTES TO CHANNEL FRAMES
 RIM05    LDC    F.WRITE
          RJM    IFR         ISSUE WRITE FUNCTION
          ZJN    RIM10       IF FUNCTION SUCCESSFUL
 RIM07    UJK    RIM70

 RIM10    BSS    0
          LDC    IOBUF
          STML   RIMA        RESTORE OUTPUT START ADDRESS
          ACN    CHN         ACTIVATE CHANNEL
          LDML   IOBUF+P.H802.3+P.H802.2   BITS 0-7 OF TEST HEADER IN BITS 8-15
          SHN    17-IL.WDLY-8
          MJN    RIM20       IF OUTPUT WITH DELAY
          LDN    0
          STDL   T1
          STDL   T2
          LDDL   IOCNT
          UJN    RIM40

 RIM20    LDDL   IOCNT       CHANNEL COUNT TO OUTPUT MESSAGE
          SHN    -2          DIVIDE BY 4
          STDL   T1          NUMBER OF OUTPUTS AT 4 FRAMES/OUTPUT
          LDDL   IOCNT
          LPN    3
          STDL   T2          REMAINING FRAMES (IOCNT MOD 4)
 RIM30    LDN    4
 RIM40    OAPM   IOBUF,CHN   OUTPUT MESSAGE
 RIMA     EQU    *-1         MODIFIED IF OUTPUT WITH DELAY
          NJN    RIM60       IF ERROR
          LDN    3
          RAML   RIMA        INCREMENT OUTPUT ADDRESS
          SODL   T1
          ZJN    RIM50       IF ALL FULL BLOCKS SENT
          PJN    RIM30       IF OUTPUT NOT COMPLETE
          LDN    0
          UJN    RIM60       OUTPUT COMPLETE

 RIM50    BSS    0
          LDDL   T2          REMAINING FRAMES TO TRANSFER
          NJN    RIM40       IF FRAMES TO TRANSFER
 RIM60    STDL   ERRCNT      NUMBER OF WORDS NOT WRITTEN
          LDK    /RS/K.LILWRT
          RJM    ERR         CHECK ERRORS
          ZJN    RIM70       IF NO ERRORS
          LDDL   STCHNG
          NJN    RIM70       EXIT IF RESET
          LDDL   ERRT1
          LPC    /RS/K.LSCEF
          ZJN    RIM63       IF NO CHANNEL ERROR FLAG
          LDDL   GNSTAT
          SHN    17-S.ERROR
          PJN    RIM70       IF ONLY ERROR WAS CEF IGNORE
 RIM63    LDML   RDRTY
          ZJN    RIM70       IF UNRECOVERED
          UJK    RIM05       IF IN RECOVERY

 RIM70    LDN    FTRY
          STML   RDRTY       RESET RETRY COUNTER
          UJK    RIMX        EXIT
          SPACE  4,10
 OV5CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  OV5END
          OVERLAY  (DETAILED STATUS),OVEND
          ROUTINE  OV6
 DST      SPACE  4,12
**        DST - DETAILED STATUS.
*
*         THIS ROUTINE READS THE MDI 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.
*
*         EXIT   (A) = 0, IF NO ERROR,
*                    <> 0, IF ERROR.
*
*         USES   T7, T8.
*
*         CALLS  CSC, FAW, GER, IGS, SLM, SRU, SSC.
          SPACE  4,10
 DST      SUBR               ENTRY/EXIT
          LDN    FTRY
          STML   DSTRC
 DST10    LDN    F.DS        DETAILED STATUS
          RJM    FAW
          NJN    DSTX        IF FUNCTION TIMEOUT OR OTHER ERROR
          STML   DSTER
          LDN    LDS170
          IAPM   LRS+/RS/P.DETAIL,CHN  INPUT DETAILED STATUS
          ZJN    DST20       IF INPUT COMPLETE
          LDC    /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
          LDC    /RS/K.LSMLV
          RAML   DSTER       MESSAGE LENGTH ERROR
 DST30    CFM    DST40,CHN   IF NOT CHANNEL ERROR
          RJM    GER         RECORD ERROR REGISTER
          RAML   DSTER       SET CHANNEL ERROR
 DST40    RJM    GST         GET GENERAL STATUS
          NJK    DSTX        IF *GST* ERRORS OR STATE CHANGE
          LDDL   GNSTAT
          SHN    17-S.ERROR
          PJN    DST50       IF NO ERRORS GETTING DETAILED STATUS
          LDC    /RS/K.LSGSE
          RAML   DSTER       SET GENERAL STATUS ERROR
          RJM    IGS         INCLUDE GENERAL STATUS
 DST50    LDML   DSTER
          NJN    DST60       IF ERRORS GETTING DETAILED STATUS
          LDC    /RS/K.LDS
          STML   DSTER       UPDATE DETAILED 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         UNRECOVERED ERROR
          LDN    ST.PPR
          STDL   STCHNG      RESET MDI
          RJM    SLM         SEND LOG MESSAGE
          UJK    DSTX        EXIT WITH ERROR

 DSTRC    BSSZ   1           RETRY COUNT
 DSTER    BSSZ   1           SYMPTOM CODES
          SPACE  4,10
 OV6CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  END
          OVERLAY  (STATE CHANGE ROUTINES),BUFEND
          ROUTINE  OV7
 LAM      SPACE  4,12
**        LAM - LOG AVAILABILITY MESSAGE.
*
*         THIS ROUTINE WILL LOG A MESSAGE INDICATING THE
*         AVAILABILITY OF THE MDI.
*
*         ENTRY  (AVAIL) = VALUE OF LAST AVAILABILITY
*                          RESPONSE SENT TO THE CPU.
*
*         EXIT   (A) = 0 IF NO ERRORS.
*                    <> 0 IF ERRORS.
*
*         CALLS  GDS, IGS, SLM.


 LAM      SUBR               ENTRY/EXIT
          LDML   AVAIL
          LMN    URC.LO
          NJN    LAM20       IF NOT AVAILABLE
          RJM    GDS         GET DETAILED STATUS
          NJN    LAMX        EXIT IF DST ERRORS
          LDK    /RS/K.LMDIA
 LAM10    STML   LRS+/RS/P.ERRID
          RJM    IGS         INCLUDE GENERAL STATUS
          LDN    REC.IM
          STML   LRS+/RS/P.RETSUC
          RJM    SLM         SEND LOG MESSAGE
          LDN    0
          UJN    LAMX        EXIT

 LAM20    STML   NEGPR
          LDK    /RS/K.LMDIR
          UJN    LAM10       CONTINUE
 NCP      SPACE  4,14
**        NCP - NEGOTIATE CHANNEL PROTOCOL.
*
*         NEGOTIATE WITH THE MDI TO DETERMINE WHICH CHANNEL
*         PROTOCOL WILL BE USED.
*
*         EXIT   A = 0 IF NEGOTIATIONS SUCCESSFULL,
*                  <> 0 IF NEGOTIATIONS NOT SUCCESSFULL.
*
*         CALLS  GDS, IFR, ILR, SLM.


 NCP10    LDML   LRS+/RS/P.DETAIL+DS.MPS+1
          STML   TCCH+/HD/P.MRS
          RJM    ILR         INITIALIZE LOG RESPONSE
          LDN    0
          STML   RDRTY       RESET RETRY COUNTER
          STML   NEGPR       CLEAR NEGOTIATION FLAG

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

 NCP14    LDML   LRS+/RS/P.DETAIL
          SHN    -8
 NCP15    STML   PROV
          RJM    ILR         INITIALIZE LOG RESPONSE
          LDML   PROV
          ADC    PR.BASE
          RJM    IFR         SEND NEGOTIATION FUNCTION
          NJN    NCP30       IF FUNCTION TIMEOUT
          RJM    GDS         READ DETAILED STATUS
          NJN    NCP30       IF ERRORS READING DETAILED STATUS
          LDML   LRS+/RS/P.DETAIL
          SHN    -8
          SBML   PROV
          ZJK    NCP10       IF PROTOCOLS MATCH
 NCP20    LDN    ST.PPD
          STML   STCHNG      DOWN MDI
          LDK    /RS/K.LPROER
          STML   LRS+/RS/P.ERRID
          LDK    PR.MAX
          STML   LRS+/RS/P.ERRW1
          RJM    SLM         SEND LOG MESSAGE
 NCP30    UJK    NCPX        EXIT
 SAC      SPACE  4,13
**        SAC - SEND AVAILABILITY CHANGE.
*
*         THIS ROUTINE WILL SEND AN UNSOLICITED RESPONSE
*         INFORMING THE CP THAT THE NETWORK DEVICE HAS
*         CHANGED STATES AND BECOME AVAILABLE/UNAVAILABLE.
*
*         ENTRY  (AVAIL) = VALUE OF LAST AVAILABILITY
*                          RESPONSE SENT TO THE CPU.
*                (LSTATE) = STATE OF DEVICE.
*
*         EXIT   (A) = 0 IF NO ERRORS,
*                    <> 0 IF ERRORS.
*
*         CALLS  GDS, LAM, PPR, USR.


 SAC      SUBR               ENTRY/EXIT
          LDDL   LSTATE
          LMN    ST.STRT
          ZJN    SACX        IF STARTING STATE
          LMN    ST.OPER&ST.STRT
          ZJN    SAC40       IF CHANGE TO OPERATIONAL
          LMN    ST.LOAD&ST.OPER
          NJN    SAC30       IF NOT CHANGE TO LOADING
 SAC20    LDN    URC.NR      SEND LOADING STATE RESPONSE
          UJN    SAC50       SEND RESPONSE

 SAC30    LMN    ST.ILD&ST.LOAD
 SAC40    ZJK    SAC90       IF IN-LINE DIAGNOSTICS
          LDML   AVAIL
          SBN    URC.RN
          ZJN    SACX        IF SENT EXIT
          STML   SCP.RDY     DO NOT GO READY BEFORE CP REPLIES
          LDN    URC.RN      READY TO NOT READY
 SAC50    STDL   UNSC
          STML   AVAIL
          RJM    USR         SEND UNSOLICITED RESPONSE
 SAC60    RJM    PPR         PROCESS PP REQUESTS
          LDDL   STCHNG
          NJN    SAC70       IF IDLE OR DOWN
          LDML   SCP.RDY
          NJN    SAC60       IF CPU HAS NOT ACKNOWLEDGED
          LDDL   LSTATE
          LMN    ST.LOAD
          ZJN    SAC70       IF LOADING DO NOT LOG
          RJM    LAM         LOG AVAILABILITY
 SAC70    UJK    SACX        EXIT

 SAC90    LDML   AVAIL
          LMN    URC.LO
          ZJN    SAC70       IF AVAILABLE EXIT
          RJM    GDS         GET DETAILED STATUS
          NJN    SAC70
          LDN    2
          STDL   T1
 SAC100   LDML   LRS+/RS/P.SYSID,T1
          STML   RS+/RS/P.ID,T1
          SODL   T1
          PJN    SAC100      IF NOT DONE
          LDML   PROV        RETURN PROTOCOL VERSION
          STML   RS+/RS/P.PROV
          LDML   TCCH+/HD/P.MRS  RETURN MAXIMUM RECORD SIZE
          STML   RS+/RS/P.MAXRS+1
          RJM    ILR         INITIALIZE LOG RESPONSE
          LDN    /RS/C.ID*8+8
          STML   RS+/RS/P.RESPL  UPDATE RESPONSE LENGTH
          LDN    URC.LO      SEND OPERATIONAL RESPONSE
          STML   SCP.RDY
          UJK    SAC50       SEND RESPONSES
          SPACE  4,10
 OV7CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  OVEND
          OVERLAY  (PP REQUESTS OVERLAY 1),OVEND
          ROUTINE  OV8
 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  IFR,PIE.


 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    IFR         SEND FUNCTION
          LDN    0
          UJN    GFCX        EXIT
          SPACE  4,10
 OV8CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  END
          OVERLAY  (PP REQUESTS OVERLAY 2),OVEND
          ROUTINE  OV9
**        IDP - IDLE PROCESSOR.
*
*         THIS ROUTINE PROCESSES THE IDLE COMMAND.
*
*         EXIT   (A) = 0.


 IDP      SUBR               ENTRY/EXIT
          LDML   CHLOCK
          ZJN    IDP10       IF CHANNEL NOT LOCKED
          RJM    CCK         CLEAR CHANNEL LOCK
 IDP10    LDN    ST.IDLE
          STDL   STCHNG      SET IDLE STATE
          LDN    0
          UJN    IDPX        EXIT
 NRA      SPACE  4,10
**        NRA - NOT READY ACKNOWLEDGE.
*
*         THIS ROUTINE PROCESSES THE SYNCHRONIZE
*         READY ACKNOWLEDGE.
*
*         EXIT   (A) = 0, IF NO ERRORS
*                (A) <> 0, IF ERRORS.
*
*         CALLS  PIE.


 NRA10    LDC    E50A
          RJM    PIE         RETURN INTERFACE ERROR

 NRA      SUBR               ENTRY/EXIT
          LDML   SCP.RDY
          ZJN    NRA10       IF NOT WAITING FOR THIS
          LDN    0
          STML   SCP.RDY     UPDATE SYNCHRONIZATION WORD
          UJN    NRAX        EXIT
 REP      SPACE  4,10
**        REP - RESUME PROCESSOR.
*
*         THIS ROUTINE PROCESSES THE RESUME COMMAND.
*
*         EXIT   (A) = 0.


 REP      SUBR               ENTRY/EXIT
          LDN    0
          STDL   STCHNG      CLEAR IDLE STATE
          UJN    REPX        EXIT
 RFC      SPACE  4,10
**        RFC - RESET FOR CPU.
*
*         THIS ROUTINE PROCESSES THE RESET COMMAND.
*
*         EXIT   (A) = 0.


 RFC      SUBR               ENTRY/EXIT
          LDN    ST.PPR      RESET MCI
          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.


 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,10
 OV9CH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  END
          OVERLAY  (PP REQUESTS OVERLAY 3),OVEND
          ROUTINE  OVA
 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   RWA
          STML   RPMA        MODIFY READ INSTRUCTION
          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
          LOADF  CM+/CM/P.RMA REFORMAT CM ADDRESS
          CRML   *,T5        READ IN CHANGES.
 RPMA     EQU    *-1
          LDN    0
          UJN    RPMX        EXIT
 SPA      SPACE  4,10
**        SPA - SELECT PP MEMORY.
*
*         THIS PP REQUEST SAVES THE PP ADDRESS
*         FOR READ AND WRITE MEMORY REQUESTS.
*
*         EXIT   (A) = 0.
          SPACE  2
 SPA      SUBR               ENTRY/EXIT
          LDML   CM+/CM/P.RMA+1  GET SECOND HALF OF PP MEM ADDR
          STML   RWA         SAVE PP ADDRESS
          LDN    0
          UJN    SPAX        EXIT
 WPM      SPACE  4,10
**        WPM - WRITE PP MEMORY.
*
*         THIS PP REQUEST WRITES REQUESTED PP MEMORY
*         TO CENTRAL MEMORY.
*
*         EXIT   (A) = 0.
*
*         USES   T5, T6.
          SPACE  2
 WPM      SUBR               ENTRY/EXIT
          LDML   RWA
          STML   WPMA        MODIFY WRITE INSTRUCTION
          LDML   CM+/CM/P.LEN GET BYTE COUNT
          ADK    1
          SHN    -1          GET PP WORD COUNT
          STDL   T6          SAVE PP WORD COUNT
          LDK    7777B       GET MAX PP MEMORY ADDRESS
          SBML   WPMA        SUBTRACT STARTING PT. OF COPY
          STDL   T5          SAVE MAX LENGTH OF COPY
          SBDL   T6          SUBTRACT REQUESTED LENGTH
          MJN    WPM10       IF REQUESTED LENGTH TOO LARGE, SKIP
          LDDL   T6          RESET TRANSFER LENGTH TO REQUESTED LENGTH
          STDL   T5
 WPM10    LDDL   T5          GET PP WORD LENGTH OF TRANSFER
          ADK    3
          SHN    -2          CONVERT PP WORD COUNT TO CPU WORD COUNT
          STDL   WC          SAVE CPU WORD COUNT FOR CM WRITE
          LOADF  CM+/CM/P.RMA REFORMAT CM ADDRESS
          CWML   **,WC       COPY PP MEMORY TO CM
 WPMA     EQU    *-1
          LDN    0
          UJK    WPMX        EXIT
          IFEQ   BRK,1
 DBA      SPACE  4,12
**        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.


 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
 OVACH    BSS                MDI CHANNEL REFERENCES
 TCHN+40B HERE
 T40B+CHN HERE
 TCHN     HERE
          CON    0           END OF TABLE
          OVERFLOW  END
          END    NETW
/EOR
