

          IDENT  E5PNTDD
          CIPPU
          MEMSEL 16
          TITLE  PICOI0,NOS/VE IPI-PCI (PICO) DISK DRIVER FOR I0
*
          COMMENT *SMD* LVL=02
          COMMENT  FIDES INFORMATION SERVICES 2003
*
*
*         THIS IS THE PP DRIVER FOR THE IPI-PCI WINDOWS SUBSYSTEM, PICO
*         (PROTOCOL INTERFACE CONVERTER) DRIVING THROUGH AN I0, IOU (930 SERIES).
*         INTERFACE SUPPORT IS PROVIDED FOR THE FOLLOWING EQUIPMENT TYPES:
*         NTDD_1 THROUGH NTDD_6 IN 10-MHZ TRANSFER MODE.
*
*         THE PROGRAM NAME IS E5PNTDD AND THE DECK NAME IS IOM$PICOI0. WHEN
*         THE PP DRIVER IS  LOADED, LOCATIONS 72 AND 73 MUST CONTAIN THE RMA
*         OF THE PP INTERFACE TABLE AND LOCATION 0 MUST BE THE ADDRESS, MINUS
*         ONE, AT WHICH EXECUTION IS TO BEGIN.
*
*         REVISION R1.D - 07/28/03
*
*
*
          EJECT
          SPACE 5
*         IPI STATUS REGISTER BITS (00E1 REQUEST)
*
*         15 - ERROR
*         14 - ATTENTION_IN
*         13 - BUFFER NOT EMPTY
*         12 - SELECT_OUT
*         11 - SLAVE_IN
*         10 - MASTER_OUT
*          9 - SYNC_IN
*          8 - SYNC_OUT
*          7 - PAUSE
*          6 - NOT USED
*          0 - PORT B SELECT
*
*         IPI DMA OPERATIONAL REGISTER BITS (0700 REQUEST)
*
*         15 - 19 NOT USED
*          8 - DMA TRANSFER COMPLETE
*          7 - DMA TRANSFER IN PROGRESS
*          6 - IPI TRANSFER IN PROGRESS
*          5 - OUTPUT MODE
*          4 - CHANNEL PAUSE
*          3 - DMA MODE
*          2 - ICI TRANSFER IN PROGRESS
*          1 - T-PRIME REGISTER EMPTY
*          0 - CHANNEL TRANSFER IN PROGRESS
*
*
*         IPI ERROR REGISTER BITS (00F1 REQUEST)
*
*         15 - BUFFER COUNTER OVERFLOW/UNDERFLOW
*         14 - COMPARE ERROR
*         13 - SYNC COUNTER OVERFLOW/UNDERFLOW
*         12 - NOT USED
*         11 - FUNCTION UPPER PARITY ERROR
*         10 - FUNCTION LOWER PARITY ERROR
*          9 - SLAVE STATUS ERROR
*          8 - BUS CONTROL ACKNOWLEDGE ERROR
*          7 - LOST DATA
*          6 - DATA UPPER PARITY ERROR
*          5 - DATA LOWER PARITY ERROR
*          4 - IPI SEQUENCE ERROR
*          3 - BUS A PARITY ERROR
*          2 - BUS B PARITY ERROR
*          1 - ILLEGAL FUNCTION
*          0 - ICI DEADMAN TIMEOUT
*
*
*        IPI CHANNEL CONTROL WORD VALUES. THIS IS THE CHANNEL FUNCTION
*            VALUE WHEN CALLING ROUTINES RSR AND FUNC.
*
*        FUNCTION       BUS-A         BUS-B      SEND DATA TO PP WHEN:
*
*          0X         FROM CYBER      NONE             NONE
*          1X         FROM CYBER      FROM PC    WHEN CHANNEL GOES ACTIVE(N1)
*          2X         FROM CYBER      FROM PC    SLAVE_IN GOES ACTIVE(N1)
*          3X         FROM CYBER      FROM PC    SLAVE_IN GOES ACTIVE(N2)
*          4X              ILLEGAL OPERATION
*          5X         FROM CYBER      FROM PC    SYNC_IN GOES ACTIVE(N2)
*          6X         FROM CYBER      FROM PC    SYNC_IN GOES INACTIVE(N1)
*          7X         FROM CYBER      FROM PC    SLAVE_IN GOES INACTIVE(N1)
*
*             (N1) = NO PARITY CHECK
*             (N2) = PARITY CHECK
*
*          X = 4 BITS, SELECT_OUT, MASTER_OUT, SYNC_OUT, "1"




          LIST   -$
*COPYC IODMAC1
*COPYC IODMAC2
*COPYC IODMAC3
*COPYC IODMAC4
*COPYC IODMAC5
          LIST   B,L,N,R
          EJECT
*
*         EQUATES FOR IPI ADAPTER
*
 H005B    EQU    0#005B      SET SYNC OUT
 H00E1    EQU    0#00E1      READ STATUS REGISTER
 H00F1    EQU    0#00F1      READ ERROR REGISTER
 H0600    EQU    0#0600      READ DMA ERROR REGISTER
 H0700    EQU    0#0700      READ OPERATIONAL STATUS
 H0800    EQU    0#0800      DMA TERMINATE/ABORT COMMAND
*
*         MISCELLANEOUS EQUATES
*
 DC       EQU    22B         DISK CHANNEL
 PLIE     EQU    6*8         SPECIAL PICO RESPONSE LENGTH
 PSTAT    EQU    7*8         STATISTICS RESPONSE LENGTH

*         TRANSFER MODE DEFINITIIONS

 TMOCP    EQU    0           OUTPUT COMMAND PACKET
 TMICP    EQU    1           INPUT COMMAND PACKET
 TMODM    EQU    2           OUTPUT DATA MODE
 TMIDM    EQU    3           INPUT DATA MODE

*         MAJOR STATUS EQUATES

 CCS      EQU    0#18        COMMAND COMPLETE, SUCCESSFUL

          SPACE  5,20
*         IOU/CONTROLLER/DRIVE ERROR CODES

 E00      EQU    0           CP MUST DETERMINE ERROR CODE
 E01      EQU    1           FUNCTION TIMEOUT
 E02      EQU    2           CHANNEL EMPTY WHEN ACTIVATED
 E03      EQU    3           PERIOD COUNTER PARITY
 E04      EQU    4           PP-IPI PARITY ERROR
 E06      EQU    6           IOU ERROR
 E07      EQU    7           INCOMPLETE I4 TRANSFER
 E08      EQU    8           CHANNEL NOT EMPTY
 E09      EQU    9           CENTRAL MEMORY ERROR
 E10      EQU    10          INVALID CM RESPONSE CODE
 E11      EQU    11          CM RESPONSE CODE PARITY ERROR
 E12      EQU    12          CMI READ DATA PARITY ERROR
 E13      EQU    13          Y DATA ERROR
 E14      EQU    14          BAS PARITY ERROR
 E15      EQU    15          Z ERROR
 E16      EQU    16          Y ERROR
 E17      EQU    17          X ERROR
 E18      EQU    18          DMA TEST MODE FAILURE
 E19      EQU    19          DMA COUNT OVERFLOW
 E20      EQU    20          CANT SELECT CONTROLLER
 E21      EQU    21          BIT SIGNIFICANT RESPONSE ERROR
 E22      EQU    22          NO SYNC IN
 E23      EQU    23          SYNC IN DID NOT DROP
 E24      EQU    24          IPI SEQUENCE ERROR
 E25      EQU    25          IPI CHANNEL PARITY ERROR
 E27      EQU    27          SLAVE IN NOT SET
 E28      EQU    28          SLAVE IN DID NOT DROP
 E29      EQU    29          INCOMPLETE TRANSFER
 E30      EQU    30          CHANNEL STAYED ACTIVE
 E31      EQU    31          BUFFER COUNTER PARITY
 E32      EQU    32          SYNC COUNTER PARITY
 E33      EQU    33          LOST DATA
 E34      EQU    34          BUS PARITY
 E35      EQU    35          COMMAND REJECT
 E36      EQU    36          SYNC OUT NOT EQUAL SYNC INS
 E37      EQU    37          BUS B ACKNOWLEDGE INCORRECT
 E38      EQU    38          NO CONTROLLER RESPONSE
 E39      EQU    39          ENDING STATUS WRONG
 E40      EQU    40          TIP DID NOT DROP
 E41      EQU    41          TIP FAILED TO DROP IN TIME
 E42      EQU    42          SLAVE_IN FAILED TO DROP IN TIME
 E43      EQU    43          TRANSFER TIMEOUT
 E70      EQU    70          NO ERROR CODE PROVIDED
 E76      EQU    76          UNEXPECTED RESPONSE
 E120     EQU   120          INTERFACE ERROR
 E121     EQU   121          RESPONSE OCTET ERROR
 E122     EQU   122          FATAL MEDIA TRANSMISSION ERROR
 E123     EQU   123          RSR TIMEOUT LIMIT REACHED

          SPACE  5,20
*         INTERFACE ERROR CODES.

 E304     EQU    0406B       INVALID ADDRESS BOUNDARY
 E306     EQU    1406B       INVALID UNIT TYPE
 E307     EQU    1407B       INVALID UNIT NUMBER
 E501     EQU    2401B       INVALID COMMAND CODE
 E505     EQU    2405B       INVALID LENGTH SPECIFICATION IN COMMAND
          EJECT
*********************************************************************
*         SS TABLE DEFINITIONS. INFORMATION SAVED FOR EACH UNIT.
*********************************************************************
 SS       RECORD PACKED


          PPWORD             NOT USED BY PICO

          PPWORD             NOT USED BY PICO

          PPWORD             NOT USED BY PICO

 LU       PPWORD             LOGICAL UNIT

 FNC      PPWORD             FUNCTION CODE + FLAGS (STORE RESPONSE & INDIRECT ADDRESS) eg. 40300

 REQ      STRUCT 4           RMA OF CURRENT REQUEST (UNFORMATTED)
 PVA      STRUCT 6           PVA OF CURRENT REQUEST

 LASTC    PPWORD             OFFSET OF COMMAND IN REQUEST
 FRST     PPWORD             = 0, IF FIRST TIME THROUGH UNCMND
 NUMCM    PPWORD             NUMBER OF COMMANDS LEFT TO PROCESS IN  THIS REQUEST
 LISTL    PPWORD             NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST.
                             (INCLUDES THE NUMBER OF WORDS NOT YET READ FROM CM)

 TOTAL    STRUCT 2                 NOT USED BY PICO
 FCOMRQ   STRUCT 4           FIRST COMPLETED REQUEST (RMA)
 CURRQ    STRUCT 4           CURRENT REQUEST (RMA)
 PRERQ    STRUCT 4                 NOT USED BY PICO
 NCOMRQ   PPWORD             NUMBER OF COMPLETED REQUESTS
 NCR      PPWORD             REQUEST CHAIN FLAG
 CURTRK   PPWORD                   NOT USED BY PICO
 CURSEC   PPWORD                   NOT USED BY PICO
 FPVA     STRUCT 6           PVA OF FIRST COMPLETED REQUEST
 XFER     STRUCT 4           TRANSFER COUNT
 PVA2     STRUCT 6                 NOT USED BY PICO
 RMA2     STRUCT 4           RMA FOR CURRENT SEGMENT (USED BY DLEN)
 TW2      STRUCT 2                 NOT USED BY PICO
 CLK      PPWORD             ACTIVITY TIMER
 CRTS     PPWORD                   NOT USED BY PICO
 RQTRY    PPWORD                   NOT USED BY PICO
 RESET    PPWORD                   NOT USED BY PICO
 RECOV    PPWORD                   NOT USED BY PICO
 DP       STRUCT 6           DELINK POINTER (REFORMATTED RMA)
 MREV     STRUCT 4                 NOT USED BY PICO

 RQ       STRUCT 40          REQUEST

 CMLIST   STRUCT 8           CURRENT DATA ADDRESS OR CURRENT COMMAND
                             (THESE ARE THE ACTUAL LENGTH/ADDRESSES TO BE USED FOR I/O)

 DLIST    STRUCT 8           ASSEMBLY AREA FOR BASE ADDRESS/LENGTH POINTERS
                             (THESE POINT TO THE LENGTH/ADDRESSES TO BE USED FOR I/O)
 SS       RECEND

 SSSIZE   EQU    128
 USIZE    EQU    128
 UDSIZE   EQU    256
 UELEN    EQU    7           LENGTH OF UNIT ENTRY
 ERLIMIT  EQU    8           TRANSMISSION ERROR RETRY LIMIT

          SPACE  5,20
***********************************************************************
*         UNIT TABLE ENTRY
***********************************************************************

 UE       RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 DTYPE    PPWORD             DEVICE TYPE
 UNIT     PPWORD             FACILITY NUMBER
 UQT      RMA                UNIT INTERFACE TABLE (RMA)
 ERRCNT   PPWORD             UNIT ERROR RETRY COUNT
 UE       RECEND

          SPACE  5,20
************************************************************************
*         PP INTERFACE TABLE
************************************************************************

 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
 ACTCH    BOOLEAN            ACTIVE CHECK, THE PP CLEARS THIS BIT WITHIN 1 MINUTE
 IDLREQ   BOOLEAN            IDLE REQUEST
 RESREQ   BOOLEAN            RESUME REQUEST
 PPIDLE   BOOLEAN            PP IDLE
          SUBRANGE 0,3777B   UNUSED
 LOCK     BOOLEAN            PP TABLE LOCK
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
          STRUCT 24          UNUSED
          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  5,20
***************************************************************************
*         UNIT DESCRIPTORS.
***************************************************************************

 UD       RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 UQTPVA   STRUCT 6           UNIT INTERFACE TABLE (PVA)
 CHAN     SUBRANGE 0,377B    CHANNEL NUMBER
 CNTRLR   SUBRANGE 0,377B    CONTROLLER NUMBER
 UNIT     PPWORD             PHYSICAL UNIT NUMBER
 UQT      RMA                UNIT INTERFACE TABLE (RMA)

 UD       RECEND
          SPACE  5,20
************************************************************************
*         UNIT INTERFACE TABLE
************************************************************************

 UIT      RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 DSABLE   BOOLEAN            UNIT IS ENABLED/DISABLED. (SET = DISABLED)
 FRCFMT   BOOLEAN            FORCE FORMAT FLAG              . Shouldn't use
 PARPRO   BOOLEAN            PARITY PROTECTION STATUS       .Shouldn't use
                               0 = PROTECTION DISABLED
                               1 = PROTECTION ENABLED
 RESTDR   BOOLEAN            RESTORING DRIVE FLAG          .Shouldn't use
                               O = NOT RESTORING
                               1 = RESTORING DRIVE
 FILL1    SUBRANGE 0,17B
 OFFLD    SUBRANGE 0,377B     OFF-LINE DRIVE NUMBER

          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               = 41fB, ntdd-1   = 420B, ntdd-2   = 421B, ntdd-3
                               = 422B, ntdd-4   = 423B, ntdd-5
 QCNT     PPWORD             QUEUE COUNT
 SHARE    BOOLEAN            NONZERO IF THIS UNIT IS BEING SHARED WITH MALET OR DFT
          ALIGN  16,64
 UBUFL    PPWORD             UNIT COMMUNICATION BUFFER LENGTH
 UBUF     RMA                UNIT COMMUNICATION BUFFER (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)

          MASKP  DSABLE
 K.DSABLE EQU    MSK
          MASKP  FRCFMT
 K.FRCFMT EQU    MSK
          MASKP  PARPRO
 K.PARPRO EQU    MSK
          MASKP  RESTDR
 K.RESTDR EQU    MSK
          MASKP  OFFLD
 K.OFFLD  EQU    MSK

 K.PBITS  EQU    K.PARPRO+K.RESTDR+K.OFFLD

 UIT      RECEND
          SPACE  5,20
********************************************************************
*         PP REQUESTS.
********************************************************************
 RQ       RECORD PACKED

          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)
 LEN      PPWORD             REQUEST LENGTH
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS (NOT USED)
                               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 (NOT USED)
          ALIGN  48,64
          ALIGN  49,64       ALERT MASK
 COMPAR   BOOLEAN            COMPARE NOT SATISFIED ON COMPARE/SWAP COMMAND
          ALIGN  0,64
 SWIT     BOOLEAN            SWITCH TO NEXT REQUEST
          ALIGN  16,64
 CYL      PPWORD             CYLINDER ADDRESS
 TRACK    PPWORD             TRACK ADDRESS
 SECTOR   PPWORD             SECTOR ADDRESS
 CMND     INTEGER            COMMAND SEQUENCE

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

 RQ       RECEND
          SPACE  5,20
*******************************************************************
*         COMMAND PART OF REQUEST
*******************************************************************

 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$
          SPACE  5,20
*******************************************************************
*         PP RESPONSE.
*******************************************************************

 RS       RECORD PACKED

*         WORD 1.

 FILL1    BOOLEAN
 SHORT    BOOLEAN            IF SET, ONE-WORD RESPONSE
          SUBRANGE 0,77B     UNUSED
          SUBRANGE 0,377B    LOGICAL UNIT (FOR DEBUG)
          ALIGN  16,64
 PVA      STRUCT 6           PVA OF REQUEST

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

*         WORD 3

 RESPL    PPWORD             RESPONSE LENGTH  (8-BIT BYTES)
 LU       PPWORD             LOGICAL UNIT
          SUBRANGE 0,3       (NOT USED)
          BOOLEAN            (NOT USED)
          SUBRANGE 0,37B     (NOT USED)
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    PRIORITY  (NOT USED)
          ALIGN  48,64
          ALIGN  49,64       ALERT MASK
          BOOLEAN            (NOT USED)

*         WORD 4.

          ALIGN  0,64
          BOOLEAN            (NOT USED)
 INTERR   BOOLEAN            LOGICAL INTERFACE ERROR (INCLUDE INTERFACE
                             ERROR CODE)
          BOOLEAN            (NOT USED)
          BOOLEAN            (NOT USED)
          BOOLEAN            (NOT USED)
 DATERR   BOOLEAN            UNCORRECTABLE PARITY OR CHECKWORD ERROR
          BOOLEAN            (NOT USED)
          BOOLEAN            (NOT USED)
          BOOLEAN            (NOT USED)
          BOOLEAN            (NOT USED)
          ALIGN  16,64
 IEC      PPWORD             INTERFACE ERROR CODE
 RC       SUBRANGE 0,3       RESPONSE CODE
                               0 - UNSOLICITED RESPONSE
                               1 - INTERMEDIATE RESPONSE
                               2 - NORMAL REQUEST TERMINATION
                               3 - ABNORMAL REQUEST TERMINATION
          SUBRANGE 0,3       (NOT USED)
 K.REC    EQU    1           RECOVERED ERROR
          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)
                               4 - CONTROLLER RESERVED
                               5 - UNIT RESERVED TO ANOTHER ACCESS
                               6 - RECOVERED ABNORMAL CONDITION
                               7 - STATISTICS REPORT

          ALIGN  49,64       ALERT CONDITIONS
          BOOLEAN            (NOT USED)

*         WORD 5

          ALIGN  0,64
 XFER     STRUCT 4           TRANSFER COUNT
          RMA                (NOT USED)

*         WORD 6.
*                      THE CONTENTS OF THE FOLLOWING STATUS WORDS VARY DEPENDING ON THE ISSUEING ROUTINE.
 DSP1     PPWORD             DETAILED STATUS P1 - CHANNEL  / PARITY COUNT
 DSP2     PPWORD             DETAILED STATUS P2 - CYLINDER / RSR RETRY COUNT
 DSP3     PPWORD             DETAILED STATUS P3 - TRACK    / WTC RETRY COUNT
 DSP4     PPWORD             DETAILED STATUS P4 - SECTOR   / EFP CALL COUNT

*         WORD 7

 DSP5     PPWORD             DETAILED STATUS P5 - RESYNC COUNT
 DSP6     PPWORD             DETAILED STATUS P6 - BCS CONTROL ERRORS
 DSP7     PPWORD             DETAILED STATUS P7 - NOT USED
 DSP8     PPWORD             DETAILED STATUS P8 - NOT USED



          MASKP  INTERR
 K.INTERR EQU    MSK
          MASKP  DATERR
 K.DATERR EQU    MSK
          MASKP  SHORT
 K.SHORT  EQU    MSK

 RS       RECEND


 CM       RECEND
          SPACE  5,20
*         RESPONSE CODES

 R.UNS    EQU    0           UNSOLICITED RESPONSE
 R.INT    EQU    1           INTERMEDIATE RESPONSE
 R.ABN    EQU    3           ABNORMAL REQUEST TERMINATION
 R.URC    EQU    7           STATISTICS REPORT

          SPACE  5,20


 RPBL     EQU    104         MAXIMUM LENGTH OF RESPONSE BUFFER
 EOM      EQU    20000B


 IPIT     EQU    EOM-2000    PP INTERFACE TABLE
 UBUF     EQU    IPIT+P.PIT  UNIT INTERFACE TABLE
 IBUF     EQU    UBUF+P.UIT  UNIT DESCRIPTOR BUFFER
 NRQ      EQU    IPIT        NEXT REQUEST
 RQT      EQU    NRQ+8

 RS       EQU    IBUF+128    DISK RESPONSE
 RQ       EQU    /SS/P.RQ    REQUEST
 CM       EQU    RQ+/RQ/P.CMND  CURRENT COMMAND
 CMLIST   EQU    /SS/P.CMLIST  INDIRECT RMA LIST
 DLIST    EQU    /SS/P.DLIST   WORKING LENGTH LIST
          EJECT
          CON    INIT-1

*         DIRECT CELLS

 CM.PIT   BSSZ   3           CM ADDRESS OF PP INTERFACE TABLE
                              THE BYTE ADDRESS IS
                               RIGHTMOST 10 BITS OF WORD 0 CONCATENATED WITH
                               RIGHTMOST 12 BITS OF WORD 1 CONCATENATED WITH
                               RIGHTMOST 6 BITS OF WORD 2 CONCATENATED WITH
                               3 BITS OF ZEROS
 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

 CMADR    BSSZ   3           CM ADDRESS
 CHAN     BSSZ   1           CHANNEL NUMBER
 CMNDS    BSSZ   1           NUMBER OF OUTSTANDING COMMANDS
 SP       BSSZ   1           POINTER TO SS TABLE
 UP       BSSZ   1           POINTER TO A UNIT DESCRIPTOR

 P1       BSSZ   1
 P2       BSSZ   1
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1


 BC       BSSZ   1           BYTE COUNT TO READ/WRITE
 RMA      BSSZ   2           RMA FOR DMA TRANSFER
 TREG     EQU    BC          T-REGISTER FOR WRITE
 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 RFNC     BSSZ   1           RAW FUNCTION CODE
 LF       BSSZ   1           LAST FUNCTION TO IPI ADAPTER
 RMOD     BSSZ   1           REQUEST MODIFIER

 WC       BSSZ   1           WORD COUNT
 LC       BSSZ   1           LIST COUNT
 TC       BSSZ   1           TIMEOUT COUNT
 PC       BSSZ   1           PACKET COUNT
 TOTALU   BSSZ   1           TOTAL BYTES UPPER
 TOTALL   BSSZ   1           TOTAL BYTES LOWER

 PCSTAT   BSSZ   1           TEMP STORAGE FOR B-BUS STATUS FROM THE PC

 CLCUR    BSSZ   1           CHANNEL 14 CLOCK CURRENT VALUE
 CLMCS    BSSZ   1           CLOCK, MICROSECOND
 CLMLS    BSSZ   1           CLOCK, MILLISECOND
 CLSEC    BSSZ   1           CLOCK, SECOND
 STATCLK  BSSZ   1           STATISTICS INCREMENT CLOCK
 STATINC  EQU    120         STATISTICS INCREMENT (SECONDS)


 UIT      BSSZ   3           UIT RMA (FORMATTED)

 FI       BSSZ   1           LOG INDEX
 FUNCC    BSSZ   1           LAST FUNCTION CODE
 FUNCT1   BSSZ   1
 FUNCNT   BSSZ   1           FUNCTION TIMEOUTS


          SPACE  2
          BSS    72B-*
 DSRTP    DATA   2,0         RMA OF PP INTERFACE TABLE AT DEADSTART
 CH       EQU    DSRTP       0 IF 10 MB/S IPI CHANNEL
                              1 IF 25 MB/S IPI CHANNEL
 INPNT    EQU    DSRTP+1     IN POINTER FOR RESPONSE BUFFER
 LIM      BSSZ   1           LIMIT OF RESPONSE BUFFER (IN 8-BIT BYTES)
 LPN      CON    1           LOGICAL PP NUMBER
          BSS    100B-*
          LJM    INIT        SAVE ADDRESS OF PPIT
          DATA   50111B      PICO DRIVER IDENT (FOR ANAD PROC)
          DATA   41517B
 HANG     CON    0           AN EASY WAY TO SEE CERTAIN HANGS
          UJN    *

 STORS    BSS    1           STORE RESPONSE FLAG (USED BY RESPIN)
                               = 0, IF A RESPONSE IS SENT TO CM
                               = NONZERO, IF NO RESPONSE WAS SENT TO CM
 TRYED    DATA   0           NUMBER OF TIMES WE CHECK FOR IDLE
 IDLE     DATA   0           NUMBER OF TIMES DRIVER WAS IDLED
 PCS      DATA   0           NUMBER OF TIMES I CALL RCP

 BRESP    BSSZ   1           B-BUS RESPONSE FROM RSR
 OCTET    BSSZ   1           RESPONSE OCTET
 OPSTAT   BSSZ   1           OPERATIONAL STATUS
 OAMRES   BSSZ   1           COMMAND PACKET RESPONSE
 IAMRES   BSSZ   1           RESIDUE
 BUFF     BSSZ   8           STATUS BUFFER
 WATCH    BSSZ   1           GUARD TIMER
 SSTAB    BSSZ   SSSIZE      SS TABLE
 UDTAB    BSSZ   UDSIZE      UNIT DESCRIPTOR TABLE
          SPACE  5,20



          SPACE  2
*         THE FOLLOWING CM ADDRESSES ARE SET DURING INITIALIZATION
*         THE BYTE ADDRESS IS
*          WORD 1 IS UPPER 16 BITS OF RMA
*          WORD 2 TIMES 8 IS LOWER RMA

 CM.CB.T  BSSZ   2           ADDRESS OF PP COMMUNICATION BUFFER (T REG. FORMAT)
 CM.CB    BSSZ   2           ADDRESS OF BUFFER WITHIN PP COMMUNICATION BUFFER
 CM.RS    BSSZ   2           ADDRESS OF RESPONSE BUFFER
 CM.INT   BSSZ   2           ADDRESS OF INTERRUPT WORD
 CM.CHAN  BSSZ   2           ADDRESS OF CHANNEL INTERLOCK TABLE

 T10      DATA   0
 T11      DATA   0
 T12      DATA   0

*         LOCATION DTYPE IS THE INDEX TO THIS EQUIPMENT INFO TABLE

 EICPD    DATA   1629        NTDD_1         CYLINDERS PER DEVICE
          DATA   6512        NTDD_2
          DATA   3224        NTDD_3
          DATA   6512        NTDD_4
          DATA   6828        NTDD_5
          DATA   6828        NTDD_6

 EITPC    DATA   8           NTDD_1         TRACKS PER CYLINDER
          DATA   8           NTDD_2
          DATA   8           NTDD_3
          DATA   8           NTDD_4
          DATA   22          NTDD_5
          DATA   40          NTDD_6

 EISPT    DATA   22          NTDD_1         SECTORS PER TRACK
          DATA   42          NTDD_2
          DATA   42          NTDD_3
          DATA   42          NTDD_4
          DATA   64          NTDD_5
          DATA   60          NTDD_6

 EIBPS    DATA   4096        NTDD_1         BYTES PER SECTOR
          DATA   8192        NTDD_2
          DATA   4096        NTDD_3
          DATA   8192        NTDD_4
          DATA   8192        NTDD_5
          DATA   8192        NTDD_6

          SPACE  5,20

 PAS      EQU    0#62        10 MB CHANNEL PORT A SELECT
 PBS      EQU    0#862       10 MB CHANNEL PORT B SELECT

 CNTRLN   BSSZ   1           CONTROLLER NUMBER
 PORTN    BSSZ   1           PORT NUMBER
 CHANN    BSSZ   1           CHANNEL NUMBER
 UNITN    BSSZ   1           UNIT NUMBER
 LUNN     BSSZ   1           LOGICAL UNIT NUMBER
 LPNN     BSSZ   1           LOGICAL PP NUMBER
 FAC      BSSZ   1           FACILITY NUMBER

 ALIVE    BSSZ   1           PC DEVICE  ACTIVE FLAG
 LASTL    BSSZ   1           LAST ENTRY LENGTH
 UNITC    BSSZ   1           UNIT COUNT
 UNITI    BSSZ   1           UNIT INDEX
 UNITL    BSSZ   1           UNIT LIMIT
 DTYPE    BSSZ   1           DEVICE TYPE

 LIOR     BSSZ   1           LONG I/O REQUEST

 ECYL     BSSZ   1           CYLINDERS
 ETRK     BSSZ   1           TRACKS
 ESEC     BSSZ   1           SECTORS
 EBYTES   BSSZ   1           BYTES

 ERRCNT   BSSZ   1           HANG ERROR COUNT
 RETRY    BSSZ   1           RETRY COUNT
 PARITY   BSSZ   1           PARITY ERROR COUNT

 TRACKE4  BSSZ   1           NUMBER OF TIMES AN UNSOLICITED IS SENT

 BCSERR   BSSZ   1           BUS CONTROL SEQUENCE RESPONSE ERRORS

 IDLEM    BSSZ   1           = 1 = DRIVER IS IN IDLE MODE

 TRLEN    BSSZ   1           TRACKING LENGTH
 TROPC    BSSZ   1           TRACKING OP CODE

 PACKL    EQU    16D         DEFAULT PACKET LENGTH
 DTL      EQU    8192D       DEFAULT BLOCK TRANSFER LENGTH
   EJECT
          TITLE  MAIN LOOP
          SPACE  2
** NAME-- MAIN
*
** PURPOSE-- MAIN CONTROL LOOP.  LOOK FOR REQUESTS FROM CENTRAL MEMORY
*
** ENTRY
*         MAIN -   AFTER DRIVER IS LOADED OR IF THE PP IS RESUMED.
*         MAIN10 - REINITIALIZE LOOP IF PC DROPS.
*         MAIN15 - MAIN COMMAND FETCH/PROCESS LOOP.
*         MAIN20 - I/O INITIATION ENTRY.
*         MAIN30 - RESPONSE PROCESSING ENTRY.
          SPACE  2

 MAIN     BSS
          AOML   IDLEM
          RJM    ITF         GO DO TABLE INITIALIZATION
          RJM    UC
          LDDL   CLSEC
          STDL   STATCLK      RESET THE CLOCK FOR THE NEXT INTERVAL

 MAIN10   BSS
          RJM    ITLPC         PERFORM HANDSHAKE INITIALIZATION

 MAIN15   BSS
          RJM    PPRQ        CHECK FOR IDLE OR RESUME REQUEST
          LDML   MAINGO
          ZJK    MAIN17      DON'T DO STATISTICS UNTIL WE ARE ACTIVE
          RJM    UC          UPDATE THE CLOCK
          LDDL   CLSEC
          SBML   STATCLK     CHECK FOR WRAP
          PJN    MAIN16      NO WRAP
          ADC    0#10000
 MAIN16   BSS
          SBML   MAINT       CHECK FOR END OF TIME INTERVAL
          MJN    MAIN17      NOT TIME YET
          RJM    SNDSTAT     GO ISSUE STATISTICS MESSAGE
          RJM    RESPIN      UPDATE THE IN_POINTER

 MAIN17   BSS
          RJM    GETU        CHECK FOR UNIT REQUESTS

 MAIN20   BSS
          LDDL   CMNDS
          ZJN    MAIN15      NO COMMANDS SO JUST LOOP AROUND
          LDN    0
          STML   IDLEM       CLEAR THE IDLE FLAG
          RJM    IOT         GO PROCESS THE TRANSFER

 MAIN30   BSS
          RJM    TERM        SEND RESPONSE TO CM
          LDML   ALIVE       MAKE SURE THAT THE PC IS STILL WITH US
          ZJK    MAIN10      IF NOT, GO WAIT FOR IT TO COME BACK
          UJK    MAIN15      JUST GO HERE FOR NOW

 MAIN50   DATA   0           THIS IS JUST TO INDICATE WHERE WE CAME FROM
          AOML   SYNCC       INCREMENT COUNT OF CALLS TO THIS ENTRY
          LDC    MAINLOG1
          ADML   LOGINDX
          STML   MAIN51+1
          LDML   MAIN50
 MAIN51   STML   *
          AOML   LOGINDX
          SBN    32
          MJK    MAIN52
          LDN    0
          STML   LOGINDX
 MAIN52   UJK    MAIN

 MAINT    BSSZ   1           TEMPORARY CLOCK
 MAINGO   DATA   0           STATUS FLAG
 MAINLOG1 BSSZ   32          LOG OF HOW WE GOT HERE
 LOGINDX  DATA   0
 SYNCC    DATA   0           COUNT OF NUMBER OF TIMES WE RE-SYNCED
          SPACE  5,20



** NAME-- IT
*
** PURPOSE-- INITIALIZE TABLES
*
** ENTRY  CM.PIT = CM BYTE ADDRESS OF THE PP INTERFACE TABLE.
          SPACE  2
 ITFX     LJM    **
 ITF      EQU    *-1

          LDC    SSSIZE
          STDL   T1
 IT10     BSS
          LDN    0
          STML   SSTAB-1,T1    ZERO OUT SS TABLE
          SODL   T1
          NJN    IT10
          LDC    SSTAB
          STDL   SP             POINTER TO SS TABLE

          LDML   EICPD
          STML   ECYL           STORE DEFAULTS FOR DEVICE CHARACTERISTICS
          LDML   EITPC
          STML   ETRK
          LDML   EISPT
          STML   ESEC
          LDML   EIBPS
          STML   EBYTES

          LDC    UDSIZE
          STDL   T1
 IT15     BSS
          LDN    0
          STML   UDTAB-1,T1    ZERO OUT UD TABLE
          SODL   T1
          NJN    IT15
          LDC    UDTAB
          STD    UP

          LDN    0            CLEAR THE FOLLOWING CELLS
          STDL   P4
          STDL   P5
          STDL   P6
          STDL   T7
          STDL   CMNDS
          STML   SEQN
          STML   OCTET
          STML   UNITC
          STML   UNITI
          STDL   RMOD
          STML   LIOR
          STML   ALIVE
          STML   MAINGO

          LDC    STATINC
          STML   MAINT       INITIALIZE STATISTICS INCREMENT VALUE TO 30 SECONDS

          LDN    C.PIT
          STDL   WC
          LOADC  CM.PIT      LOAD CM ADDRESS OF PP INTERFACE TABLE
          CRML   IPIT,WC     READ PP INTERFACE TABLE
          LDML   IPIT+/PIT/P.PPNO  GET PP NUMBER
          STDL   LPN
          STML   LPNN
          REFAD  IPIT+/PIT/P.RSBUF,CM.RS  REFORMAT CM ADDRESS OF RESPONSE
                                          BUFFER AND SAVE IN CM.RS
          LDML   IPIT+/PIT/P.LIMIT  GET LIMIT OF RESPONSE BUFFER
          STDL   LIM
          REFAD  IPIT+/PIT/P.INT,CM.INT  REFORMAT CM ADDRESS OF INTERRUPT
                                         WORD AND SAVE IN CM.INT
          REFAD  IPIT+/PIT/P.CHAN,CM.CHAN  REFORMAT CM ADDRESS OF
                                         CHANNEL TABLE AND SAVE IN CM.CHAN
          LDML   IPIT+/PIT/P.UNITC
          STDL   T8
          STML   UNITC       NUMBER OF UNITS
          STML   UNITL       SAVE AS SEARCH LIMIT
          SHN    1
          STDL   T8          LENGTH OF UNIT DESCRIPTOR (CM WORDS)
          ZJK    IT80        EXIT IF NO UNITS

 IT30     BSS
          LDN    C.UD        READ 2 CM WORDS
          STDL   WC
          LOADC  CM.PIT
          ADN    C.PIT
          ADDL   P6          INDEX TO UNIT DESCRIPTOR
          CRML   IBUF,WC     READ UNIT DESCRIPTOR
          LDML   IBUF+/UD/P.UQT  RMA = 0 IF NULL ENTRY
          ADML   IBUF+/UD/P.UQT+1
          ZJK    IT70        IF NULL ENTRY
          LDML   IBUF+/UD/P.CNTRLR
          STDL   T2
          LPN    77B         GET CONTROLLER NUMBER
          STML   CNTRLN
          LDML   T2
          SHN    -6
          LPN    3           GET PORT NUMBER
          STML   PORTN
          LDML   IBUF+/UD/P.UNIT
          STML   /UE/P.UNIT,UP
          STML   FAC         SAVE AS LOCAL FACILITY NUMBER

 IT40     BSS
          LDN    C.UIT
          STDL   WC
          LOADF  IBUF+/UD/P.UQT  REFORMAT RMA OF UNIT INTERFACE TABLE
                                  AND SAVE IN UNITS TABLE
          STDL   UIT+2
          STML   /UE/P.UQT+2,UP
          CRML   UBUF,WC          READ UNIT INTERFACE TABLE
          LDDL   CMADR                      AND
          STDL   UIT              SAVE AS POINTER TO UNIT Q TABLE
          STML   /UE/P.UQT,UP
          LDDL   CMADR+1
          STDL   UIT+1
          STML   /UE/P.UQT+1,UP
          LDDL   T2
          SHN    -8
          STDL   CHAN        CHANNEL NUMBER
          STML   CHANN       SAVE IT AGAIN
          LDML   IBUF+/UD/P.LU  GET LOGICAL UNIT NUMBER
          STML   /UE/P.LU,UP
          STML   UNITN       SAVE IT LOCAL ALSO
          STML   LUNN        AND AS LOGICAL
          LDDL   LPN
          STML   LPNN        SAVE LOGICAL PP NUMBER
          LOADR  UIT
          CRDL   T5
          LDDL   T7          GET DEVICE TYPE FROM UIT
          LPN    77B
          SBN    37B
          STML   /UE/P.DTYPE,UP  SAVE DEVICE TYPE
 IT70     BSS
          LDN    C.UD
          RAD    P6         UPDATE TO NEXT UNIT DESCRIPTOR
          LDN    UELEN
          RAD    UP         UPDATE TO NEXT UNIT ENTRY
          SOML   UNITL
          NJK    IT30        IF MORE UNITS

 IT80     BSS
          RJM    CHGCH       SET CHANNEL INSTRUCTIONS
          DCN    DC+40B
          LDN    0
          RJM    FUNC        MASTER CLEAR ADAPTER
          LDC    100D
 IT96     BSS
          SBN    1
          PSN
          PSN
          NJN    IT96        WAIT 100 USCE
          SFM    IT97,DC     CLEAR CHANNEL FLAG
 IT97     BSS
          LDN    0
          RJM    FUNC        RE-MASTER CLEAR TO CLEAR SEQ ERROR
          LDC    0#7E42      SELECT TRANSFER RATE = 10MB/ 20MHZ
          RJM    FUNC
          RJM    UC          GO ESTABLISH INITIAL TIMEOUT VALUES
          LJM    ITFX



 ITLPCX   LJM    **
 ITLPC    EQU    *-1
          RJM    RCP         GO READ A COMMAND PACKET TO TEST PATH
          LDN    1
          STML   ALIVE       SET THE PC ACTIVE FLAG
          AOML   PCS         UPDATE THE RETRY COUNTER
          UJN    ITLPCX

          EJECT
*******************************************************************************
*         THE FOLLOWING ARE THE ROUTINES ASSOCIATED WITH FETCHING A REQUEST
*         FROM CM THROUGH THE UIT AND PROCESSING IT'S ASSOCIATED COMMANDS.
*
*         AT THE COMPLETION OF PROCESSING, EVERYTHING IS SETUP TO BEGIN
*         I/O. THE CM RMA FOR I/O TRANSFER IS IN VARIABLE, RMA AND THE
*         I/O TRANSFER LENGTH FOR THIS PARCEL IS IN VARIABLE, BC.
*
*         THE REMAINING COMMAND COUNT (CMNDS) HAS BEEN UPDATED TO REFLECT
*         THE COMMAND BEING PROCESSED (I.E. IF THERE IS 1 COMMAND TO
*         PROCESS, THE COUNT CMNDS HAS BEEN DECREMENTED TO 0). EVEN THOUGH
*         THE ACTUAL I/O HAS NOT YET BEEN ACCOMPLISHED. THE REASON FOR THIS
*         IS TO PREVENT FURTHER PROCESSING OF THIS COMMAND IF AN I/O ERROR
*         OCCURS DURING THE I/O CYCLE.
*******************************************************************************
*
*
          SPACE  5,20
** NAME-- GETU
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL AND ISSUE THE
*            TRANSFER REQUEST.
          SPACE  2
 GETUX    LJM    **
 GETU     EQU    *-1

 GETU5    BSS
          LDN    0            ELSE
          STML   UNITI        RESET THE INDEX
          LDML   UNITC
          STML   UNITL        RESET THE SEARCH LIMIT
          LDC    UDTAB
          STD    UP
          STML   UCODE        INITIALIZE THE INTERFACE ERROR FIELD

 GETU2    BSS
          LDML   /UE/P.UQT,UP
          STDL   UIT
          LDML   /UE/P.UQT+1,UP
          STDL   UIT+1
          LDML   /UE/P.UQT+2,UP
          STDL   UIT+2
          LDML   /UE/P.UNIT,UP
          STML   FAC
          LDML   /UE/P.LU,UP
          STML   UNITN
          STML   LUNN
          LDML   /UE/P.DTYPE,UP
          STML   DTYPE         DEVICE TYPE
          LDC    EICPD
          ADML   DTYPE
          STML   GETU11+1
 GETU11   LDML   *
          STML   ECYL         SAVE NUMBER OF CYLINDERS
          LDC    EITPC
          ADML   DTYPE
          STML   GETU12+1
 GETU12   LDML   *
          STML   ETRK         SAVE NUMBER OF TRACKS
          LDC    EISPT
          ADML   DTYPE
          STML   GETU13+1
 GETU13   LDML   *
          STML   ESEC         SAVE NUMBER OF SECTORS
          LDC    EIBPS
          ADML   DTYPE
          STML   GETU14+1
 GETU14   LDML   *
          STML   EBYTES       SAVE NUMBER OF BYTES

 GETU20   BSS

*         CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.
          LDN    0
          STML   LIOR        RESET THE LONG I/O FLAG
          STDL   CMNDS       INITIALIZE THE COMMAND COUNT

 GETU55   BSS
          LOADR  UIT                 ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5                  READ UNIT DISABLED FLAG
          LDDL   T5+/UIT/L.DSABLE+2
          SHN    /UIT/L.DSABLE+2
          MJK    GETU55A     THIS UNIT IS DISABLED SO GO TO NEXT
          LDDL   T8          QUEUE COUNT
          NJN    GETU56
 GETU55A  BSS
          SOML   UNITL       CHECK END OF UNITS
          ZJK    GETUX       DONE THIS ITERATION SO EXIT
          LDN    UELEN
          RAML   UNITI       UPDATE THE INDEX TO NEXT UNIT
          ADC    UDTAB       ADD THE BASE
          STD    UP          STORE THE NEW POINTER
          UJK    GETU2       GO LOOP THROUGH THE REST OF THE UNITS

 GETU56   BSS
          RJM    SR          SELECT REQUEST
          NJK    GETU55A     NO REQUEST, CHECK NEXT UNIT

 GETU70   BSS
          RJM    GETR        GO GET THE REQUEST

*    IN GETR, THE REQUEST AND ASSOCIATED COMMAND(S) IS BROUGHT INTO
*    THE SSTABLE AND PROCESSED.

          LDD    CMNDS
          ZJK    GETU55A     CHECK NEXT UNIT
          STML   MAINGO      WE CAN DO STATISTICS NOW
          RJM    IOT         DO THE I/O
          RJM    TERM
          UJK    GETU55A     CYCLE UNTIL QUEUE COUNTS = 0



          SPACE  5,20
** NAME-- SR
*
** PURPOSE-- SELECT REQUEST FROM UNIT QUEUE
*
** EXIT-- A = 0 IF REQUEST FOUND
*
*  COMMENTS-- AT END OF SR :
*
*             A) WE KNOW THERE IS A REQUEST AVAILABLE,
*             B) WE HAVE RETRIEVED THE PVA & RMA OF THE
*                   REQUEST FROM THE UIT AND STORED IT IN THE SS,
*             C) WE HAVE SET THE DELINK POINTER IN THE SS TO
*                   POINT TO THE ADDRESS OF THE UIT ENTRY.
*
*
          SPACE  2
 SRX      LJM    **
 SR       EQU    *-1
          LDML   /SS/P.NCR,SP       CHECK LOOP FLAG
          ZJK    SR10               GET NEW REQUEST IF ZERO
          LDML   RQ+/RQ/P.NEXT      MOVE NEXT REQUEST LINK INTO SS
          STML   /SS/P.REQ,SP
          LDML   RQ+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,SP
          LDML   RQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA,SP
          STML   /SS/P.DP,SP
          LDML   RQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA+1,SP
          STML   /SS/P.DP+1,SP
          LDML   RQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA+2,SP
          STML   /SS/P.DP+2,SP
          UJK    SR30
 SR10     BSS
          RJM    SQLOCK             SET THE UNIT LOCKWORD
          NJK    SRX                EXIT IF LOCK NOT SET
          LDN    2
          STDL   P5
          LOADR  UIT                 CM ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV       POINT TO POSITION OF THE NEXT POINTER
          CRML   NRQ,P5              READ REQUEST POINTER FROM UIT TO NRQ
          LDML   NRQ+/RQ/P.NEXT
          STML   /SS/P.REQ,SP        STORE IT IN THE SS TABLE
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,SP
          ADML   /SS/P.REQ,SP
          NJN    SR20                NON-ZERO IF A REQUEST IS ON QUEUE
 SR16     BSS
          RJM    CQLOCK              CLEAR THE UNIT LOCKWORD
          LDN    1                   NO REQUEST FOUND
          UJK    SRX
 SR20     BSS
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA,SP
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA+1,SP
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA+2,SP
          LDDL   UIT                 INITIALIZE DELINK POINTER TO FIRST REQUEST
          STML   /SS/P.DP,SP
          LDDL   UIT+1
          STML   /SS/P.DP+1,SP
          LDDL   UIT+2
          ADN    /UIT/C.NEXTPV
          STML   /SS/P.DP+2,SP
 SR24     BSS
          LDN    0
          STML   /SS/P.NCR,SP        CLEAR THE QUEUE CHAIN LOOP FLAG
 SR30     BSS
          RJM    CQLOCK              CLEAR THE UNIT LOCKWORD
          LDN    0                   INDICATE REQUEST FOUND
          UJK    SRX
          SPACE  5,20



** NAME-- GETR
*
** PURPOSE-- GET THE NEXT REQUEST AND START IT ON IT'S WAY.



          SPACE  2
 GETRX    LJM    **
 GETR     EQU    *-1
          RJM    UREQ        READ UNIT REQUEST FROM CM TO SSTAB
          RJM    SRESP       SET UP STATUS FOR RESPONSE BUFFER
          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    UNCMND      GET FIRST COMMAND FROM REQUEST
          UJK    GETRX
          SPACE  5,20



** NAME-- UREQ
*
** PURPOSE-- READ A REQUEST FROM CM.  THE REQUEST IS READ WITH 2
*            3-WORD INPUTS SO THAT THE RMA WILL BE CORRECT IF THE
*            STREAM BIT IS SET.
*
*
** EXIT   RQ  CONTAINS CURRENT REQUEST.
*         FRST = 0
*         NUMCM = NUMBER OF COMMANDS.
          SPACE  2
 UREQX    LJM    **
 UREQ     EQU    *-1
          LDN    0
          STML   /SS/P.FRST,SP     SET FLAG WHEN REQUEST IS READ
          STDL   PC               CLEAR LOOP FLAG
          LDN    3           NUMBER OF WORDS TO READ
          STDL   WC
          LDC    SSTAB        ADDRESS OF SS TABLE
          ADK    RQ          POINT TO LOCATION OF REQUEST IN SS TABLE
          STML   UREQ8       ADDRESS TO PUT REQUEST
          ADN    8
          STML   UREQ4       ADDRESS TO PUT REQUEST
          LOADF  /SS/P.REQ,SP     LOAD CM REQUEST ADDRESS
          ADN    2
          CRML   *,WC        READ CURRENT REQUEST
 UREQ4    EQU    *-1
          SBN    5
          CRML   *,WC              READ CURRENT REQUEST
 UREQ8    EQU    *-1
          LDML   RQ+/RQ/P.LU,SP    GET LUN FROM REQUEST
          SBML   UNITN             CHECK AGAINST OUR LUN
          ZJN    UREQ20
          LDC    E307
          STML   UCODE
          RJM    INTERR            NOT OUR UNIT
 UREQ20   BSS    0
          LDML   RQ+/RQ/P.LEN,SP     DETERMINE NUMBER OF COMMANDS
          SHN    -3
          SBN    /RQ/C.CMND
          STML   /SS/P.NUMCM,SP     NUMBER OF COMMANDS
          STDL   CMNDS              STORE MAIN LOOP COUNT
          LDN    /RQ/C.CMND
          STML   /SS/P.LASTC,SP     OFFSET OF COMMAND

          LDML   RQ+/RQ/P.NEXT
          ADML   RQ+/RQ/P.NEXT+1
          NJK    UREQ30             IF MORE REQUESTS IN CHAIN
          STML   /SS/P.NCR,SP       CLEAR CHAIN FLAG
          UJK    UREQX
 UREQ30   BSS
          UJK    UREQX

          SPACE  5,20



** NAME-- SRESP
*
** PURPOSE-- SET UP STATUS FOR RESPONSE BUFFER.
          SPACE  2
 SREX     LJM    **
 SRESP    EQU    *-1
          LDML   /SS/P.PVA,SP     SAVE PVA OF REQUEST
          STML   /SS/P.FPVA,SP
          LDML   /SS/P.PVA+1,SP
          STML   /SS/P.FPVA+1,SP
          LDML   /SS/P.PVA+2,SP
          STML   /SS/P.FPVA+2,SP
          LDN    0
          STML   /SS/P.XFER,SP     TRANSFER COUNT
          STML   /SS/P.XFER+1,SP
          UJK    SREX
          SPACE  5,20


** NAME-- SETRQ
*
** PURPOSE-- SET UP FOR FIRST REQUEST.
          SPACE  2
 SETRQX   LJM    **
 SETRQ    EQU    *-1
          LDML   /SS/P.REQ,SP     SAVE RMA OF REQUEST
          STML   /SS/P.FCOMRQ,SP     FIRST COMPLETED REQUEST (RMA)
          STML   /SS/P.CURRQ,SP     CURRENT REQUEST (RMA)
          LDML   /SS/P.REQ+1,SP
          STML   /SS/P.FCOMRQ+1,SP
          STML   /SS/P.CURRQ+1,SP
          LDN    1
          STML   /SS/P.NCOMRQ,SP     NUMBER OF COMPLETED REQUESTS
          LDML   RQ+/RQ/P.INT,SP     CHECK IF INTERRUPT WAS SELECTED
          SHN    /RQ/L.INT+2
          MJN    SETR10      IF INTERRUPT SELECTED
          LDC    2400B       PSN INSTRUCTION
          UJN    SETR20
 SETR10   BSS
          LDML   RQ+/RQ/P.PORT,SP     GET PROCESSOR PORT NUMBER TO INTERRUPT
          SHN    -16+/RQ/L.PORT+/RQ/N.PORT
          LPN    /RQ/M.PORT
          ADC    102600B     INPN INSTRUCTION
 SETR20   BSS
          STML   INTPRC
          UJK    SETRQX
          SPACE  5,20



** NAME-- UNCMND
*
** PURPOSE-- GET NEXT COMMAND FROM CM.  SET UP CMLIST AND LISTL
*            IN THE SS TABLE AND COUNTERS LC AND TOTALL/TOTALU
*
** EXIT-- A REGISTER = 0, IF NO MORE COMMANDS.
          SPACE  2
 UNCX     LJM    **
 UNCMND   EQU    *-1
          LDML   /SS/P.NUMCM,SP
          ZJN    UNCX              IF NO MORE COMMANDS
          SOML   /SS/P.NUMCM,SP     DECREMENT COMMAND COUNT
          LDM    /SS/P.FRST,SP
          ZJN    UNC10             HAVEN'T FINISHED FIRST COMMAND YET

*         GO READ NEXT COMMAND
          LDDL   SP
          ADK    CM
          STML   UNC4
          AOML   /SS/P.LASTC,SP
          LDN    C.CM
          STDL   WC
          LOADF  /SS/P.REQ,SP
          ADML   /SS/P.LASTC,SP
          CRML   *,WC               READ COMMAND
 UNC4     EQU    *-1

*         IF INDIRECT ADDRESS, READ CM ADDRESS LIST.

 UNC10    BSS
          LDML  CM+/CM/P.LEN,SP     MAKE SURE IT IS AN EVEN NUMBER OF CM WORDS
          ADN    7
          SCN    7
          STML   CM+/CM/P.LEN,SP
          STML   CMLIST+/CM/P.LEN,SP
          SHN    -3
          STML   /SS/P.LISTL,SP     LENGTH OF CM ADDRESS AREA  (CM WORDS)
          LDML   CM+/CM/P.INDIR,SP
          SHN    /CM/L.INDIR+2
          MJN    UNC15       IF INDIRECT ADDRESS
          LDN    1
          STML   /SS/P.LISTL,SP     IF NOT INDIRECT, ONLY 1 COMMAND.
          LDML   CM+/CM/P.RMA,SP
          STML   CMLIST+/CM/P.RMA,SP
          STML   /SS/P.RMA2,SP
          LDML   CM+/CM/P.RMA+1,SP
          STML   CMLIST+/CM/P.RMA+1,SP
          STML   /SS/P.RMA2+1,SP
          RJM    DLEN        NEED TO KNOW THE LENGTH, EVEN FOR 1
          UJN    UNC20
 UNC15    BSS
          LDML   /SS/P.LISTL,SP   GET NUMBER OF ENTRIES IN ADDRESS PAIR LIST
          STDL   LC
 UNC17    BSS
          RJM    DLEN        GO DETERMINE LENGTH OF TRANSFER
          RJM    GLIST       GET CM ADDRESS LIST OF DATA AREA
 UNC20    BSS
          LDML   CM+/CM/P.CODE,SP     GET COMMAND CODE
          STML   /SS/P.FNC,SP
          SHN    -8
          STDL   RFNC
          ADC    -0#40          CHECK FOR READ
          ZJN    UNC30
          SBN    0#10           CHECK FOR WRITE
          ZJN    UNC30
 UNC25    BSS

*        WE ALWAYS GET A FORMAT (INITIALIZE SECTORS) COMMAND
*        DURING INIMSV. THIS COMMAND (0#74) IS BASICALLY A
*        NOP FOR US

          LDN    0              ELSE,
          STDL   CMNDS          CLEAR THE COMMAND COUNT
          LJM    MAIN30         AND SKIP THIS FUNCTION
*                               ***** ACTIVATE ERROR PROCESSING, LATER *****
          LDC    E501           ERROR IN COMMAND CODE
          STML   UCODE
          RJM    INTERR         REPORT INTERFACE ERROR (NO RETURN)

 UNC30    BSS
          LDDL   RFNC
          SHN    -4
          STDL   FNC            STORE INTERNAL FUNCTION CODE
 UNC40    BSS
 UNC70    BSS
          AOML   /SS/P.FRST,SP     SET FIRST COMMAND FLAG NONZERO
          UJK    UNCX              EXIT A REGISTER NONZERO TO INDICATE A COMMAND
          SPACE  5,20



** NAME-- GLIST
*
** PURPOSE-- READ ONE ENTRY FROM THE CM ADDRESS LIST PORTION OF A COMMAND.
*
** ENTRY-- LISTL
*
** EXIT-- CMLIST, CM+/CM/P.RMA
          SPACE  2
 GLIX     LJM    **
 GLIST    EQU    *-1
          LDDL   SP           ADDRESS OF SS TABLE
          ADK    CMLIST
          STML   GLIST4      ADDRESS TO STORE CM LIST
          LDN    1
          STDL   WC          NUMBER OF CM WORDS TO READ
          LOADF  CM+/CM/P.RMA,SP     LOAD CM ADDRESS AND REFORMAT
          CRML   *,WC        READ ONE ENTRY FROM THE CM LIST
 GLIST4   EQU    *-1
          LDN    8
          RAML  CM+/CM/P.RMA+1,SP     UPDATE RMA ADDRESS FOR NEXT READ
          SHN    -16
          RAML  CM+/CM/P.RMA,SP
          LDML   CMLIST+/CM/P.LEN,SP     MAKE SURE IT IS AN EVEN NUMBER OF CM WORDS
          ADN    7
          SCN    7
          STML   CMLIST+/CM/P.LEN,SP
          UJK    GLIX
          SPACE  5,20



** NAME-- DLEN
*
** PURPOSE-- SCAN THROUGH THE LENGTH/ADDRESS LIST AND BUILD A SUM
*            OF ALL THE LENGTH VALUES. WE NEED THIS FOR THE TRANSFER
*            LENGTH FIELD WHEN BUILDING THE LEADING COMMAND PACKET.
*
** ENTRY-- DLEN - NO PARAMETERS PASSED IN.
*
** EXIT-- TOTALU/TOTALL  CONTAIN LENGTH OF TRANSFER
          SPACE  2
 CLIMIT   EQU    32

 DLENX    LJM    **
 DLEN     EQU    *-1
          LDC    CLIMIT
          STML   CCNT             INITIALIZE THE MAX SIZE CHECK
          LDN    0
          STML   LASTL            INITIALIZE THE CHECK LENGTH VALUE
          STDL   PC               INITIALIZE THE SEGMENT COUNT
          STDL   TOTALL           INITIALIZE THE TRANSFER COUNT
          STDL   TOTALU
          LDML   CM+/CM/P.RMA,SP
          STML   /SS/P.RMA2,SP    MOVE THE ADDRESS TO TEMP
          LDML   CM+/CM/P.RMA+1,SP
          STML   /SS/P.RMA2+1,SP
 DLEN10   BSS
          LDDL   SP               ADDRESS OF SS TABLE
          ADK    DLIST
          STML   DLEN20           ADDRESS TO STORE CM LIST
          LDN    1
          STDL   WC               NUMBER OF CM WORDS TO READ
          LOADF  /SS/P.RMA2,SP    LOAD CM ADDRESS AND REFORMAT
          CRML   *,WC             READ ONE ENTRY FROM THE CM LIST
 DLEN20   EQU    *-1
          LDN    8
          RAML   /SS/P.RMA2+1,SP      UPDATE RMA ADDRESS FOR NEXT READ
          SHN    -16
          RAML   /SS/P.RMA2,SP
          LDML   LASTL
          NJN    DLEN30              NOT THE FIRST TIME THROUGH
          LDML   DLIST+/CM/P.LEN,SP
          STML   LASTL
          LDN    1
          STDL   PC                  WE ALWAYS DO AT LEAST 1
          UJN    DLEN40
 DLEN30   BSS
          LDML   DLIST+/CM/P.LEN,SP   BUILD SUM TOTAL OF ALL ENTRIES
          ZJK    DLENER               ZERO LENGTH - NOT GOOD
          SBML   LASTL                CHECK AGAINST LAST LENGTH
          NJK    DLEN60               NOT THE SAME, GO PROCESS WHAT WE HAVE
          SOML   CCNT
          ZJK    DLEN60               SIZE LIMIT REACHED, GO PROCESS
          AODL   PC                   OTHERWISE, UPDATE THE SEGMENT COUNT
 DLEN40   BSS
          LDML   DLIST+/CM/P.LEN,SP
          ZJK    DLENER              ZERO LENGTH - NOT GOOD
          RAML   TOTALL
          SHN    -16
          RAML   TOTALU
          SODL   LC
          ZJN    DLEN50               LOOP THROUGH LIST
          UJK    DLEN10
 DLEN50   BSS
          LDDL   TOTALL               FORCE TO EVEN NUMBER
          ADN    7
          SCN    7
          STDL   TOTALL
          UJK    DLENX
 DLEN60   BSS
          UJK    DLENX
 DLENER   BSS
          LDC    E505                INVALID LENGTH DETECTED
          STML   UCODE
          RJM    INTERR
 CCNT     DATA   0



*****************************************************************************
*     THE FOLLOWING ARE ROUTINES ASSOCIATED WITH HANDLING THE COMPLETION
*     OF A REQUEST AND THE PROCESS OF RETURNING THE RESPONSE TO CM AND
*     MAINTAINING THE RESPONSE QUEUE "IN" POINTER.
*
*     AT REQUEST COMPLETION, THE REQUEST POINTER IS DELINKED FROM THE
*     UNIT INTERFACE TABLE.
*
*****************************************************************************
*
*
          SPACE  5,20
** NAME-- DCR
*
** PURPOSE-- DELETE COMPLETED REQUEST FROM THE UNIT QUEUE.
*
** ENTRY  UIT = POINTER TO UNIT INTERFACE TABLE
*
** EXIT   P5, T8 ARE UNCHANGED
          SPACE  2
 DCRX     LJM    **
 DCR      EQU    *-1
          LDN    2
          STDL   P6
 DCR5     BSS
          RJM    SQLOCK           SET UNIT LOCKWORD
          NJN    DCR5             WAIT FOR IT
          LOADF  /SS/P.CURRQ,SP     RMA OF CURRENT REQUEST
          CRML   RQT,P6      READ RMA CHAIN OF CURRENT REQUEST

          LOADR  UIT              LOAD CM ADDRESS OF UNIT INT. TABLE
          STDL   T1
          CRDL   P1          READ QUEUE COUNT
          ERRNZ  /UIT/C.QCNT
          LDDL   P1+/UIT/P.QCNT  DECREMENT QUEUE COUNT
          SBML   /SS/P.NCOMRQ,SP     NUMBER OF COMPLETED REQUESTS
          STDL   P1+/UIT/P.QCNT
          MJN    DCR10       IF INVALID QUEUE COUNT
          LDDL   T1
          LMC    400000B
          CWDL   P1          WRITE QUEUE COUNT
 DCR10    BSS
          LOADR  /SS/P.DP,SP     DELINK POINTER
 DCR12    BSS
          STDL   P2
          ADN    1           POINT TO RMA INSTEAD OF PVA
          CRDL   T1          RMA OF A REQUEST
          LDDL   T3
          LMML   /SS/P.FCOMRQ,SP
          NJN    DCR15       IF NEXT REQUEST IS NOT COMPLETED REQUEST
          LDDL   T4
          LMML   /SS/P.FCOMRQ+1,SP
          ZJK    DCR30       IF THIS IS A COMPLETED REQUEST
 DCR15    BSS
          LOADF  T3          UPDATE DELINK POINTER TO NEXT
          STML   /SS/P.DP+2,SP     REQUEST IN THE CHAIN
          LDDL   CMADR
          STML   /SS/P.DP,SP
          ADDL   CMADR+1
          ADDL   CMADR+2
          ZJN    DCR20             IF END OF REQUEST QUEUE
          LDDL   CMADR+1
          STML   /SS/P.DP+1,SP
          LDDL   CMADR+2
          LMC    400000B
          UJN    DCR12
 DCR20    BSS

          LDDL   UIT                   INITIALIZE DELINK POINTER TO
          STML   /SS/P.DP,SP           FIRST RMA
          LDDL   UIT+1
          STML   /SS/P.DP+1,SP
          LDDL   UIT+2
          ADN    /UIT/C.NEXTPV
          STML   /SS/P.DP+2,SP
          UJK    DCR10

*         DELINK COMPLETED REQUESTS.

 DCR30    BSS
          LDDL   P2                CM ADDRESS OF REQUEST
          LMC    400000B
          CWML   RQT,P6            PVA AND RMA OF NEXT REQUEST IN CHAIN
          LDML   RQT+/RQ/P.NEXT
          ADML   RQT+/RQ/P.NEXT+1
          NJK    DCR32             IF NOT END OF QUEUE
          LOADR  UIT               ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV
          CRML   RQT,P6            READ FIRST PVA AND RMA
          LDDL   UIT               INITIALIZE DELINK POINTER TO FIRST REQUEST
          STML   /SS/P.DP,SP
          LDDL   UIT+1
          STML   /SS/P.DP+1,SP
          LDDL   UIT+2
          ADN    /UIT/C.NEXTPV
          STML   /SS/P.DP+2,SP
 DCR32    BSS
          RJM    CQLOCK            CLEAR THE LOCKWORD
          LJM    DCRX
          SPACE  5,20



** NAME-- PDR
*
** PURPOSE-- PREPARE NORMAL DISK RESPONSE
          SPACE  2
 PDRX     LJM    **
 PDR      EQU    *-1
          LDML   /SS/P.FPVA,SP    PVA OF REQUEST
          STML   RS+/RS/P.PVA
          LDML   /SS/P.FPVA+1,SP
          STML   RS+/RS/P.PVA+1
          LDML   /SS/P.FPVA+2,SP
          STML   RS+/RS/P.PVA+2
          LDN    8
          STML   RS+/RS/P.RESPL   NORMAL RESPONSE LENGTH
          LDN    0
          STML   RS+/RS/P.DATERR  ABNORMAL STATUS WORD
          STML   RS+/RS/P.IEC     INTERFACE ERROR CODE WORD
          LDML   /SS/P.LU,SP      LOGICAL UNIT
          LPC    0#FF
          LMC    /RS/K.SHORT      INDICATE ONE-WORD RESPONSE
          STML   RS+/RS/P.SHORT
          UJK    PDRX
          SPACE  5,20



** NAME-- SNMSG
*
** PURPOSE-- SEND UNSOLICITED MESSAGE
          SPACE  2
 SNMSGX   LJM    **
 SNMSG    EQU    *-1
          LDML   UCODE
          STML   RS+/RS/P.IEC     STORE THE INTERFACE ERROR CODE
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
          LDC    PLIE
          STML   RS+/RS/P.RESPL   BYTE LENGTH OF RESPONSE
          LDN    R.UNS            INDICATE UNSOLICITED MESSAGE
          STML   RS+/RS/P.RC       AS THE RESPONSE CODE
          LDN    R.ABN
          STML   RS+/RS/P.URC     INDICATE ABNORMAL CONDITION

          LDDL   CHAN             SAVE THE DEVICE POSITION INFO
          STML   RS+/RS/P.DSP1
          LDML   LUNN
          STML   RS+/RS/P.LU
          LDML   RQ+/RQ/P.CYL,SP
          STML   RS+/RS/P.DSP2
          LDML   RQ+/RQ/P.TRACK,SP
          STML   RS+/RS/P.DSP3
          LDML   RQ+/RQ/P.SECTOR,SP
          STML   RS+/RS/P.DSP4

          RJM    RESP             SEND RESPONSE TO CM
          AOML   TRACKE4          UPDATE COUNT OF UNSOLICITED MSGS SENT
          UJK    SNMSGX

 UCODE    DATA   0
          SPACE  5,20

** NAME-- SNDSTAT
*
** PURPOSE-- SEND STATISTICS MESSAGE
          SPACE  2
 SNDSTATX LJM    **
 SNDSTAT  EQU    *-1
          LDN    0
          STML   RS+/RS/P.IEC        SET IEC CODE TO NULL
          LDN    0
          STML   RS+/RS/P.SHORT      INDICATE ERROR RESPONSE
          LDC    PSTAT
          STML   RS+/RS/P.RESPL      BYTE LENGTH OF RESPONSE
          LDN    R.UNS               SET TO UNSOLICITED RESPONSE
          STML   RS+/RS/P.RC
          LDN    R.URC               SET TO STATISTICS RESPONSE
          STML   RS+/RS/P.URC
          LDML   LUNN
          STML   RS+/RS/P.LU

          LDML   CKPCCNT             COUNT OF PARITY ERRORS
          STML   RS+/RS/P.DSP6
          LDML   SYNCC               COUNT OF RESYNCS
          STML   RS+/RS/P.DSP5
*         LDML   WTCCNT              WTC RETRYS
          LDML   FUNTO               FIRST FUNCTION ISSUE TIMEOUT COUNT
          STML   RS+/RS/P.DSP3
          LDML   RSRCNT              RSR RETRYS
          STML   RS+/RS/P.DSP2
          LDDL   FUNCNT              FUNCTION TIMEOUTS
          STML   RS+/RS/P.DSP4
          LDML   BCSERR
          STML   RS+/RS/P.DSP1       BCS ERRORS

          RJM    RESP                SEND RESPONSE TO CM

          LDN    0                   RESET THE INCREMENT COUNTS
          STML   CKPCCNT
          STML   SYNCC
*         STML   WTCCNT
          STML   FUNTO
          STML   RSRCNT
          STML   EFPCNT
          STML   BCSERR
          STDL   FUNCNT

          RJM    UC
          LDDL   CLSEC
          STDL   STATCLK      RESET THE CLOCK FOR THE NEXT INTERVAL

          UJK    SNDSTATX

          SPACE  5,20


** NAME-- UBT
*
** PURPOSE-- UPDATE BYTES TRANSFERRED
          SPACE  2
 UBTX     LJM    **
 UBT      EQU    *-1
          LDML   CMLIST+/CM/P.LEN,SP GET BYTES TRANSFERRED
          RAML   /SS/P.XFER+1,SP     UPDATE BYTES TRANSFERRED
          SHN    -16
          RAML   /SS/P.XFER,SP
          RJM    GLIST
          UJN    UBTX
          SPACE  5,20



** NAME-- RESP
*
** PURPOSE-- WRITE STATUS BUFFER TO CM RESPONSE BUFFER.
          SPACE  2
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  2
 RESPX    LJM    **
 RESP     EQU    *-1

*         CHECK IF RESPONSE SHOULD BE SENT TO CM.

          LDN    0
          STML   STORS       SET FLAG TO STORE RESPONSE
          LDML   CM+/CM/P.STOR,SP     CHECK IF CALLER WANTS RESPONSE
          SHN    /CM/L.STOR+2
          MJN    RESP10      IF STORE RESPONSE FLAG IS SET
          LDML   RS+/RS/P.SHORT
          SHN    /RS/L.SHORT+2
          PJN    RESP10      IF NOT NORMAL RESPONSE, STORE RESPONSE
          AOML   STORS       NONZERO MEANS DO NOT STORE RESPONSE
          UJK    RESPX

*         READ IN AND OUT POINTERS OF RESPONSE BUFFER.

 RESP10   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.

          LDN    0
          STDL   T5          NUMBER OF WORDS IN 2ND BLOCK WRITE
          LDDL   INP
          SBDL   OUTP
          MJN    RESP20      IF IN .LT. OUT
          LDDL   LIM         IN .GE. OUT, SET OUT = OUT + LIMIT
          RADL   OUTP
 RESP20   BSS
          LDML   RS+/RS/P.RESPL  GET RESPONSE LENGTH
          ADDL   INP
          STDL   INPNT       IN + RESPONSE LENGTH
          SBDL   OUTP        CHECK IF ENOUGH ROOM IN BUFFER FOR RESPONSE
          MJN    RESP30      IF ROOM IN BUFFER
          RJM    PPRQ        CHECK FOR IDLE REQUEST
          UJK    RESP10
 RESP30   BSS
          LDDL   INP
          SHN    -3
          STDL   T3          'IN' POINTER IN WORDS
          LDML   RS+/RS/P.RESPL  CONVERT RESPONSE LENGTH TO WORDS
          SHN    -3
          STDL   T4          RESPONSE LENGTH IN WORDS
          LDDL   INPNT
          SBDL   LIM
          MJN    RESP50      IF IN + RESPONSE LENGTH .LT. LIMIT
                             ONLY 1 BLOCK WRITE
          STDL   INPNT       IN + RESPONSE LENGTH - LIMIT = NEW 'IN' POINTER
          SHN    -3
          STDL   T5          NUMBER OF WORDS IN 2ND BLOCK WRITE

*         WRITE RESPONSE TO CM.

          LDML   RS+1
          ADML   RS+2
          ADML   RS+3
          NJN    RESP40      IF PVA FOR REQUEST IS PRESENT
          STML   RS+14       INSURE UNSOLICITED RESPONSE CODE RETURNED

 RESP40   LDDL   LIM         FIRST BLOCK WRITE = (LIMIT - IN) WORDS
          SBDL   INP
          SHN    -3
          STDL   T4          NUMBER OF WORDS TO TRANSFER ON 1ST BLOCK
          SHN    2           CONVERT TO NUMBER OF PP WORDS
          ADC    RS
          STML   RESP60      RESPONSE ADDRESS FOR 2ND BLOCK WRITE
 RESP50   BSS
          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
          LDDL   T5          RESPONSE LENGTH
          ZJN    RESP70      IF ONLY 1 BLOCK WRITE REQUIRED
          LDDL   T6          LOAD ADDRESS OF RESPONSE BUFFER
          LMC    400000B
          CWML   **,T5       WRITE 2ND PART OF RESPONSE TO CM
                             (BEGINNING OF RESPONSE BUFFER)
 RESP60   EQU    *-1
 RESP70   BSS
          LJM    RESPX
          SPACE  5,20



** NAME-- RESPIN
*
** PURPOSE-- UPDATE THE 'IN' POINTER IN THE CM RESPONSE BUFFER.
*
** ENTRY  INPNT = NEW 'IN' POINTER.
          SPACE  2
 RESNX    LJM    **
 RESPIN   EQU    *-1

*         CHECK IF RESPONSE SHOULD BE SENT TO CM.

          LDML   STORS       CHECK IF CALLER WANTS RESPONSE
          NJK    RESNX       IF NO RESPONSE WAS SENT

*         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. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   LPN-3       SET LAST BYTE NONZERO
 INTPRC   PSN    0           INTERRUPT OR PSN (MODIFIED)
          UJK    RESNX
          SPACE  5,20



** NAME-- TERM
*
** PURPOSE-- TERMINATE A UNIT REQUEST.
          SPACE  2
 TERMX    LJM    **
 TERM     EQU    *-1
          RJM    PDR              PREPARE NORMAL DISK RESPONSE
          LDML   /SS/P.NUMCM,SP   MAKE SURE ALL COMMANDS WERE PROCESSED
          ZJN    TERM20           DATA TRANSFERRED

 TERM10   LDK    E76         UNEXPECTED RESPONSE
          RJM    EFP         (NO RETURN)

 TERM20   BSS
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE RESPONSE BUFFER IN-POINTER
          RJM    DCR         DELETE COMPLETED REQUEST FROM QUEUE
          LDN    0
          STML   /SS/P.REQ,SP    SO SR ROUTINE STARTS AT BEGINNING OF QUEUE
          STML   /SS/P.REQ+1,SP
          UJN    TERMX

          EJECT

***************************************************************************
*
*         THIS IS THE ROUTINE THAT CONTROLS THE ACTUAL I/O BETWEEN HOST
*         AND CLIENT.
*
***************************************************************************
          SPACE  2
*
*
** NAME-- IOT
*
** PURPOSE-- I/O  TRANSFER.
*            IF FUNCTION CODE = 4  DATA TRANSFER FROM PC TO CYBER
*            IF FUNCTION CODE = 5  DATA TRANSFER FROM CYBER TO PC
*
** ENTRY  LC    = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                 COMMAND WHICH ARE LEFT TO PROCESS.
*         P.LEN = NUMBER OF BYTES TO TRANSFER THIS INTERATION
*
*         FNC = 4  IF READ, 5 IF WRITE
*
*         WE STAY IN THIS LOOP UNTIL THE ADDRESS LIST IS EXHAUSTED.
*
*  **** WARNING *****  THE SEQUENCES: RJM XX FOLLOWED BY RJM CKPC MUST REMAIN IN ORDER
*                      AS CONTROL ALWAYS RETURNS TO THE ADDRESS OF RJM  CKPC-4 ON AN ERROR ****
*




          SPACE  2
 IOTX     LJM    **
 IOT      EQU    *-1
          LDN    0
          STDL   RMOD        ALWAYS SET TO INITIAL SECTION WHEN
*                            ENTERED HERE
          RJM    BCP         GO BUILD THE COMMAND PACKET
 IOT20    BSS
          LDML   CMLIST+/CM/P.LEN,SP      NUMBER OF BYTES TO TRANSFER THIS SEGMENT
          STML   TRLEN       STORE TRACKING LENGTH
          STDL   BC
          NJN    IOT30       OKAY, LENGTH IS NON-ZERO
          RJM    HANG        NOT GOOD
 IOT30    BSS
          LDML   CMLIST+/CM/P.RMA,SP
          STDL   RMA
          LDML   CMLIST+/CM/P.RMA+1,SP
          STDL   RMA+1
          NJN    IOT60       OKAY IF NONE-ZERO
          LDDL   RMA
          NJN    IOT60       OKAY ALSO
          RJM    HANG        BAD IF ZERO ADDRESS
 IOT60    BSS
          LDDL   FNC
          SBN    4           CHECK FOR READ REQUEST
          NJN    IOT70       SKIP, NOT A READ REQUEST
          RJM    RDB         ELSE, GO READ A DATA BLOCK
          RJM    CKPC        CHECK FOR TRANSMISSION ERROR
          UJN    IOT80
 IOT70    BSS
          RJM    WDB         OTHERWISE, GO WRITE A DATA BLOCK
          RJM    CKPC        CHECK FOR TRANSMISSION ERROR
 IOT80    BSS
          SODL   PC          CHECK IF MORE CM ADDRESS/LENGTH PAIRS FOR THIS SEGMENT
          NJN    IOT85       THERE ARE MORE THERE SO GO PROCESS THEM
          LDDL   LC          OTHERWISE, CHECK THE OUTER COMMAND LOOP
          ZJN    IOT90       THE LIST IS EMPTY SO WE ARE DONE
          RJM    DLEN        ELSE, GO DETERMINE LENGTH OF THE NEW PACKET
          RJM    UBT
          AODL   RMOD        SET THE CONTINUATION FLAG
          RJM    BCP         AND BUILD IT
          UJK    IOT20
 IOT85    BSS
          RJM    UBT
          UJK    IOT20       GO DO THE NEXT REQUEST
 IOT90    BSS
          RJM    UNCMND      GO CHECK FOR ANOTHER COMMAND FOR THIS REQUEST
          NJN    IOT100      ANOTHER COMMAND FOUND SO GO PROCESS IT
          STDL   CMNDS       OTHERWISE, CLEAR THE COMMAND COUNT
          UJK    IOTX        AND EXIT THE I/O PROCESSOR
 IOT100   BSS
          AODL   RMOD        THIS IS A CONTINUATION CASE
          RJM    BCP         NEED ANOTHER COMMAND PACKET FOR THE NEW COMMAND
          UJK    IOT20       SO BUILD ONE AND GO PROCESS THE I/O


          EJECT

*
*
** NAME-- CKPC
*
** PURPOSE-- CHECK FOR PC TRANSMISSION ERROR
*
*
** ENTRY  NONE
*
*
*
*
 CKPCX1   BSS
          LDN    0
          STML   RETRY       RESET ERROR COUNTER ON SUCCESSFUL COMPLETION
 CKPCX    LJM    **
 CKPC     EQU    *-1
          LDDL   PCSTAT      GET B-BUS STATUS OF LAST TRANSMISSION
          ZJK    CKPCX1      OKAY, EXIT
 CKPC10   BSS
          AOML   RETRY
          SBN    ERLIMIT     TEST TO THRESHOLD
          NJK    CKPC20      HAVE NOT REACHED LIMIT YET
          LDC    E122
          STML   ECODE
          RJM    ERRPC       ABORT THIS REQUEST DUE TO TRANSMISSION ERROR
 CKPC20   BSS
          AOML   CKPCCNT
          RJM    MAIN50      GO REISSUE THE REQUEST
 CKPCCNT  DATA   0           COUNT OF PARITY ERRORS

          EJECT

*****************************************************************************
*         THE FOLLOWING ARE SUPPORT ROUTINES FOR IPI CONTROL FUNCTIONS
*         AND ADDITIONAL ROUTINES TO SUPPORT INTERCHANGE HANDSHAKE
*
*****************************************************************************

          SPACE  2,20
** NAME-- BCP
*
** PURPOSE-- BUILD THE COMMAND PACKET
          SPACE  2
*                    PACKET ASSIGNMENTS
*                      SEQUENCE #              1 PP WORD
*                      REQUEST CODE          1/2 PP WORD
*                      REQUEST MODIFIER      1/2 PP WORD
*                      CONTROLLER #          1/2 PP WORD
*                      FACILITY #            1/2 PP WORD
*                      TRANSFER LENGTH         2 PP WORDS
*                      DAR                     2 PP WORDS
*                      MAJOR STATUS          1/2 PP WORD
*                      MINOR STATUS          1/2 PP WORD
*                      PARAMETERS              6 PP WORDS
*                      SPARE                   2 PP WORDS
          SPACE  2
*         THE MESSAGE PACKET DEFINITIONS

 SEQ      EQU    0           SEQUENCE NUMBER
 REQ      EQU    1           REQUEST OP CODE
 REQM     EQU    1           REQUEST MODIFIER
 CNTLR    EQU    2           CONTROLLER NUMBER
 FACN     EQU    2           FACILITY NUMBER
 TL1      EQU    3           TRANSFER LENGTH UPPER
 TL2      EQU    4           TRANSFER LENGTH LOWER
 DAR1     EQU    5           DISK ADDRESS - CYLINDER
 DAR2     EQU    6           DISK ADDRESS - TRACK/SECTOR
 MAJRS    EQU    7           MAJOR RESPONSE
 MINRS    EQU    7           MINOR RESPONSE
 PARAMS   EQU    8           PARAMETERS
 SPARES   EQU    14          SPARES

*         THE PARAMS AREA IS USED WITH DISK DEVICES TO SPECIFY
*         DEVICE CHARACTERISTICS  AS FOILLOWS:
*
*         PARAMS      1 PP WORD   -  CYLINDERS PER DEVICE
*         PARAMS    1/2 PP WORD   -  TRACKS PER CYLINDER
*         PARAMS    1/2 PP WORD   -  SECTORS PER TRACK
*         PARAMS      1 PP WORD   -  BYTES PER SECTOR
*         PARAMS    1/2 PP WORD   -  NOT USED
*         PARAMS    1/2 PP WORD   -  DEVICE TYPE (INTERNAL CODE 1,2,ETC)
*         PARAMS      1 PP WORD   -  LONG I/O REQUEST



 CP_CPD   EQU    0            CYLINDERS/DEVICE
 CP_TPC   EQU    1            TRACKS/CYLINDER
 CP_BPS   EQU    2            BYTES/SECTOR
 CP_DT    EQU    3            DEVICE TYPE
 CP_LIO   EQU    4            LONG I/O



*       MODIFIER = 1 = CONTINUE

 OCP      BSSZ   16             COMMAND PACKET BUFFER
 SEQN     BSSZ   1              SEQUENCE NUMBER STORAGE
          SPACE  2

 BCPX     LJM    **
 BCP      EQU    *-1
          AOML   SEQN
 BCP10    BSS
          LPC    777B
          STML   SEQN
          STML   OCP+SEQ     STORE THE COMMAND SEQUENCE NUMBER

          LDDL   FNC          GET THE FUNCTION CODE
          SHN    8            POSITION IT
          ADDL   RMOD         ADD IN THE MODIFIER
          STML   OCP+REQ      STORE IT AS THE REQUEST CODE

 BCP20    BSS
          LDML   CNTRLN
          SHN    8
          ADML   FAC
          STML   OCP+CNTLR    STORE THE CONTROLLER AND FACILITY

 BCP30    BSS
          LDDL   TOTALU
          STML   OCP+TL1      STORE THE UPPER LENGTH VALUE
          LDDL   TOTALL
          STML   OCP+TL2      STORE THE LOWER LENGTH VALUE


 BCP50    BSS
          LDML   RQ+/RQ/P.CYL,SP
          STML   OCP+DAR1     STORE CYLINDER NUMBER
          LDML   RQ+/RQ/P.TRACK,SP
          SHN    8
          ADML   RQ+/RQ/P.SECTOR,SP
          STML   OCP+DAR2     STORE TRACK/SECTOR ADDRESS

 BCP90    BSS    0
          LDN    0
          STML   OCP+MAJRS    CLEAR MAJOR RESPONSE
          LDML   ECYL         SETUP DEVICE CHARACTERISTICS
          STML   OCP+PARAMS+CP_CPD   STORE CYLINDERS PER DEVICE
          LDML   ETRK
          SHN    8
          ADML   ESEC                TRACKS AND SECTORS PER DEVICE
          STML   OCP+PARAMS+CP_TPC
          LDML   EBYTES
          STML   OCP+PARAMS+CP_BPS   BYTES PER SECTOR
          LDML   DTYPE
          STML   OCP+PARAMS+CP_DT    DEVICE TYPE
          LDML   LIOR
          STML   OCP+PARAMS+CP_LIO   VALUE FOR 'LONG I/O REQUEST'

          RJM    WCP          GO WRITE THE COMMAND PACKET

          UJK    BCPX
          SPACE  5,20

** NAME-- BCS
*
** PURPOSE-- PERFORM BUS CONTROL SEQUENCE
*
** ENTRY
*         A = BUS A BITS. A = 0 OUTPUT PACKET, A=1 INPUT PACKET
*                         A = 2 OUTPUT DATA STREAM, A=3 INPUT DATA STREAM

          SPACE  2
 BCSX     LJM    **
 BCS      EQU    *-1
          SHN    16B
          ADC    H005B      110.01 SET SYNC OUT, BUS A HAS FUNCTION CODE
          RJM    RSR        110.11 WHEN RETURNED
          LDML   OCTET      GET BUS A/B OCTETS
          LPC    377B       MASK OFF BUS B
          ZJN    BCS15
          STML   BCSSTA     JUST SAVE STATUS
          AOML   BCSERR     UPDATE THE STATUS COUNT
 BCS15    BSS
          PSN    0
          LDDL   LF         110.10 DROP SYNC OUT
          LMN    0#32
          RJM    RSR        110.00 RETURN WHEN SYNC IN DROPS
          UJN    BCSX

 BCSSTA   DATA   0           SAVED B BUS STATUS
          SPACE  5,20



** NAME-- RSR
*
** PURPOSE-- FUNCTION AND READ RESPONSE OCTET
*
** ENTRY

 RSRX1    BSS
          LDN    0
          STML   RSRERR      CLEAR THE ERROR COUNT ON GOOD EXIT
 RSRX     LJM    **
 RSR      EQU    *-1
          RJM    FUNC        ISSUE FUNCTION
          LDN    0
          STML   OCTET
          LDC    6700
 RSR10    BSS
          IJM    RSR20,DC    CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    RSR10
          UJN    RSRX1       EXIT, CHANNEL WON'T GO INACTIVE

 RSR20    BSS
          ACN    DC          ACTIVATE CHANNEL
          LDC    6700
 RSR22    BSS
          IJM    RSRX1,DC    EXIT IF CHANNEL INACTIVE
          FJM    RSR30,DC    CONTINUE IF FULL
          SBN    1
          NJN    RSR22       WAIT
          UJK    RSR40       EXIT ON TIMEOUT

 RSR30    BSS
          LDN    1
          IAM    RSRSTAT,DC
          NJK    RSRX1       EXIT IF NOTHING READ
          LDML   RSRSTAT
          STML   OCTET       MOVE STATUS TO 'REAL' STATUS
          DCN    DC+40B
          UJK    RSRX1

 RSR40    BSS
          AOML   RSRCNT      UPDATE ERROR STATISTICS COUNTER
          AOML   RSRERR      SET THE ERROR FLAG
          SBN    ERLIMIT
          NJK    RSR50       OKAY
          LDC    E123
          STML   ECODE
          RJM    ERRPC       REPORT ON ERROR LIMIT

 RSR50    BSS
          RJM    MAIN50      NORMALLY WE RETRY

 RSRSTAT  DATA   0           TEMP STATUS
 RSRERR   DATA   0
 RSRCNT   DATA   0
          SPACE  5,20

** NAME-- RCP
*
** PURPOSE-- READ COMMAND (RESPONSE) PACKET
*
** EXIT
*         ICP  - STARTING LOCATION OF RESPONSE COMMAND PACKET

 ICP      BSSZ   16          INPUT (RESPONSE) COMMAND PACKET


 RCPX     LJM    **
 RCP      EQU    *-1
          LDN    1           CODE FOR READ COMMAND PACKET
          STML   TROPC       STORE TRACKING OP CODE
          RJM    SEL         SELECT PORT/CONTROLLER
          LDN    TMICP       CONTROL PACKET READ FUNCTION FOR BCS
          RJM    BCS         DO THE BUS CONTROL SEQUENCE
          LDC    0#281       STREAM, READ
          RJM    FUNC        SET MASTER OUT
          LDC    PACKL       TRANSFER 32 OCTETS
          ACN    DC
          IAM    ICP,DC      INPUT REQUIRED WORDS
          STML   IAMRES      SAVE RESIDUE
          DCN    DC+40B

 RCP1     BSS
          RJM    WTCHSI      CHECK STATE OF SLAVE_IN
          MJN    RCP1        WAIT FOR IT TO DROP

          RJM    DCM         DESELECT CONTROLLER
          UJN    RCPX


          SPACE  5,20

** NAME-- WCP
*
** PURPOSE-- WRITE COMMAND PACKET
*
** ENTRY
*         OCP - STARTING ADDRESS OF COMMAND PACKET
          SPACE  2
 WCPX     LJM    **
 WCP      EQU    *-1
          LDN    2           CODE FOR WRITE COMMAND PACKET
          STML   TROPC       STORE TRACKING OP CODE
          RJM    SEL         SELECT PORT AND CONTROLLER
          LDN    TMOCP       SET PACKET WRITE VALUE FOR BCS
          RJM    BCS         DO BUS CONTROL SEQUENCE
          LDC    0#381       ISSUE STREAM MODE WRITE
          RJM    FUNC        111.00 BRINGS UP MASTER OUT
          ACN    DC          START ADT MODE, WHICH WILL SEND SYNC IN
          LDC    PACKL       GET LENGTH (FORCE FOR NOW)
          OAM    OCP,DC      SEND PACKET
          STM    OAMRES      SAVE RESPONSE

 WCP1     BSS
          RJM    WTCHSI      CHECK STATE OF SLAVE_IN
          MJN    WCP1        WAIT FOR IT TO DROP

 WCP2     BSS
          FJM    WCP2,DC     WAIT ON CHANNEL FULL
          DCN    DC+40B
          RJM    DCM         DESELECT CONTROLLER
          LJM    WCPX


          SPACE  5,20
** NAME-- DCM
*
** PURPOSE-- DESELECT THE CONTROLLER
          SPACE  2

 DCMX     LJM    **
 DCM      EQU    *-1
          LDC    0#79
          RJM    RSR         DROP MASTER_OUT  - SAVE B_BUS STATUS
          LDML   OCTET
          LPC    0#4000      MASK OFF PARITY FLAG
          STDL   PCSTAT      SAVE IT FOR OUR FOLLOWERS
          LDC    0#01
          RJM    FUNC        GO DROP SELECT_OUT
          UJK    DCMX        ALL DONE

          SPACE  5,20



** NAME-- FUNC
*
** PURPOSE-- ISSUE FUNCTION TO IPI CHANNEL
*
** ENTRY-- A REGISTER = FUNCTION CODE.
          SPACE  2
*                    FUNCTION CODES PRESENTED TO FUNC
*
*                       0001 - DROP SELECT_OUT
*                       1201 - STREAM READ
*                       1601 - STREAM WRITE
*                       0142 - SELECT PORT A
*                       4142 - SELECT PORT B
*                       6400 - DMA WRITE AND LOAD T-REG
*                       6000 - DMA READ AND SELECT T-REG
*                       5000 - READ T-REG
*                       3400 - READ OPERATIONAL REGISTER
*                     xxx133 - SET SYNC OUT (+ CONTROL CODE (STREAM READ/WRITE, COMMAND/DATA))
*                       0171 - DROP MASTER OUT
          SPACE 2


 FUNX     LJM    **
 FUNC     EQU    *-1
          STDL   FUNCC       SAVE THE FUNCTION CODE LOCALLY
          LDN    5           2ND LEVEL TIMEOUT LOOP COUNT
          STDL   FUNCT1
 FUNCY    BSS
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
          LDDL   FUNCC
          FAN    DC          ISSUE THE FUNCTION
          STDL   LF          SAVE FUNCTION CODE HERE, ALSO
          LDN    0
 FUNC1    BSS
          IJM    FUNX,DC     EXIT WHEN ACCEPTED
          SBN    1
          NJN    FUNC1
          AOML   FUNTO       COUNT THE INNER LOOP FUNCTION TIMEOUT
          SODL   FUNCT1
          NJK    FUNCY       GO TRY AGAIN
          DCN    DC+40B      DEACTIVATE ON TIMEOUT
          RJM    RES         GO GET IPI ERROR STATUS
          LDDL   FUNCC
          STML   FUNLOG,FI   FUNCTION CODE LOG
          LDML   TROPC
          STML   FUNLOG1,FI  OPERATION CODE LOG
          LDML   RESA
          STML   FUNLOG2,FI  IPI ERROR REGISTER LOG
          LDML   WTCTS
          STML   FUNLOG3,FI  REMAINING BYTE COUNT LOG
          AODL   FI
          SBN    32
          NJN    FUNC8
          STDL   FI          INITIALIZE THE INDEX
 FUNC8    BSS
          AODL   FUNCNT      UPDATE THE FUNCTION TIMEOUT COUNT
          RJM    MAIN50      GO RESYNC PICO (NO RETURN)

 FUNTO    BSSZ   1           FIRST FUNCTION ISSUE TIMEOUT COUNT
 FUNLOG   BSSZ   32          FUNCTION LOG
 FUNLOG1  BSSZ   32          OP CODE LOG
 FUNLOG2  BSSZ   32          IPI ERROR STATUS
 FUNLOG3  BSSZ   32          TIP STATUS

          SPACE  5,20



** NAME-- PS
*
** PURPOSE-- PORT SELECT.  SELECT PORT A OR B OF IPI CHANNEL
          SPACE  2
 PSX      LJM    **
 PS       EQU    *-1
          LDML   PORTN
          ZJN    PS5       IF PORT A
          LDC    PBS       PORT B SELECT
          UJN    PS10
 PS5      BSS
          LDC    PAS       PORT A SELECT
 PS10     BSS
          RJM    FUNC
          UJN    PSX
          SPACE  5,20




** NAME-- RDRG
*
** PURPOSE-- READ REGISTER
*
** ENTRY--  A = FUNCTION CODE
          SPACE  2
 RDRG10   BSS
          LDN    0
 RDRGX    LJM    **
 RDRG     EQU    *-1
          DCN    DC+40B
          FAN    DC
          AJM    RDRG10,DC   IF NO FUNCTION REPLY
          ACN    DC+40B
          EJM    RDRG10,DC   IF WORD COULD NOT BE READ
          IAN    DC
          UJN    RDRGX
          SPACE  5,20




** NAME-- SEL
*
** PURPOSE-- SELECT THE CONTROLLER
*
          SPACE  2
 SELX     LJM    **
 SEL      EQU    *-1
          RJM    PS         SELECT PORT
          RJM    WAITAI     WAIT FOR ATTENTION_IN
 SEL10    BSS
          LDML   CNTRLN     GET THE CONTROLLER NUMBER
          SHN    14B        POSITION IN BUS OCTET
          LMN    0#29       100.00 SELECT OUT
          RJM    RSR        ISSUE SELECT, READ RESPONSE
          UJN    SELX
          SPACE  5,20



** NAME-- WTR
*
** PURPOSE--  WRITE THE T-REGISTER
          SPACE  2
 WTRX     LJM    *
 WTR      EQU    *-1
          LDN    3
          ACN    DC
          OAM    TREG,DC    WRITE T-REG TO START TRANSFER
 WTR1     FJM    WTR1,DC
          DCN    DC+40B
          UJN    WTRX
          SPACE  5,20



** NAME-- WDB
*
** PURPOSE-- WRITE A DATA BLOCK
*
** THE LENGTH AND ADDRESS VALUES HAVE BEEN STORED IN BC AND RMA

          SPACE  2
 WDBX     LJM    **
 WDB      EQU    *-1
          LDN    4          CODE FOR WRITE
          STML   TROPC      STORE TRACKING OP CODE
          RJM    SEL        SELECT CONTROLLER
          LDN    TMODM      OUTPUT DATA MODE
          RJM    BCS        GO DO THE BUS CONTROL SEQUENCE
          LDC    0#381      STREAM MODE WRITE
          RJM    FUNC
          LDC    0#D00      DMA WRITE FUNCTION AND LOAD T-REGISTER
          RJM    FUNC
          RJM    WTR        WRITE T-REG TO START TRANSFER
          RJM    WTC        GO WAIT FOR TRANSFER COMPLETE
          RJM    DCM        DESELECT THE CONTROLLER
          UJN    WDBX
          SPACE  5,20



** NAME-- RDB
*
** PURPOSE-- READ A DATA BLOCK
*
** THE LENGTH AND ADDRESS VALUES HAVE BEEN STORED IN BC AND RMA

          SPACE   2
 RDBX     LJM     **
 RDB      EQU     *-1
          LDN     3         CODE FOR READ
          STML    TROPC     STORE TRACKING OP CODE
          RJM     SEL       SELECT THE CONTROLLER
          LDN     TMIDM     INPUT DATA MODE
          RJM     BCS       GO DO THE BUS CONTROL SEQUENCE
          LDC     0#281     STREAM MODE READ
          RJM     FUNC
          LDC     0#C00     DMA READ FUNCTION AND LOAD T-REGISTER
          RJM     FUNC
          RJM     WTR       WRITE T-REG TO START TRANSFER
          RJM     WTC       GO WAIT FOR TRANSFER COMPLETE
          RJM     DCM       DESELECT THE CONTROLLER
          UJN     RDBX
          SPACE  5,20



** NAME-- WTC
*
** PURPOSE-- WAIT FOR TRANSFER COMPLETE
*
*            FOR TROPC CODE = READ_DATA_BLOCK (3): THE TERMINATOR IS
*                             SLAVE_IN DROPPING DETECTED.
*
*                           = WRITE_DATA_BLOCK (4): THE TERMINATOR IS
*                             TIP = 0 DETECTED.

          SPACE   2
 WTCX1    BSS
          LDN     0
          STML    RETRY     RESET THE RETRY COUNTER ON A SUCCESSFUL COMPLETION
 WTCX     LJM     **
 WTC      EQU     *-1
          LDC     6700
          STML    WATCH1
          LDC     200
          STML    WATCH2
          LDML    TROPC     GET FUNCTION CODE
          SBN     3         TEST FOR READ_DATA_BLOCK
          ZJK     WTC30     GO WAIT FOR SLAVE_IN TO DROP

 WTC20    BSS
          RJM     RDTIP     GO TEST THE TIP FLAG
          ZJK     WTCX1     OKAY, EXIT
          SOML    WATCH1
          NJN     WTC20     WAIT ON IT
          SOML    WATCH2
          NJK     WTC20
          LDC     E41
          STML    ECODE
          UJK     WTC40     GO REPORT TIP FLAG FAILED TO CLEAR

 WTC30    BSS
          RJM     WTCHSI    CHECK FOR SLAVE_IN DOWN
          MJN     WTC31     NOT DOWN YET
          LDML    BC        GET THE REMAINING BYTE COUNT VALUE
          STML    WTCTS     SAVE IT
          UJK     WTCX1
 WTC31    BSS
          SOML    WATCH1
          NJN     WTC30     WAIT ON IT
          SOML    WATCH2
          NJK     WTC30
          LDC     E42
          STML    ECODE
          UJK     WTC40     GO REPORT SLAVE_IN FAILED TO DROP

 WTC40    BSS
          AOML    WTCCNT    UPDATE STATISTICS
          AOML    RETRY
          SBN     ERLIMIT   SEE IF WE EXCEEDED ERROR THRESHOLD
          NJK     WTC42     STILL OKAY
          RJM     ERRPC     OVER THE LIMIT, GO PROCESS ERROR
 WTC42    BSS
          RJM     MAIN50    GO RESET AND RETRY THE REQUEST

 WTCCNT   DATA    0         STATISTICS TOTAL COUNT OF RETRYS
 WATCH1   DATA    0
 WATCH2   DATA    0
 WTCTS    DATA    0         TIP STATUS

          SPACE   5,20

** NAME -- RDTIP
*
** PURPOSE -- GET TRANSFER IN PROGRESS FLAG
*
** EXIT -- (A) = TRANSFER IN PROGRESS FLAG

          SPACE   2
 RDTIPX   LJM     **
 RDTIP    EQU     *-1
          LDC     0#700       READ OPERATIONAL STATUS
          RJM     FUNC
          ACN     DC
          IAN     DC
          DCN     DC+40B
          STML    OPSTAT
          LPN     1
          UJN     RDTIPX      EXIT WITH BIT 0
          SPACE   5,20


** NAME -- WTCHSI
*
** PURPOSE -- CHECK SLAVE_IN STATE
*
** EXIT -- (A) = NEG IF SLAVE_IN IS SET

          SPACE   2
 WTCHSIX  LJM     **
 WTCHSI   EQU     *-1
          RJM     RDIPIST   GO GET IPI STATUS
          SHN     6         POSITION SLAVE_IN TO SIGN BIT
          UJN     WTCHSIX
 IPISTAT  DATA    0
          SPACE   5,20

** NAME __ WAITAI
*
** PURPOSE __ WAIT FOR ATTENTION_IN
*
          SPACE   2
 WAITAIX  LJM    **
 WAITAI   EQU    *-1
 WAITI10  BSS
          LDN    0
          STML   WAITM    RESET THE TIMER
 WAITI20  BSS
          RJM    RDIPIST  GO CHECK FOR ATTENTION_IN
          SHN    3        IS IT THERE?
          MJN    WAITAIX  YES, GO ISSUE THE SELECT
          SOML   WAITM    OTHERWISE, DECREMENT THE COUNTER
          NJK    WAITI20  WAIT ON PP IDLE CHECK COUNTER
          RJM    PPRQ     CHECK FOR PP IDLE REQUEST
          UJK    WAITI10  JUST KEEP WAITING FOR AI
 WAITM    DATA   0
          SPACE  5,20


** NAME -- RDIPIST
*
** PURPOSE -- READ THE IPI STATUS REGISTER
*
** EXIT -- (A) =  IPI STATUS
          SPACE  2

 RDIPIS10 LDML   IPISTAT
 RDIPISTX LJM    **
 RDIPIST  EQU    *-1
          DCN    DC+40B
          LDC    0#E1
          FAN    DC
          LDC    6750
 RDIPIS20 BSS
          IJM    RDIPIS30,DC      CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    RDIPIS20         ELSE, WAIT
          UJN    RDIPIS10         EXIT ON TIMEOUT
 RDIPIS30 BSS
          ACN    DC
          LDC    6750
 RDIPIS32 BSS
          IJM    RDIPIS10,DC      EXIT IF CHANNEL INACTIVE
          FJM    RDIPIS40,DC      CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    RDIPIS32         ELSE, WAIT
          UJN    RDIPIS10         EXIT ON TIMEOUT
 RDIPIS40 BSS
          LDN    1
          IAM    IPISTATL,DC      READ CHANNEL WORD
          NJK    RDIPIS10         EXIT IF NOTHING READ
          LDML   IPISTATL         ELSE, MOVE LOCAL TO GLOBAL
          STML   IPISTAT
          DCN    DC+40B
          UJK    RDIPISTX
 IPISTATL DATA   0

** NAME-- RTR
*
** PURPOSE-- READ THE T-REGISTER
          SPACE   2
 RTRX     LJM     **
 RTR      EQU     *-1
          LDC     0#A00     READ THE T-REGISTER
          RJM     FUNC
          ACN     DC
          LDN     3
          IAM     TREG,DC
          DCN     DC+40B
          LDDL    TREG     RETURN # BYTES LEFT IN A
          UJN     RTRX
          SPACE  5,20

** NAME-- RES
*
** PURPOSE-- READ THE IPI ERROR REGISTER
          SPACE   2
 RES4     LDC    770B
          UJN    RES9

 RES5     LDC    771B
          UJN    RES9

 RES6     LDC    772B
          UJN    RES9

 RES7     LDC    773B
          UJN    RES9

 RES8     LDC    774B
 RES9     STML   RESA
          DCN    DC+40B

 RESX     LJM    **
 RES      EQU    *-1
          LDC    0#0F1
          FAN    DC
          LDN    0
 RES1     SBN    1
          ZJN    RES4      RETURN 770B (FUNCTION TIMEOUT)
          AJM    RES1,DC
          ACN    DC
          LDN    0
 RES2     IJM    RES5,DC   RETURN 771B (DISCONNECT)
          SBN    1
          ZJN    RES6      RETURN 772B (DATA TIMEOUT)
          EJM    RES2,DC
          LDN    1
          IAM    RESA,DC
          NJK    RES7      RETURN 773B (DISCONNECT 2)
 RES3     IJM    RESX,DC
          SBN    1
          NJN    RES3
          UJN    RES8      RETURN 774B (CHANNEL ACTIVE AFTER TRANSFER)

 RESA     DATA   0

** NAME-- ROS
*
** PURPOSE-- READ THE OPERATIONAL STATUS REGISTER
          SPACE   2
 ROSX     LJM     **
 ROS      EQU     *-1
          LDC     0#700
          RJM     FUNC
          ACN     DC
          EJM     ROS10,DC       IF ERROR
          IAN     DC
          STML    ROSSTAT
          UJK     ROSX
 ROS10    BSS
          LDN     0              ADD EDDOR CODE LATER
          RJM     MAIN50         CHANNEL EMPTY WHEN ACTIVATED
 ROSSTAT  DATA    0



** NAME-- INIT
*
** PURPOSE-- REFORMAT AND SAVE ADDRESS OF PPIT

          SPACE  2
 INIT     BSS
          REFAD  DSRTP,CM.PIT  REFORMAT ADDRESS OF PP INTERFACE TABLE
                                AND SAVE IN CM.PIT
          LJM    MAIN
          SPACE  5,20

 SAVAX    LJM    **
 SAVAD    EQU    *-1
          STML   2,T2
          LDDL   CMADR
          STI    T2
          LDDL   CMADR+1
          STML   1,T2
          UJK    SAVAX

          SPACE  5,20





** NAME-- FORMA
*
** PURPOSE-- FORMAT A CM REAL MEMORY ADDRESS.
*
** ENTRY--  A = ADDRESS OF A 2-WORD CM BYTE ADDRESS.
*
** EXIT--  CMADR- IS THE ADDRESS OF THE RESULTING 3-WORD REFORMATED
*          CM ADDRESS.  THE FORMAT CAN BE USED BY THE LOADC MACRO.
*           -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.
          SPACE  2
 FORX     LJM    **
 FORMA    EQU    *-1
          STDL   T1
          LDML   1,T1
          LPN    7
          NJN    FOR10       RMA ADDRESS ERROR
          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
          UJK    FORX
 FOR10    BSS
          LDC    E304        RMA NOT WORD BOUNDARY
          STML   UCODE
          RJM    INTERR      REPORT ERROR (NO RETURN)






          SPACE  5,20
** NAME-- PAUS
*
** PURPOSE-- DELAY PROGRAM EXECUTION FOR A SPECIFIED NUMBER OF
*            MICROSECONDS.
*
** ENTRY  A REGISTER SPECIFIES NUMBER OF MICROSECONDS
*          TO BE DELAYED.
          SPACE  2
 PAUSX    LJM    **
 PAUS     EQU    *-1
 PAUS10   SBN    1           EACH ITERATION OF THIS LOOP
          STDL   T1           IS ONE MICROSECOND (I4 ONLY)
          NJN    PAUS10
          UJK    PAUSX



          SPACE  5,20
** NAME-- SQLOCK
*
** PURPOSE-- SETS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
          SPACE  2
 SQLX     LJM    **
 SQLOCK   EQU    *-1
          LDC    UIT          UNIT INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          UJK    SQLX



          SPACE  5,20
** NAME-- CQLOCK
*
** PURPOSE-- CLEARS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE
          SPACE  2
 CQLX     LJM    **
 CQLOCK   EQU    *-1
          LDC    UIT              UNIT INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CQLX




          SPACE  5,20
** NAME-- LOCK
*
** PURPOSE-- SET THE LOCKWORD
*
** ENTRY
*         T7 = RMA POINTER
*         T5 = OFFSET TO LOCKWORD FROM RMA
*
** EXIT
*         A = 0 IF LOCK SUCCESSFULLY SET
          SPACE  2
 LOCKX    LJM    **
 LOCK     EQU    *-1
 LOCK10   BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        UNIT/PP INTERFACE TABLE ADDRESS
          ADDL   T5          ADD LOCKWORD OFFSET, SAVE CM ADDRESS
          STDL   T6          SAVE CM ADDRESS
          RDSL   T1          SET INTERMEDIATE VALUE
          LDDL   T1
          ZJN    LOCK30      IF LOCK COULD BE SET
          ADDL   T2
          ADC    -177777B-177777B
          ZJN    LOCK10      IF INTERMEDIATE VALUE
          LDDL   T2
          LPC    77777B
          ADC    100000B
          STDL   T2          SET THE VE BIT
          LDDL   T6
          LMC    400000B
          CWDL   T1          RESTORE THE LOCKWORD AND SET THE VE BIT
          LDDL   T4
          SBDL   LPN         CHECK IF LOCK ALREADY SET
          NJN    LOCK20      IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 LOCK20   UJK    LOCKX       IF LOCK WAS ALREADY SET, EXIT A = 0
                             IF LOCK COULD NOT BE SET, EXIT A .NE. 0
 LOCK30   BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   LPN
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    LOCKX



          SPACE  5,20
** NAME-- CLOCK
*
** PURPOSE-- CLEAR LOCKWORD
*
*  ENTRY
*         T7 = POINTER RMA
*         T5 = OFFSET TO LOCKWORD FROM RMA
          SPACE  2
 CLKX     LJM    **
 CLOCK    EQU    *-1
 CLK14    BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        RMA OF TABLE
          ADDL   T5          ADD LOCKWORD OFFSET
          STDL   T6
          RDSL   T1          WRITE INTERMEDIATE VALUE
          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          ZJN    CLK14       IF INTERMEDIATE VALUE
          LDDL   T4
          SBDL   LPN
          ZJN    CLK30       IF THIS PP HAS THE LOCK SET
          LDDL   T6
          LMC    400000B
          CWDL   T1          RESTORE THE ORIGINAL CONTENTS
          RJM    HANG        HANG, THE LOCKWORD WAS WRONG
 CLK30    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6
          LMC    400000B
          CWDL   T1          CLEAR THE LOCKWORD
          UJK    CLKX

          SPACE  5,20
** NAME-- PPRQ
*
** PURPOSE-- CHECK FOR ANY PP REQUESTS
          SPACE  2
 PPRQX    LJM    **
 PPRQ     EQU    *-1
          LCN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDC    0#7FFF
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDCL   T1          CLEAR ACTIVE CHECK BIT, READ PPIT WORD 1
          LDDL   T4
          LPC    0#6000
          ZJN    PPRQX       IF NOT IDLE OR RESUME
          RJM    PIR         PROCESS IDLE/RESUME(NO RETURN)
          SPACE  5,20


** NAME-- PIR
*
** PURPOSE-- PROCESS IDLE RESUME
          SPACE  2
 PIR      CON    0
          RJM    SPLOCK      SET PP LOCK
          AOML   TRYED       BUMP COUNTER
          LDDL   T4
          SHN    /PIT/L.IDLREQ+2
          MJN    PIR10       IF IDLE REQUEST
          LDDL   T4
          LPC    0#4FFE      CLEAR ACTIVE CHECK BIT, RESUME REQUEST BIT,
          STDL   T4           IDLE STATUS BIT, AND LOCK BIT IN PP
          LDDL   CM.PIT+2     INTERFACE TABLE
          LMC    400000B
          CWDL   T1
          LJM    MAIN
 PIR10    BSS
          AOML   IDLE        NUMBER OF TIMES DRIVER IDLED
 PIR13    BSS
          LDN    0
          STDL   CMNDS       NO OUTSTANDING COMMANDS
 PIR15    BSS
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          CRDL   T1
          LDDL   T4          CLEAR ACTIVE CHECK BIT, IDLE REQUEST BIT,
          LPC    0#2FFE       AND SET IDLE STATUS BIT
          LMC    0#1000
          STDL   T4
          LDDL   CM.PIT+2
          LMC    400000B
          CWDL   T1
 PIR20    BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PIR20
          SPACE  5,20


          SPACE  5,20
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP TABLE LOCK IN THE
*            PP INTERFACE TABLE.
          SPACE  2
 SPLX     LJM    **
 SPLOCK   EQU    *-1
 SPLOCK4  BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDN    1
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDSL   T1          ATTEMPT TO SET PP TABLE LOCK
          LDDL   T4
          LPN    1
          ZJK    SPLX        IF LOCK SET
          UJK    SPLOCK4

          SPACE  5,20

** NAME-- UC
*
** PURPOSE-- UPDATE THE CLOCK.
*
          SPACE  2
 UCX      LJM    **
 UC       EQU    *-1
          LDDL   CLCUR
          STDL   P6          SAVE CURRENT CLOCK
          IAN    14B
          STDL   CLCUR
          SBDL   P6
          PJN    UC5         IF CLOCK HASNT WRAPPED
          ADC    10000B
 UC5      BSS
          RADL   CLMCS       UPDATE MICROSECOND PORTION OF CLOCK
          LDDL   CLMCS
          ADC    -2000
          MJN    UCX         IF LESS THAN 2 MILLISECONDS
          STDL   CLMCS
          LDN    2
          RADL   CLMLS       UPDATE MILLISECOND PORTION OF CLOCK
          ADC    -1000
          MJN    UCX         IF LESS THAN 1 SECOND
          STDL   CLMLS
          AODL   CLSEC       UPDATE SECOND PORTION OF CLOCK
          UJN    UCX
          SPACE  5,20
** NAME-- CTIM
*
** PURPOSE-- CHECK FOR TIMEOUT
*
** RETURN-- (A) = + = TIMEOUT
*

          SPACE  2
 CTIMX    LJM    **
 CTIM     EQU    *-1
          LDDL   CLSEC
          SBML   /SS/P.CLK,SP
          PJN    CTIM20
          ADC    0#10000
 CTIM20   BSS
          SBN    TC
          UJK    CTIM

**************************************************************************
*   ERROR PROCESSING ROUTINES
**************************************************************************

          SPACE  3

** NAME-- INTERR
*
** PURPOSE-- REPORT AN INTERFACE ERROR
          SPACE  2
 INTERRX  LJM    **
 INTERR   EQU    *-1
          RJM    SNMSG            SEND UNSOLICITED MESSAGE
          RJM    RESPIN           UPDATE IN POINTER
          AOML   ERRCNT           UPDATE ERROR STATISTICS
          RJM    MAIN15           GO TRY AGAIN - WE PROBABLY GET THE SAME REQUEST
          SPACE  5,20

*
** NAME-- EFP
*
** PURPOSE-- ERROR FLAG PROCESSING
          SPACE  2
 EFPX     LJM    **
 EFP      EQU    *-1
          LDC    H0800       DMA TERMINATE
          DCN    DC+40B
          FAN    DC
          LDC    H0600       READ DMA ERROR REGISTER
          RJM    RDRG
          STDL   T1
          SHN    9
          MJK    EFP60       IF IPI ERROR
          SHN    11
 EFP2     BSS
          PJN    EFP3        IF NOT DMA COUNT OVERFLOW
          LDN    E19         DMA COUNT OVERFLOW
          UJN    EFP40
 EFP3     BSS
          SHN    1
          MJK    EFP85       IF ILLEGAL FUNCTION
          SHN    1
          MJN    EFP5        IF UNCORRECTED CM ERROR
          SHN    1
          PJN    EFP10       IF NOT CM REJECT
 EFP5     BSS
          LDN    E09         CENTRAL MEMORY ERROR
          UJN    EFP40
 EFP10    BSS
          SHN    1
          PJN    EFP15       IF NOT INVALID CM RESPONSE CODE
          LDN    E10
          UJN    EFP40
 EFP15    BSS
          SHN    1
          PJN    EFP20       IF NOT CM RESPONSE CODE PARITY ERROR
          LDN    E11
          UJN    EFP40
 EFP20    BSS
          SHN    1
          PJN    EFP25       IF NOT CMI READ DATA PARITY ERROR
          LDN    E12
          UJN    EFP40
 EFP25    BSS
          SHN    5
          PJN    EFP35       IF NOT Y BOARD DATA ERROR
          LDN    E13
          UJN    EFP40
 EFP35    BSS
          SHN    1
          PJN    EFP45       IF NOT BAS PARITY ERROR
          LDN    E14
 EFP40    BSS
          UJN    EFP75
 EFP45    BSS
          SHN    1
          PJN    EFP50       IF NOT Z BOARD ERROR
          LDN    E15
          UJN    EFP75
 EFP50    BSS
          SHN    1
          PJN    EFP55       IF NOT J BOARD ERROR
          LDN    E16
          UJN    EFP75
 EFP55    BSS
          SHN    1
          PJK    EFP130      IF NOT L BOARD ERROR
          LDN    E17
          UJN    EFP75
 EFP60    BSS
          LDC    H00F1       READ IPI ERROR REGISTER
          RJM    RDRG
          SHN    2
          PJN    EFP65       IF NOT BUFFER COUNTER PARITY
          LDN    E31
          UJN    EFP75
 EFP65    BSS
          SHN    2
          PJN    EFP70       IF NOT SYNC COUNTER PARITY
          LDN    E32
          UJN    EFP75
 EFP70    BSS
          SHN    1
          PJN    EFP80       IF NOT PERIOD COUNTER PARITY
          LDN    E03
 EFP75    BSS
          UJN    EFP108
 EFP80    BSS
          SHN    1
          MJN    EFP85       IF PARITY ERROR ON FUNCTION
          SHN    1
          PJN    EFP95       IF NOT PARITY ERROR ON FUNCTION
 EFP85    BSS
          LDN    E01         FUNCTION TIMEOUT
          UJN    EFP108
 EFP95    BSS
          SHN    3
          PJN    EFP100      IF NOT LOST DATA
          LDN    E33
          UJN    EFP150
 EFP100   BSS
          SHN    1
          MJN    EFP105      IF UPPER ICI PARITY ERROR
          SHN    1
          PJN    EFP110      IF NOT LOWER ICI PARITY ERROR
 EFP105   BSS
          LDN    E04
 EFP108   BSS
          UJN    EFP150
 EFP110   BSS
          SHN    1
          PJN    EFP115      IF NOT IPI SEQUENCE ERROR
          LDN    E24
          UJN    EFP150
 EFP115   BSS
          SHN    1
          MJN    EFP128      IF UPPER IPI CHANNEL PARITY ERROR
          SHN    1
          MJN    EFP128      IF LOWER IPI CHANNEL PARITY ERROR
 EFP128   BSS
          LDN    E25
          UJN    EFP150
 EFP130   BSS
          LDN    E06         IOU ERROR
 EFP150   BSS
          STML   ECODE       SAVE THE ERROR CODE
          AOML   EFPCNT      UPDATE STATISTICS
          RJM    ERRPC       GO REPORT ERROR TO VE
 EFPCNT   DATA   0           STATISTICS COUNT OF NUMBER OF CALLS



          SPACE  5,20
** NAME-- ERRPC
*
** PURPOSE-- PROCESS PICO ERRORS
*
** ENTRY-- (A) = ERROR CODE
*
          SPACE  2
 ERRPCX   LJM    **
 ERRPC    EQU    *-1
          LDML   ECODE
          STDL   P2
          STML   RS+/RS/P.IEC    PUT IT INTO THIS FIELD INSTEAD OF ERRID
          LDC    0#C000          ALWAYS SET TO ABNORMAL RESPONSE
          STML   RS+/RS/P.RC     STORE THE ERROR RESPONSE CODE
          LDN    1
          STDL   CMNDS           PUT IN BOGUS VALUE FOR DCR
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATES ERROR RESPONSE
          LDC    PLIE            SPECIAL PICO RESPONSE LENGTH
          STML   RS+/RS/P.RESPL  SET RESPONSE LENGTH
          LDDL   CHAN
          STML   RS+/RS/P.DSP1   SAVE CHANNEL NUMBER
          LDML   LUNN
          STML   RS+/RS/P.LU     SAVE LOGICAL UNIT NUMBER
          LDK    /RS/K.DATERR
          STML   RS+/RS/P.DATERR INDICATE A DATA ERROR OCCURRED
          LDML   /SS/P.PVA,SP
          STML   RS+/RS/P.PVA    SAVE THE PVA OF REQUEST
          LDML   /SS/P.PVA+1,SP
          STML   RS+/RS/P.PVA+1
          LDML   /SS/P.PVA+2,SP
          STML   RS+/RS/P.PVA+2

          RJM    RESP            SEND THE RESPONSE
          RJM    DCR             DELINK THE REQUEST
          RJM    RESPIN          UPDATE THE IN POINTER

          AOML   ERRCNT          UPDATE ERROR STATISTICS
          RJM    MAIN            GO DO NEXT REQUEST


 ECODE    DATA   0



** NAME-- CHGCH
*
** PURPOSE-- SET CHANNEL NUMBER IN CHANNEL INSTRUCTIONS
*
** ENTRY  CHAN = CHANNEL NUMBER
          SPACE  2
 CHGX     LJM    **
 CHGCH    EQU    *-1
          LDN    0
          STDL   T1          CHANGE DISK CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGX        END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   CHAN        CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CHG10
 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE








          ERRMI  IPIT-*      IF CODE OVERFLOWS INTO TABLES
*         THE LAST CARD IN THE DECK MUST BE /EOR SO THAT COMS CAN
*         ASSEMBLE MULTIPLE DECKS.
          END
/EOR

