          IDENT  E9PPICO
          CIPPU
          MEMSEL 8
          TITLE  PICO, NOS/VE IPI-PCI (PICO) DISK DRIVER FOR I4
*
*
          COMMENT *SMD* LVL=02
          COMMENT  FIDES INFORMATION SERVICES 2005
 PRGNAM   MICRO  1,4,'NTDD'  1ST 4 CHARACTERS OF OVERLAY NAME
*
*         THIS IS THE PP DRIVER FOR THE IPI-PCI WINDOWS SUBSYSTEM, PICO
*         (PROTOCOL INTERFACE CONVERTER) DRIVING THROUGH AN I4, IOU.
*         INTERFACE SUPPORT IS PROVIDED FOR THE FOLLOWING LOGICAL UNIT TYPES:
*         NTDD_1, NTDD_2, NTDD_3, NTDD_4, NTDD_5 AND NTDD_6.
*
*         THE PROGRAM NAME IS E9PNTDD OR E9PPICO, THE DECK NAME IS IOM$PICO.
*         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 R 0.6.1 - 2005-05-02   EXPERIMENTAL
*
*
          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
*
 H0000    EQU    0#0000      MASTER RESET IPI ADAPTER
 H005B    EQU    0#005B      SET SYNC OUT
 H00E1    EQU    0#00E1      READ STATUS REGISTER
 H00F1    EQU    0#00F1      READ ERROR REGISTER
 H0100    EQU    0#0100      CLEAR IPI STATUS AND 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
 H0A00    EQU    0#0A00      READ T REGISTER
*
*         MISCELLANEOUS EQUATES
*
 DC       EQU    22B         DISK CHANNEL
 PLIE     EQU    6*8         SPECIAL PICO RESPONSE LENGTH
 PSTAT    EQU    7*8         STATISTICS RESPONSE LENGTH
 PTHROT   EQU    320B        320B PPU WORDS INCLUDING 5 CM WORDS HEADER

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

 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)
 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
 FUNCNT   BSSZ   1           FUNCTION TIMEOUTS

 DT       BSSZ   1           DEVICE TYPE

 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
 OCTET    BSSZ   1           RESPONSE OCTET

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

 LPN      CON    1           LOGICAL PP NUMBER

 TROPC    BSSZ   1           TRACKING OP CODE

          SPACE  2
          BSS    72B-*
 DSRTP    DATA   2,0         RMA OF PP INTERFACE TABLE AT DEADSTART
 INPNT    EQU    DSRTP       IN POINTER FOR RESPONSE BUFFER
 LIM      EQU    DSRTP+1     LIMIT OF RESPONSE BUFFER (IN 8-BIT BYTES)
 LUNN     BSSZ   1           UNIT NUMBER

 UNITC    BSSZ   1           UNIT COUNT
 UNITI    BSSZ   1           UNIT INDEX
 UNITL    BSSZ   1           UNIT LIMIT

          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    *

 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

 OPSTAT   BSSZ   1           OPERATIONAL STATUS            ACTUALLY NOT REALLY USED...
 OAMRES   BSSZ   1           COMMAND PACKET RESPONSE       ACTUALLY NOT REALLY USED...
 IAMRES   BSSZ   1           RESIDUE                       ACTUALLY NOT REALLY USED...
 SSTAB    BSSZ   SSSIZE      SS TABLE
 UDTAB    BSSZ   UDSIZE      UNIT DESCRIPTOR TABLE
          SPACE  5,20


*         THE FOLLOWING CM ADDRESSES ARE SET DURING INITIALIZATION
*         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

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


*         LOCATION DT 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
 FAC      BSSZ   1           FACILITY NUMBER

 ALIVE    BSSZ   1           PC DEVICE  ACTIVE FLAG
 LASTL    BSSZ   1           LAST ENTRY LENGTH

 ERRCNT   BSSZ   1           HANG ERROR COUNT
 RETRY    BSSZ   1           RETRY COUNT

 TRACKE1  BSSZ   1           NUMBER OF TIMES AN UNSOLICITED IS SENT

 BCSERR   BSSZ   1           BUS CONTROL SEQUENCE RESPONSE ERRORS

 TRLEN    BSSZ   1           TRACKING LENGTH

 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.
*         MAIN30 - RESPONSE PROCESSING ENTRY.
          SPACE  2

 MAIN     BSS
          RJM    ITF         GO DO TABLE INITIALIZATION
          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
          LDC    0           DO NEVER STATISTIC
*          LDML   MAINGO
          ZJN    MAIN17      DON'T DO STATISTICS UNTIL WE ARE ACTIVE
          RJM    UC          UPDATE THE CLOCK
          LDDL   CLSEC
          SBDL   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
          UJN    MAIN15

 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   *
          STML   DMAIN50     DEBUGGING
          AOML   LOGINDX
          SBN    32
          MJN    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


          TITLE  INITIALIZE TABLES
** NAME-- ITF
*
** 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

          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
          STDL   OCTET
          STDL   RMOD
          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
          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   UNITC       NUMBER OF UNITS
          STDL   UNITL       SAVE AS SEARCH LIMIT
*         ZJK    IT80        EXIT IF NO UNITS
          NJN    IT30        THERE ARE UNITS DEFINED
          RJM    HANG        WE BETTER HANG HERE INSTEAD OF SCREW UP OTHER CHANNELS

 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
          LDDL   T2
          SHN    -6
          LPN    3           GET PORT NUMBER
          STML   PORTN
          LDML   IBUF+/UD/P.UNIT
          STML   /UE/P.UNIT,UP

 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
          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
          LDML   IBUF+/UD/P.LU     GET LOGICAL UNIT NUMBER
          STML   /UE/P.LU,UP
          STDL   LUNN        AND AS LOGICAL
          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
          SODL   UNITL
          NJK    IT30        IF MORE UNITS

 IT80     BSS
          RJM    CHGCH       SET CHANNEL INSTRUCTIONS
          DCN    DC+40B
          LDN    H0000
          FAN    DC
          LDC    100D
          RJM    PAUS        WAIT 100 U-SEC
          SFM    IT97,DC     CLEAR CHANNEL FLAG
 IT97     BSS
          IJM    IT98,DC     CONTINUE IF CHANNEL INACTIVE
          AOML   ITA98       UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          DCN    DC+40B
 IT98     LDN    H0000       MASTER CLEAR ADAPTER
          FAN    DC
          LDC    100D
          RJM    PAUS        WAIT 100 U-SEC
          IJM    IT99,DC     CONTINUE IF CHANNEL INACTIVE
          AOML   ITA99       UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          DCN    DC+40B
 IT99     LDC    0#7E42      SELECT TRANSFER RATE = 10MB/ 20MHZ
          FAN    DC
          RJM    UC          GO ESTABLISH INITIAL TIMEOUT VALUES
          LJM    ITFX

 ITA98    DATA   0           UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
 ITA99    DATA   0           UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION


 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


          TITLE  GETU - GET A UNIT REQUEST FROM CENTRAL
** NAME-- GETU
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL AND ISSUE THE
*            TRANSFER REQUEST.
          SPACE  2
 GETUX    LJM    **
 GETU     EQU    *-1

          LDN    0
          STDL   UNITI       RESET THE INDEX
          STDL   CMNDS
          STML   UCODE       INITIALIZE INTERFACE ERROR
          LDDL   UNITC
          STDL   UNITL       RESET THE SEARCH LIMIT
          LDC    UDTAB
          STD    UP

 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
          STDL   LUNN
          LDML   /UE/P.DTYPE,UP
          STDL   DT          DEVICE TYPE

*         CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.
          LOADR  UIT         ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5          READ UNIT DISABLED FLAG
          LDDL   T5+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJN    GETU55      THIS UNIT IS DISABLED SO GO TO NEXT
          LDDL   T8          QUEUE COUNT
          NJN    GETU56

 GETU55   BSS
          SODL   UNITL       CHECK END OF UNITS
          ZJK    GETUX       DONE THIS ITERATION SO EXIT

          LDN    UELEN
          RADL   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
          LDML   EICPD,DT
          STDL   ECYL        SAVE NUMBER OF CYLINDERS
          LDML   EITPC,DT
          STDL   ETRK        SAVE NUMBER OF TRACKS
          LDML   EISPT,DT
          STDL   ESEC        SAVE NUMBER OF SECTORS
          LDML   EIBPS,DT
          STDL   EBYTES      SAVE NUMBER OF BYTES

          RJM    SR          SELECT REQUEST
          NJK    GETU55      NO REQUEST, CHECK NEXT UNIT

          RJM    GETR        GO GET THE REQUEST

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

          LDD    CMNDS
          ZJK    GETU55      CHECK NEXT UNIT

          STML   MAINGO      WE CAN DO STATISTICS NOW
          RJM    IOT         DO THE I/O
          RJM    TERM
          UJK    GETU55      CYCLE UNTIL QUEUE COUNTS = 0
          SPACE  5,20


          TITLE  SR - SELECT REQUEST FROM UNIT QUEUE
** 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
          ZJN    SR10               GET NEW REQUEST IF ZERO
          LDML   RQ+/RQ/P.NEXT,SP   MOVE NEXT REQUEST LINK INTO SS
          STML   /SS/P.REQ,SP
          LDML   RQ+/RQ/P.NEXT+1,SP
          STML   /SS/P.REQ+1,SP
          LDML   RQ+/RQ/P.NEXTPV,SP
          STML   /SS/P.PVA,SP
          STML   /SS/P.DP,SP
          LDML   RQ+/RQ/P.NEXTPV+1,SP
          STML   /SS/P.PVA+1,SP
          STML   /SS/P.DP+1,SP
          LDML   RQ+/RQ/P.NEXTPV+2,SP
          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

          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

          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


          TITLE  OTHER REQUESTS ....
** 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
          STML   RSRD+/RS/P.LU    SAVE FOR LONG RESPONSE
          SBDL   LUNN         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,SP
          ADML   RQ+/RQ/P.NEXT+1,SP
          NJN    UREQ30           IF MORE REQUESTS IN CHAIN
          STML   /SS/P.NCR,SP     CLEAR CHAIN FLAG
 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.
          STDL   LC
          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   FNC
          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
          STDL   CMNDS             CLEAR THE COMMAND COUNT
          LJM    MAIN15            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   FNC
          SHN    -4
          STDL   FNC               STORE INTERNAL FUNCTION CODE
          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
          LDN    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
          ZJN    DLENER               ZERO LENGTH - NOT GOOD
          SBML   LASTL                CHECK AGAINST LAST LENGTH
          NJN    DLEN60               NOT THE SAME, GO PROCESS WHAT WE HAVE
          SOML   CCNT
          ZJN    DLEN60               SIZE LIMIT REACHED, GO PROCESS
          AODL   PC                   OTHERWISE, UPDATE THE SEGMENT COUNT
 DLEN40   BSS
          LDML   DLIST+/CM/P.LEN,SP
          ZJN    DLENER              ZERO LENGTH - NOT GOOD
          RADL   TOTALL
          SHN    -16
          RADL   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
          ZJN    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
          NJN    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
          LDDL   TROPC            GET FUNCTION DIRECT FROM COMMAND
          SBN    3                TROPC EQUAL 3 MEANS READ
          ZJN    PDR40            JUMP IF READ
 DEBUG1   BSS
          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                WRITE, SHORT REPLY
          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

 PDR40    LDML   /SS/P.FPVA,SP    PVA OF REQUEST
          STML   RSRD+/RS/P.PVA
          LDML   /SS/P.FPVA+1,SP
          STML   RSRD+/RS/P.PVA+1
          LDML   /SS/P.FPVA+2,SP
          STML   RSRD+/RS/P.PVA+2
          LDC    PTHROT           LONG REPLY ONLY ON READ
          STML   RSRD+/RS/P.RESPL NORMAL RESPONSE LENGTH
          LDN    0
          STML   RSRD+/RS/P.DATERR  ABNORMAL STATUS WORD
          STML   RSRD+/RS/P.IEC     INTERFACE ERROR CODE WORD
          LDC    100000B          NORMAL TERMINATION
          STML   RSRD+/RS/P.RC    RC = 2 IN RESPONSE CODE WORD
          LDML   /SS/P.LU,SP      LOGICAL UNIT
          LPC    0#FF             CLEAR ONE WORD BIT
          STML   RSRD+/RS/P.SHORT
          LJM    PDRX
*         LJM    DEBUG1
          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
          LDN    PLIE
          STML   RS+/RS/P.RESPL   BYTE LENGTH OF RESPONSE
          LDN    R.ABN
          STML   RS+/RS/P.URC     INDICATE ABNORMAL CONDITION

          LDDL   CHAN             SAVE THE DEVICE POSITION INFO
          STML   RS+/RS/P.DSP1
          LDDL   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   TRACKE1          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
          LDN    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
          LDDL   LUNN
          STML   RS+/RS/P.LU

          LDC    0                   DUMMY
          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   SYNCC
*         STML   WTCCNT
          STML   FUNTO
          STML   RSRCNT
          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
          STDL   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
          AODL   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
          LDDL   TROPC       GET FUNCTION DIRECT FROM COMMAND
          SBN    3           TROPC EQUAL 3 MEANS READ
          ZJK    RESP24      READ, SEND LONG RESPONSE
*         ZJK    DEBUG2      READ, SEND SHORT RESPONSE
*         NJN    DEBUG2      READ, SEND SHORT RESPONSE
*         LJM    DEBUG2      READ, SEND SHORT RESPONSE
 DEBUG2   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+/RS/P.RC 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

* STATUS BUFFER TO CM RESPONSE BUFFER FOR READ.
 RESP24   BSS
          LDML   RSRD+/RS/P.RESPL  GET RESPONSE LENGTH
          ADDL   INP
          STDL   INPNT       IN + RESPONSE LENGTH
          SBDL   OUTP        CHECK IF ENOUGH ROOM IN BUFFER FOR RESPONSE
          MJN    RESP34      IF ROOM IN BUFFER
          RJM    PPRQ        CHECK FOR IDLE REQUEST
          UJK    RESP10
 RESP34   BSS
          LDDL   INP
          SHN    -3
          STDL   T3          'IN' POINTER IN WORDS
          LDML   RSRD+/RS/P.RESPL  CONVERT RESPONSE LENGTH TO WORDS
          SHN    -3
          STDL   T4          RESPONSE LENGTH IN WORDS
          LDDL   INPNT
          SBDL   LIM
          MJN    RESP54      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

 RESP44   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    RSRD
          STML   RESP64      RESPONSE ADDRESS FOR 2ND BLOCK WRITE
 RESP54   BSS
          LOADC  CM.RS       LOAD CM ADDRESS OF RESPONSE BUFFER
          STDL   T6          SAVE CM ADDRESS
          ADDL   T3          ADD 'IN' OFFSET
          CWML   RSRD,T4     WRITE RESPONSE TO CM
          LDDL   T5          RESPONSE LENGTH
          ZJN    RESP74      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)
 RESP64   EQU    *-1
 RESP74   BSS
          LDML   DMAIN50
          ZJN    RESP84      NO ENTRY
          AOML   CMAIN50     COUNT ENTER OF MAIN50
          LDN    0
          STML   DMAIN50     CPU CAN COUNT OCCURENCE AND ADD TIMESTAMP
 RESP84   LDML   WTC111      TRANSFER IN PROGRESS TOO LONG
          ZJN    RESP85      NO ENTRY
          AOML   LOSTCNT     LOST DATA COUNT IN MST
          LDN    0
          STML   WTC111      CPU CAN COUNT OCCURENCE AND ADD TIMESTAMP
 RESP85   LDML   IPIERR5     BUFFER OVERFLOW/UNDERFLOW
          ZJN    RESP94      NO ENTRY
          AOML   IPIERRC5    BUFFER OVERFLOW/UNDERFLOW COUNTER
          LDN    0
          STML   IPIERR5     CPU CAN COUNT OCCURENCE AND ADD TIMESTAMP
 RESP94   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.

          LDDL   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)
          RJM    HANG

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


 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
          STML   XBC         SAVE BYTE LENGTH
          NJN    IOT30       OKAY, LENGTH IS NON-ZERO
          RJM    HANG        NOT GOOD
 IOT30    BSS
          LDML   CMLIST+/CM/P.RMA,SP
          STDL   RMA
          STML   XRMA        SAVE RMA
          LDML   CMLIST+/CM/P.RMA+1,SP
          STDL   RMA+1
          STML   XRMAL       SAVE RMA LOWER
          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
          UJN    IOT80
 IOT70    BSS
          RJM    WDB         OTHERWISE, GO WRITE A DATA BLOCK
 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
          LDN    1
          STDL   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
          LDN    1
          STDL   RMOD        THIS IS NOT 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


*****************************************************************************
*         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
          LPC    777B
          STML   SEQN
          STML   OCP+SEQ      STORE THE COMMAND SEQUENCE NUMBER
          STML   XOCP+SEQ      STORE THE COMMAND SEQUENCE NUMBER
          STML   RSBCPU+14B   DEBUGGING
          STML   CPTSN        COMMAND PACKET SEQUENCE NUMBER DEBUGGING
          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
          STML   XOCP+REQ      STORE IT AS THE REQUEST CODE
          STML   RSBCPU+11B   DEBUGGING
          LDML   CNTRLN
          SHN    8
          ADML   FAC
          STML   OCP+CNTLR    STORE THE CONTROLLER AND FACILITY
          STML   XOCP+CNTLR    STORE THE CONTROLLER AND FACILITY
          STML   RSBCPU+4     DEBUGGING
          LDDL   TOTALU
          STML   OCP+TL1      STORE THE UPPER LENGTH VALUE
          LDDL   TOTALL
          STML   OCP+TL2      STORE THE LOWER LENGTH VALUE
          LDML   RQ+/RQ/P.CYL,SP
          STML   OCP+DAR1     STORE CYLINDER NUMBER
          STML   XOCP+DAR1    STORE CYLINDER NUMBER
          STML   RSBCPU+1     DEBUGGING
          LDML   RQ+/RQ/P.TRACK,SP
          STML   RSBCPU+2     DEBUGGING
          SHN    8
          ADML   RQ+/RQ/P.SECTOR,SP
          STML   OCP+DAR2     STORE TRACK/SECTOR ADDRESS
          STML   XOCP+DAR2    STORE TRACK/SECTOR ADDRESS
          LPC    377B         MASK SECTOR
          STML   RSBCPU+3     DEBUGGING
          LDN    0
          STML   OCP+MAJRS    CLEAR MAJOR RESPONSE
          STML   OCP+PARAMS+CP_LIO   VALUE FOR 'LONG I/O REQUEST'  MOVED HERE, AS NOT USED
          LDDL   ECYL         SETUP DEVICE CHARACTERISTICS
          STML   OCP+PARAMS+CP_CPD   STORE CYLINDERS PER DEVICE
          STML   XOCP+PARAMS+CP_CPD   STORE CYLINDERS PER DEVICE
          LDDL   ETRK
          SHN    8
          ADDL   ESEC                TRACKS AND SECTORS PER DEVICE
          STML   OCP+PARAMS+CP_TPC
          STML   XOCP+PARAMS+CP_TPC
          LDDL   EBYTES
          STML   OCP+PARAMS+CP_BPS   BYTES PER SECTOR
          STML   XOCP+PARAMS+CP_BPS   BYTES PER SECTOR
          LDDL   DT
          STML   OCP+PARAMS+CP_DT    DEVICE TYPE
          STML   XOCP+PARAMS+CP_DT    DEVICE TYPE
*         LDML   LIOR                IS ALWAYS 0, NOT USED; SO INIT IT ABOVE
*         STML   OCP+PARAMS+CP_LIO   VALUE FOR 'LONG I/O REQUEST'

          LDML   PORTN        GET PORT
          SHN    15
          ADDL   CHAN         ADD CHANNEL
          STML   RSBCPU       DEBUGGING

          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
          LDDL   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
*
*  NOTE: ERROR PROCESSING REMOVED, AS WE KILL NOS/VE IN ERRPC
*        AND AS WE DO NOT RESET THE RETRY, IT'S USELESS ANYWAY...

 RSRX1    BSS
*         LDN    0           WANNA KEEP THAT COUNT FOR A WHILE
*         STML   RSRERR      CLEAR THE ERROR COUNT ON GOOD EXIT
 RSRX     LJM    **
 RSR      EQU    *-1
          RJM    FUNC        ISSUE FUNCTION
          LDN    0
          STDL   OCTET
*                            WAS 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
          LDN    0           WAS LDC 6700
 RSR22    BSS
          IJM    RSRX1,DC    EXIT IF CHANNEL INACTIVE
          FJM    RSR30,DC    CONTINUE IF FULL
          SBN    1
          NJN    RSR22       WAIT
          UJN    RSR40       EXIT ON TIMEOUT

 RSR30    BSS
          LDN    1
          IAM    RSRSTAT,DC
          NJK    RSRX1       EXIT IF NOTHING READ
          LDML   RSRSTAT
          STDL   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
*         NJN    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
          STDL   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
          LDN    PACKL       TRANSFER 32 OCTETS
          ACN    DC
          IAM    ICP,DC      INPUT REQUIRED WORDS
          STML   IAMRES      SAVE RESIDUE
          DCN    DC+40B
          RJM    WTCHSI      CHECK STATE OF SLAVE_IN
          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
          STDL   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
          LDN    PACKL       GET LENGTH (FORCE FOR NOW)
          OAM    OCP,DC      SEND PACKET
          STM    OAMRES      SAVE RESIDUE
          ZJN    WCP10
          AOML   WCP111      RESIDUE ERROR
 WCP10    LDC    6400
 WCP20    EJM    WCP30,DC    IF CHANNEL EMPTY, XFER COMPLETE
          SBN    1
          NJN    WCP20       ELSE, WAIT
          AOML   WCP122      COUNT FULL ERROR
 WCP30    RJM    WTCHSI      CHECK STATE OF SLAVE_IN
          RJM    DCM         DESELECT CONTROLLER
          LJM    WCPX

 WCP111   DATA   0           COUNT RESIDUE ERROR
 WCP122   DATA   0           COUNT FULL ERROR
          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
          LDDL   OCTET
          LPC    0#4000      MASK OFF PARITY FLAG
          STDL   PCSTAT      SAVE IT FOR OUR FOLLOWERS
          LDN    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     LDDL   LF
          STML   PREFUN      STORE THE PREVIOUS GOOD FUNCTION CODE FOR DEBUG PURPOSES
          LJM    **
 FUNC     EQU    *-1
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
          FAN    DC          ISSUE THE FUNCTION
          STDL   LF          SAVE FUNCTION CODE HERE, ALSO
          LDN    0
 FUNC10   BSS
          IJM    FUNX,DC     EXIT WHEN ACCEPTED
          SBN    1
          NJN    FUNC10
          AOML   FUNTO       COUNT THE FUNCTION TIMEOUT
          DCN    DC+40B      DEACTIVATE ON TIMEOUT
          RJM    RES         GO GET IPI ERROR STATUS
          LDDL   LF
          STML   FUNLOG,FI   FUNCTION CODE LOG
          LDDL   TROPC
          STML   FUNLOG1,FI  OPERATION CODE LOG
*         LDML   RESA
          LDML   DCM         THE TIMEOUT WAS ALWAYS IN DCM, SO WE WANNA KNOW WHERE WE CAM FROM
          STML   FUNLOG2,FI  IPI ERROR REGISTER LOG
          STML   DDCMFTO     DEBUGGING DCM FTIMEOUT
          LDML   WTCTS
          STML   FUNLOG3,FI  REMAINING BYTE COUNT LOG
          AODL   FI
          SBN    32
          NJN    FUNC20
          STDL   FI          INITIALIZE THE INDEX
 FUNC20   BSS
          AODL   FUNCNT      UPDATE THE FUNCTION TIMEOUT COUNT
          RJM    MAIN50      GO RESYNC PICO (NO RETURN)

 PREFUN   BSSZ   1           KEEP THAT DAMN PREVIOUS ISSUED FUNCTION
 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-- SEL
*
** PURPOSE-- SELECT THE CONTROLLER
*

 SELX     LJM    **
 SEL      EQU    *-1
*                           * DEBUG *
          LDC    H0100      WE CLEAR THE ERROR REGISTERS IN THE IPI ARRAY
          FAN    DC         SO WE DO NOT ALWAYS SEE THE OLD ERROR AGAIN
*                           * DEBUG END *
          LDML   PORTN
          ZJN    PSA         IF PORT A
          LDC    PBS         PORT B SELECT
          UJN    PSB
 PSA      BSS
          LDC    PAS         PORT A SELECT
 PSB      BSS
          RJM    FUNC
          SFM    SEL40,DC    IF ERROR FLAG SET ON ENTRY
 SEL10    BSS
          RJM    WAITAI      WAIT FOR ATTENTION_IN
          LDML   CNTRLN      GET THE CONTROLLER NUMBER
          STDL   T9
          SHN    14B         POSITION IN BUS OCTET
          LMN    0#29        100.00 SELECT OUT
          RJM    FUNC        ISSUE FUNCTION
          LDC    1000B       DELAY COUNT
          STML   SEL311      SET THE COUNTER
          ACN    DC          ACTIVATE CHANNEL
 SEL20    BSS
          FJM    SEL30,DC    SHOULD GET A WORD FROM ADAPTER
          SOML   SEL311      DECREMENT
          NJN    SEL20       NOT YET
          AOML   SEL122      COUNT THE ERROR
          LJM    SELX        IGNORE WRONG BIT SIGNIFICANT RESPONSE
*         RJM    MAIN50      PC IS MAYBE POWERED DOWN
 SEL30    BSS
          IAN    DC          READ THE RESPONSE OCTET
          STML   SEL211      SAVE THE COMPLETE VALUE
          LPC    377B
          LMML   SELT,T9
          ZJK    SELX        IF BIT SIGNIFICANT RESPONSE CORRECT
          AOML   SEL111      SELECT FAILED, BIT SIGNIFICANT RESPONSE WRONG
          LJM    SELX        IGNORE WRONG BIT SIGNIFICANT RESPONSE
*         RJM    MAIN50      PC IS MAYBE POWERED DOWN
 SEL40    BSS
          AOML   SEL133      COUNT THE ERROR FLAG SET
          LJM    SEL10       CONTINUE

 SELT     BSS
          DATA   1,2,4,8     CONTROLLERS ON PORT A
          DATA   16,32,64,128
          DATA   1,2,4,8     CONTROLLERS ON PORT B
          DATA   16,32,64,128

 SEL111   DATA   0           SELECT FAILED
 SEL122   DATA   0           NO ADAPTER WORD
 SEL133   DATA   0           COUNT THE ERROR FLAG SET
 SEL211   DATA   0           SAVE THE COMPLETE STATUS
 SEL311   DATA   0           FULL DELAY COUNTER
          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
          FJM    WTR30,DC    NOT ALL WORDS TRANSFERRED
          NJN    WTR20       NOT ALL WORDS TRANSFERRED
          DCN    DC+40B
          LDDL   TREG
          STML   DTREG       DEBUGGING
          LDDL   TREG+1
          STML   DTREG+1     DEBUGGING
          LDDL   TREG+2
          STML   DTREG+2     DEBUGGING
          UJN    WTRX        RETURN
 WTR20    STML   OAMRES      SAVE RESIDUE
          STML   WTR211      SAVE RESIDUE IN THIS ROUTINE, TOO
          AOML   WTR111      COUNT THE ERROR
          LJM    WTRX        IGNORE ANY ERROR
*         RJM    MAIN50      GO TRY AGAIN - NO RETURN
 WTR30    AOML   WTR122      COUNT THE ERROR
          DCN    DC+40B
          LJM    WTRX        IGNORE ANY ERROR
*         RJM    MAIN50      GO TRY AGAIN - NO RETURN

 WTR111   DATA   0           NOT ALL WORDS TRANSFERED
 WTR122   DATA   0           FULL ERROR
 WTR211   DATA   0           RESIDUE VALUE
          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
          STDL   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
          STDL   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    WTCRD     GO WAIT FOR READ TRANSFER COMPLETE
          RJM    DCM       DESELECT THE CONTROLLER
          RJM    RDIPER    TRY TO GET THE IPI ERROR IF POSSIBLE
          RJM    GESTAT    DEBUG CODE ONLY - DEBUGGING ONLY
          RJM    XREAD     DO AN EXTRA READ AND HANG IF AN ERROR IS DETECTED
          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.
*
*  NOTE: ERROR PROCESSING REMOVED, AS WE KILL NOS/VE IN ERRPC
*        AND AS WE DO NOT RESET THE RETRY, IT'S USELESS ANYWAY...

          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
          LDDL   TROPC     GET FUNCTION CODE
          SBN    3         TEST FOR READ_DATA_BLOCK
          NJN    WTC20     GO WAIT FOR TIP TO DROP
          AOML   WTC1111   ILLEGAL ENTRY
 WTC20    BSS
          RJM    RDTIP     GO TEST THE TIP FLAG
          ZJK    WTCX1     OKAY, EXIT
          SOML   WATCH1
          NJN    WTC20     WAIT ON IT
          SOML   WATCH2
          NJK    WTC20
          LDN    E41
          STML   ECODE
          UJN    WTC40     GO REPORT TIP FLAG FAILED TO CLEAR

 WTC30    RJM    WTCHSI    CHECK FOR SLAVE_IN DOWN
          LDML   BC        GET THE REMAINING BYTE COUNT VALUE
          STML   WTCTS     SAVE IT
          UJK    WTCX1

 WTC40    BSS
          AOML   WTCCNT    UPDATE STATISTICS
          AOML   RETRY
*         SBN    ERLIMIT   SEE IF WE EXCEEDED ERROR THRESHOLD
*         NJN    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
 WTC1111  DATA   0         ILLEGAL ENTRY
          SPACE  5,20


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

 WTCRDX   LJM    **
 WTCRD    EQU    *-1
          LDN    0
          STML   WTC355      REPEAT COUNTER OPERATIONAL STATUS
 WTC41    LDC    H0700       FUNCTION TO READ OPERATIONAL STATUS REGISTER
          RJM    FUNC
          ACN    DC
          FJM    WTC42,DC    STATUS AVAILABLE
          AOML   WTC133      NO OPERATIONAL STATUS AVAILABLE
          LCN    11          SET STATUS 177766B
          UJN    WTC43
 WTC42    IAN    DC          READ A WORD
 WTC43    STML   WTC211      SAVE OPERATIONAL STATUS
          ZJK    WTC46       IMPOSSIBLE VALUE
          LPC    303B        MASK BITS 56, 57, 62, 63
          LMC    2           ONLY T REGISTER EMPTY BIT IS UP
          ZJN    WTC44       TRANSFER IS COMPLETE
          AOML   WTC355      INCREMENT REPEAT COUNTER OPERATIONAL STATUS
          SHN    2
          PJN    WTC41       TRY IT AGAIN
          AOML   WTC111      NO TRANSFER COMPLETE ERROR
          UJN    WTC44       JUST CONTINUE
          RJM    MAIN50      GO RESET AND RETRY THE REQUEST
 WTC44    RJM    RTR         READ T-REG, CHECK IF BYTE COUNT EQUAL 0
          ZJN    WTC45       BYTES ARE DONE, CHECK SLAVE IN
          STML   WTCTS       SAVE REMAINING BYTE COUNT
          STML   WTC233      SAVE REMAINING BYTE COUNT
          AOML   WTC144      NON ZERO T-REGISTER
          RJM    GESTAT      READ ALL REGISTERS - IF POSSIBLE
          RJM    MAIN50      GO RESET AND RETRY THE REQUEST
 WTC45    RJM    WAITVI      READ IPI STATUS REGISTER
          LDML   IPIVSTA     GET IPI STATUS
          STML   IPISTAT     SAVE IN NORMAL IPI STATUS
          STML   WTC222      SAVE VALUE HERE TOO
          LDN    0
          STML   RETRY       RESET THE RETRY COUNTER ON A SUCCESSFUL COMPLETION
          LJM    WTCRDX      RETURN
 WTC46    AOML   WTC122      ILLEGAL STATUS RECEIVED
          UJK    WTC41

*WTC111   DATA   0           NO TRANSFER COMPLETE
*WTC122   DATA   0           ILLEGAL STATUS
*WTC133   DATA   0           NO OPERATIONAL STATUS AVAILABLE
*WTC144   DATA   0           NO T-REG READ OUT
*WTC211   DATA   0           OPERATIONAL STATUS
*WTC222   DATA   0           IPI STATUS REGISTER
*WTC233   DATA   0           SAVE REMAINING BYTE COUNT
*WTC355   DATA   0           REPEAT COUNTER OPERATIONAL STATUS
          SPACE  5,20


** NAME-- RTR
*
** PURPOSE-- READ THE T-REGISTER
*
** EXIT-- (A) = REMAINING WORD COUNT

 RTRX     LJM    **
 RTR      EQU    *-1
          LDC    H0A00       READ THE T-REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          IAM    DTRBCNT,DC  T-REGISTER BYTE COUNT
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
          ZJN    RTR10       ALL WORDS RECEIVED
          STML   RTR233      SAVE RESIDUE OF THIS INPUT
          AOML   RTR111      COUNT THE ERROR
          LCN    12B         SET NEGATIVE
          STML   RTR233      SAVE RESIDUE OF THIS INPUT
 RTR10    LDML   DTRBCNT     MOVE TO CPU BUFFER
          STML   RTRBCNT     REMAINING T-REGISTER BYTE COUNT DEBUGGING
          RJM    RTRCK       CHECK FOR CORRECT VALUES
          LJM    RTRX

*DTRBCNT  BSSZ   1           DEBUGGING T-REGISTER VALUE
*DTRRMAU  BSSZ   1           DEBUGGING RMA UPPER VALUE
*DTRRMAL  BSSZ   1           DEBUGGING RMA LOWER VALUE
 RTR111   DATA   0           COUNT THE ERROR
 RTR233   DATA   0           SAVE RESIDUE OF THIS INPUT
 RTKCK    DATA   0           T-REG NONZERO
 RTKCK2   DATA   0   T-REG NOT CORRECT UPDATED
          SPACE  5,20


** NAME-- RTRCK
*
** PURPOSE-- CHECK FOR UPDATED T-REGISTER VALUE
*
** EXIT-- (A) = NONZERO IS AN ERROR

 RTRCKX   LJM    **
 RTRCK    EQU    *-1
          LDML   DTRBCNT     ZERO IS GOOD XFER
          ZJN    RTRCK10
          AOML   RTKCK       T-REG NONZERO
          UJN    RTRCKX
 RTRCK10  LDML   XBC         GET START VALUE
          RAML   DTRRMAL     ADD RMA LOWER VALUE
          SHN    -16
          RAML   DTRRMAU     ADD RMA UPPER VALUE
          LDML   XBC         GET START VALUE
          RAML   XRMAL       ADD RMA LOWER START VALUE
          SHN    -16
          RAML   XRMA        ADD RMA UPPER START VALUE
          LMML   DTRRMAU
          NJN    RTRCKX      T-REG NOT CORRCT UPDATED
          LDML   XRMAL       LOAD RMA LOWER START VALUE
          LMML   DTRRMAL
          ZJN    RTRCKX
 RTRCK20  AOML   RTKCK2      T-REG NOT CORRECT UPDATED
          LJM    RTRCKX      A=0 GOOD TRANSFER


** NAME -- WAITVI
*
** PURPOSE -- WAIT SLAVE_IN STATE DOWN
*
** EXIT -- RETURN IF SLAVE IN IS DOWN, ELSE RJM MAIN50

          SPACE  2
 WAITVIX  LJM    **
 WAITVI   EQU    *-1
 WAITVI1  LDN    0
          STML   IPIVCNT          ZERO OUT RETRIES THIS CALL
 WAITVI5  DCN    DC+40B
          LDC    H00E1            READ IPI STATUS REGISTER
          FAN    DC
          LDN    0
 WAITVI10 IJM    WAITVI20,DC      CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    WAITVI10         ELSE, WAIT
          UJK    WAITVI60         EXIT ON TIMEOUT
 WAITVI20 ACN    DC
          LDC    6400
 WAITVI30 IJM    WAITVI61,DC      EXIT IF CHANNEL INACTIVE
          FJM    WAITVI40,DC      CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    WAITVI30         ELSE, WAIT
          UJK    WAITVI62         EXIT ON TIMEOUT
 WAITVI40 LDN    1
          IAM    IPIVSTA,DC       READ CHANNEL WORD
          NJK    WAITVI63         EXIT IF NOTHING READ
          DCN    DC+40B
          LDML   IPIVSTA
          STML   IPISTAT          SAVE IN NORMAL STATUS
          SHN    2
          MJK    WAITVI50         CHECK FOR ERROR BIT
          SHN    2
          MJK    WAITVI55         CHECK FOR BUFFER NOT EMPTY
          SHN    2
          PJK    WAITVIX          EXIT WHEN SLAVE IN IS DOWN
          AOML   IPIVCNT          COUNT THE RETRIES IN THIS CALL

*                                 * DEBUG PC HANG
*                                 * THIS ROUTINE DOES NOT WORK
*                                 * NEEDS MAYBE AN ADDITIONAL DELAY
          SHN    2
          PJK    WAITVI5          JUST KEEP WAITING FOR VI TO GO DOWN
 WAITVI71 LDML   IPIVSTA
          STML   IPIVER7          SAVE IT FOR DUMP ANALYSIS
          LPC    56000B           MASK FOR ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT
          LMC    56000B           CHECK FOR ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
          NJN    WAITVI41         JUMP WHEN NOT ALL SET
          AOML   IPIVER8          SLAVE IN DID NOT DROP - COUNT ERROR
 WAITVI41 LDML   IPIVSTA
          LPC    16000B           MASK FOR SEL-OUT, SLAVE-IN, MSTR-OUT SET
          LMC    16000B           CHECK FOR SEL-OUT, SLAVE-IN, MSTR-OUT SET
          NJK    WAITVI5          JUST KEEP WAITING FOR VI TO GO DOWN
          AOML   IPIVER9          COUNT ERROR
*                                 * DEBUG END PC HANG
          RJM    RDIPER           TRY TO GET THE IPI ERROR IF POSSIBLE
          LDC    H0000            RESET THE IPI ADAPTER, TOO SEE IF WE CAN CONTINUE
          FAN    DC               MAYBE, RELEASE THE PC FROM A HANG SITUATION
          LDC    100D
          RJM    PAUS             WAIT 100 U-SEC
          SFM    WAITVI42,DC      CLEAR CHANNEL FLAG
 WAITVI42 LDN    H0000            MASTER CLEAR ADAPTER
          FAN    DC
          LDC    100D
          RJM    PAUS             WAIT 100 U-SEC
          IJM    WAITVI72,DC      CONTINUE IF CHANNEL INACTIVE
          AOML   IPIVERA          UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          DCN    DC+40B
 WAITVI72 LDC    0#7E42           SELECT TRANSFER RATE = 10MB/ 20MHZ
          FAN    DC
          RJM    MAIN50           DO A RETRY, WILL CAUSE AN ITF AND SO RESET THE ADAPTER
*         RJM    HANG             * STOP THE PPU AND LOOK AT THE LEDS OF THE PC
*                                 * DEBUG END PC HANG

 WAITVI50 AOML   IPIVER4          COUNT THE ERROR BITS - PROBABLY NOW ALWAYS SET
*         RJM    RDIPER           GET THE IPI ERROR - TAKE IT OUT FOR NOW
          LDML   IPIVSTA
          SHN    4
          PJN    WAITVI70         CHECK FOR SLAVE IN DOWN
 WAITVI55 AOML   IPIVER4,TROPC    COUNT BUFFER NOT EMPTY
*         RJM    RDIPER           GET THE IPI ERROR - TAKE IT OUT FOR NOW
          UJN    WAITVI70         CHECK FOR SLAVE IN DOWN
 WAITVI60 AOML   IPIVER0          COUNT INACTIVE TIMEOUT
*         RJM    RDIPER           DISABLED - GET THE IPI ERROR WILL FAIL, TOO
          RJM    MAIN50           THROTTLING OR NOT IS THE QUESTION
 WAITVI61 AOML   IPIVER1          COUNT STILL ACTIVE
          UJK    WAITVI1          RETRY - SHOULD NOT HAPPEN
 WAITVI62 AOML   IPIVER2          COUNT FULL TIMEOUT
          UJK    WAITVI1          RETRY
 WAITVI63 AOML   IPIVER3          COUNT EMTRY READ
          UJK    WAITVI1          RETRY - IS THIS POSSIBLE
 WAITVI70 LDML   IPIVSTA          ALSO CHECK FOR SLAVE IN DOWN
          SHN    6
          PJK    WAITVIX          EXIT WHEN SLAVE IN IS DOWN
          RJM    RDIPER           TRY TO GET THE IPI ERROR IF POSSIBLE
          RJM    MAIN50           THROTTLING OR NOT IS THE QUESTION
*         LJM    WAITVI1          JUST KEEP WAITING FOR VI TO GO DOWN
*         LJM    WAITVI71         TRY TO CLEAR SELECT OUT AND MASTER OUT

*IPIVSTA  DATA   0                IPI STATUS REGISTER
*IPIVER0  DATA   0                COUNT THE FUNCTION TIMEOUTS
*IPIVER1  DATA   0                COUNT THE CHANNEL INACTIVES
*IPIVER2  DATA   0                COUNT THE INPUT TIMEOUTS
*IPIVER3  DATA   0                COUNT THE NOTHING READ
 IPIVER4  DATA   0                COUNT ERROR FLAG SET
*         BSSZ   4                COUNT BUFFER NOT EMPTY - RCP, WCP, RDB, WDB
 IPIVCNT  DATA   0                COUNT THE RETRIES THIS CALL
*IPIVER7  DATA   0                IPIVTAT AT DEBUG CONDITION - PC HANG
*IPIVER8  DATA   0                COUNT ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
*IPIVER9  DATA   0                COUNT SEL-OUT, SLAVE-IN, MSTR-OUT SET
*IPIVERA  DATA   0                UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          SPACE  5,20


** NAME-- GESTAT
*
** PURPOSE-- GET ALL ADAPTER STATUS

 GESTATX  LJM    **
 GESTAT   EQU    *-1
          LDC    H0700       OPERATIONAL STATUS
          RJM    RDRGS       READ THE REGISTER
          STML   DOPSTA      DEBUGGING OPERATIONAL STATUS
          LDC    H00E1       IPI STATUS
          RJM    RDRGS       READ THE REGISTER
          STML   DIPISTA     DEBUGGING IPI STATUS
          LDC    H00F1       IPI ERROR STATUS
          RJM    RDRGS       READ THE REGISTER
          STML   DIERSTA     DEBUGGING IPI ERROR STATUS
          LDC    H0600       DMA ERROR STATUS
          RJM    RDRGS       READ THE REGISTER
          STML   DDMASTA     DEBUGGING DMA ERROR STATUS
          UJN    GESTATX

*DOPSTA   BSSZ   1           DEBUGGING OPERATIONAL STATUS
*DIPISTA  BSSZ   1           DEBUGGING IPI STATUS
*DIERSTA  BSSZ   1           DEBUGGING IPI ERROR STATUS
*DDMASTA  BSSZ   1           DEBUGGING DMA ERROR STATUS
*DTRBCNT  BSSZ   1           DEBUGGING T-REGISTER VALUE
*DTRRMAU  BSSZ   1           DEBUGGING RMA UPPER VALUE
*DTRRMAL  BSSZ   1           DEBUGGING RMA LOWER VALUE
          SPACE  5,20


** NAME-- RDRGS
*
** PURPOSE-- READ REGISTER DURING STATUS
*
** ENTRY--  A = FUNCTION CODE
** EXIT--  A = STATUS WORD OR 777XXB

 RDRGSX   LJM    **
 RDRGS    EQU    *-1
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
          FAN    DC          ISSUE THE FUNCTION
          STML   FUNC99      SAVE THE FUNCTION
          LDC    77700B      RETURN (FUNCTION TIMEOUT)
          AJM    RDRGS10,DC  EXIT IF CHANNEL STILL ACTIVE
          ACN    DC
          LDC    77710B      RETURN (DATA TIMEOUT)
          EJM    RDRGS10,DC  NO STATUS, ERROR EXIT
          IAN    DC
          STML   RDRGSST     SAVE STATUS WORD
          UJN    RDRGSX
 RDRGS10  STML   RDRGERR     SAVE INFO FAILING READ REGISTER STATUS
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
          AOML   RDRGERC     READ REGISTER ERROR COUNTER
          LCN    0           JUST TO FLAG STATUS FUNCTION ERROR
*         LDML   RDRGSST     LOAD STATUS WORD EQUAL ERROR INFO
          LJM    RDRGSX      RETURN

 FUNC99   DATA   0           LAST STATUS FUNCTION
 RDRGSST  DATA   0           LAST STATUS WORD
 RDRGERR  DATA   0           FAILING INFO READ REGISTER ERROR
 RDRGERC  DATA   0           READ REGISTER ERROR COUNTER
          SPACE  5,20


** NAME-- ROS
*
** PURPOSE-- READ OPERATIONL STATUS
*
          SPACE  2

 ROSX     LJM    **
 ROS      EQU    *-1
          LDC    H0700
          RJM    FUNC
          ACN    DC
          EJM    ROS10,DC
          IAN    DC
          STML   ROSOS
          UJN    ROSX
 ROS10    AOML   ROSOE     COUNT THE ERROR
          RJM    MAIN50    TRY AGAIN

 ROSOS    DATA   0
 ROSOE    DATA   0

** NAME-- WFTE
*
** PURPOSE-- WAIT FOR T PRIME REGISTER EMPTY
*
*  EXIT - (A) .NE. 0 IF T PRIME REGISTER GOES EMPTY
          SPACE  2

 WFTEX    LJM    **
 WFTE     EQU    *-1
          LDC    6666
          STML   WFTEW
 WFTE10   RJM    ROS       READ OPERATIONAL STATUS
          LPN    2
          NJN    WFTEX     T PRIME IS EMPTY
          SOML   WFTEW
          NJN    WFTE10
          AOML   WFTEE     COUNT THE TIMEOUTS
          UJN    WFTEX

 WFTEW    DATA   0
 WFTEE    DATA   0
          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 -- RDIPER
*
** PURPOSE -- READ IPI ERROR REGISTER
*
** EXIT -- (A) =

          SPACE  2
 RDIPERX  LJM    **
 RDIPER   EQU    *-1
          IJM    RDIPER5,DC
          DCN    DC+40B           ENSURE CHANNEL IS INACTIVE
          AOML   IPIERR4
 RDIPER5  LDC    H00F1            READ IPI ERROR REGISTER
          FAN    DC
          LDC    6400
 RDIPER10 IJM    RDIPER20,DC      CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    RDIPER10         ELSE, WAIT
          UJK    RDIPER50         EXIT ON TIMEOUT
 RDIPER20 ACN    DC
          LDC    6400
 RDIPER30 IJM    RDIPER51,DC      EXIT IF CHANNEL INACTIVE
          FJM    RDIPER40,DC      CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    RDIPER30         ELSE, WAIT
          UJK    RDIPER52         EXIT ON TIMEOUT
 RDIPER40 LDN    1
          IAM    IPIERR,DC        READ CHANNEL WORD
          NJK    RDIPER53         EXIT IF NOTHING READ
          DCN    DC+40B
          LDML   IPIERR
          ZJK    RDIPERX          NO BITS ARE SET - GO BANANAS

          SBML   IPIERRP          DO NOT STORE VALUE IN LOG, WHEN SAME AS PREVIOUS ERROR
          ZJK    RDIPER60         GOT SAME ERROR AS BEFORE, ANALYZE IT

          LDML   IPIERR           UPDATE PREVIOUS ERROR
          STML   IPIERRP

* FOR NOW, WE JUST HANDLE IT LIKE ALL OTHER ERRORS, AS WE WANNA SEE WHAT WE GET
*         SCN    0#10             CLEAR IPI SEQUENCE ERROR - PROBABLY ALWAYS SET
*         ZJK    RDIPERX          NO BITS ARE SET

          LDC    IPIELOG1         STORE THE ERROR IN THE CIRCULAR LOG
          ADML   IPIELOGI
          STML   RDIPER41+1
          LDML   IPIERR
 RDIPER41 STML   *
          AOML   IPIELOGI
          SBN    32
          NJN    RDIPER60
          LDN    0                RESET INDEX
          STML   IPIELOGI
          UJN    RDIPER60         ANALYZE THE ERROR


* COUNT FUNCTION TIMEOUT ERRORS

 RDIPER50 AOML   IPIERR0          E1 FUNCTION TIMEOUT
          UJN    RDIPER54
 RDIPER51 AOML   IPIERR1          CHANNEL INACTIVE
          UJN    RDIPER54
 RDIPER52 AOML   IPIERR2          FULL TIMEOUT
          UJN    RDIPER54
 RDIPER53 AOML   IPIERR3          NOTHING READ
          UJN    RDIPER54
 RDIPER54 DCN    DC+40B           LEAVE WITH CHANNEL INACTIVE
          UJK    RDIPERX


* ANALYZE ERROR BITS

 RDIPER60 LDML   IPIERR
          SHN    48-46            BIT 48 -CP- BUFFER OVERFLOW/UNDERFLOW - MAYBE, THIS IS IT
          MJK    RDIPER80
 RDIPER61 LDML   IPIERR
          SHN    50-46            BIT 50 -SP- SYNC COUNTER PARITY ERROR
          MJK    RDIPER81
 RDIPER62 LDML   IPIERR
          SHN    51-46            BIT 51 -PP- PERIOD COUNTER PARITY ERROR
          MJK    RDIPER82
 RDIPER63 LDML   IPIERR
          SHN    52-46            BIT 52 -FU- FUNCTION UPPER PARITY ERROR
          MJK    RDIPER83
 RDIPER64 LDML   IPIERR
          SHN    53-46            BIT 53 -FL- FUNCTION LOWER PARITY ERROR
          MJK    RDIPER84
 RDIPER65 LDML   IPIERR
          SHN    56-46            BIT 56 -FL- LOST DATA
          MJK    RDIPER85
 RDIPER66 LDML   IPIERR
          SHN    57-46            BIT 57 -UB- UPPER DATA PARITY ERROR
          MJK    RDIPER86
 RDIPER67 LDML   IPIERR
          SHN    58-46            BIT 58 -LB- LOWER DATA PARITY ERROR
          MJK    RDIPER87
 RDIPER68 LDML   IPIERR
          SHN    59-46            BIT 59 -SE- LOWER DATA PARITY ERROR
          MJK    RDIPER88
 RDIPER69 LDML   IPIERR
          SHN    60-46            BIT 60 -AP- UPPER IPI PARITY ERROR
          MJK    RDIPER89
 RDIPER70 LDML   IPIERR
          SHN    61-46            BIT 61 -BP- LOWER IPI PARITY ERROR
          MJK    RDIPER90
 RDIPER71 LDML   IPIERR
          SHN    62-46            BIT 62 -IP- LOWER IPI PARITY ERROR
          MJK    RDIPER91
 RDIPER72 UJK    RDIPERX          CLEAR THE ERROR IS DONE VIA MAIN50

* COUNT THE BITS

 RDIPER80 AOML   IPIERR48         BIT 48 -CP- BUFFER OVERFLOW/UNDERFLOW
          AOML   IPIERR5          COUNT THE BUFFER OVERFLOW/UNDERFLOW ERROR
          UJK    RDIPER61
 RDIPER81 AOML   IPIERR50         BIT 50 -SP- SYNC COUNTER PARITY ERROR
          UJK    RDIPER62
 RDIPER82 AOML   IPIERR51         BIT 51 -PP- PERIOD COUNTER PARITY ERROR
          UJK    RDIPER63
 RDIPER83 AOML   IPIERR52         BIT 52 -FU- FUNCTION UPPER PARITY ERROR
          UJK    RDIPER64
 RDIPER84 AOML   IPIERR53         BIT 53 -FL- FUNCTION LOWER PARITY ERROR
          UJK    RDIPER65
 RDIPER85 AOML   IPIERR56         BIT 56 -FL- LOST DATA
          UJK    RDIPER66
 RDIPER86 AOML   IPIERR57         BIT 57 -UB- UPPER DATA PARITY ERROR
          UJK    RDIPER67
 RDIPER87 AOML   IPIERR58         BIT 58 -LB- LOWER DATA PARITY ERROR
          UJK    RDIPER68
 RDIPER88 AOML   IPIERR59         BIT 59 -SE- LOWER DATA PARITY ERROR
          UJK    RDIPER69
 RDIPER89 AOML   IPIERR60         BIT 60 -AP- UPPER IPI PARITY ERROR
          UJK    RDIPER70
 RDIPER90 AOML   IPIERR61         BIT 61 -BP- LOWER IPI PARITY ERROR
          UJK    RDIPER71
 RDIPER91 AOML   IPIERR62         BIT 62 -IP- LOWER IPI PARITY ERROR
          UJK    RDIPER72         CLEAR THE ERROR AND EXIT

 IPIERR   DATA   0                IPI ERROR REGISTER
 IPIERRP  DATA   0                IPI ERROR REGISTER PREVIOUS ERROR
*IPIERR0  DATA   0                COUNT THE FUNCTION TIMEOUTS
*IPIERR1  DATA   0                COUNT THE CHANNEL INACTIVES
*IPIERR2  DATA   0                COUNT THE INPUT TIMEOUTS
*IPIERR3  DATA   0                COUNT THE NOTHING READ
*IPIERR4  DATA   0                COUNT CHANNEL ACTIVE AT ENTRANCE
*IPIERR5  DATA   0                COUNT BUFFER NOT EMPTY
 IPIELOG1 BSSZ   32               LOG OF IPI ERROR WORDS
 IPIELOGI DATA   0                INDEX
*IPIERR48 DATA   0                BIT 48 -CP- BUFFER OVERFLOW/UNDERFLOW
*IPIERR50 DATA   0                BIT 50 -SP- SYNC COUNTER PARITY ERROR
*IPIERR51 DATA   0                BIT 51 -PP- PERIOD COUNTER PARITY ERROR
 IPIERR52 DATA   0                BIT 52 -FU- FUNCTION UPPER PARITY ERROR
 IPIERR53 DATA   0                BIT 53 -FL- FUNCTION LOWER PARITY ERROR
*IPIERR56 DATA   0                BIT 56 -FL- LOST DATA
*IPIERR57 DATA   0                BIT 57 -UB- UPPER DATA PARITY ERROR
 IPIERR58 DATA   0                BIT 58 -LB- LOWER DATA PARITY ERROR
 IPIERR59 DATA   0                BIT 59 -SE- LOWER DATA PARITY ERROR
*IPIERR60 DATA   0                BIT 60 -AP- UPPER IPI PARITY ERROR
*IPIERR61 DATA   0                BIT 61 -BP- LOWER IPI PARITY ERROR
*IPIERR62 DATA   0                BIT 62 -IP- LOWER IPI PARITY ERROR
          SPACE  5,20


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

          SPACE  2
 WTCHSIX  LJM    **
 WTCHSI   EQU    *-1
 WTCHSI1  LDN    0
          STML   IPISER5          ZERO OUT RETRIES THIS CALL
 WTCHSI5  DCN    DC+40B
          LDC    H00E1            READ IPI STATUS REGISTER
          FAN    DC
          LDN    0                WAS 6400
 WTCHSI10 IJM    WTCHSI20,DC      CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    WTCHSI10         ELSE, WAIT
          UJK    WTCHSI60         EXIT ON TIMEOUT
 WTCHSI20 ACN    DC
          LDC    6400
 WTCHSI30 IJM    WTCHSI61,DC      EXIT IF CHANNEL INACTIVE
          FJM    WTCHSI40,DC      CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    WTCHSI30         ELSE, WAIT
          UJK    WTCHSI62         EXIT ON TIMEOUT
 WTCHSI40 LDN    1
          IAM    IPISTAT,DC       READ CHANNEL WORD
          NJK    WTCHSI63         EXIT IF NOTHING READ
          DCN    DC+40B
          LDML   IPISTAT
          SHN    2
          MJK    WTCHSI50         CHECK FOR ERROR BIT
          SHN    2
          MJK    WTCHSI55         CHECK FOR BUFFER NOT EMPTY
          SHN    2
          PJK    WTCHSIX          EXIT WHEN SLAVE IN IS DOWN
          AOML   IPISER5          COUNT THE RETRIES IN THIS CALL
*                                 * ORG CODE
          UJK    WTCHSI5          JUST KEEP WAITING FOR VI TO GO DOWN

*                                 * DEBUG PC HANG
*                                 * THIS ROUTINE DOES NOT WORK
*                                 * NEEDS MAYBE AN ADDITIONAL DELAY
          SHN    2
          PJK    WTCHSI45         KEEP ON WAITING
 WTCHSI71 LDML   IPISTAT
          STML   IPISER7          SAVE IT FOR DUMP ANALYSIS
          LPC    56000B           MASK FOR ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT
          LMC    56000B           CHECK FOR ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
          NJN    WTCHSI41         JUMP WHEN NOT ALL SET
          AOML   IPISER8          COUNT ERROR
 WTCHSI41 LDML   IPISTAT
          LPC    16000B           MASK FOR SEL-OUT, SLAVE-IN, MSTR-OUT SET
          LMC    16000B           CHECK FOR SEL-OUT, SLAVE-IN, MSTR-OUT SET
          NJN    WTCHSI45         CONTINUE WHEN NOT ALL SET

          AOML   IPISER9          COUNT ERROR
*         DCN    DC+40B           DONE AND COUNTED IN ROUTINE RDIPER
*                                 * DEBUG END PC HANG
          RJM    RDIPER           TRY TO GET THE IPI ERROR IF POSSIBLE
          LDC    H0000            RESET THE IPI ADAPTER, TOO SEE IF WE CAN CONTINUE
          FAN    DC               MAYBE, RELEASE THE PC FROM A HANG SITUATION
          LDC    100D
          RJM    PAUS             WAIT 100 U-SEC
          SFM    WTCHSI42,DC      CLEAR CHANNEL FLAG
 WTCHSI42 LDN    H0000            MASTER CLEAR ADAPTER
          FAN    DC
          LDC    100D
          RJM    PAUS             WAIT 100 U-SEC
          IJM    WTCHSI72,DC      CONTINUE IF CHANNEL INACTIVE
          AOML   IPISERA          UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          DCN    DC+40B
 WTCHSI72 LDC    0#7E42           SELECT TRANSFER RATE = 10MB/ 20MHZ
          FAN    DC
          RJM    MAIN50           DO A RETRY, WILL CAUSE AN ITF AND SO RESET THE ADAPTER
*         RJM    HANG             * STOP THE PPU AND LOOK AT THE LEDS OF THE PC
*                                 * DEBUG END PC HANG

 WTCHSI45 AOML   IPISER6          COUNT THE TOTAL RETRIES
          UJK    WTCHSI5          JUST KEEP WAITING FOR VI TO GO DOWN

*                                 * END DISABLED DEBUG CODE

 WTCHSI50 AOML   IPISER4          COUNT THE ERROR BITS - PROBABLY NOW ALWAYS SET
*         RJM    RDIPER           GET THE IPI ERROR - TAKE IT OUT FOR NOW
          LDML   IPISTAT
          SHN    4
          PJN    WTCHSI70         CHECK FOR SLAVE IN DOWN
 WTCHSI55 AOML   IPISER4,TROPC    COUNT BUFFER NOT EMPTY
*         RJM    RDIPER           GET THE IPI ERROR - TAKE IT OUT FOR NOW
          UJN    WTCHSI70         CHECK FOR SLAVE IN DOWN

 WTCHSI60 AOML   IPISER0          COUNT INACTIVE TIMEOUT &
          AOML   IPISER0,TROPC    FOR EACH REQUEST TYPE
*                                 * THIS WAS NOT IN ORG CODE
          RJM    RDIPER           GET THE IPI ERROR - TAKE IT OUT FOR NOW

*         UJK    WTCHSI1          RETRY - SHOULD NOT HAPPEN
          RJM    MAIN50           ACTUALLY, DOES HAPPEN! THROTTLING OR NOT IS THE QUESTION
 WTCHSI61 AOML   IPISER1          COUNT STILL ACTIVE &
          UJK    WTCHSI1          RETRY - SHOULD NOT HAPPEN
 WTCHSI62 AOML   IPISER2          COUNT FUNCTION TIMEOUT
          UJK    WTCHSI1          RETRY
 WTCHSI63 AOML   IPISER3          COUNT EMTRY READ &
          UJK    WTCHSI1          RETRY - IS THIS POSSIBLE

 WTCHSI70 LDML   IPISTAT          ALSO CHECK FOR SLAVE IN DOWN
          SHN    6
          PJK    WTCHSIX          EXIT WHEN SLAVE IN IS DOWN
*                                 * THIS WAS NOT IN ORG CODE
          RJM    RDIPER           TRY TO GET THE IPI ERROR IF POSSIBLE

*         RJM    MAIN50           THROTTLING OR NOT IS THE QUESTION
          LJM    WTCHSI1          JUST KEEP WAITING FOR VI TO GO DOWN
*         LJM    WTCHSI71         TRY TO CLEAR SELECT OUT AND MASTER OUT

*IPISTAT  DATA   0                IPI STATUS REGISTER
 IPISER0  DATA   0                COUNT THE FUNCTION TIMEOUTS
          BSSZ   4                COUNT THE FUNCTION TIMEOUTS - RCP, WCP, RDB, WDB
*IPISER1  DATA   0                COUNT THE CHANNEL INACTIVES
*IPISER2  DATA   0                COUNT THE INPUT TIMEOUTS
*IPISER3  DATA   0                COUNT THE NOTHING READ
*IPISER4  DATA   0                COUNT ERROR FLAG SET
*         BSSZ   4                COUNT BUFFER NOT EMPTY - RCP, WCP, RDB, WDB
 IPISER5  DATA   0                COUNT THE RETRIES THIS CALL
 IPISER6  DATA   0                COUNT THE RETRIES TOTAL CALL
*IPISER7  DATA   0                IPISTAT AT DEBUG CONDITION - PC HANG
*IPISER8  DATA   0                COUNT ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
*IPISER9  DATA   0                COUNT SEL-OUT, SLAVE-IN, MSTR-OUT SET
 IPISERA  DATA   0                UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          SPACE  5,20


** NAME -- WAITAI
*
** PURPOSE -- WAIT FOR ATTENTION_IN
*
          SPACE   2
 WAITAIX  LJM    **
 WAITAI   EQU    *-1
          LDN    0
          STML   WAITM            RESET TIMER
 WAITAI05 DCN    DC+40B
          LDC    H00E1            READ IPI STATUS REGISTER
          FAN    DC
          LDN    0
 WAITAI10 IJM    WAITAI20,DC      CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    WAITAI10         ELSE, WAIT
          UJN    WAITAI50         EXIT ON TIMEOUT
 WAITAI20 ACN    DC
          LDN    0
 WAITAI30 IJM    WAITAI50,DC      EXIT IF CHANNEL INACTIVE
          FJM    WAITAI40,DC      CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    WAITAI30         ELSE, WAIT
          UJN    WAITAI50         EXIT ON TIMEOUT
 WAITAI40 LDN    1
          IAM    WAITSTAT,DC      READ CHANNEL WORD
          NJK    WAITAI50         EXIT IF NOTHING READ
          DCN    DC+40B
          LDML   WAITSTAT
          SHN    3                CHECK FOR ATTENTION-IN
          MJK    WAITAIX          EXIT ON ATTENTION IN SET
 WAITAI50 AOML   WAITMCNT         DEBUG - COUNT TIMEOUTS
          SOML   WAITM            DECREMENT TIMER COUNTER
          NJK    WAITAI05         WAIT ON PP IDLE CHECK COUNTER
          RJM    PPRQ             CHECK FOR PP IDLE REQUEST
          UJK    WAITAI05         KEEP WAITING

 WAITSTAT DATA   0
 WAITM    DATA   0
 WAITMCNT DATA   0                COUNT THE RETRIES, TIMEOUTS WAITING FOR AI
          SPACE  5,20


** NAME-- RES
*
** PURPOSE-- READ THE IPI ERROR REGISTER
          SPACE   2
* CALL RDIPER INSTEAD
 RESX     LJM    **
 RES      EQU    *-1
          RJM    RDIPER
          LDML   IPIERR
          STML   RESA
          UJK    RESX

 RESA     DATA   0


** 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-- 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-- 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
          LDN    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
          LDN    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


** 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

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



* USE AN EXTRA READ

* SAVE T-REGISTER VALUES
* READ A DATA BLOCK
* SAVE ALL STATUS BYTES
* COMMAND PACKET
* SET UP TO READ 16 CM WORDS OF LABEL
* SET UP T-REG
* GO AND XFER THE WORDS FROM PICO TO COMMUNICATION BUFFER
* SAVE ALL STATUS BYTES
* IF NO ERROR RESTORE T-REGISTER
* SEND RESPONSE FOR A GOOD READ
* ELSE:
* IF ANY ERROR, COUNT THE ERROR
* HANG THE PPU
* STEP TWO:
* REREAD THE FAILING DATA BLOCK


 XOCP     BSSZ   16             X COMMAND PACKET BUFFER
* IS UPDATED BY MAIN ROUTINE, CYL,TRK,SEC AS ORG
* LENGTH IS SET TO 32 BYTES, FUNCTION TO READ

* THESE THREE VALUES ARE THE ORIGINAL ONES
 XBC      DATA   0           SAVE BYTE LENGTH
 XRMA     DATA   0           SAVE XRMA UPPER
 XRMAL    DATA   0           SAVE XRMA LOWER

* THESE THREE VALUES ARE SAVED DURING READ
*DTRBCNT  DATA   0           SAVE BYTE LENGTH
*DTRRMAU  DATA   0           SAVE XRMA UPPER
*DTRRMAL  DATA   0           SAVE XRMA LOWER


** NAME-- EXTRD
*
** PURPOSE-- DO AN EXTRA READ TO DETECT DATA ERRORS

 XREADX   LJM    **
 XREAD    EQU    *-1

          LDML   XOCP+DAR1   LOAD CYLINDER NUMBER
          ZJN    XREADX      DONT CHECK ON CYLINDER ZERO
          LDC    20B         SET LENGTH TO 32 BYTES
          STML   XOCP+TL2    STORE THE LOWER LENGTH VALUE
          LDC    2000B       READ FUNCTION
          STML   XOCP+REQ    STORE IT AS THE REQUEST CODE
          RJM    XWCP        GO WRITE THE COMMAND PACKET

          LDC    20B         SET LENGTH TO 32 BYTES
          STDL   BC
          LDML   IPIT+/PIT/P.CBUF        ADDRESS OF COMMUNICATION BUFFER
          STDL   RMA
          LDML   IPIT+/PIT/P.CBUF+1      ADDRESS OF COMMUNICATION BUFFER
          STDL   RMA+1
          RJM    XRDB        GO READ THE SHORT DATABLOCK

          LDML   DTRBCNT     RESTORE BYTE LENGTH
          STDL   BC
          LDML   DTRRMAU     RESTORE XRMA UPPER
          STDL   RMA
          LDML   DTRRMAL     RESTORE XRMA LOWER
          STDL   RMA+1
          LDDL   TROPC       GET LAST TRACE CODE
          SBN    3
          ZJK    XREAD30     WAS READ
          AOML   XREAD111    COUNT THE ERROR
 XREAD30  LJM    XREADX
*         RJM    HANG
 XREAD111 DATA   0           NOT A READ COUNT THE ERROR
          SPACE  5,20


** NAME-- XWCP
*
** PURPOSE-- WRITE COMMAND PACKET
*
** ENTRY
*         OCP - STARTING ADDRESS OF COMMAND PACKET
          SPACE  2
 XWCPX    LJM    **
 XWCP     EQU    *-1
          LDN    2           CODE FOR WRITE COMMAND PACKET
          STDL   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
          LDN    PACKL       GET LENGTH (FORCE FOR NOW)
          OAM    XOCP,DC     SEND PACKET
          STM    OAMRES      SAVE RESIDUE
          ZJN    XWCP10
          AOML   XWCP111     RESIDUE ERROR
 XWCP10   LDC    6400
 XWCP20   EJM    XWCP30,DC   IF CHANNEL EMPTY, XFER COMPLETE
          SBN    1
          NJN    XWCP20      ELSE, WAIT
          AOML   XWCP122     COUNT FULL ERROR
 XWCP30   RJM    XTCHSI      CHECK STATE OF SLAVE_IN
          RJM    XDCM        DESELECT CONTROLLER
          LJM    XWCPX

 XWCP111  DATA   0           COUNT RESIDUE ERROR
 XWCP122  DATA   0           COUNT FULL ERROR
          SPACE  5,20


** NAME -- XTCHSI
*
** PURPOSE -- WAIT SLAVE_IN STATE DOWN
*
** EXIT -- (A) = NEG IF SLAVE_IN IS SET

          SPACE  2
 XTCHSIX  LJM    **
 XTCHSI   EQU    *-1
 XTCHSI1  LDN    0
          STML   XPISER5     ZERO OUT RETRIES THIS CALL
 XTCHSI5  DCN    DC+40B
          LDC    H00E1       READ IPI STATUS REGISTER
          FAN    DC
          LDN    0           WAS 6400
 XTCHSI10 IJM    XTCHSI20,DC CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    XTCHSI10    ELSE, WAIT
 XTCHSI20 ACN    DC
          LDC    6400
 XTCHSI30 IJM    XTCHSI61,DC EXIT IF CHANNEL INACTIVE
          FJM    XTCHSI40,DC CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    XTCHSI30    ELSE, WAIT
          UJK    XTCHSI62    EXIT ON TIMEOUT
 XTCHSI40 LDN    1
          IAM    XPISTAT,DC  READ CHANNEL WORD
          DCN    DC+40B
          LDML   XPISTAT
          SHN    6
          PJK    XTCHSIX     EXIT WHEN SLAVE IN IS DOWN
          AOML   XPISER5     COUNT THE RETRIES IN THIS CALL
          SHN    2
          PJK    XTCHSI5

 XTCHSI60 AOML   XPISER0     COUNT INACTIVE TIMEOUT
*         UJK    XTCHSI1     RETRY - SHOULD NOT HAPPEN
          RJM    MAIN50      ACTUALLY, DOES HAPPEN! THROTTLING OR NOT IS THE QUESTION
 XTCHSI61 AOML   XPISER1     COUNT STILL ACTIVE
          UJK    XTCHSI1     RETRY - SHOULD NOT HAPPEN
 XTCHSI62 AOML   XPISER2     COUNT FUNCTION TIMEOUT
          UJK    XTCHSI1     RETRY

 XPISTAT  DATA   0           IPI STATUS REGISTER
 XPISER0  DATA   0           COUNT THE FUNCTION TIMEOUTS
 XPISER1  DATA   0           COUNT THE CHANNEL INACTIVES
 XPISER2  DATA   0           COUNT THE INPUT TIMEOUTS
 XPISER5  DATA   0           COUNTER
          SPACE  5,20


** NAME-- XDCM
*
** PURPOSE-- DESELECT THE CONTROLLER
          SPACE  2

 XDCMX    LJM    **
 XDCM     EQU    *-1
          LDC    0#79
          RJM    FUNC        DROP MASTER_OUT  - SAVE B_BUS STATUS
          LDN    0#01
          RJM    FUNC        GO DROP SELECT_OUT
          UJK    XDCMX       ALL DONE
          SPACE  5,20


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

          SPACE  2
 XRDBX    LJM    **
 XRDB     EQU    *-1
          LDN    3         CODE FOR READ
          STDL   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    XWTCRD    GO WAIT FOR READ TRANSFER COMPLETE
          RJM    DCM       DESELECT THE CONTROLLER
          RJM    RDIPER    TRY TO GET THE IPI ERROR IF POSSIBLE
          RJM    GESTAT    DEBUG CODE ONLY - DEBUGGING ONLY
          UJN    XRDBX
          SPACE  5,20


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

 XWTCRDX  LJM    **
 XWTCRD   EQU    *-1
          LDN    0
          STML   XWTC355     REPEAT COUNTER OPERATIONAL STATUS
 XWTC41   LDC    H0700       FUNCTION TO READ OPERATIONAL STATUS REGISTER
          RJM    FUNC
          ACN    DC
          FJM    XWTC42,DC   STATUS AVAILABLE
          AOML   XWTC133     NO OPERATIONAL STATUS AVAILABLE
          LCN    11          SET STATUS 177766B
          UJN    XWTC43
 XWTC42   IAN    DC          READ A WORD
 XWTC43   STML   XWTC211     SAVE OPERATIONAL STATUS
          ZJK    XWTC46      IMPOSSIBLE VALUE
          LPC    303B        MASK BITS 56, 57, 62, 63
          LMC    2           ONLY T REGISTER EMPTY BIT IS UP
          ZJN    XWTC44      TRANSFER IS COMPLETE
          AOML   XWTC355     INCREMENT REPEAT COUNTER OPERATIONAL STATUS
          SHN    2
          PJN    XWTC41      TRY IT AGAIN
          AOML   XWTC111     NO TRANSFER COMPLETE ERROR
*         UJN    XWTC44      JUST CONTINUE

          UJN    *+1         JUST HANG TO SEE IF THE ERROR IS DETECTED
*         RJM    HANG        JUST HANG TO SEE IF THE ERROR IS DETECTED

          RJM    MAIN50      GO RESET AND RETRY THE REQUEST
 XWTC44   RJM    XRTR        READ T-REG, CHECK IF BYTE COUNT EQUAL 0
          ZJN    XWTC45      BYTES ARE DONE, CHECK SLAVE IN
          STML   XWTC233     SAVE REMAINING BYTE COUNT
          AOML   XWTC144     NON ZERO T-REGISTER
          RJM    GESTAT      READ ALL REGISTERS - IF POSSIBLE
          UJN    *+1         JUST HANG
*         RJM    HANG
          RJM    MAIN50      GO RESET AND RETRY THE REQUEST
 XWTC45   RJM    WAITVI      READ IPI STATUS REGISTER
          LDML   IPIVSTA     GET IPI STATUS
          STML   XWTC222     SAVE VALUE HERE TOO
          LJM    XWTCRDX     RETURN
 XWTC46   AOML   XWTC122     ILLEGAL STATUS RECEIVED
          UJK    XWTC41

XWTC111   DATA   0           NO TRANSFER COMPLETE
XWTC122   DATA   0           ILLEGAL STATUS
XWTC133   DATA   0           NO OPERATIONAL STATUS AVAILABLE
XWTC144   DATA   0           NO T-REG READ OUT
XWTC211   DATA   0           OPERATIONAL STATUS
XWTC222   DATA   0           IPI STATUS REGISTER
XWTC233   DATA   0           SAVE REMAINING BYTE COUNT
XWTC355   DATA   0           REPEAT COUNTER OPERATIONAL STATUS
          SPACE  5,20


** NAME -- XAITVI
*
** PURPOSE -- WAIT SLAVE_IN STATE DOWN
*
** EXIT -- RETURN IF SLAVE IN IS DOWN, ELSE RJM MAIN50

          SPACE  2
 XAITVIX  LJM    **
 XAITVI   EQU    *-1
 XAITVI1  LDN    0
          STML   XPIVCNT          ZERO OUT RETRIES THIS CALL
 XAITVI5  DCN    DC+40B
          LDC    H00E1            READ IPI STATUS REGISTER
          FAN    DC
          LDN    0
 XAITVI10 IJM    XAITVI20,DC      CONTINUE IF CHANNEL INACTIVE
          SBN    1
          NJN    XAITVI10         ELSE, WAIT
          UJK    XAITVI60         EXIT ON TIMEOUT
 XAITVI20 ACN    DC
          LDC    6400
 XAITVI30 IJM    XAITVI61,DC      EXIT IF CHANNEL INACTIVE
          FJM    XAITVI40,DC      CONTINUE IF CHANNEL FULL
          SBN    1
          NJN    XAITVI30         ELSE, WAIT
          UJK    XAITVI62         EXIT ON TIMEOUT
 XAITVI40 LDN    1
          IAM    XPIVSTA,DC       READ CHANNEL WORD
          NJK    XAITVI63         EXIT IF NOTHING READ
          DCN    DC+40B
          LDML   XPIVSTA
          SHN    6
          PJK    XAITVIX          EXIT WHEN SLAVE IN IS DOWN
          AOML   XPIVCNT          COUNT THE RETRIES IN THIS CALL
          SHN    2
          PJK    XAITVI5          JUST KEEP WAITING FOR VI TO GO DOWN

 XAITVI71 LDML   XPIVSTA
          STML   XPIVER7          SAVE IT FOR DUMP ANALYSIS
          LPC    56000B           MASK FOR ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT
          LMC    56000B           CHECK FOR ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
          NJN    XAITVI41         JUMP WHEN NOT ALL SET
          AOML   XPIVER8          SLAVE IN DID NOT DROP - COUNT ERROR
 XAITVI41 LDML   XPIVSTA
          LPC    16000B           MASK FOR SEL-OUT, SLAVE-IN, MSTR-OUT SET
          LMC    16000B           CHECK FOR SEL-OUT, SLAVE-IN, MSTR-OUT SET
          NJK    XAITVI5          JUST KEEP WAITING FOR VI TO GO DOWN
          AOML   XPIVER9          COUNT ERROR
*                                 * DEBUG END PC HANG
          RJM    RDIPER           TRY TO GET THE IPI ERROR IF POSSIBLE
*         LDC    H0000            RESET THE IPI ADAPTER, TOO SEE IF WE CAN CONTINUE
*         FAN    DC               MAYBE, RELEASE THE PC FROM A HANG SITUATION
*         LDC    100D
*         RJM    PAUS             WAIT 100 U-SEC
*         SFM    XAITVI42,DC      CLEAR CHANNEL FLAG
*XAITVI42 LDN    H0000            MASTER CLEAR ADAPTER
*         FAN    DC
*         LDC    100D
*         RJM    PAUS             WAIT 100 U-SEC
*         IJM    XAITVI72,DC      CONTINUE IF CHANNEL INACTIVE
*         AOML   XPIVERA          UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
*         DCN    DC+40B
*XAITVI72 LDC    0#7E42           SELECT TRANSFER RATE = 10MB/ 20MHZ
*         FAN    DC
*         RJM    MAIN50           DO A RETRY, WILL CAUSE AN ITF AND SO RESET THE ADAPTER
          RJM    HANG             * STOP THE PPU AND LOOK AT THE LEDS OF THE PC

 XAITVI60 AOML   XPIVER0          COUNT INACTIVE TIMEOUT
          UJK    XAITVI1          RETRY
 XAITVI61 AOML   XPIVER1          COUNT STILL ACTIVE
          UJK    XAITVI1          RETRY - SHOULD NOT HAPPEN
 XAITVI62 AOML   XPIVER2          COUNT FULL TIMEOUT
          UJK    XAITVI1          RETRY
 XAITVI63 AOML   XPIVER3          COUNT EMTRY READ
          UJK    XAITVI1          RETRY - IS THIS POSSIBLE

 XPIVSTA  DATA   0                IPI STATUS REGISTER
 XPIVER0  DATA   0                COUNT THE FUNCTION TIMEOUTS
 XPIVER1  DATA   0                COUNT THE CHANNEL INACTIVES
 XPIVER2  DATA   0                COUNT THE INPUT TIMEOUTS
 XPIVER3  DATA   0                COUNT THE NOTHING READ
 XPIVER4  DATA   0                COUNT ERROR FLAG SET
 XPIVCNT  DATA   0                COUNT THE RETRIES THIS CALL
 XPIVER7  DATA   0                XPIVTAT AT DEBUG CONDITION - PC HANG
 XPIVER8  DATA   0                COUNT ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
 XPIVER9  DATA   0                COUNT SEL-OUT, SLAVE-IN, MSTR-OUT SET
 XPIVERA  DATA   0                UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION
          SPACE  5,20


** NAME-- XRTR
*
** PURPOSE-- READ THE T-REGISTER
*
** EXIT-- (A) = REMAINING WORD COUNT

 XRTRX    LJM    **
 XRTR     EQU    *-1
          LDC    H0A00       READ THE T-REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          IAM    XTRCNT,DC   T-REGISTER BYTE COUNT
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
          ZJN    XRTR10      ALL WORDS RECEIVED
          STML   XRTR233     SAVE RESIDUE OF THIS INPUT
          AOML   XRTR111     COUNT THE ERROR
          RJM    XTRCK       CHECK FOR CORRECT VALUES
 XRTR10   UJN    XRTRX

 XTRCNT   DATA   0           X T-REGISTER BYTE COUNT
 XTRRMAU  DATA   0           X RMA UPPER VALUE
 XTRRMAL  DATA   0           X RMA LOWER VALUE
 XRTR111  DATA   0           COUNT THE ERROR
 XRTR233  DATA   0           SAVE RESIDUE OF THIS INPUT
 XTKCK    DATA   0           T-REG NONZERO
 XTKCK2   DATA   0           T-REG NONZERO
          SPACE  5,20

** NAME-- XTRCK
*
** PURPOSE-- CHECK FOR UPDATED T-REGISTER VALUE
*
** EXIT-- (A) = NONZERO IS AN ERROR

 XTRCKX   LJM    **
 XTRCK    EQU    *-1
          LDML   XTRCNT     ZERO IS GOOD XFER
          ZJN    XTRCK10
          AOML   XTKCK       T-REG NONZERO
          UJN    XTRCKX
 XTRCK10  LDML   XBC         GET START VALUE
          RAML   XTRRMAL     ADD RMA LOWER VALUE
          SHN    -16
          RAML   XTRRMAU     ADD RMA UPPER VALUE
          LDML   XBC         GET START VALUE
          RAML   XRMAL       ADD RMA LOWER START VALUE
          SHN    -16
          RAML   XRMA        ADD RMA UPPER START VALUE
          LMML   XTRRMAU
          NJN    XTRCK20     T-REG NOT UPDATED
          LDML   XRMAL       LOAD RMA LOWER START VALUE
          LMML   XTRRMAL
          ZJN    XTRCKX
 XTRCK20  AOML   XTKCK2      T-REG NOT CORRECT UPDATED
          LJM    XTRCKX      A=0 GOOD TRANSFER
          SPACE  5,20

** 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    MAIN50           GO TRY AGAIN - WE PROBABLY GET THE SAME REQUEST
 ECODE    DATA   0
          SPACE  5,20

          BSS    10154B-*
 RSRD     BSS    0           RESONSE READ
          BSS    10200B-*
** RESPONSE STATUS BUFFER FOR THE CPU
 RSBCPU   BSS    0           RESPONSE BUFFER CPU
          DATA   0           PORT + CHANNEL
          DATA   0           STARTING CYLINDER
          DATA   0           STARING TRACK
          DATA   0           STARTING SECTOR
          DATA   0           CONTROL MODULE AND FACILITY
          DATA   0
          DATA   0
          DATA   0
 RTRBCNT  BSSZ   1           REMAINING T-REGISTER VALUE
          DATA   0           FUNCTION
          DATA   0           ID = 0
          DATA   1           ERROR ID ALWAYS 1
          DATA   0           COMMAND SEQUENCE NUMBER
 DIPISTA  BSSZ   1           DEBUGGING IPI STATUS
 DIERSTA  BSSZ   1           DEBUGGING IPI ERROR STATUS
          DATA   0
 DDMASTA  BSSZ   1           DEBUGGING DMA ERROR STATUS
 DOPSTA   BSSZ   1           DEBUGGING OPERATIONAL STATUS
          DATA   0
          DATA   0

* RESPONSE_PACKETS
 RPDATA   EQU    *
* BITS RELATED TO READ TROUBLESHOOTING
 DTREG    BSSZ   3           START VALUE OF T-REG + RMA
 DTRBCNT  BSSZ   1           DEBUGGING T-REGISTER VALUE
 DTRRMAU  BSSZ   1           DEBUGGING RMA UPPER VALUE
 DTRRMAL  BSSZ   1           DEBUGGING RMA LOWER VALUE
 DMAIN50  DATA   0           RJM ENTRY ADDRESS
 DDCMFTO  DATA   0           DEBUGGING DCM FUNCTION TIMEOUT
 WTC111   DATA   0           NO TRANSFER COMPLETE
 WTC122   DATA   0           ILLEGAL STATUS
 WTC133   DATA   0           NO OPERATIONAL STATUS AVAILABLE
 WTC144   DATA   0           NO T-REG READ OUT
 WTC211   DATA   0           OPERATIONAL STATUS
 WTC222   DATA   0           IPI STATUS REGISTER
 WTC355   DATA   0           REPEAT COUNTER OPERATIONAL STATUS
 IPIVSTA  DATA   0           IPI STATUS REGISTER
 IPIVER0  DATA   0           COUNT THE FUNCTION TIMEOUTS
 IPIVER1  DATA   0           COUNT THE CHANNEL INACTIVES
 IPIVER2  DATA   0           COUNT THE INPUT TIMEOUTS
 IPIVER3  DATA   0           COUNT THE NOTHING READ
 CMAIN50  DATA   0           COUNT ERROR FLAG SET
          BSSZ   4           COUNT BUFFER NOT EMPTY - RCP, WCP, RDB, WDB
 LOSTCNT  DATA   0           COUNT THE RETRIES THIS CALL
 IPIVER7  DATA   0           IPIVTAT AT DEBUG CONDITION - PC HANG
 IPIVER8  DATA   0           COUNT ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
 IPIVER9  DATA   0           COUNT SEL-OUT, SLAVE-IN, MSTR-OUT SET
 IPIVERA  DATA   0           UNEXPECTED ACTIVE AFTER MASTER CLEAR FUNCTION

* BITS NOT RELATED TO READ
 IPIERR0  DATA   0           COUNT THE FUNCTION TIMEOUTS
 IPIERR1  DATA   0           COUNT THE CHANNEL INACTIVES
 IPIERR2  DATA   0           COUNT THE INPUT TIMEOUTS
 IPIERR3  DATA   0           COUNT THE NOTHING READ
 IPIERR4  DATA   0           COUNT CHANNEL ACTIVE AT ENTRANCE
 IPIERR5  DATA   0           DETECT BUFFER NOT EMPTY
 IPIERRC5 DATA   0           COUNT BUFFER NOT EMPTY
 IPIERR48 DATA   0           BIT 48 -CP- BUFFER OVERFLOW/UNDERFLOW
 IPIERR50 DATA   0           BIT 50 -SP- SYNC COUNTER PARITY ERROR
 IPIERR51 DATA   0           BIT 51 -PP- PERIOD COUNTER PARITY ERROR
 IPIERR56 DATA   0           BIT 56 -FL- LOST DATA
 IPIERR57 DATA   0           BIT 57 -UB- UPPER DATA PARITY ERROR
 IPIERR60 DATA   0           BIT 60 -AP- UPPER IPI PARITY ERROR
 IPIERR61 DATA   0           BIT 61 -BP- LOWER IPI PARITY ERROR
 IPIERR62 DATA   0           BIT 62 -IP- LOWER IPI PARITY ERROR
 IPISTAT  DATA   0           IPI STATUS REGISTER
          BSSZ   4           COUNT THE FUNCTION TIMEOUTS - RCP, WCP, RDB, WDB
 IPISER1  DATA   0           COUNT THE CHANNEL INACTIVES
 IPISER2  DATA   0           COUNT THE INPUT TIMEOUTS
 IPISER3  DATA   0           COUNT THE NOTHING READ
 IPISER4  DATA   0           COUNT ERROR FLAG SET
          BSSZ   4           COUNT BUFFER NOT EMPTY - RCP, WCP, RDB, WDB
 IPISER7  DATA   0           IPISTAT AT DEBUG CONDITION - PC HANG
 IPISER8  DATA   0           COUNT ATT-IN, SEL-OUT, SLAVE-IN, MSTR-OUT SET
 IPISER9  DATA   0           COUNT SEL-OUT, SLAVE-IN, MSTR-OUT SET
 WTC233   DATA   0           SAVE REMAINING BYTE COUNT ON READ
 CPTSN    DATA   0           COMMAND PACKET SEQUENCE NUMBER
          BSSZ   5           FILLER
          SPACE  5,20


** 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

