          IDENT  E9P9853
          CIPPU
          MEMSEL 8
          TITLE  DSKK - NOS/VE CM3/9853 DISK DRIVER FOR I4
*
*         WORD 6 OF THE FOLLOWING COMMENT MUST BE THE REVISION NUMBER FOR CTI
*
          COMMENT *SMD* LVL=02
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
*
*         THIS IS THE PP DRIVER FOR THE IPI CHANNEL THAT SUPPORTS THE CM3
*         AND 9853 DRIVE ON A SYSTEM WITH AN I4 IOU.  THE PROGRAM NAME IS
*         E9P9853 AND THE DECK NAME IS IOM$DSKK.  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.
*
*         COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
*
          LIST   -$
*COPYC IODMAC1
*COPYC IODMAC2
*COPYC IODMAC3
*COPYC IODMAC4
          LIST   B,L,N,R
          EJECT
*
*         EQUATES FOR IPI ADAPTER
*
 H0000    EQU    0#0000      MASTER CLEAR ADAPTER
 H0004    EQU    0#0004      READ OPERAND GENERATOR
 H0009    EQU    0#0009      SET SELECT OUT
 H0014    EQU    0#0014      WRITE OPERAND GENERATOR
 H0029    EQU    0#0029      SELECT OUT, FULL WHEN SLAVE IN IS 1
 H005B    EQU    0#005B      SET SYNC OUT
 H0062    EQU    0#0062      PORT A SELECT
 H0071    EQU    0#0071      FULL WHEN SLAVE IN IS 0
 H00E1    EQU    0#00E1      READ STATUS REGISTER
 H00F1    EQU    0#00F1      READ ERROR REGISTER
 H0100    EQU    0#0100      CLEAR DMA ERROR
 H0102    EQU    0#0102      READ IPI REVISION REGISTER
 H0122    EQU    0#0122      IPI BUS A OUTPUT PARITY ERROR
 H0200    EQU    0#0200      READ CONTROL REGISTER/READ ATTRIBUTES
 H0281    EQU    0#0281      STREAM, READ
 H0300    EQU    0#0300      WRITE CONTROL REGISTER
 H0302    EQU    0#0302      WRITE TRANSMITTER RECEIVER REGISTER
 H0322    EQU    0#0322      IPI BUS A INPUT PARITY ERROR
 H0381    EQU    0#0381      STREAM, WRITE
 H0600    EQU    0#0600      READ DMA ERROR REGISTER
 H0700    EQU    0#0700      READ OPERATIONAL STATUS
 H0711    EQU    0#0711      DROP MASTER OUT
 H0715    EQU    0#0715      REQUEST CLASS 1, 2, OR 3 INTERRUPT
 H0800    EQU    0#0800      DMA TERMINATE/ABORT COMMAND
 H0862    EQU    0#0862      PORT B SELECT
 H0A00    EQU    0#0A00      READ T REGISTER
 H0B00    EQU    0#0B00      WRITE T PRIME REGISTER
 H0C00    EQU    0#0C00      DMA READ
 H0C22    EQU    0#0C22      ICI OUTPUT PARITY ERROR
 H0D00    EQU    0#0D00      DMA WRITE
 H7E42    EQU    0#7E42      IPI CHANNEL TRANSFER RATE
 H8025    EQU    0#8025      MASTER OUT, FULL WHEN SLAVE IN IS 1
 H8039    EQU    0#8039      SELECT OUT, FULL WHEN SLAVE IN IS 1
 H8215    EQU    0#8215      SET MASTER OUT, LOGICAL INTERFACE RESET
 H8415    EQU    0#8415      SET MASTER OUT, SLAVE RESET
 H9211    EQU    0#9211      DROP SYNC OUT
 H9213    EQU    0#9213      SET SYNC OUT
*
*         MISCELLANEOUS EQUATES
*
 UNIX     EQU    1           = 1, TO ENABLE ONE-WORD RESPONSE AND NEW METHOD OF
                                  RESPONDING TO IDLE AND RESUME REQUESTS, ALSO
                                  RELY TOTALLY ON CONFIDENCE TEST FOR ISOLATION
                                  OF MEDIA ERRORS. (=0 FOR UNIX)
 FE       EQU    0           = 1, TO ENABLE FORCE ERROR CODE
 FHT      EQU    0           = 1, TO KEEP LAST 16 FUNCTIONS
 ERRD     EQU    0           = 1, TO ENABLE READ RAW DATA
 DC       EQU    22B         DISK CHANNEL
 MS50     EQU    53475       50 MILLISECOND TIMEOUT FOR CERTAIN LOOPS
 RRL      EQU    3           REQUEST RETRY LIMIT
 SRT      EQU    120         SLAVE RESET TIMEOUT (SECONDS)
 FDT      EQU    9000        FORMAT DRIVE TIMEOUT (SECONDS)
 DST      EQU    480         DRIVE SPINUP TIMEOUT (SECONDS)
 RLIE     EQU    49*8        RESPONSE LENGTH IF ERROR
 NSBS     EQU    3           NUMBER OF BURSTS TO TRANSFER BEFORE
                              SUSPENDING
 C.CHCNT  EQU    37          NUMBER OF REQUESTS TO PROCESS BEFORE
                              CHANNEL LOCK
 RBPL     EQU    0#14        READ BUFFER PACKET LENGTH
 RPL      EQU    0#10        READ, WRITE COMMAND PACKET LENGTH
 H0209    EQU    0#0209      LOAD ATTRIBUTES OPERATION CODE
 H020A    EQU    0#020A      SAVE ATTRIBUTES OPERATION CODE
 H0400    EQU    0#0400      RESERVE DRIVE
 H0700    EQU    0#0700      SET OPERATING MODE
 H1005    EQU    0#1005      READ OPERATION CODE
 H1107    EQU    0#1107      READ RAW DATA
 H2005    EQU    0#2005      WRITE OPERATION CODE
 H5200    EQU    0#5200      WRITE TO BUFFER OPERATION CODE
 H6200    EQU    0#6200      READ FROM BUFFER OPERATION CODE
 H8100    EQU    0#8100      PERFORM DRIVE DIAGNOSTICS OP CODE
 H8400    EQU    0#8400      READ PERFORMANCE LOG OP CODE
 H0931    EQU    0#0931      COMMAND EXTENT PARAMETER
 MAXCYL   EQU    1411        MAXIMUM CYLINDER
 MAXTR    EQU    18          MAXIMUM TRACK
 BPS      EQU    2048        BYTES PER SECTOR
 WPS      EQU    BPS/8       WORDS PER SECTOR
 SPT      EQU    21          SECTORS PER TRACK
 ID13     EQU    0#13        MESSAGE/MICROCODE EXCEPTION
 ID14     EQU    0#14        INTERVENTION REQUIRED FOR CONTROLLER
 ID15     EQU    0#15        ALTERNATE PORT EXCEPTION
 ID16     EQU    0#16        MACHINE EXCEPTION FOR CONTROLLER
 ID17     EQU    0#17        COMMAND EXCEPTION FOR CONTROLLER
 ID19     EQU    0#19        CONTROLLER CONDITIONAL SUCCESS
 ID23     EQU    0#23        DRIVE MESSAGE EXCEPTION
 ID24     EQU    0#24        INTERVENTION REQUIRED STATUS
 ID26     EQU    0#26        MACHINE EXCEPTION FOR DRIVE
 ID29     EQU    0#29        DRIVE CONDITIONAL SUCCESS
 ID32     EQU    0#32        FAILING ADDRESS
 ID50     EQU    0#50        HAS MICROCODE REVISION
 ID51     EQU    0#51        HAS SECTOR SIZE

* COMMAND/RESPONSE PACKET EQUATES

 CRN      EQU    1           COMMAND REFERENCE NUMBER
 OPCD     EQU    2           OPERATION CODE FOR CONTROL MODULE
 SLAD     EQU    3           SLAVE ADDRESS, UNIT ADDRESS
 MAJST    EQU    4           MAJOR STATUS
 FCP      EQU    4           FIRST COMMAND PARAMETER

* MAJOR STATUS EQUATES
*         RESPONSE TYPES
 CC       EQU    1           COMMAND COMPLETE RESPONSE
 AR       EQU    4           ASYNCHRONOUS RESPONSE
 TN       EQU    5           TRANSFER NOTIFICATION
 CCS      EQU    0#18        COMMAND COMPLETE, SUCCESSFUL
 IVR      EQU    0#1000      INTERVENTION_REQUIRED_STATUS
* LEFT SHIFTS FOR MAJOR STATUS
 SC       EQU    14          SUCCESSFUL
 CS       EQU    16          CONDITIONAL SUCCESS
          SPACE  5,20
* BUS CONTROL EQUATES
 CMDOUT   EQU    0           COMMAND, INFORMATION OUT
 RSPIN    EQU    1           RESPONSE, INFORMATION IN
 DATAOUT  EQU    2           DATA OUT
 DATAIN   EQU    3           DATA IN
          SPACE  5,20
* IOU/CM3/9853 ERROR CODES
 E00      EQU    0           CP MUST DECODE STATUS IN RESPONSE PACKET
 E01      EQU    1           FUNCTION TIMEOUT
 E02      EQU    2           CHANNEL EMPTY WHEN ACTIVATED
 E03      EQU    3           PERIOD COUNTER PARITY
 E04      EQU    4           UPPER ICI PARITY
 E05      EQU    5           LOWER ICI PARITY
 E06      EQU    6           IOU ERROR
 E07      EQU    7           INCOMPLETE 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          JY DATA ERROR
 E14      EQU    14          BAS PARITY ERROR
 E15      EQU    15          LZ ERROR
 E16      EQU    16          JY ERROR
 E17      EQU    17          LX ERROR
 E18      EQU    18          DMA TEST MODE FAILURE
 E20      EQU    20          CANT SELECT CM3
 E21      EQU    21          BIT SIGNIFICANT RESPONSE ERROR
 E22      EQU    22          NO SYNC IN
 E23      EQU    23          SYNC IN DID NOT DROP
 E24      EQU    24          IPI SEQUENCE ERROR
 E25      EQU    25          UPPER IPI CHANNEL PARITY
 E26      EQU    26          LOWER IPI CHANNEL PARITY
 E27      EQU    27          SLAVE IN NOT SET
 E28      EQU    28          SLAVE IN DID NOT DROP
 E29      EQU    29          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 CM3 INTERRUPT
 E39      EQU    39          ENDING STATUS WRONG
 E50      EQU    50          EXECUTING CONTROLLER DIAGNOSTICS
 E51      EQU    51          CONTROLLER DIAGNOSTICS PASSED
 E52      EQU    52          CM3 DIAGNOSTICS PASSES - LAST ERROR CODE RETURNED
 E57      EQU    57          FORMATTING DRIVE
 E58      EQU    58          FORMAT COMPLETE
 E60      EQU    60          CONTROLLER FAILURE
 E61      EQU    61          DRIVE FAILURE (A,B,C,D)
 E62      EQU    62          MEDIA FAILURE
 E70      EQU    70          INTERNAL CONTROLLER ERROR
 E71      EQU    71          CM3 INTERVENTION REQUIRED
 E72      EQU    72          CM3 MACHINE EXCEPTION
 E73      EQU    73          COMMAND EXCEPTION
 E74      EQU    74          MICROCODE EXECUTION ERROR
 E75      EQU    75          ALTERNATE PORT EXCEPTION
 E76      EQU    76          UNEXPECTED RESPONSE
 E77      EQU    77          DRIVER RESERVED TO OTHER CM3 PORT
 E78      EQU    78          CONTROLLER OVER TEMPERATURE
 E95      EQU    95          NO DRIVE OPERATIONAL RESPONSE
 E110     EQU    110         PP-CM3 DATA INTEGRITY
 E111     EQU    111         CM-DRIVE DATA INTERGRITY
 E120     EQU    120         SOFTWARE FAILURE
 E141     EQU    141         UNIT NOT FORMATTED
          SPACE  5,20
* INTERFACE ERROR CODES.
 E208     EQU    1010B       LOGICAL UNIT OF UNIT DESCRIPTOR NOT
                             IN SEQUENCE OR NOT IN RANGE
 E20B     EQU    1013B       COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF WORDS OR NOT LONG ENOUGH
 E304     EQU    1404B       RMA OF NEXT UNIT REQUEST
                             NOT A WORD BOUNDARY
 E306     EQU    1406B       INVALID UNIT TYPE
 E308     EQU    1410B       UNIT COMMUNICATION BUFFER IS TOO SMALL
 E501     EQU    2401B       INVALID COMMAND CODE
 E505     EQU    2405B       INVALID LENGTH SPECIFICATION IN COMMAND
          EJECT
* CONFIGURED UNITS.

 UN       RECORD PACKED

* WORD 1
 CIP      BOOLEAN            AT LEAST ONE COMMAND IN PROGRESS
 TCIP     BOOLEAN            TWO COMMANDS IN PROGRESS
 DTIP     BOOLEAN            DATA TRANSFER IN PROGRESS
 NCR      BOOLEAN            NO CONTROLLER RESPONSE
 RD       BOOLEAN            DRIVE RESERVED
 FILL1    SUBRANGE 0,7
 PORT     SUBRANGE 0,3       PORT TO IPI CHANNEL, 0 = PORT A, 1= PORT B
 CM       SUBRANGE 0,7       CONTROL MODULE NUMBER
 UNIT     SUBRANGE 0,7       UNIT NUMBER
* WORD 2
 SSPTR    PPWORD             POINTER TO RESIDENT SS TABLE. IF ZERO
                             THE TABLE IS IN THE UNIT COMM. BUFFER
* WORD 3
 CLK      PPWORD             SECONDS CLOCK OF LAST ACTIVITY
* WORD 4
 UIT      STRUCT 6           RMA OF UNIT INTERFACE TABLE (REFORMATTED)
          MASKP  NCR
 K.NCR    EQU    MSK
          MASKP  RD
 K.RD     EQU    MSK
 UN       RECEND
          SPACE  5,20
* SS TABLE DEFINITIONS. INFORMATION SAVED FOR EACH UNIT.

 SS       RECORD PACKED

* WORD 1

 MREV     SUBRANGE 0,377B    CM3 MICROCODE REVISION
 FILL1    SUBRANGE 0,77B
 CRN      SUBRANGE 0,3       USED TO MAKE COMMAND REFERENCE NUMBER UNIQUE
*
 CMOD     SUBRANGE 0,377B    CONTROL MODULE NUMBER
 UNIT     SUBRANGE 0,377B    UNIT NUMBER
*
 LU       PPWORD             LOGICAL UNIT
*
 FNC      PPWORD             FUNCTION CODE  READ = 0
                                            WRITE = 1
                                            FORMAT = 2
 REQ      STRUCT 4           CURRENT REQUEST (UNFORMATTED RMA)
 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 WHICH HAVENT
                             BEEN READ FROM CM.)
 TOTAL    STRUCT 4           TOTAL CM BYTES LEFT TO TRANSFER
 MT       EQU    /SS/P.TOTAL MASTER TERMINATE FLAG
                              8XXX IF USING MASTER TERMINATE,
                              XXX NOT 0 IF COMMAND TERMINATED
 FCOMRQ   STRUCT 4           FIRST COMPLETED REQUEST (RMA)
 CURRQ    STRUCT 4           CURRENT REQUEST (RMA)
 PRERQ    STRUCT 4           PREVIOUS REQUEST (RMA)
 NCOMRQ   PPWORD             NUMBER OF COMPLETED REQUESTS
 NCR      PPWORD             NUMBER OF COMPLETED REQUESTS
 CURTRK   PPWORD             CURRENT TRACK
 CURSEC   PPWORD             CURRENT SECTOR
 SWFLG    PPWORD             NONZERO IF A STREAMING REQUEST SWITCH WAS MADE
 FPVA     STRUCT 6           PVA OF FIRST COMPLETED REQUEST
 XFER     STRUCT 4           TRANSFER COUNT
 PVA2     STRUCT 6           PVA FOR SECOND COMMAND
 RMA2     STRUCT 4           RMA FOR SECOND COMMAND
 TW2      STRUCT 4           TOTAL CM BYTES TO TRANSFER FOR 2ND COMMAND
 MT2      EQU    /SS/P.TW2   MASTER TERMINATE FLAG FOR 2ND COMMAND
 RQTRY    PPWORD             REQUEST RETRY COUNT
 RESET    PPWORD             RESET ISSUED
                              1 SLAVE ASYNCH EXPECTED
                              2 DRIVE ASYNCH EXPECTED AFTER SLAVE RESET
                              3 BOTH 1 AND 2
 CT       PPWORD             NONZERO WHEN CONFIDENCE TEST IS COMPLETE
                              1 IF NO ERROR
                              2 IF ERROR
                              4 IF DATA INTEGRITY ERROR
 RECOV    PPWORD             NONZERO IF IN RECOVERY
 DP       STRUCT 6           DELINK POINTER (REFORMATTED RMA)

 RQ       STRUCT 40          REQUEST

 CMLIST   STRUCT 8           CURRENT DATA ADDRESS OR CURRENT COMMAND

 SS       RECEND

* ALTERNATE USAGE OF LOCATIONS IN SS TABLE DURING CONFIDENCE TEST
 STT      EQU    /SS/P.PVA2   SECTORS TO TRANSFER
 CTME     EQU    /SS/P.PVA2+1 START OF 3 WORD TABLE WITH EACH WORD
                               CONTAINING THE HEAD AND SECTOR NUMBER OF
                               OF A MEDIA ERROR
          SPACE  6
* PP INTERFACE TABLE
 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
 .U       IFEQ   UNIX,1
 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
 .U       ELSE
          ALIGN  0,64
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
 LOCK     BOOLEAN            PP REQUEST QUEUE LOCK
          ALIGN  48,64
 LOCKPP   PPWORD             PP REQUEST QUEUE LOCK OWNER
          ALIGN  16,64
 PPQPVA   STRUCT 6           NEXT QUEUED PP REQUEST (PVA)
          ALIGN 32,64
 PPQ      RMA                NEXT QUEUED PP REQUEST (RMA)
 .U       ENDIF
          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  6
* 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  6
* UNIT INTERFACE TABLE

 UIT      RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 DSABLE   BOOLEAN            UNIT IS ENABLED/DISABLED. (SET = DISABLED)
          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               = 400B, 844-4X
                               = 401B, 885-1X
                               = 402B, 885-42
 QCNT     PPWORD             QUEUE COUNT
*
          ALIGN  16,64
 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

 UIT      RECEND
          SPACE  6
* 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  6
* PP COMMAND.

 CM       RECORD PACKED

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

 RS       RECORD PACKED

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

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

* WORD 3.
 RESPL    PPWORD             RESPONSE LENGTH  (8-BIT BYTES)
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS (FROM REQUEST) (NOT USED)
 INT      BOOLEAN            INTERRUPT CPU (IF SET)  (NOT USED)
 PORT     SUBRANGE 0,37B     MEMORY PORT USED FOR INTERRUPTS  (NOT USED)
          ALIGN  40,64
 PRIOR    SUBRANGE 0,377B    PRIORITY  (NOT USED)
          ALIGN  48,64
          ALIGN  49,64       ALERT MASK
 COMPAR   BOOLEAN            COMPARE NOT SATISFIED ON COMPARE/SWAP COMMAND
                             (NOT USED)

* WORD 4.
          ALIGN  0,64
 ABALRT   BOOLEAN            ABNORMAL ALERT CONDITION DETECTED  (NOT USED)
 INTERR   BOOLEAN            LOGICAL INTERFACE ERROR (INCLUDE INTERFACE
                             ERROR CODE)
 FORC     BOOLEAN            FORCED TERMINATION AS A RESULT OF STOP UNIT COMMAND
                             (NOT USED)
 CHERR    BOOLEAN            CHANNEL PARITY ERROR (NOT USED)
 DATOV    BOOLEAN            DATA OVERRUN. A LOST DATA CONDITION
                             OCCURRED ON INPUT OR INADEQUATE DATA RATE ON OUTPUT
                             (NOT USED)
 DATERR   BOOLEAN            UNCORRECTABLE PARITY OR CHECKWORD ERROR
                             ON AN ADDRESS OR DATA FIELD.
 HDWR     BOOLEAN            UNCORRECTABLE HARDWARE MALFUNCTION IN A
                             CONTROLLER OR UNIT  (NOT USED)
 NRDY     BOOLEAN            INTERVENTION REQUIRED BY OPERATOR ON A
                             HARDWARE MALFUNCTION.  EXAMPLE-UNIT NOT
                             READY, UNIT NOT CONNECTED.  (NOT USED)
 FTO      BOOLEAN            FUNCTION TIMEOUT (NOT USED)
 CHERO    BOOLEAN            CHANNEL OUTPUT PARITY ERROR (NOT USED)
          ALIGN  16,64
 IEC      PPWORD             INTERFACE ERROR CODE
 RC       SUBRANGE 0,3       RESPONSE CODE
                               0 - UNSOLICITED RESPONSE
                               1 - INTERMEDIATE RESPONSE
                               2 - NORMAL REQUEST TERMINATION
                               3 - ABNORMAL REQUEST TERMINATION
 RCON     SUBRANGE 0,3       ADDITIONAL RESPONSE CONDITIONS
                             (= 0 FOR UNSOLICITED RESPONSE)
                               0 - NO ADDITIONAL CONDITION
                               1 - RECOVERED ERROR
                               2 - COMMAND HAD EXPLICIT RESPONSE FLAG SET
                               3 - BOTH CONDITIONS 1 AND 2
 K.REC    EQU    1           RECOVERED ERROR
          ALIGN  40,64
 URC      SUBRANGE 0,377B    UNSOLICITED RESPONSE CODE  (NOT USED)
                               1 - UNIT CHANGED FROM READY TO NOT READY
                               2 - UNIT CHANGED FROM NOT READY TO READY
                               3 - ABNORMAL CONDITION DURING HOUSEKEEPING CYCLE,
                                   (CHECK ABNORMAL STATUS OR INTERFACE ERROR CODE)
                               4 - CONTROLLER RESERVED
                               5 - UNIT RESERVED TO ANOTHER ACCESS
                               6 - RECOVERED ABNORMAL CONDITION
          ALIGN  49,64       ALERT CONDITIONS
 COMPRC   BOOLEAN            COMPARE NOT SATISFIED ON COMPARE/SWAP COMMAND
                             (NOT USED)

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

* WORD 6.
 CHAN     PPWORD             CHANNEL NUMBER
 SCYL     PPWORD             STARTING CYLINDER
 STRK     PPWORD             STARTING TRACK
 SSEC     PPWORD             STARTING SECTOR

* WORD 7.
 UNIT     PPWORD             UNIT NUMBER
 RTRY     PPWORD             REQUEST RETRY COUNT
 FTRK     PPWORD             FAILING TRACK
 FSEC     PPWORD             FAILING SECTOR
* WORD 8
 WC       PPWORD             WORDS NOT TRANSFERRED
 FUNTO    PPWORD             FUNCTION WITH TIMEOUT
 ID       PPWORD             ERROR IDENTIFIER
 K.UDN    EQU    3           UNIT DOWN
 K.CMDN   EQU    2           CONTROL MODULE DOWN
 K.CHDN   EQU    1           CHANNEL DOWN
 ERRID    PPWORD             ERROR IDENTIFIER
* WORD 9
 MREV     PPWORD             CM3 MICROCODE REVISION
 STREG    PPWORD             IPI CHIP STATUS REGISTER
 ERREG    PPWORD             IPI CHIP ERROR REGISTER
 FILL1    PPWORD
* WORD 10
 DMAER    PPWORD             DMA ERROR REGISTER
 OSR      PPWORD             OPERATIONAL STATUS REGISTER
 CR       PPWORD             CONTROL REGISTER
 FILL2    PPWORD

          MASKP  INTERR
 K.INTERR EQU    MSK
          MASKP  DATERR
 K.DATERR EQU    MSK
 .U       IFEQ   UNIX,1
          MASKP  SHORT
 K.SHORT  EQU    MSK
 .U       ENDIF

 RS       RECEND


 CM       RECEND
          SPACE  6
* COMMAND CODES.

 C.IDLE   EQU    4           IDLE
 C.RESUME EQU    5           RESUME
 C.READ   EQU    100B        READ
 C.WRITE  EQU    120B        WRITE
 C.FORMAT EQU    164B        FORMAT
          SPACE  5,20
* RESPONSE CODES.

 R.UNS    EQU    0           UNSOLICITED RESPONSE
 R.INT    EQU    1           INTERMEDIATE RESPONSE
 R.NRM    EQU    2           NORMAL REQUEST TERMINATION
 R.ABN    EQU    3           ABNORMAL REQUEST TERMINATION
          SPACE  10
* PP COMMUNICATION BUFFER.

 CB       RECORD PACKED

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

 CONTRL   STRUCT 8           LOAD CONTROLWARE COMMAND (NOT USED)
 CMCTRL   STRUCT 8           LOAD CONTROLLER CONTROLWARE (NOT USED)
          STRUCT 64          (NOT USED)
          ALIGN  0,64
 BUF      STRUCT 5240        DATA BUFFER FOR CONFIDENCE TEST
                              BYTES = SECTOR (2048) + 8 TIMES
                              (SECTORS (21) X TRACKS (19))
 CB       RECEND
 RPBL     EQU    192         MAXIMUM LENGTH OF RESPONSE BUFFER
 EOM      EQU    20000B
 RPB      EQU    EOM-RPBL    RESPONSE PACKET BUFFER
 RS       EQU    RPB-P.RS    DISK RESPONSE

 IPIT     EQU    RPB+64      PP INTERFACE TABLE
 UBUF     EQU    IPIT+P.PIT  UNIT INTERFACE TABLE
 IBUF     EQU    UBUF+P.UIT  UNIT DESCRIPTOR BUFFER
 NRQ      EQU    IPIT+P.SS   NEXT REQUEST
          ERRMI  EOM-NRQ+20  IF TABLE OVERFLOWS MEMORY
 RQT      EQU    NRQ+8
          ERRMI  RPBL-P.PIT-P.UIT-8-64 IF TABLES OVERFLOW MEMORY
 OB       EQU    RPB+64      OUTPUT BUFFER FOR PP/CONTROLLER PATH TEST
 IB       EQU    RPB+128     INPUT BUFFER FOR PP/CONTROLLER PATH TEST
 IBN      EQU    IB+50       END OF INPUT BUFFER
          ERRMI  EOM-IBN     IF TABLES OVERFLOW MEMORY
 RQ       EQU    /SS/P.RQ    REQUEST
 CM       EQU    RQ+/RQ/P.CMND  CURRENT COMMAND
 CMLIST   EQU    /SS/P.CMLIST  INDIRECT RMA LIST
          EJECT
          CON    MAIN-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

 CMADR    BSSZ   3           CM ADDRESS
 CHAN     BSSZ   1           CHANNEL NUMBER
 STATUS   BSSZ   2           IPI CHANNEL STATUS
 OS       BSSZ   1           OPERATIONAL STATUS
 CMNDS    BSSZ   1           NUMBER OF OUTSTANDING COMMANDS
 CMOD     BSSZ   1           PORT NUMBER AND CONTROLLER NUMBER (0000PCCC)
 UX       BSSZ   1           INDEX TO UNITS TABLE
 .F       IFEQ   FHT,1       FOR FUNCTION HISTORY TABLE
 FI       BSSZ   1           INDEX TO FUNCTION HISTORY BUFFER
 .F       ENDIF
 P1       BSSZ   1
 P2       BSSZ   1
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
* BC, RMA ARE T REGISTER PARAMETERS
 BC       BSSZ   1           BYTE COUNT TO READ/WRITE
 RMA      BSSZ   2           RMA FOR DMA TRANSFER

 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 LF       BSSZ   1           LAST FUNCTION TO IPI ADAPTER
 CNUM     BSSZ   1           0 IF ONE COMMAND, 1 IF 2 COMMANDS ISSUED TO
                              THE CONTROL MODULE
 WC       BSSZ   1           WORD COUNT
 BBS      BSSZ   1           BURSTS TO TRANSFER BEFORE SUSPENDING
 BURPOS   BSSZ   1           BURST BUFFER TRANSFER POSITION (TO CM)
 CSST     BSSZ   1           POINTER TO CURRENT SS TABLE
 LUX      BSSZ   1           VALUE OF UNIT INDEX OF LAST UNIT SELECTED
 TOTAL    BSSZ   2           TOTAL BYTES TO TRANSFER
 SSUN     CON    7777B       UX VALUE OF CURRENT SS TABLE
 UNUML    BSSZ   1           LENGTH OF CONFIGURED UNIT ENTRIES
 TMF      BSSZ   1           TEST MODE FLAG, NONZERO IF TEST MODE IN PROGRESS
 .U       IFNE   UNIX,1
 IDLE     BSSZ   1           NONZERO IF IDLE COMMAND RECEIVED,
                              RESUME COMMAND SETS IT TO ZERO
 .U       ENDIF
 MALET    BSSZ   1           NONZERO IF MAINTENANCE SOFTWARE WANTS
                              THE CHANNEL
 TBC      BSSZ   1           NONZERO IF TRANSFER RESPONSE RECEIVED
                              BEFORE COMPLETION RESPONSE
 CLF      DATA   1           CHANNEL LOCK FLAG, 0 IF LOCK IS SET
 CTM      BSSZ   1           USED TO CHANGE TRANSFER MODE TO STREAMING
                             FOR COMMAND AND RESPONSE PACKETS
 CLCUR    BSSZ   1           CHANNEL 14 CLOCK CURRENT VALUE
 CLMCS    BSSZ   1           CLOCK, MICROSECOND
 CLMLS    BSSZ   1           CLOCK, MILLISECOND
 CLSEC    BSSZ   1           CLOCK, SECOND
 CTPAT    DATA   0           CONFIDENCE TEST PATTERN FIRST WORD
 .F       IFEQ   FE,1
 FEST     DATA   0           FORCE ERROR START COUNT
 FEND     DATA   0           FORCE ERROR END COUNT
 FEUN     DATA   0           UNIT NUMBER TO FORCE ERROR ON
 .F       ENDIF
          SPACE  2
          BSS    72B-*
 DSRTP    DATA   2,0         RMA OF PP INTERFACE TABLE AT DEADSTART
 CH       EQU    DSRTP       0 IF 10 MB/S IPI CHANNEL
                              1 IF 25 MB/S IPI CHANNEL
 INPNT    EQU    DSRTP+1     IN POINTER FOR RESPONSE BUFFER
 LIM      BSSZ   1           LIMIT OF RESPONSE BUFFER (IN 8-BIT BYTES)
 PPNO     CON    1           LOGICAL PP NUMBER
 PTF      BSSZ   1           IF 0 EXECUTE PATH TEST
 IF       BSSZ   1           INITIALIZATION FLAG
          BSS    100B-*
          LJM    MAIN
          DATA   8           I4/IPI DRIVER (FOR ANAD PROC)
 HANG     CON    0           AN EASY WAY TO SEE CERTAIN HANGS
          UJN    *
          SPACE  2
* 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 BUF 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
          SPACE  5,20
*         LOCATION CH IS THE INDEX INTO THIS CHANNEL TYPE TABLE

 WOR      DATA   0#14        10 MB CHANNEL WRITE OPERAND REGISTER FUNCTION
          DATA   0#702       25 MB CHANNEL WRITE OPERAND REGISTER FUNCTION

 TMWC     DATA   0#8064      10 MB CHANNEL TEST MODE WORD COUNT
          DATA   0#FF9C      25 MB CHANNEL TEST MODE WORD COUNT

 ETMF     CON    H0300       10 MB CHANNEL ENABLE TEST MODE FUNCTION
          CON    H0302       25 MB CHANNEL ENABLE TEST MODE FUNCTION

 ETMP     DATA   0#1000      10 MB CHANNEL, ENABLE TEST MODE PARAMETER
          DATA   0#80FF      25 MB CHANNEL, ENABLE TEST MODE PARAMETER

 EOG1     DATA   0#D79A      10 MB CHANNEL, EXPECTED OPERAND GENERATOR
          DATA   0#71        25 MB CHANNEL, EXPECTED OPERAND GENERATOR

 EOG2     DATA   0#2A92      10 MB CHANNEL, EXPECTED OPERAND GENERATOR
          DATA   0           25 MB CHANNEL, EXPECTED OPERAND GENERATOR

 RORF     DATA   4           10 MB CHANNEL, READ OPERAND GENERATOR FUNCTION
          DATA   0#802       25 MB CHANNEL, READ OPERAND GENERATOR FUNCTION

 EC1      DATA   0#FA15      10 MB CHANNEL, EXPECTED CHECKSUM
          DATA   0#DACF      25 MB CHANNEL, EXPECTED CHECKSUM

 EC2      DATA   0#31        10 MB CHANNEL, EXPECTED CHECKSUM
          DATA   0#36        25 MB CHANNEL, EXPECTED CHECKSUM

 FIP      DATA   0           FORMAT IN PROGRESS FLAG

 .F       IFEQ   FE,1
          BSS    60          FOR PATCHES DURING CHECKOUT
 .F       ENDIF
          TITLE  MAIN LOOP
** NAME-- MAIN
*
** PURPOSE-- MAIN IDLE LOOP.  LOOK FOR REQUESTS FROM CENTRAL MEMORY
*            AND LOOK FOR INTERRUPTS FROM THE CONTROLLERS.
*
** ENTRY
*         MAIN - AFTER DRIVER IS LOADED
*         MAIN5 - WHEN THE PP IS RESUMED
*         MAIN10 - TO RUN DIAGNOSTICS DURING ERROR RECOVERY
*         MAIN15 - AFTER SEEK, WRITE, OR READ COMMAND STARTED
*         MAIN20 - WHEN A WRITE OR READ COMMMAND COMPLETES
          SPACE  2
 MAIN     BSS
          REFAD  DSRTP,CM.PIT REFORMAT ADDRESS OF PP INTERFACE TABLE
                               AND SAVE IN CM.PIT
 MAIN5    BSS
          RJM    INIT        INITIALIZATION
 MAIN10   BSS
          RJM    PT          PATH TEST
 MAIN15   BSS
 .F       IFEQ   FE,1        FORCE ERROR IN RUNNING PP DRIVER
          RJM    FER         FORCE ERROR ROUTINE
 .F       ENDIF
          RJM    EI          ENABLE INTERRUPTS
          RJM    PPRQ        CHECK FOR ANY PP REQUESTS
          RJM    GETUD       SELECT UNIT REQUESTS, SEEK,
                             AND PROCESS INTERRUPTS
          LDDL   CMNDS
          NJK    MAIN15      IF OUTSTANDING COMMANDS
 MAIN20   BSS
          SOML   CHLCNT
          NJN    MAIN15      IF PP DOESN'T HAVE TO GIVE UP CHANNEL
          LDML   FIP
          NJN    MAIN15      IF FORMAT IN PROGRESS
          RJM    CKC         CHECK IF CHANNEL MUST BE GIVEN UP
          UJK    MAIN15
          SPACE  5,12
 UCMD     BSS                COMMANDS FROM CENTRAL MEMORY
          CON    C.READ
          CON    C.WRITE
          CON    C.IDLE
          CON    C.RESUME
          CON    C.FORMAT
 UCMDL    EQU    *-UCMD
          TITLE  COMMANDS
** NAME-- READ
*
** PURPOSE-- PROCESS READ DATA COMMAND.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST  = LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                    CM DATA AREA.
          SPACE  2
 READX    LJM    **
 READ     EQU    *-1
 READ20   BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES LEFT TO TRANSFER
          STDL   BC          CM BYTES LEFT TO TRANSFER
          ADC    -BPS        CM BYTES PER BURST
          ADDL   BURPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS BURST
          MJN    READ30      IF LESS THAN 1 BURST LEFT TO TRANSFER
          LDC    BPS         COMPUTE NUMBER OF CM BYTES TO TRANSFER THIS LOOP
          SBDL   BURPOS
          STDL   BC          NUMBER OF CM BYTES TO TRANSFER
 READ30   BSS
          LDDL   BURPOS
          NJN    READ36      IF BUS CONTROL ALREADY DONE
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
 READ32   EQU    *-1         FOR FORCING ERRORS
          LDC    H0281       STREAM, READ
          RJM    FUNC        RAISE MASTER OUT
 READ34   EQU    *-1         FOR FORCING ERRORS
          UJN    READ38
 READ36   BSS
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
 READ38   BSS
          LDC    H0C00       DMA READ
          RJM    FUNC
          ACN    DC
          LDML   CMLIST+/CM/P.RMA,CSST
          STDL   RMA         CM ADDRESS OF DATA AREA
          LDML   CMLIST+/CM/P.RMA+1,CSST
          STDL   RMA+1
          LDN    3
          OAM    BC,DC       BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
 READ40   EQU    *-1         FOR FORCING ERRORS
          LDML   /SS/P.NCR,CSST NUMBER OF COMPLETED REQUESTS
          ZJN    READ42      IF NO COMPLETED REQUESTS
          RJM    RDWTOK      SEND RESPONSE FOR GOOD READ
 READ42   BSS
          LDDL   BC
          RADL   BURPOS      UPDATE BURST POSITION
          ADC    -BPS        CHECK FOR END OF BURST
          ZJN    READ55      IF END OF BURST
          LDML   /SS/P.LISTL,CSST CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          ZJN    READ45      IF ALL DATA FOR THIS BURST TRANSFERRED
          RJM    UBT         UPDATE BYTES TRANSFERRED
          UJN    READ100
 READ45   BSS
          LDC    BPS         CM BYTES PER BURST
          SBDL   BURPOS
          STML   CM.CB.T     BYTES TO TRANSFER
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
          LDC    H0B00       WRITE T PRIME REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          OAM    CM.CB.T,DC  BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
 READ55   BSS
          RJM    UBT         UPDATE BYTES TRANSFERRED
          RJM    WFTC        WAIT FOR TRANSFER COMPLETE
          NJN    READ80      IF NO ERROR
          LJM    READ160     EXIT, RESPONSE PACKET WILL HAVE ERROR STATUS
 READ80   BSS
          RJM    UDA         UPDATE DISK ADDRESS
 READ100  BSS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJK    READ20      IF MORE DATA TO TRANSFER
 READ160  BSS
          LJM    READX
          EJECT
** NAME-- WRITE
*
** PURPOSE-- PROCESS THE WRITE DATA COMMAND.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST = LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                   CM DATA AREA.
          SPACE  2
 WRITE    CON    0
 WRI20    BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES LEFT TO TRANSFER
          STDL   BC          CM BYTES LEFT TO TRANSFER
          ADC    -BPS        CM BYTES PER BURST
          ADDL   BURPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS BURST
          MJN    WRI30       IF LESS THAN 1 BURST LEFT TO TRANSFER
          LDC    BPS         COMPUTE NUMBER OF CM BYTES TO TRANSFER THIS LOOP
          SBDL   BURPOS
          STDL   BC          NUMBER OF CM BYTES TO TRANSFER
 WRI30    BSS
          LDDL   BURPOS
          NJN    WRI36       IF BUS CONTROL ALREADY DONE
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
 WRI32    EQU    *-1         FOR FORCING ERRORS
          LDC    H0381       STREAM, WRITE
          RJM    FUNC        RAISE MASTER OUT
 WRI34    EQU    *-1         FOR FORCING ERRORS
          UJN    WRI38
 WRI36    BSS
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
 WRI38    BSS
          LDC    H0D00       DMA WRITE
          RJM    FUNC
          ACN    DC
          LDML   CMLIST+/CM/P.RMA,CSST
          STDL   RMA         CM ADDRESS OF DATA AREA
          LDML   CMLIST+/CM/P.RMA+1,CSST
          STDL   RMA+1
          LDN    3
          OAM    BC,DC       BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
 WRI40    EQU    *-1         FOR FORCING ERRORS
          LDDL   BC
          RADL   BURPOS      UPDATE BURST POSITION
          ADC    -BPS        CHECK FOR END OF BURST
          ZJN    WRI55       IF END OF BURST
          LDML   /SS/P.LISTL,CSST CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          ZJN    WRI45       IF ALL DATA FOR THIS BURST TRANSFERRED
          RJM    UBT         UPDATE BYTES TRANSFERRED
          UJN    WRI100
 WRI45    BSS
          LDC    BPS         CM BYTES PER BURST
          SBDL   BURPOS
          STML   CM.CB.T     BYTES TO TRANSFER
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
          LDC    H0B00       WRITE T PRIME REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          OAM    CM.CB.T,DC  BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
 WRI55    BSS
          RJM    UBT         UPDATE BYTES TRANSFERRED
          RJM    WFTC        WAIT FOR TRANSFER COMPLETE
          NJN    WRI80       IF NO ERROR
          UJN    WRI160      EXIT, RESPONSE PACKET WILL HAVE ERROR STATUS
 WRI80    BSS
          RJM    UDA         UPDATE DISK ADDRESS
 WRI100   BSS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJK    WRI20       IF MORE DATA TO TRANSFER
 WRI160   BSS
          LJM    MAIN15
          TITLE  COMMAND SUBROUTINES
** NAME-- BCTB
*
** PURPOSE-- BUILD CONFIDENCE TEST WRITE BUFFER
          SPACE  2
 BCTBX    LJM    **
 BCTB     EQU    *-1
          IAN    14B
          STDL   CTPAT       CONFIDENCE TEST PATTERN FIRST WORD MINUS ONE
          STDL   P1
          LOADC  CM.CB       ADDRESS OF PP COMMUNICATIONS BUFFER
          STDL   P2
 BCTB10   BSS
          AODL   P1          BUILD INCREMENTING PATTERN
          STDL   T1
          AODL   P1
          STDL   T2
          AODL   P1
          STDL   T3
          AODL   P1
          STDL   T4
          SBDL   CTPAT
          ADC    -P.CB-4+/CB/P.BUF
          PJN    BCTBX       IF ALL WORDS STORED
          LDDL   P2
          LMC    400000B
          CWDL   T1          STORE IN PP COMMUNICATIONS BUFFER
          AODL   P2
          UJN    BCTB10
          SPACE  5,20
** NAME-- BPTB
*
** PURPOSE-- BUILD PATH TEST BUFFER
          SPACE  2
 BPTBX    LJM    **
 BPTB     EQU    *-1
          LDN    0
          STDL   T1          INDEX TO OUTPUT BUFFER
          LDN    10
          STDL   T2          TIMES TO REPEAT PATTERN
 BPTB4    BSS
          LCN    0           PATTERN IS FFFF, 0000, AAAA, 5555,
          STML   OB,T1        FEFD REPEATED 10 TIMES
          LDN    0
          STML   OB+1,T1
          LDC    0#AAAA
          STML   OB+2,T1
          SHN    -1
          STML   OB+3,T1
          LDC    0#FEFD
          STML   OB+4,T1
          LDN    5
          RADL   T1
          SODL   T2
          ZJN    BPTBX       IF DONE
          UJN    BPTB4
          SPACE  5,20
** NAME-- CBC
*
** PURPOSE-- COMPUTE BYTE COUNT TO TRANSFER
          SPACE  2
 CBCX     BSS
          LDN    SPT         SECTORS PER TRACK
          SBML   /SS/P.CURSEC,CSST
          RADL   TOTAL+1
          STML   STT,CSST    SECTORS TO TRANSFER
          SHN    -5
          STDL   TOTAL       UPPER 16 BITS OF BYTE COUNT
          LDDL   TOTAL+1
          LPN    37B
          SHN    11
          STDL   TOTAL+1     LOWER 16 BITS OF BYTE COUNT
          LJM    **
 CBC      EQU    *-1
          LDML   /SS/P.CURTRK,CSST
          STDL   T1          TRACK
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          STML   CP+FCP+4    TRACK, SECTOR FOR COMMAND PACKET
          LDC    MAXCYL-1
          STML   CP+FCP+3    CYLINDER FOR COMMAND PACKET
          LDN    0
          STDL   TOTAL+1
          STML   CP+FCP+1    UPPER WORD OF SECTOR COUNT
          STML   /SS/MT,CSST NO MASTER TERMINATION
 CBC10    BSS
          AODL   T1
          LMN    MAXTR+1
          ZJK    CBCX        IF LAST TRACK
          LDN    SPT         SECTORS PER TRACK
          RADL   TOTAL+1
          UJN    CBC10
          SPACE  5,20
** NAME-- CCLOCK
*
** PURPOSE-- CLEARS CHANNEL LOCK.
          SPACE  2
 CCLX     LJM    **
 CCLOCK   EQU    *-1
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          STDL   CLF         CHANNEL LOCK FLAG
          LDDL   CHAN        CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD
          UJK    CCLX
          SPACE  5,20
** NAME-- CD
*
** PURPOSE-- CHECK DRIVE.  IF COMMAND IS FORMAT GO TO FORMAT ROUTINE
*            ELSE ASSUME THAT CONFIDENCE IS TO BE RUN. ENSURE THAT DRIVE
*            IS FORMATTED BEFORE STARTING THE CONFIDENCE TEST. IF DRIVE
*            IS NOT FORMATTED CHECK IF REQUEST IS A READ OF THE LABEL
*            AREA AND IF SO RETURN WITHOUT DOWNING THE DRIVE. THIS CHECK IS
*            NEEDED BECAUSE NOS/VE ALWAYS ATTEMPTS TO READ THE LABEL EVEN
*            WHEN ATTEMPTING TO FORMAT THE DRIVE.
*
** ENTRY-- FROM GETU IF A REQUEST IS PRESENT AND THE CONFIDENCE TEST
*          HAS NOT BEEN RUN FOR A UNIT AFTER THE PP WAS LOADED OR WHEN A
*          FORMAT COMMAND HAS BEEN ISSUED TO THE UNIT.
*
          SPACE  2
 CDX      LJM    **
 CD       EQU    *-1
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    CD05        IF NOT FORMAT COMMAND
          LDML   UNITS,UX
          LPC    0#1FFF
          STML   UNITS,UX    CLEAR COMMAND IN PROGRESS BITS
          LDN    1
          STML   /SS/P.CT,CSST  DISABLE RUNNING CONFIDENCE TEST

*         DRIVE RESET COULD TAKE UP TO 15 SECONDS, SO ONLY DO IT ONCE PER
*         ERROR DURING ERROR PROCESSING.

 CD05     LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    CD10        IF RUNNING CONFIDENCE TEST TO ISOLATE TO MEDIA ERROR
          LDML   /SS/P.RQTRY,CSST  RETRY COUNT
          LMN    1
          NJN    CD20        IF NOT FIRST ERROR RETRY
 CD10     BSS
          RJM    DPR         DRIVE POWER ON RESET
 CD20     RJM    RMR         READ MICROCODE REVISION
          RJM    DUSC        DISABLE USAGE STATISTIC COUNTING
          RJM    RD          RESERVE DRIVE
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    CD25        IF NOT FORMAT COMMAND
          STDL   IF          CLEAR INITIALIZATION FLAG
          RJM    IU          INITIALIZE UNIT
          LDN    1           ENABLE CT BYPASS
          UJN    CD27
 CD25     RJM    IUF         IS UNIT FORMATTED
          NJN    CD30        UNIT IS NOT FORMATTED
 CD27     UJK    CDX
 CD30     BSS
          LDML   /SS/P.FNC,CSST
          NJN    CD50        IF NOT READ COMMAND
          LDML   RQ+/RQ/P.CYL,CSST
          NJN    CD50        IF NOT CYLINDER WITH LABEL
          LDML   RQ+/RQ/P.TRACK,CSST
          NJN    CD50        IF NOT TRACK WITH LABEL
          LDN    1
          STDL   CMNDS       SO DCR ROUTINE LEAVES CMNDS EQUAL TO 0
          LDC    E141        ERROR CODE (141)
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LJM    EPF10       SEND ABNORMAL RESPONSE (NO RETURN)
 CD50     BSS
          LDC    E141        ERROR CODE (141)
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- CFME
*
** PURPOSE-- CHECK FOR MEDIA ERROR
*
** EXIT--  A = 0 IF MEDIA ERROR AND FAILING ADDRESS IS PRESENT
          SPACE  2
 CFME20   BSS
          LDN    1           INDICATE MEDIA ERROR NOT FOUND
 CFMEX    LJM    **
 CFME     EQU    *-1
          LDML   RS+/RS/P.ERRID
          NJN    CFMEX       IF NOT MEDIA ERROR
          LDK    ID26        DRIVE MACHINE EXCEPTION
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    CFMEX       IF ID26 NOT FOUND
          LDML   RPB+5,T3
          SHN    -8
          SBN    11
          MJN    CFME20      IF NO EXTENDED SUBSTATUS
          LDML   RPB+10,T3   COMMAND ENDING STATUS
          STDL   T5
          LPN    77B
          SBN    0#11
          ZJN    CFME10      IF ECC ERROR
          SBN    2
          ZJN    CFME10      IF MISSING SYNC
          SBN    6
          NJN    CFMEX       IF NOT (SECTOR NOT FOUND) ERROR
 CFME10   BSS
          LDK    ID32        RESPONSE EXTENT PARAMETER
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    CFMEX       IF PARAMETER 32 NOT FOUND
          LDN    0           INDICATE MEDIA ERROR FOUND
          UJN    CFMEX
          SPACE  5,20
** NAME-- CHGCH
*
** PURPOSE-- SET CHANNEL NUMBER IN CHANNEL INSTRUCTIONS
*
** INPUT-- 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
          SPACE  5,20
** NAME-- CKC
*
** PURPOSE-- CHECK IF MAINTENANCE PP WANTS THE CHANNEL.
          SPACE  2
 CKC100   BSS
          STDL   PTF         ENABLE RUNNING PATH TEST
          RJM    PT          PATH TEST
 CKCX     LJM    **
 CKC      EQU    *-1
          LDN    C.CHCNT     NUMBER OF REQUESTS TO PROCESS BEFORE
          STML   CHLCNT       GIVING UP THE CHANNEL
          LOADC  CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          ADDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          CRDL   T1          READ CHANNEL LOCKWORD
          LDDL   T2
          LPN    1
          ZJK    CKCX        IF MAINTENANCE PP DOES NOT WANT THE CHANNEL
          LDDL   UNUML
          ZJK    CKCX        IF NO UNITS
          RJM    CUB         CHECK UNIT BUSY
          STDL   MALET       SETTING MALET NONZERO PREVENTS STARTING
                              NEW DISK REQUESTS
          NJN    CKCX        IF OUTSTANDING COMMANDS
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          PAUSE  130000      DELAY 130 MILLISECONDS TO ALLOW
                             MAINTENANCE PP TO GET THE CHANNEL
          RJM    SCLOCK      SET CHANNEL LOCK
          LDN    0
          STDL   UX
          UJN    CKC20
 CKC10    BSS
          LDN    P.UN
          RADL   UX          UPDATE TO NEXT UNIT TABLE
 CKC20    BSS
          SBDL   UNUML
          ZJK    CKC100      IF ALL UNIT RESERVED FLAGS CLEARED
          LDML   UNITS,UX
          LPC    0#07FF
          STML   UNITS,UX
          UJK    CKC10
 CHLCNT   CON    C.CHCNT     NUMBER OF REQUESTS TO PROCESS BEFORE
                              GIVING UP THE CHANNEL
          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   PPNO
          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-- COG
*
** PURPOSE-- CHECK OPERAND GENERATOR.  THE CRC VALUE GENERATED
*            AFTER A TEST MODE OPERATION IS READ AND COMPARED
*            WITH THE CORRECT VALUE.
*
** ENTRY  A = EXPECTED OPERAND GENERATOR
          SPACE  2
 COGX     LJM    **
 COG      EQU    *-1
          STDL   T3
          LDC    H0009
          RJM    FUNC        DROP MASTER OUT
          RJM    DCM         DROP SELECT OUT
          LDML   ETMF,CH
          STDL   T2          WRITE REGISTER FUNCTION
          LDN    0           DISABLE TEST MODE
          RJM    WR          WRITE REGISTER
          LDDL   T3
          ZJN    COGX        IF 25 MB CHANNEL AND DMA READ
          LDML   RORF,CH     READ OPERAND GENERATOR FUNCTION
          RJM    RDRG        READ REGISTER
          LMDL   T3
          ZJN    COGX        IF OPERAND GENERATOR IS CORRECT
          LDN    E18         DMA TEST MODE FAILURE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 .U       IFNE   UNIX,1
          SPACE  5,20
** NAME-- CPLOCK
*
** PURPOSE-- CLEARS THE PP QUEUE LOCK IN THE PP INTERFACE TABLE
          SPACE  2
 CPLX     LJM    **
 CPLOCK   EQU    *-1
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CPLX
 .U       ENDIF
          SPACE  5,20
** NAME-- CQLOCK
*
** PURPOSE-- CLEARS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
          SPACE  2
 CQLX     LJM    **
 CQLOCK   EQU    *-1
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.QLOCK OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CQLX
          SPACE  5,20
** NAME-- CRS
*
** PURPOSE-- CHECK FOR REQUEST SWITCH
*
** EXIT
*         A NOT EQUAL 0 IF MORE DATA TO TRANSFER
          SPACE  2
 CRSX     LJM    **
 CRS      EQU    *-1
          LDDL   T2          SET BY ROUTINES UBT AND WFTC
          NJN    CRS10       IF NO REQUEST SWITCH
          LDML   /SS/P.TOTAL,CSST TOTAL CM BYTES LEFT TO TRANSFER
          NJN    CRS5        IF NOT END OF TRANSFER
          LDML   /SS/P.TOTAL+1,CSST
          SBDL   BC          NUMBER OF CM BYTES TRANSFERRED THIS LOOP
          ZJK    CRS30       IF END OF TRANSFER
          MJN    CRS20       IF CM HAS CHANGED
 CRS5     BSS
          RJM    CSWIT       SWITCH TO NEXT REQUEST
 CRS10    BSS
          LDML   /SS/MT,CSST
          SHN    2
          PJN    CRS15       IF NOT USING MASTER TERMINATE
          LPN    77B
          NJN    CRS35       IF ALL DATA TRANSFERRED
          UJN    CRS25
 CRS15    BSS
          LDML   /SS/P.TOTAL+1,CSST DECREMENT CM BYTES LEFT TO TRANSFER
          SBDL   BC          NUMBER OF CM BYTES TRANSFERRED THIS LOOP
          STML   /SS/P.TOTAL+1,CSST
          PJN    CRS25       IF NOT NECESSARY TO ADJUST SECOND WORD
          ADC    200000B     ADD CARRY BIT
          STML   /SS/P.TOTAL+1,CSST
          SOML   /SS/P.TOTAL,CSST SUBTRACT CARRY BIT FROM FIRST WORD
          PJN    CRS25       IF MORE TO TRANSFER
 CRS20    BSS
          LDC    E505        CM HAS CHANGED
          RJM    INTERR      REPORT ERROR (NO RETURN)
 CRS25    BSS
          LDDL   STATUS
          LPN    0#30
          NJN    CRS35       IF DELAY
          LDDL   BBS
          ZJN    CRS35       IF TIME TO SUSPEND DATA TRANSFER
          UJK    CRSX        IF MORE TO TRANSFER
 CRS30    BSS
          STML   /SS/P.TOTAL+1,CSST ALL BYTES TRANSFERRED
 CRS35    BSS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDN    0
          LJM    CRSX
          SPACE  5,20
** NAME-- CSWIT
*
** PURPOSE-- SWITCH TO THE NEXT REQUEST
          SPACE  2
 CSWX     LJM    **
 CSWIT    EQU    *-1
          LDML   RQ+/RQ/P.NEXT,CSST PUT RMA OF NEXT REQUEST IN SS TABLE
          STML   /SS/P.REQ,CSST
          LDML   RQ+/RQ/P.NEXT+1,CSST
          STML   /SS/P.REQ+1,CSST
          LDML   RQ+/RQ/P.NEXTPV,CSST PUT PVA OF NEXT REQUEST IN SS TABLE
          STML   /SS/P.PVA,CSST
          LDML   RQ+/RQ/P.NEXTPV+1,CSST
          STML   /SS/P.PVA+1,CSST
          LDML   RQ+/RQ/P.NEXTPV+2,CSST
          STML   /SS/P.PVA+2,CSST
          LDML   RQ+/RQ/P.CYL,CSST
          STDL   T2          SAVE CYLINDER OF LAST REQUEST
          RJM    UREQ        READ NEXT REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL,CSST
          SBD    T2
          NJN    *           IF NOT SAME CYLINDER
          LDML   /SS/P.CURSEC,CSST CURRENT SECTOR - 1
          LMML   RQ+/RQ/P.SECTOR,CSST SECTOR OF NEXT REQUEST
          NJN    *           IF SECTOR NUMBER WRONG
          LDML   /SS/P.CURTRK,CSST CURRENT TRACK
          LMML   RQ+/RQ/P.TRACK,CSST TRACK ADDRESS OF NEXT REQUEST
          NJN    *           TRACK NUMBER WRONG
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          AOML   /SS/P.NCR,CSST INCREMENT NUMBER OF COMPLETED REQUESTS
          UJK    CSWX
          SPACE  5,20
** NAME-- CT
*
** PURPOSE-- CONFIDENCE TEST.  RESERVE THE DRIVE, WRITE, READ, AND
*            VERIFY DATA ON A RESERVED CYLINDER.
*
** ENTRY
*         1)  AT INITIALIZATION AFTER PP LOADED
*         2)  DURING REQUEST RECOVERY WITH /SS/P.RECOV = 1
*         3)  WHEN PP RESUMED
          SPACE  2
 CTX      LJM    **
 CT       EQU    *-1
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T1
          LDDL   T1+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJK    MAIN15      IF UNIT DISABLED
 .U       IFEQ   UNIX,1
          RJM    PPRQ        CHECK FOR IDLE REQUEST
 .U       ENDIF
          LDN    0
          STML   /SS/P.CURTRK,CSST STARTING TRACK
          STML   /SS/P.CURSEC,CSST STARTING SECTOR
          RJM    SFT         SET FACILITY TIMEOUT
          RJM    CTDT        CONFIDENCE TEST DATA TRANSFER
          RJM    SFRR        CLEAR CIP AND TCIP
          LDN    1
          STML   /SS/P.CT,CSST INDICATE TEST COMPLETED SUCCESSFULLY
 CT45     LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    CT50        IF CONFIDENCE TEST IS PART OF REQUEST RECOVERY
          LDN    0
          STML   /SS/P.RECOV,CSST
          STML   /SS/P.RQTRY,CSST CLEAR REQUEST RETRY COUNTER
 CT50     BSS
          UJK    CTX
          SPACE  5,20
** NAME-- CTDT
*
** PURPOSE-- CONFIDENCE TEST DATA TRANSFER
          SPACE  2
 CTDTX    LJM    **
 CTDT     EQU    *-1

* WRITE THE CYLINDER

          LCN    0
          STML   CTME,CSST   MAKE MEDIA ERROR TABLE LOOK EMPTY
          STML   CTME+1,CSST
          STML   CTME+2,CSST
          LDN    1
          STDL   FNC         INDICATE WRITE OPERATION
          RJM    BCTB        BUILD CONFIDENCE TEST BUFFER
 CTDT5    BSS                ENTRY IF MEDIA ERROR
          RJM    CBC         COMPUTE BYTE COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
 CTDT7    EQU    *-1         FOR FORCING ERRORS
 CTDT10   BSS
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    CTDT100     IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    BPS
          STDL   BC          BYTES PER SECTOR
          LDC    H0381       STREAM, WRITE
          RJM    FUNC
          LDC    H0D00       DMA WRITE
          RJM    FUNC
          ACN    DC
          LDC    SPT*MAXTR+SPT SECTORS PER CYLINDER
          SBML   STT,CSST    SECTORS TO TRANSFER
          SHN    3
          ADML   CM.CB.T+2
          STDL   RMA+1       LOWER RMA
          SHN    -16
          ADML   CM.CB.T+1
          STDL   RMA         UPPER RMA
          LDN    3
          OAM    BC,DC       BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
          RJM    WFTC        WAIT FOR TRANSFER COMPLETE
          ZJK    CTDT10      IF ERROR, STATUS WILL BE IN NEXT RESPONSE
          RJM    DCM         DESELECT THE CONTROL MODULE
          RJM    UDA         UPDATE DISK ADDRESS
          SOML   STT,CSST
          NJK    CTDT10      IF MORE SECTORS TO TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          ZJK    CTDT100     IF NOT SUCCESSFUL

* READ THE CYLINDER

 CTDT40   BSS
          LDN    0
          STML   /SS/P.CURTRK,CSST STARTING TRACK
          STML   /SS/P.CURSEC,CSST STARTING SECTOR
          STDL   FNC         INDICATE READ FUNCTION
 CTDT50   BSS                ENTRY IF MEDIA ERROR
          RJM    CBC         COMPUTE BYTE COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
 CTDT60   BSS
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    CTDT100     IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    BPS
          STML   CM.CB.T     BYTES PER SECTOR
          LDC    H0281       STREAM, READ
          RJM    FUNC
          LDC    H0C00       DMA READ
          RJM    FUNC
          ACN    DC
          LDN    3
          OAM    CM.CB.T,DC  BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
          RJM    WFTC        WAIT FOR TRANSFER TO COMPLETE
          ZJK    CTDT60      IF ERROR, STATUS WILL BE IN NEXT RESPONSE

* VERIFY THE DATA IN ONE SECTOR

          RJM    DCM         DESELECT THE CONTROL MODULE
          RJM    VCTD        VERIFY CONFIDENCE TEST DATA
          RJM    UDA         UPDATE DISK ADDRESS
          SOML   STT,CSST
          NJK    CTDT60      IF MORE SECTORS TO TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          NJK    CTDTX       IF SUCCESSFUL OR CONDITIONAL SUCCESS
 CTDT100  BSS
          LDN    E00         CP MUST ISOLATE THE ERROR
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- CTR
*
** PURPOSE-- CONFIDENCE TEST RECOVERY
*
** EXIT--  TO CALLING ROUTINE WITH
*             A = 0  IF ERROR LIMIT REACHED
*             A NOT 0  IF NOT MEDIA ERROR
*          TO CTDT ROUTINE IF MEDIA ERROR
          SPACE  2
 CTR100   BSS
          LMN    4           DATA INTEGRITY ERROR
 CTRX     LJM    **
 CTR      EQU    *-1
          LDML   /SS/P.CT,CSST
          NJN    CTR100      IF NOT IN CONFIDENCE TEST
          RJM    CFME        CHECK FOR MEDIA ERROR
          NJN    CTRX        IF NOT A MEDIA ERROR
          LDML   RPB+9,T3    HEAD, SECTOR
          STDL   T4
          LDDL   CSST
          STDL   T5          POINTER TO SS TABLE
          LDN    3
          STDL   T6          NUMBER OF MEDIA ERRORS ALLOWED
 CTR20    BSS
          LDML   CTME,T5
          SHN    2
          MJN    CTR30       IF TABLE ENTRY AVAILABLE
          SHN    -2
          LMDL   T4
          ZJN    CTR40       IF THIS SECTOR IN TABLE
          AODL   T5
          SODL   T6
          NJN    CTR20       IF MORE ENTRIES TO CHECK
          UJK    CTRX
 CTR30    BSS
          LDDL   T4
          STML   CTME,T5
 CTR40    BSS
          RJM    MCC         MASTER CLEAR CHANNEL
          LDDL   FNC
          ZJN    CTR50       IF READ
          LDDL   T4
          SHN    -8
          STML   /SS/P.CURTRK,CSST FAILING TRACK
          LDDL   T4
          LPN    77B
          STML   /SS/P.CURSEC,CSST FAILING SECTOR
 CTR50    BSS
          AOML   /SS/P.CURSEC,CSST UPDATE SECTOR NUMBER
          SBN    SPT         SECTORS PER TRACK
          MJN    CTR60       IF SAME TRACK
          STML   /SS/P.CURSEC,CSST
          AOML   /SS/P.CURTRK,CSST UPDATE TRACK NUMBER
          LMN    MAXTR+1
          NJN    CTR60       IF NOT LAST SECTOR ON CYLINDER
          LDDL   FNC
          NJK    CTDT40      IF WRITE
          LJM    CTDTX
 CTR60    BSS
          LDDL   FNC
          NJK    CTDT5       IF WRITE
          LJM    CTDT50      GO TO READ ENTRY POINT
          SPACE  5,20
** NAME-- CUB
*
** PURPOSE-- CHECK UNIT BUSY.  NOTE IF SLAVE RESET IS IN PROGRESS
*            CMNDS COULD BE 0, BUT ERROR RECOVERY IS STILL IN PROGRESS.
*
** EXIT  A = 0  IF NO COMMANDS IN PROGRESS
          SPACE  2
 CUB50    BSS
          LDN    1
 CUBX     LJM    **
 CUB      EQU    *-1
          LDN    0
          STDL   UX          POINTER TO UNITS TABLE
          UJN    CUB20
 CUB10    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 CUB20    BSS
          SBDL   UNUML
          ZJN    CUBX        IF END OF CONFIGURED UNITS
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5
          LDDL   T5+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJN    CUB10       IF UNIT DISABLED
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          MJN    CUB50       IF COMMAND IN PROGRESS
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   /SS/P.RQTRY,CSST
          NJK    CUB50       IF IN ERROR RECOVERY FOR THIS UNIT
          UJK    CUB10
          SPACE  5,20
** NAME-- DARH
*
** PURPOSE-- DRIVE ASYNCHRONOUS RESPONSE HANDLER
          SPACE  2
 DARHX    LJM    **
 DARH     EQU    *-1
          LDDL   UX
          STDL   T8          SAVE UX
          LDN    0
          STDL   UX          INDEX TO UX TABLE
          UJN    DARH20
 DARH10   BSS
          LDN    P.UN
          RADL   UX          INDEX TO UX TABLE
 DARH20   BSS
          SBDL   UNUML
          ZJN    DARHX       IF DRIVE NOT FOUND
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   /SS/P.UNIT,CSST
          LMML   RPB+SLAD
          NJN    DARH10      IF DIFFERENT DRIVE
          LDML   UNITS,UX
          LMML   UNITS,T8
          LPC    100B
          NJN    DARH10      IF DIFFERENT CHANNEL PORT
          LDK    ID26
          RJM    SFP         CHECK FOR MACHINE EXCEPTION
          MJN    DARH30      IF MACHINE EXCEPTION ID NOT FOUND
          LDML   RPB+6,T3
          LPC    0#FAF0
          LMC    0#6000
          ZJN    DARH40      IF NO ERROR
 DARH30   BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ENDIF
 DARH40   BSS
          LDML   /SS/P.RESET,CSST
          ZJK    DARHX       IF RESET NOT ISSUED
          RJM    SFRR        SET UP FOR REQUEST RETRY
          UJK    DARHX
          SPACE  5,20
** NAME-- DCR
*
** PURPOSE-- DELETE COMPLETED REQUEST FROM THE UNIT QUEUE.
*
** INPUTS-- UNITS+/UN/P.UIT = POINTER TO UNIT INTERFACE TABLE
*
** OUTPUT-- P5, T8 ARE UNCHANGED
          SPACE  2
 DCRX     LJM    **
 DCR      EQU    *-1
          LDN    2
          STDL   P6
 DCR2     BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    DCR2        IF LOCK COULD NOT BE SET
          LOADF  /SS/P.CURRQ,CSST RMA OF CURRENT REQUEST
          CRML   RQT,P6      READ RMA CHAIN OF CURRENT REQUEST

          LOADR  UNITS+/UN/P.UIT,UX  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,CSST 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,CSST 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,CSST
          NJN    DCR15       IF NEXT REQUEST IS NOT COMPLETED REQUEST
          LDDL   T4
          LMML   /SS/P.FCOMRQ+1,CSST
          ZJK    DCR30       IF THIS IS A COMPLETED REQUEST
 DCR15    BSS
          LOADF  T3          UPDATE DELINK POINTER TO NEXT
          STML   /SS/P.DP+2,CSST  REQUEST IN THE CHAIN
          LDDL   CMADR
          STML   /SS/P.DP,CSST
          ADDL   CMADR+1
          ADDL   CMADR+2
          ZJN    DCR20       IF END OF REQUEST QUEUE
          LDDL   CMADR+1
          STML   /SS/P.DP+1,CSST
          LDDL   CMADR+2
          LMC    400000B
          UJN    DCR12
 DCR20    BSS
          LDML   UNITS+/UN/P.UIT,UX INITIALIZE DELINK POINTER TO
          STML   /SS/P.DP,CSST       FIRST RMA
          LDML   UNITS+/UN/P.UIT+1,UX
          STML   /SS/P.DP+1,CSST
          LDML   UNITS+/UN/P.UIT+2,UX
          ADN    /UIT/C.NEXTPV
          STML   /SS/P.DP+2,CSST
          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
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    DCR35      IF NOT FORMAT COMMAND
          SODL   CMNDS       CMNDS IS SET TO 2 FOR FORMAT
          LDML   UNITS,UX
          UJK    DCR37
 DCR35    LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    DCR44       IF 2 COMMANDS ISSUED TO CONTROLLER
          SHN    -/UN/L.TCIP-2
 DCR37    LPC    0#1FFF
          STML   UNITS,UX    CLEAR CIP AND DTIP
          LDML   RQT+/RQ/P.NEXT
          STML   /SS/P.REQ,CSST
          LDML   RQT+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,CSST POSSIBLE NEXT RMA
          ADML   /SS/P.REQ,CSST
          ZJN    DCR40       IF END OF QUEUE
          LDML   RQT+/RQ/P.NEXTPV
          STML   /SS/P.PVA,CSST
          LDML   RQT+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA+1,CSST
          LDML   RQT+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA+2,CSST
 DCR40    BSS
          LJM    DCR50
 DCR44    BSS
          LDML   UNITS,UX
          LPC    0#9FFF
          STML   UNITS,UX    CLEAR TCIP, DTIP

* MOVE (RMA, PVA, TOTAL BYTES) FOR SECOND COMMAND ISSUED TO THE
* TABLE FOR THE FIRST COMMAND

          LDML   /SS/P.RMA2,CSST
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.RMA2+1,CSST
          STML   /SS/P.REQ+1,CSST MOVE RMA
          LDML   /SS/P.PVA2,CSST
          STML   /SS/P.PVA,CSST
          LDML   /SS/P.PVA2+1,CSST
          STML   /SS/P.PVA+1,CSST
          LDML   /SS/P.PVA2+2,CSST
          STML   /SS/P.PVA+2,CSST MOVE PVA
          LDML   /SS/P.TW2,CSST
          STML   /SS/P.TOTAL,CSST
          LDML   /SS/P.TW2+1,CSST
          STML   /SS/P.TOTAL+1,CSST MOVE TOTAL BYTES
          RJM    UREQ        READ UNIT REQUEST FROM CM
          RJM    SRESP       SET UP STATUS FOR RESPONSE BUFFER
          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    UNCMND      GET FIRST COMMAND
 DCR50    BSS
          SODL   CMNDS       OUTSTANDING COMMANDS
          LJM    DCRX
          SPACE  5,20
** NAME-- DPR
*
** PURPOSE-- DRIVE POWER ON RESET.  THIS MASTER CLEARS THE DRIVES,
*            BREAKS AN OPPOSITE ACCESS RESERVE AND RUNS DIAGNOSTICS.
*            IT IS ISSUED BY THE CM3 EVEN IF THE CM3 THINKS THE DRIVE
*            IS NOT OPERATIONAL.
          SPACE  2
 DPRX     LJM    **
 DPR      EQU    *-1
          LDC    H0800       ABORT COMMAND
          STML   CP+OPCD
          LDN    9           COMMAND PACKET LENGTH
          STML   CP
          LDC    0#254
          STML   CP+FCP
          LDC    0#400       RESET AS AT POWER ON
          STML   CP+FCP+1
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJK    DPR50       IF ERROR
*
*         IF THE UNIT IS NOT READY, THE DRIVE RESET COULD RESULT IN A
*         STATE CHANGE.  THE STATE CHANGE TOOK AS LONG AS 22 SECONDS
*         WITH REV 8A OF CM3 MICROCODE.  IF A CM3 IS POWERED ON AND A
*         DRIVE IS RESERVED TO ANOTHER CM3, THE CM3 THAT IS POWERED
*         ON WILL REPORT THAT THE DRIVE IS NOT OPERATIONAL AND NOT READY.
*
          LDML   /SS/P.RQ,CSST
          ZJK    DPRX        IF THERE SHOULD BE NO STATE CHANGE
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX  SAVE CLOCK IN TABLE
 DPR10    BSS
          RJM    RI          REQUEST INTERRUPT
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          NJN    DPR20       IF INTERRUPT PRESENT
          RJM    UC          UPDATE CLOCK
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    DPR15       IF CLOCK HAS NOT WRAPPED
          ADC    0#10000
 DPR15    BSS
          SBN    32          30 TO 32 SECOND TIMEOUT
          MJN    DPR10       IF TIMEOUT NOT EXPIRED
          LJM    DPRX
 DPR20    BSS
          RJM    SEL         SELECT THE CONTROLLER
          RJM    RPT         RESPONSE PACKET TRANSFER
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDML   RPB+MAJST
          SHN    -4
          LPN    0#F
          LMN    AR
          NJN    DPR50       IF NOT ASYNCHRONOUS RESPONSE
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJN    DPR50       IF ASYNCHRONOUS RESPONSE FOR CONTROLLER
          RJM    DARH        DYNAMIC ASYNCHRONOUS RESPONSE HANDLER
          LDDL   T8
          STDL   UX          RESTORE UX
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LJM    DPRX
 DPR50    BSS
          LDN    E00         CPU MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- DUSC
*
** PURPOSE-- DISABLE USAGE STATISTICS COUNTING.  THIS IS SUPPOSE
*            TO SAVE 400 MICROSECONDS PER COMMAND. IT ALSO ELIMINATES
*            THE PROBLEM OF HANDLING STATISTIC COUNTER OVERFLOWS AND
*            HAVING TO CLEAR THE PERFORMANCE LOG.
*
*            ALSO ALLOW FAULT LOG REPORTING AND ALLOW MASTER TERMINATE
*            IF REVISION 8A OR LATER CM3 MICROCODE.
          SPACE  2
 DUSCX    LJM    **
 DUSC     EQU    *-1
          LDML   /SS/P.MREV,CSST
          SHN    -12
          STDL   T1          MICROCODE REVISION
          SBN    7
          MJN    DUSC10      IF MICROCODE REVISION BEFORE 7A
          ZJN    DUSC5       IF MICROCODE REVISION BEFORE 8A
          LDN    0#13
          UJN    DUSC20
 DUSC5    BSS
          LDN    0#B
          UJN    DUSC20
 DUSC10   BSS
          LDN    8
 DUSC20   BSS
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#209
          STML   CP+OPCD     ATTRIBUTES COMMAND
          LDDL   CMOD
          LPN    7
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     SLAVE ADDRESS
          LDC    0#1D1
          STML   CP+FCP      DISABLE COUNTING PARAMETER
          LDC    0#2D4
          STML   CP+FCP+1    DEVICE FAULT LOG REPORTING

*         ENABLING DEVICE FAULT LOG REPORTING BEFORE 8A MICROCODE CAUSED
*         WRITING TO THE WRONG CYLINDER IF THE DRIVE HAD A SLIPPED CYLINDER.

          LDDL   T1
          SBN    8
          MJN    DUSC30      IF MICROCODE REVISION BEFORE 8A
          LDC    0#100       ENABLE REPORTING
          UJN    DUSC40
 DUSC30   BSS
          LDN    0           DISABLE REPORTING
 DUSC40   BSS
          STML   CP+FCP+2
          STML   CP+FCP+4
          STML   CP+FCP+6
          LDC    0#2D2       ALLOW MASTER TERMINATE
          STML   CP+FCP+3
          LDC    0#2D3       SPEED UP MASTER TERMINATE
          STML   CP+FCP+5
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    DUSCX       IF SUCCESSFUL
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EFP
*
** PURPOSE-- ERROR FLAG PROCESSING
          SPACE  2
 EFP      CON    0
          LDC    H0800       DMA TERMINATE
          RJM    FAN
          LDC    H0600       READ DMA ERROR REGISTER
          RJM    RDRG
          SHN    9
          MJK    EFP60       IF IPI ERROR
          SHN    12
          MJK    EFP85       IF ILLEGAL FUNCTION
          SHN    1
          MJN    EFP5        IF UNCORRECTED CM ERROR
          SHN    1
          PJN    EFP10       IF NOT CM REJECT
 EFP5     BSS
          LDN    E09         CENTRAL MEMORY ERROR
          UJN    EFP40
 EFP10    BSS
          SHN    1
          PJN    EFP15       IF NOT INVALID CM RESPONSE CODE
          LDN    E10
          UJN    EFP40
 EFP15    BSS
          SHN    1
          PJN    EFP20       IF NOT CM RESPONSE CODE PARITY ERROR
          LDN    E11
          UJN    EFP40
 EFP20    BSS
          SHN    1
          PJN    EFP25       IF NOT CMI READ DATA PARITY ERROR
          LDN    E12
          UJN    EFP40
 EFP25    BSS
          SHN    5
          PJN    EFP35       IF NOT JY DATA ERROR
          LDN    E13
          UJN    EFP40
 EFP35    BSS
          SHN    1
          PJN    EFP45       IF NOT BAS PARITY ERROR
          LDN    E14
 EFP40    BSS
          UJN    EFP75
 EFP45    BSS
          SHN    1
          PJN    EFP50       IF NOT LZ ERROR
          LDN    E15
          UJN    EFP75
 EFP50    BSS
          SHN    1
          PJN    EFP55       IF NOT JY ERROR
          LDN    E16
          UJN    EFP75
 EFP55    BSS
          SHN    1
          PJK    EFP130      IF NOT LX ERROR
          LDN    E17
          UJN    EFP75
 EFP60    BSS
          LDC    H00F1       READ IPI ERROR REGISTER
          RJM    RDRG
          SHN    2
          PJN    EFP65       IF NOT BUFFER COUNTER PARITY
          LDN    E31
          UJN    EFP75
 EFP65    BSS
          SHN    2
          PJN    EFP70       IF NOT SYNC COUNTER PARITY
          LDN    E32
          UJN    EFP75
 EFP70    BSS
          SHN    1
          PJN    EFP80       IF NOT PERIOD COUNTER PARITY
          LDN    E03
 EFP75    BSS
          UJN    EFP120
 EFP80    BSS
          SHN    1
          MJN    EFP85       IF PARITY ERROR ON FUNCTION
          SHN    1
          PJN    EFP95       IF NOT PARITY ERROR ON FUNCTION
 EFP85    BSS
          LDN    E01         FUNCTION TIMEOUT
          UJN    EFP120
 EFP95    BSS
          SHN    3
          PJN    EFP100      IF NOT LOST DATA
          LDN    E33
          UJN    EFP150
 EFP100   BSS
          SHN    1
          PJN    EFP105      IF NOT UPPER ICI PARITY
          LDN    E04
          UJN    EFP150
 EFP105   BSS
          SHN    1
          PJN    EFP110      IF NOT LOWER ICI PARITY
          LDN    E05
          UJN    EFP150
 EFP110   BSS
          SHN    1
          PJN    EFP115      IF NOT IPI SEQUENCE ERROR
          LDN    E24
          UJN    EFP150
 EFP115   BSS
          SHN    1
          PJN    EFP125      IF NOT UPPER IPI CHANNEL PARITY
          LDN    E25
 EFP120   BSS
          UJN    EFP150
 EFP125   BSS
          SHN    1
          PJN    EFP130      IF NOT LOWER IPI CHANNEL PARITY
          LDN    E26
          UJN    EFP150
 EFP130   BSS
          LDN    E06         IOU ERROR
 EFP150   BSS
          STML   RS+/RS/P.ERRID
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EP
*
** PURPOSE-- ERROR PROCESSING
          SPACE  2
 EP       CON    0
          LDML   /SS/P.RQTRY,CSST
          NJN    EP5         IF NOT FIRST ERROR FOR REQUEST
          STML   /SS/P.RECOV,CSST
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EP5      BSS
 .U       IFEQ   UNIX,1
          RJM    PPRQ        CHECK FOR IDLE REQUEST
 .U       ENDIF
          LDN    0
          STML   /SS/P.RQ,CSST  DO NOT WAIT FOR ASYNCH IN DPR
          LDML   RS+/RS/P.ERRID
          NJN    EP7         IF RESPONSE PACKET NOT APPLICABLE
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    EP7         IF PARAMETER 24 NOT FOUND
          LDML   RPB+6,T3
          SHN    3
          PJN    EP7         IF DRIVE WAS READY
          AOML   /SS/P.RQ,CSST  FLAG SAYS WAIT FOR ASYNCH IN DPR
 EP7      BSS
          LDN    0
          STDL   TBC         DO NOT EXPECT 01 ENDING STATUS
          LDDL   TMF
          NJN    EP10        IF ERROR DURING TEST MODE
          LDML   RS+/RS/P.ERRID
          ZJK    EP25        IF PROBABLY NOT IOU ERROR
          SBN    E20
          PJK    EP25        IF PROBABLY NOT IOU ERROR
 EP10     BSS
          LDML   /SS/P.RQTRY,CSST
          SBN    11
          PJN    EP20        IF RETRY LIMIT REACHED
          AOML   /SS/P.RQTRY,CSST INCREMENT RETRY COUNT
          PAUSE  200000      MUST RETRY FOR 2 SECONDS BEFORE
                              DOWNING UNIT. THIS ALSO ALLOWS TIME
                              FOR THE CM3 TO WRITE ANY DATA IN ITS
                              BUFFER TO DISK
          LDDL   TMF
          NJN    EP15        IF ERROR DURING TEST MODE
          RJM    TAC         TERMINATE ALL COMMANDS
          RJM    RAR         RESTART ALL REQUESTS
 EP15     BSS
          LJM    MAIN10
 EP20     BSS
          LDK    /RS/K.CHDN  CHANNEL DOWN
          STML   RS+/RS/P.ID
 .U       IFEQ   UNIX,1
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          RJM    OFFCH       TURN OFF ALL UNITS ON CHANNEL
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ELSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          LJM    MAIN15
 EP25     BSS
          LDML   /SS/P.RECOV,CSST INDEX TO ERROR PROCESSING PROCEDURE
          STDL   T1
          LDML   EPT,T1
          STML   EP30
          LJM    **          EXECUTE NEXT STEP IN RECOVERY PROCEDURE
 EP30     EQU    *-1

 EPT      BSS    0
          CON    EPA         RETRY THE REQUEST
          CON    EPB         CONFIDENCE TEST
          CON    EPC         SLAVE RESET
          CON    EPD         PATH TEST
          CON    EPE         DRIVE DIAGNOSTICS
          CON    EPF         IF FINAL REQUEST RETRY FAILED
          CON    EPG         IF LOGICAL RESET FAILS AFTER FINAL RETRY
          CON    EPD50       REQUEST RETRY ERROR AFTER SLAVE RESET
          CON    EPC70       AFTER READ PERFORMANCE LOG
          SPACE  5,20
*
* REQUEST RETRY
*
 EPA      BSS
          LDML   /SS/P.RQTRY,CSST REQEST RETRY COUNTER
          ZJN    EPA10       IF INTERMEDIATE RESPONSE ALREADY REPORTED
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    EPA05       IF NOT FORMAT COMMAND
          LDML   /SS/P.RQTRY,CSST REQUEST RETRY COUNTER
          SBN    RRL
          NJN    EPA05       CONTINUE WITH ERROR RECOVERY
          LJM    EPF10       SEND ABNORMAL RESPONSE
 EPA05    LDML   /SS/P.RQTRY,CSST REQEST RETRY COUNTER
          SBN    RRL+1
          PJN    EPB         IF FAILURE DURING LOGICAL RESET
          RJM    INTRS       REPORT INTERMEDIATE RESPONSE
 EPA10    BSS
          RJM    CTR         CONFIDENCE TEST RECOVERY
          NJN    EPA30       IF ERROR LIMIT NOT REACHED
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNTER
          UJK    EPC
 EPA30    BSS
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNTER
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMANDS
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+1
          MJN    EPB10       IF NOT RETRY LIMIT
          SPACE  5,20
*
* CONFIDENCE TEST
*
 EPB      BSS
          LDML   /SS/P.FNC,CSST
          SBN    4
          ZJK    EPF10       IF FORMAT COMMAND, SEND ABNORMAL RESPONSE
          LDML   /SS/P.CT,CSST
          ZJN    EPC         IF IN INITIALIZATION CONFIDENCE TEST
          LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    EPB20       IF CONFIDENCE TEST ALREADY STARTED
          AOML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDN    0
          STML   /SS/P.CT,CSST ENABLE STARTING CONFIDENCE TEST
 EPB10    BSS
          LJM    MAIN10
 EPB20    BSS
          LDML   /SS/P.CT,CSST
          NJN    EPC         IF CONFIDENCE TEST COMPLETE
          RJM    CTR         CONFIDENCE TEST RECOVERY
          SPACE  5,20
*
* SLAVE RESET
*
 EPC      BSS
          LDML   RS+/RS/P.ERRID
          SBN    E20
          ZJN    EPC2        IF -CAN'T SELECT CONTROLLER- ERROR
          SBN    E38-E20
          NJN    EPC5        IF NOT -NO CONTROLLER RESPONSE-
 EPC2     BSS
          LDML   UNITS,UX    IF CONTROLLER HUNG, READ PERFORMANCE
          LPC    0#EFFF       LOG AFTER SLAVE RESET
          LMC    /UN/K.NCR   NO CONTROLLER RESPONSE BIT
          STML   UNITS,UX
 EPC5     BSS
          LDML   /SS/P.RECOV,CSST
          ZJN    EPC15       IF INITIALIZATION CONFIDENCE TEST
          SBN    2
          ZJK    EPC50       IF SLAVE RESET ALREADY ISSUED
          LDML   /SS/P.CT,CSST
          LMN    1
          NJN    EPC8        IF CONFIDENCE TEST FAILED
 .U       IFNE   UNIX,1
          RJM    CFME        CHECK FOR MEDIA ERROR
          NJN    EPC10       IF NOT A MEDIA ERROR
 .U       ENDIF
 .E       IFEQ   ERRD,1      READ RAW DATA
          RJM    RRD         READ RAW DATA
 .E       ENDIF
          LDK    /RS/K.DATERR SOFTWARE FLAW THE ALLOCATION UNIT
          STML   RS+/RS/P.DATERR
          LDN    E62         MEDIA ERROR
          STML   RS+/RS/P.ERRID
          LJM    EPF
 EPC8     BSS
          LMN    1
          NJN    EPC10       IF CONFIDENCE TEST COMPLETE
          RJM    SFRR       CLEAR CIP, IF
          LDN    2
          STML   /SS/P.CT,CSST INDICATE CONFIDENCE TEST FAILED
 EPC10    BSS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EPC15    BSS
          LDN    2
          STML   /SS/P.RECOV,CSST INDEX TO NEXT STEP OF RECOVERY
          LDN    E50         SLAVE RESET STARTED
          STML   RS+/RS/P.ERRID
          RJM    INTRS       INTERMEDIATE RESPONSE
          LDDL   PTF         PATH TEST FLAG
          ZJN    EPC20       IF INITIALIZATION PATH TEST
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMANDS
          LDC    0#C000      COMMAND IN PROG., 2 COMMANDS IN PROG.
          RJM    SCB         SET COMMAND IN PROGRESS BITS
 EPC20    BSS
          RJM    SRI         SET RESET ISSUED FLAG
          RJM    ISR         ISSUE SLAVE RESET (NO RETURN)
 EPC50    BSS
          LDML   UNITS,UX
          LPC    /UN/K.NCR
          STDL   T5          SAVE NO CONTROLLER RESPONSE FLAG
          LDML   UNITS,UX
          LPC    0#EFFF
          STML   UNITS,UX    CLEAR -NO CONTROLLER RESPONSE- BIT
          LDML   RS+/RS/P.ERRID
          LMC    E72
          NJK    EPC100      IF NOT MACHINE EXCEPTION
          LDN    ID16
          RJM    SFP         SEARCH FOR PARAMETER
          LDML   RPB+6,T3
          LPC    0#FEE0
          LMC    0#6000
          NJK    EPC100      IF SLAVE RESET FAILED
          LDN    2
          STML   /SS/P.RESET,CSST INDICATE ASYNCH FOR SLAVE RECEIVED

*         WITH MICROCODE 9A OR LATER A LOGICAL RESET IMMEDIATELY AFTER
*         SLAVE RESET FAILS.  A DELAY SHOULD PREVENT THIS FAILURE.

          LDC    1000
          STDL   T6          PAUSE 5 SECONDS
 EPC60    BSS
          PAUSE  5000
          RJM    PPRQ        CHECK FOR IDLE REQUEST
          SODL   T6
          NJN    EPC60       IF PAUSE NOT COMPLETE
          LDDL   T5
          ZJN    EPC70       IF CONTROLLER WAS NOT HUNG
          LDN    8           GO TO EPC70 IF ERROR
          STML   /SS/P.RECOV,CSST
          RJM    REL         READ ERROR LOG
          LDK    E52         SLAVE RESET PASSED, ERROR CODE PRESENT
          UJN    EPC80
 EPC70    BSS
          LDN    E51         SLAVE RESET PASSED
 EPC80    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    INTRS       INTERMEDIATE RESPONSE
          LDML   /SS/P.CT,CSST
          LMN    4
          ZJK    EPE40       IF DATA INTEGRITY PROBLEM
          LDN    7           INDEX TO NEXT STEP OF RECOVERY (EPD50)
          STML   /SS/P.RECOV,CSST
          RJM    DUSC        DISABLE USAGE STATISTIC COUNTING
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNT
          LJM    MAIN10
 EPC100   BSS
          LDDL   PTF
          ZJN    EPC110      IF IN PATH TEST
          LDML   RS+/RS/P.ERRID
          SBN    E20
          MJN    EPC110      IF PROBABLY NOT A CABLE PROBLEM
          SBN    E50-E20
          PJN    EPC110      IF PROBABLY NOT A CABLE PROBLEM
          RJM    INTRS       INTERMEDIATE RESPONSE
          UJN    EPD
 EPC110   BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CM3 (NO RETURN)

 EPCT     BSS    16          UX FOR RESET CONTROLLER
          SPACE  5,20
*
* PATH TEST (ROUTINE PT WORKED ONCE, SLAVE RESET FAILED, MAY BE DAISY
*            CHAIN PROBLEM.)
 EPD      BSS
          LDDL   PTF
          NJN    EPD10       IF NOT IN INITIALIZATION CONFIDENCE TEST
          RJM    CTR         CONFIDENCE TEST RECOVERY
          LDN    2
          STML   /SS/P.CT,CSST INDICATE CONFIDENCE TEST FAILED
          UJK    EPC110
 EPD10    BSS
          LDML   /SS/P.RECOV,CSST
          LMN    3
          ZJN    EPD55       IF PATH TEST ALREADY STARTED
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNT
          LDN    3
          STML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          RJM    RAR         SETUP FOR RESTARTING ALL REQUESTS
          LDN    0
          STDL   PTF         FORCE RUNNING PATH TEST
          LJM    MAIN10
 EPD50    BSS                ENTER HERE IF ERROR AFTER SLAVE RESET
          LDDL   PTF
          NJN    EPD60       IF PATH TEST SUCCESSFUL
 EPD55    BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CM3 (NO RETURN)
 EPD60    BSS
          RJM    INTRS       INTERMEDIATE RESPONSE
          SPACE  5,20
*
* DRIVE DIAGNOSTICS
*
 EPE      BSS
          LDML   /SS/P.RECOV,CSST
          LMN    4
          ZJN    EPE50       IF DIAGNOSTIC COMMAND ALREADY ISSUED
          LDN    4           INDEX TO THIS RECOVERY PROCEDURE
          STML   /SS/P.RECOV,CSST
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNT
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMAND
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    PDD         PERFORM DRIVE DIAGNOSTICS
          LDML   /SS/P.CT,CSST
          LMN    4
          ZJN    EPE40       IF DATA INTEGRITY ERROR
          LDN    5
          STML   /SS/P.RECOV,CSST INDEX TO RECOVERY PROCEDURE (EPF)
          LJM    MAIN10
 EPE40    BSS
          LDK    E111        CM-DRIVE DATA INTEGRITY
          STML   RS+/RS/P.ERRID RESET ERROR IDENTIFIER
 EPE50    BSS
          UJN    EPF5
          SPACE  5,20
*
* IF FINAL REQUEST RETRY FAILED
*
 EPF      BSS
          LDML   /SS/P.CT,CSST
          LMN    1
          ZJN    EPF10       IF CONFIDENCE TEST PASSED
 EPF5     BSS
          LDK    /RS/K.UDN   UNIT DOWN
          STML   RS+/RS/P.ID
 .U       IFEQ   UNIX,1
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          RJM    OFFUN       TURN OFF UNIT
 .U       IFNE   UNIX,1
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          UJN    EPF20
 EPF10    BSS
          LDC    R.ABN*0#4000 ABNORMAL TERMINATION
          STML   RS+/RS/P.RC RESPONSE CODE
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    DCR         DELINK REQUEST
 .U       IFEQ   UNIX,1
 EPF20    BSS
 .U       ENDIF
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
 .U       IFNE   UNIX,1
 EPF20    BSS
 .U       ENDIF
          LDN    6
          STML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          RJM    LIR         LOGICAL INTERFACE RESET
          SPACE  5,20
*
* ENTER HERE IF PREVIOUS LOGICAL INTERFACE RESET WORKS OR FAILS
*
 EPG      BSS
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMANDS
          LDN    0
          STDL   IF          CLEAR INITIALIZATION FLAG
          STML   /SS/P.RQTRY,CSST CLEAR RETRY COUNT
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    EPG10       IF NOT FORMAT COMMAND
          STML   FIP         CLEAR FORMAT IN PROGRESS FLAG
 EPG10    LJM    MAIN10
 .F       IFEQ   FE,1        FORCE ERROR CODE
          SPACE  5,20
** NAME-- FER
*
** PURPOSE-- FORCE ERROR ROUTINE.  THE ERROR CAN BE FORCED BY CHANGING
*            CENTRAL MEMORY WORD 8.  SOME ROUTINES REQUIRE THE UNIT
*            NUMBER TO BE IN CENTRAL MEMORY WORD 9.
          SPACE  2
 FERX     LJM    **
 FER      EQU    *-1
          LDN    8
          CRDL   P2          READ LOCATION WITH ERROR ROUTINE
          LDDL   P2
          ZJN    FERX        IF NOT FORCING AN ERROR
          STDL   FEST
          LPN    77B
          STDL   P6          INDEX TO TABLE
          SBN    FETND-FET
          PJN    FERX        IF UNDEFINED VALUE
          LDN    0
          STDL   P2
          LDN    8
          CWDL   P2          INDICATE ERROR BEING FORCED
          LDDL   FEST
          SHN    -8
          STDL   FEST        FORCE ERROR START COUNT
          LDDL   P3
          STDL   FEND        FORCE ERROR END COUNT OR UNIT NUMBER
          LDN    9
          CRDL   P2          READ WORD WITH UNIT NUMBER
          LDDL   P2
          STDL   FEUN        UNIT TO FORCE ERROR ON
          LDML   FET,P6
          STDL   P2
          LJM    0,P2        JUMP TO FORCE ERROR ROUTINE
* TABLE OF ERRORS TO FORCE
 FET      BSS
          CON    FERX        NO ERROR
          CON    FERA        LOWER ICI PARITY ERROR ON READ
          CON    FERB        DROP SELECT DURING READ
          CON    FERC        LOWER ICI PARITY ERROR ON WRITE
          CON    FERD        DROP SELECT DURING WRITE
          CON    FERE        READ ONE TOO MANY WORDS (RECOVERABLE)
          CON    FERF        READ ONE TOO FEW WORDS (RECOVERABLE)
          CON    FERG        WRITE ONE TOO MANY WORDS (RECOVERABLE)
          CON    FERH        WRITE ONE TOO FEW WORDS (UNRECOVERABLE)
          CON    FERI        READ DATA IPI P.E. (RECOVERABLE)
          CON    FERJ        WRITE DATA IPI P.E. (RECOVERABLE)
          CON    FERK        SPIN DOWN UNIT
          CON    MAIN5       INITIALIZE, RUN PATH, CONF. TEST
          CON    FERM        ILLEGAL CYLINDER FOR READ OR WRITE
          CON    FERN        LOWER ICI PARITY ERROR IN PATH TEST
          CON    FERO        UNABLE TO SELECT ERROR IN PATH TEST
          CON    FERP        ILLEGAL COUNT ERROR IN PATH TEST
          CON    FERQ        LOWER ICI PARITY ERROR IN CONFIDENCE TEST
          CON    FERR        UNABLE TO SELECT ERROR IN CONFIDENCE TEST
          CON    FERS        ILLEGAL CYLINDER ERROR IN CONFIDENCE TEST
          CON    FERT        CHANGE ONE MEMORY LOCATION
          CON    FERU        PARITY ERROR ON READ
          CON    FERV        BYTE COUNT EQUAL ZERO ON READ
          CON    FERW        PARITY ERROR ON WRITE
          CON    FERY        BYTE COUNT EQUAL ZERO ON WRITE
          CON    FERZ        TEST MODE READ 1 TOO MANY WORDS
 FETND    BSS
          SPACE  5,20
** NAME-- FERA
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON READ
*            8 = XX01 YYYY
*            9 = CCDD
*                X = BURSTS TO READ BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERA     BSS
          LDC    FERA10
          UJN    FERB5
 FERA10   CON    0
          STDL   T3          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJK    FERB25      IF WRONG DRIVE
          SODL   FEST
          PJN    FERB25      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERB15
          SPACE  5,20
** NAME--FERB
*
** PURPOSE-- DROP SELECT DURING READ
*            8 = XX02 YYYY
*            9 = CCDD
*                X = BURSTS TO READ BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERB     BSS
          LDC    FERB10
 FERB5    BSS
          STML   READ34
          LJM    MAIN10
 FERB10   CON    0
          STDL   T3          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERB25      IF WRONG DRIVE
          SODL   FEST
          PJN    FERB25      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
 FERB15   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERB25      IF NOT TIME TO RESTORE INSTRUCTION
 FERB20   BSS
          LDC    FUNC
          STML   READ34      RESTORE FUNCTION
 FERB25   BSS
          LDDL   T3
          RJM    FUNC        SEND FUNCTION
          LJM    READ34+1    RETURN TO READ ROUTINE
          SPACE  5,20
** NAME-- FERC
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON WRITE
*            8 = XX03 YYYY
*            9 = CCDD
*                X = BURSTS TO WRITE BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERC     BSS
          LDC    FERC10
          UJN    FERD5
 FERC10   CON    0
          STDL   T3
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJK    FERD25      IF WRONG DRIVE
          SODL   FEST
          PJN    FERD25      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERD15
          SPACE  5,20
** NAME-- FERD
*
** PURPOSE-- DROP SELECT DURING WRITE
*            8 = XX04 YYYY
*            9 = CCDD
*                X = BURSTS TO WRITE BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERD     BSS
          LDC    FERD10
 FERD5    BSS
          STML   WRI34
          LJM    MAIN10
 FERD10   CON    0
          STDL   T3          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERD25      IF WRONG DRIVE
          SODL   FEST        FORCE ERROR START COUNT
          PJN    FERD25      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
 FERD15   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERD25      IF NOT TIME TO RESTORE INSTRUCTION
 FERD20   BSS
          LDC    FUNC
          STML   WRI34       RESTORE THE INSTRUCTION
 FERD25   BSS
          LDDL   T3
          RJM    FUNC        SEND FUNCTION
          LJM    WRI34+1     RETURN TO WRITE ROUTINE
          SPACE  5,20
** NAME-- FERE
*
** PURPOSE-- READ ONE TOO MANY WORDS
*            8 = 0005
          SPACE  2
 FERE     BSS
          LDC    FERE15
          STML   READ40
          LDC    FERE10
          UJN    FERF5
 FERE10   CON    0
          AODL   BC          INCREMENT BY ONE BYTE
          AODL   BC
          UJN    FERF15
 FERE15   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          SODL   BC          RESTORE BYTE COUNT
          SODL   BC
          UJN    FERF25
          SPACE  5,20
** NAME-- FERF
*
** PURPOSE-- READ ONE TOO FEW WORDS
*            8 = 0006
          SPACE  2
 FERF     BSS
          LDC    FERF20
          STML   READ40
          LDC    FERF10
 FERF5    BSS
          STML   READ32
          LJM    MAIN10
 FERF10   CON    0
          SODL   BC          DECREMENT BY ONE BYTE
          SODL   BC
 FERF15   BSS
          LDC    BCS         RESTORE INSTRUCTION
          STML   READ32
          LJM    READ32-2
 FERF20   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          AODL   BC          RESTORE BYTE COUNT
          AODL   BC
 FERF25   BSS
          LDC    DCN         RESTORE INSTRUCTION
          STML   READ40
          LDDL   T3
          LJM    READ40-1
          SPACE  5,20
** NAME-- FERG
*
** PURPOSE-- WRITE ONE TOO MANY WORDS
*            8 = 0007
          SPACE  2
 FERG     BSS
          LDC    FERG15
          STML   WRI40
          LDC    FERG10
          UJN    FERH5
 FERG10   CON    0
          LDN    2
          RADL   BC
          UJN    FERH15
 FERG15   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          LCN    2
          RADL   BC
          UJN    FERH25
          SPACE  5,20
** NAME-- FERH
*
** PURPOSE-- WRITE ONE TOO FEW WORDS
*            8 = 0008
          SPACE  2
 FERH     BSS
          LDC    FERH20
          STML   WRI40
          LDC    FERH10
 FERH5    BSS
          STML   WRI32
          LJM    MAIN10
 FERH10   CON    0
          SODL   BC          DECREMENT BY ONE BYTE
          SODL   BC
 FERH15   BSS
          LDC    BCS
          STML   WRI32       RESTORE INSTRUCTION
          LJM    WRI32-2
 FERH20   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          AODL   BC          RESTORE BYTE COUNT
          AODL   BC
 FERH25   BSS
          LDC    DCN         RESTORE INSTRUCTION
          STML   WRI40
          LDDL   T3
          LJM    WRI40-1
          SPACE  5,20
** NAME-- FERI
*
** PURPOSE-- FORCE IPI PARITY ERROR ON INPUT DURING READ
*            8 = 0009
          SPACE  2
 FERI     BSS
          LDC    FERI10
          LJM    FERB5
 FERI10   CON    0
          STDL   T3          SAVE FUNCTION
          LDC    H0322
          RJM    FUNC        FORCE BUS A INPUT PARITY ERROR
          LJM    FERB20
          SPACE  5,20
** NAME-- FERJ
*
** PURPOSE-- FORCE IPI PARITY ERROR ON OUTPUT DURING WRITE
*            8 = 000A
          SPACE  2
 FERJ     BSS
          LDC    FERJ10
          LJM    FERD5
 FERJ10   CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0122
          RJM    FUNC        FORCE BUS A OUTPUT PARITY ERROR
          LJM    FERD20
          SPACE  5,20
** NAME-- FERK
*
** PURPOSE-- SPIN DOWN UNIT TO FORCE NOT READY ERROR
*            8 = 000B CCDD
*                C = CONTROLLER NUMBER
*                D = DRIVE NUMBER
*         THIS SHOULD ONLY BE USED WHEN THERE ARE NO OUTSTANDING
*         COMMANDS TO THE CM3.
          SPACE  2
 FERK     BSS
          LDN    0#A
          STML   CP          PACKET LENGTH
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDC    H0700       SET OPERATING MODE COMMAND
          STML   CP+OPCD     OPERATION
          LDDL   FEND
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          STML   RPB+SLAD
          SHN    -8
          STDL   CMOD        CONTROLLER NUMBER
          LDC    0#351       DISC MODES
          STML   CP+FCP
          LDC    0#4000
          STML   CP+FCP+1    SPIN DOWN UNIT
          RJM    DARH        THIS FINDS UX AND CSST
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    MAIN10      IF SUCCESSFUL
          LDN    E00
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSOR (NO RETURN)
          SPACE  5,20
** NAME-- FERM
*
** PURPOSE-- CHANGE CYLINDER NUMBER TO ILLEGAL VALUE
*            TO FORCE AN ERROR ON WRITE OR READ
*            8 = XX0D YYYY
*            9 = CCDD
*                X = COMMANDS TO SEND BEFORE FORCING FIRST ERROR
*                Y + 1 = TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERM     BSS
          LDC    FERM10
          STML   SEEK20
          LJM    MAIN10
 FERM10   CON
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERM20      IF WRONG DRIVE
          SODL   FEST
          PJN    FERM20      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+3    ILLEGAL CYLINDER NUMBER
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERM20      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   SEEK20      RESTORE INSTRUCTION
 FERM20   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    SEEK20+1    RETURN TO SEEK ROUTINE
          SPACE  5,20
** NAME-- FERN
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR IN PATH TEST
*            8 = XX0E YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERN     BSS
          LDC    FERN10
          UJN    FERP5
 FERN10   CON    0
          SODL   FEST
          PJN    FERP20      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERP30
          SPACE  5,20
** NAME-- FERO
*
** PURPOSE-- DISABLE THE CONTROLLERS RECEIVERS TO PREVENT SELECTING
*            DURING THE PATH TEST
*            8 = XX0F YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERO     BSS
          LDC    FERO10
          UJN    FERP5
 FERO10   CON    0
          SODL   FEST
          PJN    FERP20      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
          UJN    FERP30
          SPACE  5,20
** NAME--FERP
*
** PURPOSE-- FORCE COMMAND EXCEPTION DURING THE PATH TEST
*            BY SENDING AN ILLEGAL BYTE COUNT
*            8 = XX10 YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERP     BSS
          LDC    FERP10
 FERP5    BSS
          STML   PT40
          LJM    MAIN10
 FERP10   CON    0
          SODL   FEST
 FERP20   BSS
          PJN    FERP40      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+1    ILLEGAL COUNT
 FERP30   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERP40      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   PT40        RESTORE INSTRUCTION
 FERP40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    PT40+1      RETURN TO PATH TEST
          SPACE  5,20
** NAME-- FERQ
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR IN CONFIDENCE TEST
*            8 = XX11 YYYY
*                X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERQ     BSS
          LDC    FERQ10
          UJN    FERS5
 FERQ10   CON    0
          SODL   FEST
          PJN    FERS20      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERS30
          SPACE  5,20
** NAME-- FERR
*
** PURPOSE-- DISABLE THE CONTROLLERS RECEIVERS TO PREVENT SELECTING
*            DURING THE CONFIDENCE TEST
*            8 = XX12 YYYY
*                X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERR     BSS
          LDC    FERR10
          UJN    FERS5
 FERR10   CON    0
          SODL   FEST
          PJN    FERS20      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
          UJN    FERS30
          SPACE  5,20
** NAME--FERS
*
** PURPOSE-- FORCE COMMAND EXCEPTION DURING THE CONFIDENCE TEST
*            BY SENDING AN ILLEGAL CYLINDER NUMBER
*            8 = XX13 YYYY
*              X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*              Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERS     BSS
          LDC    FERS10
 FERS5    BSS
          STML   CTDT7
          LJM    MAIN10
 FERS10   CON    0
          SODL   FEST
 FERS20   BSS
          PJN    FERS40      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+3    ILLEGAL CYLINDER NUMBER
 FERS30   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERS40      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   CTDT7       RESTORE INSTRUCTION
 FERS40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    CTDT7+1     RETURN TO CONFIDENCE TEST
          SPACE  5,20
** NAME-- FERT
*
** PURPOSE-- CHANGE ONE MEMORY LOCATION
*            8 = 0014
*            9 = 0000 0000 XXXX YYYY
*              X = ADDRESS
*              Y = VALUE
          SPACE  2
 FERT     BSS
          LDDL   P5
          STIL   P4
          LJM    MAIN10
          SPACE  5,20
** NAME-- FERU
*
** PURPOSE-- FORCE DMA TO IPI INPUT DATA PARITY ERROR UPPER ON A READ
*            8 = 0015
          SPACE  2
 FERU     BSS
          LDC    FERU5
          UJN    FERV5
 FERU5    CON
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0300       WRITE CONTROL REGISTER
          RJM    FAN
          LDC    0#8A        FORCE PARITY ERROR
          UJN    FERV15
          SPACE  5,20
** NAME-- FERV
*
** PURPOSE-- FORCE BYTE COUNT EQUAL 0 ON JY BOARD ON A READ
*            8 = 0016
          SPACE  2
 FERV     BSS
          LDC    FERV10
 FERV5    BSS
          LJM    FERB5
 FERV10   CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0300       WRITE CONTROL REGISTER
          RJM    FAN
          LDC    0#96        FORCE BYTE COUNT EQUAL 0
 FERV15   BSS
          ACN    DC
          OAN    DC
          LJM    FERB20
          SPACE  5,20
** NAME-- FERW
*
** PURPOSE-- FORCE OUTPUT DATA PARITY ERROR UPPER FROM THE DMA
*            ARRAY ON A WRITE
*            8 = 0017
          SPACE  2
 FERW     BSS
          LDC    FERW5
          UJN    FERY5
 FERW5    CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0300       WRITE CONTROL REGISTER
          RJM    FAN
          LDC    0#8C        FORCE PARITY ERROR
          UJN    FERY15
          SPACE  5,20
** NAME-- FERY
*
** PURPOSE-- FORCE BYTE COUNT EQUAL 0 ON JY BOARD ON A WRITE
*            8 = 0018
          SPACE  2
 FERY     BSS
          LDC    FERY10
 FERY5    BSS
          LJM    FERD5
 FERY10   CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0300       WRITE CONTROL REGISTER
          RJM    FAN
          LDC    0#96        FORCE BYTE COUNT EQUAL 0
 FERY15   BSS
          ACN    DC
          OAN    DC
          LJM    FERD20
          SPACE  5,20
** NAME-- FERZ
*
** PURPOSE-- FORCE ERROR IN TEST MODE BY READING ONE MORE WORD
*            THAN THE TRANSFER COUNT EXPECTS.
*            8 = XX19
*                XX = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERZ     BSS
          LDC    FERZ5
          STML   WOG10
          LJM    MAIN10
 FERZ5    CON    0
          STDL   T3          SAVE FUNCTION
          LDC    0#8081
          STML   WOGP+1      INCREMENT SYNC COUNT
          LDDL   FEST
          ZJN    FERZ10      IF NOT FORCING AN ERROR
          SODL   FEST
          UJN    FERZ15
 FERZ10   BSS
          LDC    FUNC        RESTORE INSTRUCTION
          STML   WOG10
          SOML   WOGP+1      RESTORE BYTE COUNT
 FERZ15   BSS
          LDDL   T3
          RJM    FUNC
          LJM    WOG10+1
 .F       ENDIF
          SPACE  5,20
** NAME-- FORMA
*
** PURPOSE-- FORMAT A CM REAL MEMORY ADDRESS.
*
** CALLING SEQUENCE-- LDC    ADDRESS
*                     RJM    FORMA
*
** INPUT-- - A REGISTER- IS THE ADDRESS OF A 2-WORD CM BYTE ADDRESS.
*
** OUTPUT-- -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
          RJM    INTERR      REPORT ERROR (NO RETURN)
          SPACE  5,20
          SPACE  5,20
** NAME-- FU
*
** PURPOSE-- FORMAT UNIT
          SPACE  2
 FUX      LJM    **
 FU       EQU    *-1
          LDN    E57         FORMATTING DRIVE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   /SS/P.UNIT,CSST
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          LDN    0
          STML   RS+/RS/P.SCYL  STARTING CYLINDER
          STML   RS+/RS/P.FTRK  SO TRACK, SECTOR WILL BE 0 IN CRITICAL WINDOW
          STML   RS+/RS/P.FSEC
          RJM    INTRS       SEND INTERMEDIATE RESPONSE

*         FORMAT THE UNIT

          LDN    12
          STML   CP          COMMAND PACKET LENGTH
          LDDL   UX
          STML   CP+CRN
          LDC    0#280D
          STML   CP+OPCD     INITIAL FORMAT COMMAND
          LDC    0#53B
          STML   CP+FCP      LOGICAL SECTOR SIZE
          LDN    0
          STML   CP+FCP+1    UPPER BYTES OF SECTOR SIZE
          LDC    2048        LOWER BYTES OF SECTOR SIZE
          STML   CP+FCP+2
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          LDN    2           SET COMMANDS ISSUED
          STDL   CMNDS
          STML   FIP         FORMAT IN PROGRESS
          RJM    CPT         COMMAND PACKET TRANSFER
          UJK    FUX
** NAME-- GETRQ
*
** PURPOSE-- DETERMINE WHETHER OR NOT TO USE MASTER TERMINATE.
*            MASTER TERMINATE MEANS USE A LARGE SECTOR COUNT AND
*            TERMINATE WHEN THERE IS NO MORE DATA TO TRANSFER.
*            MASTER TERMINATE ONLY WORKS WITH MICROCODE LEVEL 8
*            AND LATER.  SINCE THERE IS A PERFORMANCE PENALTY
*            ON READS, ONLY USE MASTER TERMINATE FOR READS WHEN
*            MORE THAN ONE PAGE IS TO BE TRANSFERRED.  IF USING
*            MASTER TERMINATE, SET THE MASTER TERMINATE FLAG AND
*            EXIT.
*
*            IF NOT USING MASTER TERMINATE, COMPUTE
*            THE TOTAL BYTES TO TRANSFER AND SAVE IN SS TABLE.
*            THE PP DRIVER WILL ISSUE UP TO 2 COMMANDS PER DRIVE.
*            IF NO COMMANDS ARE OUTSTANDING, GET THE FIRST REQUEST
*            FROM CM, GET THE FIRST COMMAND FROM THE REQUEST AND SET
*            UP THE STATUS RESPONSE BUFFER.  IF ONE COMMAND IS STILL
*            ACTIVE FOR THE DRIVE, GETTING THE REQUEST INTO THE SS
*            TABLE WILL BE DONE IN ROUTINE DCR.
          SPACE  2
 GETRX    LJM    **
 GETRQ    EQU    *-1
          LDN    0
          STDL   TOTAL
          STDL   TOTAL+1
          STML   CP+FCP+1    UPPER WORD OF SECTOR COUNT
          LDDL   CSST
          STDL   P6          SAVE CURRENT SS TABLE POINTER
          LDC    IPIT
          STDL   CSST        START OF ALTERNATE SS TABLE
          LDDL   CNUM
          ZJN    GETR2       IF FIRST COMMAND
          LDML   /SS/P.RMA2,P6
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.RMA2+1,P6
          UJN    GETR3
 GETR2    BSS
          LDML   /SS/P.REQ,P6
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.REQ+1,P6
 GETR3    BSS
          STML   /SS/P.REQ+1,CSST
          RJM    UREQ        READ UNIT REQUEST FROM CM
          LDML   RQ+/RQ/P.CYL,CSST
          STML   CP+FCP+3    CYLINDER
          LDML   RQ+/RQ/P.TRACK,CSST
          SHN    8
          ADML   RQ+/RQ/P.SECTOR,CSST
          STML   CP+FCP+4    HEAD, SECTOR
          RJM    UNCMND      GET FIRST COMMAND
          LDML   /SS/P.MREV,P6
          SHN    -12
          SBN    8
          MJK    GETR10      IF MASTER TERMINATE NOT SUPPORTED
*
*         IF IN RECOVERY AND USING MASTER TERMINATE, THIS GUARANTEES A
*         WRITE ERROR FOR THE NTH REQUEST DOES NOT RETURN AN ERROR FOR
*         A PREVIOUS REQUEST.
*         WITH 8A MICROCODE AND IF USING MASTER TERMINATE, THE CM3 READS
*         AHEAD AND WILL REPORT AN ERROR FOR A SECTOR READ EVEN IF IT IS
*         NOT SENT TO THE PP.  SOMETIMES AN ERROR ON THE READ AHEAD WILL
*         CAUSE THE CM3 TO NOT SEND A COMPLETION RESPONSE.
*
          LDML   /SS/P.RQTRY,P6
          NJK    GETR10      IF IN ERROR RECOVERY
          LDML   CM+/CM/P.CODE,CSST
          SHN    -12
          SBN    5
          ZJN    GETR6       IF WRITE (USE MASTER TERMINATION)
          LDML   RQ+/RQ/P.SWIT,CSST
          LPC    77777B
          SBN    1
          ZJN    GETR10      IF MAU COUNT = 1 (NO MASTER TERMINATION)
          LDML   /SS/P.LISTL,CSST
          SBN    1
          ZJN    GETR10      IF ONLY ONE LIST
 GETR6    BSS
          LDDL   P6
          STDL   CSST        RESTORE POINTER TO SS TABLE
          LDDL   CNUM
          ZJN    GETR7       IF FIRST COMMAND FOR UNIT
          LDC    0#8000
          STML   /SS/MT2,CSST INDICATE MASTER TERMINATE BEING USED
          UJK    GETRX
 GETR7    BSS
          LDC    0#8000
          STML   /SS/MT,CSST INDICATE MASTER TERMINATE BEING USED
          LJM    GETR45
 GETR9    BSS
          RJM    UNCMND      GET FIRST COMMAND
 GETR10   BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES TO TRANSFER
          RADL   TOTAL+1     TOTAL BYTES TO TRANSFER
          SHN    -16
          RADL   TOTAL
          SOML   /SS/P.LISTL,CSST DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    GETR20      IF END OF RMA LIST
          RJM    GLIST       READ NEXT INDIRECT ENTRY
          UJN    GETR10
 GETR20   BSS
          RJM    UNCMND      GET NEXT COMMAND
          NJK    GETR10      IF MORE COMMANDS
          LDML   RQ+/RQ/P.SWIT,CSST CHECK IF REQUEST SWITCH FLAG IS SET
          SHN    /RQ/L.SWIT+2
          PJN    GETR30      IF SWITCH FLAG IS NOT SET
          LDML   /SS/P.RQTRY,P6
          NJN    GETR30      IF IN ERROR RECOVERY.  THIS GUARANTEES THAT
                              A WRITE ERROR IN THE NTH CONCATENATED REQUEST
                              DOES NOT CAUSE A PREVIOUS REQUEST TO BE
                              RETURNED AS UNRECOVERABLE
          LDML   RQ+/RQ/P.NEXT,CSST PUT RMA OF NEXT REQUEST IN SS TABLE
          STML   /SS/P.REQ,CSST
          LDML   RQ+/RQ/P.NEXT+1,CSST
          STML   /SS/P.REQ+1,CSST
          RJM    UREQ        READ NEXT STREAMED UNIT REQUEST FROM CM
          UJK    GETR9

 GETR30   BSS
          LDDL   P6
          STDL   CSST        RESTORE POINTER TO SS TABLE
          LDDL   CNUM
          ZJN    GETR40      IF FIRST COMMAND FOR UNIT
          LDDL   TOTAL+1
          STML   /SS/P.TW2+1,CSST TOTAL CM BYTES TO TRANSFER
          LDDL   TOTAL
          STML   /SS/P.TW2,CSST
          UJN    GETR50
 GETR40   BSS
          LDDL   TOTAL+1
          STML   /SS/P.TOTAL+1,CSST TOTAL CM BYTES TO TRANSFER
          LDDL   TOTAL
          STML   /SS/P.TOTAL,CSST
 GETR45   BSS
          RJM    UREQ        READ UNIT REQUEST FROM CM
          RJM    SRESP       SET UP STATUS FOR RESPONSE BUFFER
          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    UNCMND      GET FIRST COMMAND
 GETR50   BSS
          UJK    GETRX
          SPACE  5,20
** NAME-- GETSS
*
** PURPOSE-- READ SS TABLE FROM UNIT COMMUNICATION BUFFER IN
*            CM UNIT INTERFACE TABLE IF IT IS NOT ALREADY IN MEMORY
*
          SPACE  2
 GETSSX   LJM    **
 GETSS    EQU    *-1
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        SET INDEX TO SS TABLE
          NJN    GETSSX      IF TABLE IN MEMORY
          LDC    SSNR
          STDL   CSST        POINTER TO CURRENT SS TABLE
          LDDL   UX
          SBDL   SSUN        UX OF CURRENT SS TABLE
          ZJN    GETSSX      IF SS TABLE ALREADY IN MEMORY
          RJM    SAVSS       SAVE SS TABLE BEFORE READING ANOTHER SS TABLE
          LDDL   UX
          STDL   SSUN        SAVE UX OF NEW SS TABLE
          LOADR  UNITS+/UN/P.UIT,UX
          ADN    /UIT/C.UBUF OFFSET OF COMMUNICATION BUFFER
          CRDL   T1          GET ADDRESS OF COMMUNICATION BUFFER
          LOADF  T3          REFORMAT IT AND LOAD R REGISTER
          CRML   SSNR,WC     READ SS TABLE
          UJK    GETSSX
          SPACE  5,20
** NAME-- GETUD
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL, ISSUE ALL
*            SEEKS, AND PROCESS INTERRUPTS FROM THE CM3
          SPACE  2
 GETUDX   LJM    **
 GETUD    EQU    *-1
          LDDL   UNUML
          ZJN    GETUDX      IF NO UNITS
          RJM    UC          UPDATE CLOCK
          RJM    SIS         SAVE INTERRUPT STATUS
          LDDL   LUX         UNIT INDEX OF LAST REQUEST FOUND + 1
          STDL   P6
 GETU5    BSS
          LDDL   LUX
          STDL   UX
          LDN    P.UN
          RADL   LUX         BUMP UNIT ENTRY
          SBDL   UNUML
          MJN    GETU10      IF NOT END OF TABLE
          STDL   LUX
 GETU10   BSS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    17B
          STDL   CMOD        SAVE CONTROL MODULE NUMBER AND PORT NUMBER
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          PJK    GETU38      IF NO COMMAND IN PROGRESS
          RJM    GETSS       GET SS TABLE
          LDML   UNITS,UX
          SHN    11
          PJN    GETU15      IF PORT A
          LDML   SELT,CMOD
          LPDL   STATUS+1
          UJN    GETU20
 GETU15   BSS
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
 GETU20   BSS
          ZJN    GETU22      IF NO INTERRUPT FOR THIS CONTROL MODULE
          RJM    PI          PROCESS INTERRUPT (NO RETURN)
 GETU22   BSS
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    GETU24      IF TWO COMMANDS IN PROGRESS
          SHN    /UN/L.DTIP-/UN/L.TCIP
          MJK    GETU34      IF SECOND COMMAND CAN BE ISSUED
          ERRMI  /UN/L.DTIP-/UN/L.TCIP-1 IF PREVIOUS SHIFT INCORRECT
          LDDL   IF
          NJK    GETU34      IF INITIALIZATION, SECOND COMMAND CAN BE ISSUED
 GETU24   BSS
          LDML   /SS/P.FNC,CSST
          SBN    4
          ZJN    GETU27      IF FORMAT COMMAND
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU25      IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU25   SBN    42          40 TO 41 SECOND TIMEOUT
          PJK    GETU100     IF TIMEOUT
          UJK    GETU30
 GETU27   LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU28      IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU28   ADC    -FDT        9000 SECOND TIMEOUT VALUE
          PJK    GETU100     IF TIMEOUT

* GO TO NEXT UNIT ENTRY.

 GETU30   BSS
          LDDL   LUX         HAVE ALL ENTRIES BEEN CHECKED
          SBDL   P6
          ZJK    GETUDX      IF NO MORE ENTRIES TO CHECK
          UJK    GETU5

* DETERMINE IF DRIVE TESTING IS REQUIRED

 GETU34   BSS
          LDN    1
          STDL   CNUM        INDICATE SECOND COMMAND TO UNIT
          LDDL   IF
          ZJK    GETU40      IF INITIALIZATION NOT REQUIRED
          LDML   /SS/P.CT,CSST
          LPN    7
          NJK    GETU24      IF NO NEED TO RUN CONFIDENCE TEST
          LDDL   CMNDS
          NJK    GETU30      IF MORE CMNDS TO PROCESS
          RJM    CD          CHECK DRIVE
          NJN    GETU36      IF BYPASS CONFIDENCE TEST
          RJM    CT          RUN CONFIDENCE TEST
 GETU36   LJM    GETUDX      EXIT


* NO COMMANDS IN PROGRESS.
* CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.

 GETU38   BSS
          LDN    0           INDICATE FIRST COMMAND TO UNIT
          STDL   CNUM
          LDDL   IF
          NJK    GETU30      IF CONFIDENCE TEST SHOULD BE RUN
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5
          ADN    /UIT/C.NEXT
          CRDL   T1          READ RMA OF NEXT REQUEST FROM UNIT QUEUE
          LDDL   T3
          ADDL   T4
          ZJK    GETU30      IF NO REQUESTS ON THIS QUEUE
          LDDL   T5+/UIT/P.DSABLE CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    GETU30      IF UNIT IS DISABLED

* PROCESS COMMAND FOR UNIT

 GETU40   BSS
 .U       IFEQ   UNIX,1
          LDDL   MALET       NONZERO IF MAINTENANCE REQUEST
 .U       ELSE
          LDDL   IDLE        NONZERO IF IDLE COMMAND
          ADDL   MALET       NONZERO IF MAINTENANCE REQUEST
 .U       ENDIF
          NJK    GETU65      IF NOT STARTING REQUESTS
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          RJM    SR          SELECT REQUEST
          NJN    GETU65      IF REQUEST NOT FOUND
          RJM    GETRQ       GET REQUEST
          LDML   /SS/P.CT,CSST
          LPN    7
          ZJK    GETU50      IF NEED TO RUN CONFIDENCE TEST
          LDDL   FNC
          SBN    4
          NJN    GETU60      IF NOT FORMAT
 GETU50   LDDL   CNUM
          NJK    GETU24      IF SECOND COMMAND
          STML   /SS/P.CT,CSST  ENABLE RUNNING CONFIDENCE TEST
          LDML   UNITS,UX    SET COMMAND IN PROGRESS FLAG
          LMC    0#8000
          STML   UNITS,UX
          STDL   IF          SET INITIALIZATION FLAG
          UJN    GETU62
 GETU60   RJM    SEEK        ISSUE INITIAL SEEK
 GETU62   BSS
          LJM    MAIN15
 GETU65   BSS
          LDDL   CNUM
          NJK    GETU24      IF COMMAND IN PROGRESS, CHECK TIMER
          UJK    GETU30

* TIMEOUT PROCESSING

 GETU100  BSS
          LDML   /SS/P.RESET,CSST
          ZJN    GETU120     IF RESET NOT ISSUED
          LPN    1
          ZJN    GETU104     IF ASYNCH FOR DRIVE EXPECTED
          LDML   EPCT,CMOD
          STDL   UX          UNIT ISSUING RESET
          RJM    GETSS       GET SS TABLE IF NECESSARY
          LDC    SRT         SLAVE RESET TIMEOUT
          UJN    GETU108
 GETU104  BSS
          LDC    DST         DRIVE SPINUP TIMEOUT
 GETU108  BSS
          STDL   T1
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU110     IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU110  BSS
          SBDL   T1
          PJN    GETU120     IF TIMEOUT
          LJM    GETU30
 GETU120  BSS
          LDN    E38         NO CM3 INTERRUPT
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- GLIST
*
** PURPOSE-- READ ONE ENTRY FROM THE CM ADDRESS LIST PORTION OF A COMMAND.
*
** INPUT-- LISTL
*
** OUTPUT-- CMLIST, CM+/CM/P.RMA
          SPACE  2
 GLIX     LJM    **
 GLIST    EQU    *-1
          LDDL   CSST        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,CSST 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,CSST UPDATE RMA ADDRESS FOR NEXT READ
          SHN    -16
          RAML   CM+/CM/P.RMA,CSST
          LDML   CMLIST+/CM/P.LEN,CSST MAKE SURE IT IS AN EVEN NUMBER OF CM WORDS
          ADN    7
          SCN    7
          STML   CMLIST+/CM/P.LEN,CSST
          UJK    GLIX
          SPACE  5,20
** NAME-- IH
*
** PURPOSE-- INTERRUPT HANDLER.  INPUT THE RESPONSE PACKET.  THROW AWAY
*            ASYNCHRONOUS RESPONSES FOR UNITS NOT CONFIGURED.  REPORT
*            ASYNCHRONOUS DRIVE ERROR RESPONSES FOR CONFIGURED UNITS.
*
** EXIT
*         A = MAJOR STATUS
*         THE DRIVE IS DESELECTED
          SPACE  2
 IHX      LJM    **
 IH       EQU    *-1
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX SAVE CLOCK IN TABLE
          LDML   CP+OPCD
          NJN    IH1         IF NOT LOGICAL INTERFACE RESET
          LDN    3           2 TO 4 SECOND TIMEOUT
          UJN    IH6
 IH1      BSS
          LMC    H0800
          ZJN    IH5         IF DRIVE POWER ON RESET (NEEDS 45 SECONDS)
          LDML   CP+OPCD
          LMC    8400
          ZJN    IH2         IF READ PERFORMANCE LOG
          LDML   /SS/P.RESET,CSST
          NJN    IH4         IF RESET ISSUED
 IH2      BSS
          LDN    32          APPROXIMATELY 31 SECOND TIMEOUT
          UJN    IH6
 IH4      BSS
          SHN    17
          MJN    IH5         IF SLAVE RESET
          LDC    DST         DRIVE SPINUP TIMEOUT
          UJN    IH6
 IH5      BSS
          LDC    SRT         SLAVE RESET TIMEOUT
 IH6      BSS
          STDL   T7          SAVE TIMEOUT VALUE
 IH10     BSS
          RJM    RI          REQUEST INTERRUPTS
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          NJN    IH15        IF INTERRUPT PRESENT
          RJM    UC          UPDATE CLOCK
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    IH12        IF CLOCK HAS NOT WRAPPED
          ADC    0#10000
 IH12     BSS
          SBDL   T7
          MJN    IH10        IF TIMEOUT NOT EXPIRED
          LDK    E38         NO CM3 INTERRUPT
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 IH15     BSS
          RJM    DTM         DETERMINE TRANSFER MODE
          RJM    SEL         SELECT THE CONTROLLER
          STDL   CTM         CLEAR CHANNEL TRANSFER MODE FLAG
          RJM    RPT         RESPONSE PACKET TRANSFER
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDML   RPB+MAJST   MAJOR STATUS
          SHN    -4
          LPN    0#F
          LMN    AR
          NJN    IH20        IF NOT ASYNCHRONOUS RESPONSE
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJN    IH30        IF ASYNCHRONOUS RESPONSE FOR CONTROLLER
          RJM    DARH        DRIVE ASYNCHRONOUS RESPONSE HANDLER
          LDDL   T8
          STDL   UX          RESTORE UX
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          UJN    IH40        GO LOOK FOR ANOTHER INTERRUPT
 IH20     BSS
          LDML   RPB+MAJST   MAJOR STATUS
          LJM    IHX
 IH30     BSS
          LDK    ID16
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    IH20        IF ID 16 NOT FOUND
          LDML   RPB+6,T3
          SHN    8
          PJN    IH20        IF NOT CONTROLLER OVER TEMPERATURE
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 IH40     BSS
          LJM    IH10
          SPACE  5,20
** NAME-- INTERR
*
** PURPOSE-- REPORT AN INTERFACE ERROR
          SPACE  2
 INTERR   CON    0
          STML   RS+/RS/P.IEC INTERFACE ERROR CODE
          LDK    /RS/K.INTERR  INTERFACE ERROR
          STML   RS+/RS/P.INTERR  ABNORMAL STATUS CODE
          LDK    E120        SOFTWARE FAILURE
          STML   RS+/RS/P.ERRID SET ERROR IDENTIFIER
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ENDIF
          RJM    HANG
          SPACE  5,20
** NAME-- INTRS
*
** PURPOSE-- SEND INTERMEDIATE RESPONSE.
          SPACE  2
 INTRSX   LJM    **
 INTRS    EQU    *-1
          LDDL   PTF
          NJN    INTRS10     IF REQUEST EXISTS
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ENDIF
          UJK    INTRSX
 INTRS10  BSS
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          LDN    R.INT       INTERMEDIATE RESPONSE
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC RESPONSE CODE
          RJM    TERMP       SEND RESPONSE TO CM
          UJK    INTRSX
          SPACE  5,20
** NAME--ISR
*
** PURPOSE-- ISSUE SLAVE RESET
          SPACE  2
 ISR      CON    0
          LDC    H8415       SLAVE RESET
          STML   CP+OPCD     SO TIMEOUT WILL BE LONG IN IH
          RJM    IR          ISSUE RESET
          LDML   /SS/P.CT,CSST
          ZJN    ISR10       IF IN SUBSYSTEM CONFIDENCE TEST
          LJM    MAIN15
 ISR10    BSS
          RJM    IH          INTERRUPT HANDLER
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETRUN)
          SPACE  5,20
** NAME-- IU
*
** PURPOSE-- INITIALIZE UNIT. CALLED DURING FORMAT OPERATION.
 IUX      LJM    **
 IU       EQU    *-1
          LOADF  CMLIST+/CM/P.RMA,CSST  ADDRESS OF LIST WITH FORMAT PARAMTER
          CRDL   P1          READ WORD WITH PARAMETER
          LDDL   P3
          NJK    IU10        IF UNCONDITIONAL FORMAT
          RJM    IUF         IS UNIT FORMATTED
          NJK    IU10        IF UNIT IS NOT FORMATTED
          LDN    2           CMNDS WILL GET DECREMENTED TWICE
          STDL   CMNDS
          LDN    0
          LJM    TERM20      TERMINATE REQUEST
 IU10     BSS
          LDML   UNITS,UX
          LPC    0#3FFF
          LMC    0#C000      INDICATE TWO COMMANDS ISSUED
          STML   UNITS,UX
          RJM    FU          FORMAT UNIT
          UJK    IUX
          SPACE  5,20
** NAME-- IUF
*
** PURPOSE-- IS UNIT FORMATTED.
*
** EXIT-- A=0 IF UNIT FORMATTED AT CORRECT SECTOR SIZE
          SPACE  2
 IUFX     LJM    **
 IUF      EQU    *-1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#200
          STML   CP+OPCD     ATTRIBUTE COMMAND
          LDC    0#36C
          STML   CP+FCP      PARAMETER TO READ SECTOR SIZE
          LDC    0#4051
          STML   CP+FCP+1    RETURN SECTOR SIZE IN RESPONSE
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJN    IUF05       IF SUCCESSFUL
          LPC    IVR         INTERVENTION REQUIRED
          ZJN    IUF10       IF UNEXPECTED STATUS
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          LDML   RPB+8,T3
          SHN    2
          MJK    IUFX        IF DRIVE NOT FORMATTED
          UJN    IUF10       UNEXPECTED STATUS
 IUF05    LDC    ID51
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    IUF10       IF ID 51 NOT FOUND
          LDML   RPB+7,T3    SECTOR SIZE IN BYTES
          ADC    -2048       EXPECTED SECTOR SIZE
          LJM    IUFX
 IUF10    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- LIR
*
** PURPOSE-- LOGICAL INTERFACE RESET
          SPACE  2
 LIRX     LJM    **
 LIR      EQU    *-1
          LDN    0
          STML   CP+OPCD     SO TIMEOUT WILL BE SHORT IN IH
          RJM    GETSS       GET SS TABLE IF NECESSARY
          LDC    H8215       LOGICAL INTERFACE RESET
          RJM    IR          ISSUE RESET
          RJM    IH          INTERRUPT HANDLER
          SHN    -4
          LPN    0#F
          LMN    AR
          NJN    LIR20       IF NOT ASYNCHRONOUS RESPONSE
          LDN    ID16
          RJM    SFP         CHECK FOR MACHINE EXCEPTION
          MJN    LIR20       IF MACHINE EXCEPTION ID NOT FOUND
          LDML   RPB+6,T3
          LPC    0#FEE0
          LMC    0#6000
          NJN    LIR20       IF ERROR
          UJK    LIRX
 LIR20    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          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
 LOCK1    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    LOCK5       IF LOCK COULD BE SET
          ADDL   T2
          ADC    -177777B-177777B
          ZJN    LOCK1       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   PPNO        CHECK IF LOCK ALREADY SET
          NJN    LOCK3       IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 LOCK3    UJK    LOCKX       IF LOCK WAS ALREADY SET, EXIT A = 0
                             IF LOCK COULD NOT BE SET, EXIT A .NE. 0
 LOCK5    BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   PPNO
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    LOCKX
          SPACE  5,20
** NAME-- OFFCH
*
** PURPOSE-- TURN OFF ALL UNITS ON A CHANNEL
          SPACE  2
 OFCX     LJM    **
 OFFCH    EQU    *-1
          LDN    0
          STDL   UX          UNITS TABLE INDEX
 OFC10    BSS
          RJM    OFFUN       SET UNIT DISABLE FLAG
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    OFC10       IF NOT END OF TABLE
          UJK    OFCX
          SPACE  5,20
** NAME-- OFFCM
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROL MODULE.
          SPACE  2
 OFFCM    CON    0
 .U       IFEQ   UNIX,1
          LDK    /RS/K.CMDN  CONTROLLER DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          LDDL   UX
          STDL   P5          POINTER TO CURRENT UNITS TABLE
          LDN    0
          STDL   UX          UNITS TABLE INDEX
 OFFCM10  BSS
          LDML   UNITS,P5    COMPARE IF SAME CONTROL MODULE
          LMML   UNITS,UX
          LPN    70B
          NJN    OFFCM20     IF NOT THE SAME CONTROL MODULE
          RJM    OFFUN       SET UNIT DISBLE FLAG
 OFFCM20  BSS
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    OFFCM10     IF NOT END OF TABLE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ELSE
          LDK    /RS/K.CMDN  CONTROLLER DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          LJM    MAIN10
          SPACE  5,20
** NAME-- OFFUN
*
** PURPOSE-- SET THE DISABLE FLAG IN THE UNIT INTERFACE TABLE.
*
** OUTPUT-- P5 IS UNCHANGED
          SPACE  2
 OFUX     LJM    **
 OFFUN    EQU    *-1
          LDK    /UIT/K.DSABLE  SET UNIT DISABLE FLAG
          STDL   T3
          LDN    0
          STDL   T2
          STDL   T4
          STDL   T5
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          RDSL   T2          -LOGICAL OR- THE UNIT DISABLE FLAG

*         NOTE THAT REQUEST RETRIES DO NOT ALLOW STREAMING SO SFRR WILL
*         NOT SEND A RESPONSE.

          RJM    SFRR        SETUP FOR REQUEST RETRY (MAKE CMNDS ACCURATE)
          UJK    OFUX
          SPACE  5,20
** NAME-- PAUS
*
** PURPOSE-- DELAY PROGRAM EXECUTION FOR A SPECIFIED NUMBER OF
*            MICROSECONDS.
*
** INPUT-- 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-- PCER
*
** PURPOSE-- PREPARE COMMON ERROR RESPONSE
*
** INPUT  A = ERROR ID
          SPACE  2
 PCERX    LJM    **
 PCER     EQU    *-1
          STDL   P2
          SBN    E18
          MJN    PCER20      IF ERROR CODE 0-17
          SBN    E21-E18
          MJN    PCER10      IF ERROR CODE 18-20
          SBN    E22-E21
          MJN    PCER20      IF ERROR CODE 21
          SBN    E23-E22
          MJN    PCER10      IF ERROR CODE 22
          SBN    E27-E23
          MJN    PCER20      IF ERROR CODE 23-26
          SBN    E29-E27
          MJN    PCER10      IF ERROR CODE 27, 28
          ZJN    PCER20      IF ERROR CODE 29
          SBN    E30-E29
          NJN    PCER20      IF ERROR CODE 31-XX
 PCER10   BSS
          LDC    H00E1       READ STATUS REGISTER
          RJM    RDRG        READ REGISTER
          STDL   STATUS      SAVE CONTENTS OF STATUS REGISTER
 PCER20   BSS
 .U       IFEQ   UNIX,1
          LDML   /SS/P.XFER,CSST BYTES TRANSFERRED
          STML   RS+/RS/P.XFER
          LDML   /SS/P.XFER+1,CSST
          STML   RS+/RS/P.XFER+1
          LDML   /SS/P.LU,CSST PUT LOGICAL UNIT IN RESPONSE
          STML   RS+/RS/P.LU
 .U       ENDIF
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
          LDDL   P2
          LMN    E38
          NJN    PCER26      IF NOT -NO CONTROLLER RESPONSE-
          LDML   /SS/P.RESET,CSST
          SHN    17
          MJN    PCER26      IF NO ASYNCH AFTER SLAVE RESET
          SHN    17
          PJN    PCER26      IF ERROR ALREADY ISOLATED
          LDK    E95         NO DRIVE OPERATIONAL RESPONSE
          UJN    PCER32
 PCER26   BSS
          LDDL   P2
          NJN    PCER32      IF ERROR ALREADY ISOLATED
          LDN    ID14
          RJM    SFP         SEARCH FOR ID 14
          MJN    PCER30      IF NOT CM3 INTERVENTION REQUIRED
          LDK    E71
          UJN    PCER32
 PCER30   BSS
          LDN    ID16
          RJM    SFP         SEARCH FOR ID 16
          MJN    PCER35      IF NOT CM3 MACHINE EXCEPTION
          LDML   RPB+6,T3
          SHN    8
          PJN    PCER31      IF NOT CONTROLLER OVER TEMPERATURE
          LDK    E78
          UJN    PCER32
 PCER31   BSS
          LDK    E72
 PCER32   BSS
          UJN    PCER45
 PCER35   BSS
          LDN    ID17
          RJM    SFP         SEARCH FOR ID 17
          MJN    PCER40      IF NOT CM3 COMMAND EXCEPTION
          LDML   RPB+5,T3
          SHN    -8
          SBN    6
          MJN    PCER38      IF BYTE 5 NOT PRESENT
          LDML   RPB+8,T3
          SHN    6
          PJN    PCER38      IF NOT RESERVED TO OTHER PORT
          LDK    E77         DRIVE RESERVED TO OTHER CM3 PORT
          UJN    PCER45
 PCER38   BSS
          LDK    E73
          UJN    PCER45
 PCER40   BSS
          LDN    ID13
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER55      IF NOT ID13
          LDML   RPB+6,T3    FIRST WORD AFTER ID13
          SHN    5
          PJN    PCER50      IF NOT MESSAGE FROM CONTROLLER
          LDK    E60         CONTROLLER ERROR
 PCER45   BSS
          UJN    PCER70
 PCER50   BSS
          LDK    E74         MICROCODE EXECUTION ERROR
          UJN    PCER70
 PCER55   BSS
          LDN    ID15
          RJM    SFP         SEARCH FOR ID 15
          MJN    PCER60      IF NOT ALTERNATE PORT EXCEPTION
          LDK    E75
          UJN    PCER70
 PCER60   BSS
          LDK    ID23
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER65      IF NOT ID23
          LDML   RPB+6,T3    FIRST WORD AFTER ID23
          SHN    5
          PJN    PCER65      IF NOT MESSAGE FROM DRIVE DIAGNOSTICS
          LDK    E61         DRIVE ERROR
          UJN    PCER70
 PCER65   BSS
          LDN    E00         CP MUST ISOLATE THE ERROR
 PCER70   BSS
          STML   RS+/RS/P.ERRID
          LDDL   WC          WORDS NOT TRANSFERRED
          STML   RS+/RS/P.WC
          LDDL   LF
          STML   RS+/RS/P.FUNTO FAILING FUNCTION IF E01
          LDC    H0200       CONTROL REGISTER
          RJM    RDRG
          STML   RS+/RS/P.CR SAVE CONTROL REGISTER
          LDC    H00F1
          RJM    RDRG        READ IPI ERROR REGISTER
          STML   RS+/RS/P.ERREG SAVE ERROR REGISTER
          LDC    H0600       DMA ERROR REGISTER
          RJM    RDRG
          STML   RS+/RS/P.DMAER SAVE DMA ERROR REGISTER
          ZJN    PCER80      IF ERROR FLAG WAS NOT SET
          LDML   RS+/RS/P.CR CONTROL REGISTER
          SHN    5
          PJN    PCER80      IF TEST MODE NOT SET
          LDC    H00E1       READ STATUS REGISTER
          RJM    RDRG        READ REGISTER
          STDL   STATUS
 PCER80   BSS
          LDDL   STATUS      STATUS REGISTER
          STML   RS+/RS/P.STREG
          LDDL   OS
          STML   RS+/RS/P.OSR SAVE OPERATIONAL STATUS REGISTER
          LDML   /SS/P.MREV,CSST
          SHN    -8
          STML   RS+/RS/P.MREV CM3 MICROCODE REVISION
          RJM    SDA         SAVE DISK ADDRESS
          LDDL   CHAN
          STML   RS+/RS/P.CHAN CHANNEL NUMBER
          LDML   UNITS,UX
          LPC    177B
          STML   RS+/RS/P.UNIT PORT, CONTROLLER, UNIT NUMBER
          LDN    0
          STML   RS+/RS/P.ID
          LDML   /SS/P.RQTRY,CSST
          STML   RS+/RS/P.RTRY REQUEST RETRY COUNT
 .F       IFEQ   FE,1
          LDML   WFTCC
          ADML   WFTEC
          STML   RS+/RS/P.FILL1 NO DATA TRANSFERRED ERROR
 .F       ENDIF
          UJK    PCERX
          SPACE  5,20
** NAME-- PDD
*
** PURPOSE-- PERFORM DRIVE DIAGNOSTICS
          SPACE  2
 PDDX     LJM    **
 PDD      EQU    *-1
          LDN    6           COMMAND PACKET LENGTH
          STML   CP
          LDC    H8100       PERFORM DRIVE DIAGNOSTIC OP CODE
          STML   CP+OPCD
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    PDDX        IF SUCCESSFUL
          LDN    E00         CP MUST DETERMINE THE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- PDR
*
** PURPOSE-- PREPARE NORMAL DISK RESPONSE
          SPACE  2
 PDRX     LJM    **
 PDR      EQU    *-1
          LDML   /SS/P.FPVA,CSST PVA OF REQUEST
          STML   RS+/RS/P.PVA
          LDML   /SS/P.FPVA+1,CSST
          STML   RS+/RS/P.PVA+1
          LDML   /SS/P.FPVA+2,CSST
          STML   RS+/RS/P.PVA+2
 .U       IFNE   UNIX,1
          LDML   /SS/P.XFER,CSST BYTES TRANSFERRED
          STML   RS+/RS/P.XFER
          LDML   /SS/P.XFER+1,CSST
          STML   RS+/RS/P.XFER+1
          LDML   /SS/P.LU,CSST PUT LOGICAL UNIT IN RESPONSE
          STML   RS+/RS/P.LU
          LDK    /RS/C.LASTC*8+8
 .U       ELSE
          LDN    8
 .U       ENDIF
          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
 .U       IFEQ   UNIX,1
          LDML   /SS/P.LU,CSST  LOGICAL UNIT
          LPC    0#FF
          LMC    /RS/K.SHORT  INDICATE ONE-WORD RESPONSE
          STML   RS+/RS/P.SHORT
 .U       ELSE
          LDN    R.NRM
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC  NORMAL RESPONSE CODE
 .U       ENDIF
          UJK    PDRX
          SPACE  5,20
** NAME-- PI
*
** PURPOSE-- PROCESS INTERRUPT
          SPACE  2
 PI       CON    0
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   /SS/P.RESET,CSST
          ZJN    PI3         IF RESET NOT ISSUED
          LDML   EPCT,CMOD
          STDL   UX          CORRECT UX FOR RESET
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          RJM    DTM         DETERMINE TRANSFER MODE
 PI3      BSS
          RJM    SEL         SELECT CONTROLLER
          STDL   CTM         CLEAR CHANGE TRANSFER MODE FLAG
 PI10     BSS
          RJM    RPT         RESPONSE PACKET TRANSFER
          LDML   RPB+MAJST   MAJOR STATUS
          STDL   T6
          SHN    -4
          LPN    0#F
          SBN    CC
          NJK    PI40        IF NOT STANDARD COMMAND COMPLETION
          RJM    DCM         DESELECT THE CONTROL MODULE
          RJM    STI         SET TABLE INDEXES
          LDDL   T6
          SHN    SC
          MJK    PI25        IF SUCCESSFUL
          SHN    CS-SC
          PJK    PI100       IF NOT CONDITIONAL SUCCESS
          LDML   /SS/MT,CSST
          SHN    2
          PJN    PI20        IF NOT USING MASTER TERMINATE
          LDML   RPB+5
          LPC    0#FF
          LMC    ID19
          NJN    PI20        IF RESPONSE NOT DUE TO MASTER TERMINATE
          LDML   RPB
          SBN    15
          PJN    PI20        IF RESPONSE TOO LONG
          LDML   RPB+7
          SHN    9
          MJK    PI30        IF MASTER TERMINATE
 PI20     BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          LDC    0#5000
          STML   RS+/RS/P.RC RECOVERED, INTERMEDIATE RESPONSE
          RJM    TERMP       SEND RESPONSE TO CM
 .U       IFNE   UNIX,1
          LDN    0
          STML   /SS/P.XFER,CSST
          STML   /SS/P.XFER+1,CSST
 .U       ENDIF
          UJN    PI30
 PI25     BSS
          LDML   RPB+OPCD
          LMC    H0400
          NJN    PI30        IF NOT DRIVE RESERVE
          LDML   UNITS,UX
          LPC    0#17FF
          LMC    /UN/K.RD
          STML   UNITS,UX    SET DRIVE RESERVED BIT
          SODL   CMNDS       OUTSTANDING COMMANDS
          LJM    MAIN15
 PI30     BSS
          RJM    TERM        COMMAND COMPLETED WITHOUT ERROR (NO RETURN)
 PI40     BSS
          SBN    TN-CC
          NJN    PI60        IF NOT TRANSFER NOTIFICATION
          RJM    STI         SET TABLE INDEXES
          RJM    RDWT        READ WRITE SETUP
          NJN    PI45        IF EXPECTED RESPONSE
          AODL   TBC         INDICATE COMPLETION RESPONSE SHOULD BE PRESENT
          LJM    PI10
 PI45     BSS
          LDML   /SS/P.FNC,CSST
          ZJN    PI50        IF READ
          RJM    WRITE       IF WRITE (RETURN IS TO IDLE LOOP)
 PI50     BSS
          RJM    READ        READ
          LJM    MAIN15
 PI60     BSS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJN    PI100       IF ASYNCH FOR CONTROLLER
          RJM    DARH        DRIVE ASYNCHRONOUS RESPONSE HANDLER
          LJM    MAIN20
 PI100    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
 .U       IFEQ   UNIX,1
** 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
          SHN    /PIT/L.IDLREQ+2
          MJN    PPRQ10      IF IDLE REQUEST
          SHN    /PIT/L.RESREQ-/PIT/L.IDLREQ
          PJN    PPRQX       IF NOT RESUME OR IDLE REQUEST
          RJM    SPLOCK      SET PP TABLE LOCK
          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    MAIN5
 PPRQ10   BSS
          RJM    SPLOCK      SET PP TABLE LOCK
          RJM    RAR         RESTART ALL REQUESTS SET UP
          LDDL   CLF
          NJN    PPRQ15      IF 2 CONSECUTIVE RESUMES AND CHANNEL LOCK
                              ALREADY CLEAR
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 PPRQ15   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
 PPRQ20   BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PPRQ20
 .U       ELSE
** NAME-- PPRQ
*
** PURPOSE-- CHECK FOR ANY PP REQUESTS ON THE PP QUEUE.
          SPACE  2
 PPRQX    LJM    **
 PPRQ     EQU    *-1
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          ADN    /PIT/C.PPQ  CM ADDRESS OF PP REQUEST QUEUE POINTER
          CRDL   T1          READ PP QUEUE POINTER
          LDDL   T3          RMA OF NEXT QUEUED PP REQUEST
          ADDL   T4
          ZJN    PPRQX       IF NO PP REQUESTS
          LDC    SSNR
          STDL   CSST        USE SPARE SS TABLE
          RJM    SAVSS       SAVE SS TABLE
          LCN    0
          STDL   SSUN        INVALIDATE TABLE AT SSNR
          RJM    SPLOCK      SET PP QUEUE LOCKWORD
          NJN    PPRQX       IF LOCK WAS NOT SET
          STML   /SS/P.XFER,CSST CLEAR BYTES TRANSFERRED
          STML   /SS/P.XFER+1,CSST
          STML   /SS/P.LU,CSST CLEAR LOGICAL UNIT
          LDN    2
          STDL   P1
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA
          CRML   T1,P1       READ PVA AND RMA OF FIRST REQUEST IN CHAIN
          LDDL   T2          SAVE PVA OF REQUEST
          STML   /SS/P.FPVA,CSST
          LDDL   T3
          STML   /SS/P.FPVA+1,CSST
          LDDL   T4
          STML   /SS/P.FPVA+2,CSST
          LDDL   T7          PUT RMA OF REQUEST IN SS TABLE
          STML   /SS/P.REQ,CSST
          LDDL   T8
          STML   /SS/P.REQ+1,CSST
          RJM    UREQ        READ PP REQUEST
          RJM    PDR         PREPARE RESPONSE
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          LDDL   FNC
          SBN    3
          STDL   IDLE
          ZJN    PPRQ10      IF RESUME COMMAND
          ADN    1
          ZJN    PPRQ5       IF IDLE COMMAND
          LDC    E501        INVALID COMMAND
          RJM    INTERR      REPORT ERROR (NO RETURN)
 PPRQ5    BSS
          RJM    CUB         CHECK UNIT BUSY
          NJN    PPRQ20      EXIT IF COMMANDS IN PROGRESS
          LDDL   CLF
          NJN    PPRQ10      IF LOCK ALREADY CLEAR
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 PPRQ10   BSS
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA  CM ADDRESS OF PP QUEUE POINTER
          CWML   SSNR+RQ,P1  WRITE PVA AND RMA POINTERS OF NEXT REQUEST
          RJM    TERMP       SEND TERMINATION RESPONSE
          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD
          LDDL   FNC
          SBN    3
          ZJN    PPRQ18      IF RESUME COMMAND
 PPRQ13   BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PPRQ13
 PPRQ18   BSS
          LJM    MAIN5
 PPRQ20   BSS
          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD
          UJK    PPRQX
 .U       ENDIF
          SPACE  5,20
** NAME-- PT
*
** PURPOSE-- PATH TEST.  FIRST TEST THE DMA PATH BETWEEN CENTRAL
*            MEMORY AND THE RECEIVERS AND TRANSMITTERS, THEN
*            TEST THE PATH BETWEEN THE PP AND THE CONTROLLER.
*            IF A PATH TO A CONTROLLER STILL FAILS AFTER AT LEAST
*            ONE RETRY WITH SLAVE RESET, ALL UNITS ON THE FAILING
*            CONTROLLER WILL BE DISABLED.
*
** ENTRY
*         1)  AT INITIALIZATION AFTER PP LOADED
*         2)  AFTER MAINTENANCE HAS USED THE CHANNEL
*         3)  AFTER THE PP HAS RECEIVED A RESUME
*         4)  DURING REQUEST RETRY IF SLAVE RESET FAILS
          SPACE  2
 PT100    BSS
          AODL   PTF         INDICATE PATH TEST COMPLETE
 PTX      LJM    **
 PT       EQU    *-1
          LDDL   UNUML
          ZJN    PT100       IF NO UNITS
          RJM    SCLOCK      SET CHANNEL LOCK
          LDDL   PTF
          NJN    PTX         IF NOT EXECUTING PATH TEST
          STDL   CMOD        CONTROL MODULE NUMBER
          STDL   UX
          RJM    GETSS       GET SS TABLE IF NECESSARY
          RJM    MR          MASTER RESET
          UJN    PT12
 PT8      BSS
          AODL   CMOD
          SBN    16
          PJN    PT100       IF ALL PATHS TESTED
 PT12     BSS
          LDN    0
          STDL   UX
          UJN    PT20
 PT16     BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 PT20     BSS
          SBDL   UNUML
          PJN    PT8         IF END OF CONFIGURED UNITS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    17B
          LMDL   CMOD
          NJN    PT16        IF DIFFERENT CONTROLLER
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T1
          LDDL   T1+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJN    PT16        IF UNIT DISABLED
          RJM    GETSS       GET SS TABLE IF NECESSARY
          RJM    PS          PORT SELECT
          AODL   TMF         INDICATE TEST MODE IN PROGRESS
          RJM    TDP         TEST DMA PATH
          STDL   TMF         TMF = 0, TEST MODE COMPLETE
 PT30     BSS
          RJM    LIR         LOGICAL INTERFACE RESET

* WRITE BUFFER

          LDN    RPL
          STML   CP          COMMAND PACKET LENGTH
          LDC    H6200
          STML   CP+OPCD     WRITE TO BUFFER COMMAND
          LDDL   CMOD
          LPN    7
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     CONTROLLER, DRIVE NUMBER
          LDC    H0931
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDN    0
          STML   CP+FCP+1    UPPER WORD OF BYTE COUNT
          STML   CP+FCP+3    OFFSET
          STML   CP+FCP+4    OFFSET
          LDC    100
          STML   CP+FCP+2    BYTE LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
 PT40     EQU    *-1         FOR FORCING ERRORS
          RJM    BPTB        BUILD PATH TEST BUFFER
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    PT90        IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAOUT     DATA, TRANSFER OUT
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0381       STREAM, WRITE FROM PP
          RJM    FUNC        RAISE MASTER OUT
          ACN    DC
          LDN    50          WORD COUNT
          OAM    OB,DC       OUTPUT DATA
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
 PT50     BSS
          IJM    PT55,DC     IF SLAVE IN DROPPED
          SBN    1
          NJN    PT50        IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          UJK    PT84
 PT55     BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDDL   WC
          NJK    PT80        IF INCOMPLETE TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJK    PT90        IF NOT SUCCESSFUL

* READ BUFFER

          LDC    H5200
          STML   CP+OPCD     READ FROM CONTROLLER BUFFER
          LDN    RBPL
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#350
          STML   CP+9        BUFFER ADDRESS PARAMETER
          LDC    0#8020
          STML   CP+10       USE DATA BUFFER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    PT90        IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAIN      DATA TRANSFER IN
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0281       STREAM, READ TO PP MEMORY
          RJM    FUNC        RAISE MASTER OUT
          ACN    DC
          LDN    50          WORD COUNT
          IAM    IB,DC
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
 PT60     BSS
          IJM    PT65,DC     IF SLAVE IN DROPPED
          SBN    1
          NJN    PT60        IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          UJN    PT84
 PT65     BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDDL   WC
          NJN    PT80        IF NOT ALL WORDS TRANSFERRED
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    PT90        IF NOT SUCCESSFUL
          RJM    VPTD        VERIFY PATH TEST DATA
          LJM    PT8
 PT80     BSS
          LDN    E29         INCOMPLETE TRANSFER
 PT84     BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 PT90     BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RA6F
*
** PURPOSE-- READ ATTRIBUTE 6F
*
** EXIT   A = 0 IF NO ERROR
          SPACE  2
 RA6FX    BSS
          STDL   T1
          LJM    **
 RA6F     EQU    *-1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          LDC    H0200
          STML   CP+OPCD     READ ATTRIBUTE COMMAND
          LDC    0#36C
          STML   CP+4
          LDC    0#406F
          STML   CP+5        SELECT READING PARAMETER 6F
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    RA6FX       IF NO ERROR
          LDN    E00         CPU MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RAR
*
** PURPOSE-- RESTART ALL REQUESTS
          SPACE  2
 RARX     BSS
          STDL   CMNDS       NO OUTSTANDING COMMANDS
          LJM    **
 RAR      EQU    *-1
          PAUSE  100000      ALLOW CONTROLLER TIME TO WRITE DATA IN
          LDN    0            ITS BUFFER TO DISK
          STDL   UX          POINTER TO UNITS TABLE
          UJN    RAR20
 RAR10    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 RAR20    BSS
          SBDL   UNUML
          ZJN    RARX        IF END OF CONFIGURED UNITS
          RJM    SFRR        SET UP FOR REQUEST RETRY
          UJN    RAR10
          SPACE  5,20
** NAME-- RCC
*
** PURPOSE-- RESTART CONTROLLER COMMANDS
          SPACE  2
 RCCX     BSS
          LDDL   T8
          STDL   UX          RESTORE UNITS TABLE POINTER
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LJM    **
 RCC      EQU    *-1
          LDDL   UX
          STDL   T8          SAVE POINTER TO UNITS TABLE
          LDN    0
          STDL   UX          POINTER TO UNITS TABLE
          UJN    RCC20
 RCC10    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 RCC20    BSS
          SBDL   UNUML
          PJN    RCCX        IF END OF CONFIGURED UNITS
          LDML   UNITS,UX
          SHN    2+/UN/L.CIP
          PJN    RCC10       IF NO COMMAND IN PROGRESS
          SHN    -5
          LPN    17B
          LMDL   CMOD
          NJN    RCC10       IF DIFFERENT CONTROLLER
          RJM    SFRR        SETUP FOR REQUEST RETRY
          UJK    RCC10
          SPACE  5,20
** NAME-- RDRG
*
** PURPOSE-- READ REGISTER
*
** ENTRY--  A = FUNCTION CODE
          SPACE  2
 RDRG10   BSS
          LDN    0
 RDRGX    LJM    **
 RDRG     EQU    *-1
          RJM    FAN         SEND FUNCTION
          AJM    RDRG10,DC   IF NO FUNCTION REPLY
          ACN    DC+40B
          EJM    RDRG10,DC   IF WORD COULD NOT BE READ
          IAN    DC
          UJN    RDRGX
          SPACE  5,20
** NAME-- RDWT
*
** PURPOSE-- SET UP FOR READ OR WRITE.
*
** EXIT
*         A = 0  IF COMPLETION RESPONSE SHOULD BE PRESENT.  IT IS
*                POSSIBLE FOR A TRANSFER NOTIFICATION RESPONSE FOR A STACKED
*                COMMAND TO BE PRESENT BEFORE OR AT THE SAME TIME AS THE COMPLETION
*                RESPONSE FOR THE COMMAND IN PROGRESS.
          SPACE  2
 RDWX     LJM    **
 RDWT     EQU    *-1
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          PJN    RDWT10      IF NOT 2 COMMANDS IN PROGRESS
          LDML   RPB+CRN
          SHN    -14
          LMML   /SS/P.CRN,CSST
          LPN    1
          ZJN    RDWX        IF RESPONSE FOR SECOND COMMAND
          UJN    RDWT20
 RDWT10   BSS
          LDML   RPB+CRN
          SHN    -14
          LMML   /SS/P.CRN,CSST
          LPN    1
          NJN    RDWT80      IF COMMAND REFERENCE NUMBER WRONG
 RDWT20   BSS
          LDML   /SS/MT,CSST TOTAL CM WORDS LEFT TO TRANSFER
          SHN    2
          PJN    RDWT30      IF NOT USING MASTER TERMINATE
          LPN    77B
          NJK    RDWT80      IF UNEXPECTED RESPONSE
          UJN    RDWT40
 RDWT30   BSS
          ADML   /SS/P.TOTAL+1,CSST
          ZJN    RDWT80      IF UNEXPECTED RESPONSE
          LDN    0
 RDWT40   BSS
          STDL   BURPOS      SET BURST POSITION = 0
          LDML   UNITS,UX
          LPC    0#DFFF
          LMC    0#2000
          STML   UNITS,UX    SET DATA TRANSFER IN PROGRESS BIT
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX SET CURRENT CLOCK
          LDN    NSBS
          STDL   BBS         BURSTS TO TRANSFER BEFORE SUSPENDING
          UJK    RDWX
 RDWT80   BSS
          LJM    TERM10      REPORT UNEXPECTED RESPONSE ERROR
          SPACE  5,20
** NAME-- RDWTOK
*
** PURPOSE-- SEND RESPONSE FOR COMPLETED READ REQUEST
          SPACE  2
 RDWTX    LJM    **
 RDWTOK   EQU    *-1
          SOML   /SS/P.NCR,CSST NUMBER OF RESPONSES TO BE SENT
          RJM    PDR         PREPARE DISK RESPONSE
          RJM    SNDRSP      SEND RESPONSE TO CM
          AOML   /SS/P.NCOMRQ,CSST INCREMENT NUMBER OF COMPLETED REQUESTS
          LDML   /SS/P.CURRQ,CSST SAVE RMA OF PREVIOUS REQUEST
          STML   /SS/P.PRERQ,CSST
          LDML   /SS/P.CURRQ+1,CSST
          STML   /SS/P.PRERQ+1,CSST
          LDML   /SS/P.REQ,CSST SAVE RMA OF CURRENT REQUEST
          STML   /SS/P.CURRQ,CSST
          LDML   /SS/P.REQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
          UJK    RDWTX
          SPACE  5,20
** NAME-- RD
*
** PURPOSE-- RESERVE DRIVE.  LEAVING THE DRIVE RESERVED IS SUPPOSE
*            TO SAVE UP TO 600 MICROSECONDS PER COMMAND.
*            ALSO SET THE BURST AND INTERRUPT SIZE FOR EACH UNIT.
*            NOTE THAT NOS USES A DIFFERENT BURST SIZE THAN NOS/VE.
          SPACE  2
 RDX      LJM    **
 RD       EQU    *-1
          LDC    H0400
          STML   CP+OPCD     OPERATION CODE
          LDN    6           COMMAND PACKET LENGTH
          STML   CP
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    RD10        IF ERROR
          LDML   UNITS,UX    INDICATE DRIVE RESERVED
          LPC    0#F7FF
          LMC    /UN/K.RD
          STML   UNITS,UX
          RJM    IUF         IS UNIT FORMATTED
          NJN    RDX         IF UNIT NOT FORMATTED
          RJM    RA6F        READ ATTRIBUTE 6F
          STML   RPB+13      SET THE INTERRUPT AND BURST SIZE TO 2048
          STML   RPB+15
          LDC    0#800
          STML   RPB+14
          STML   RPB+16
          RJM    WA6F        WRITE ATTRIBUTE 6F
          UJK    RDX
 RD10     BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- REL
*
** PURPOSE-- READ ERROR LOG
          SPACE  2
 RELX     LJM    **
 REL      EQU    *-1
          LDN    9           COMMAND PACKET LENGTH
          STML   CP
          LDC    H8400
          STML   CP+OPCD     READ ERROR LOG COMMAND
          LDDL   CMOD
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     CONTROLLER NUMBER
          LDC    0#2E0
          STML   CP+FCP
          LDC    0#100       SELECT LAST ERROR LOGGED IN EEPROM
          STML   CP+FCP+1
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJN    RELX        IF NO ERROR
          LDN    E00         CP MUST DETERMINE ERROR
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RESP
*
** PURPOSE-- WRITE STATUS BUFFER TO CM RESPONSE BUFFER.
*
** INPUT-- CM.PIT, CM.RS, LIM, /PIT/IN, /PIT/OUT, RS+/RS/P.RESPL
*
** OUTPUT-- /PIT/IN, RESPONSE BUFFER
          SPACE  2
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  2
 RESPX    LJM    **
 RESP     EQU    *-1

* CHECK IF RESPONSE SHOULD BE SENT TO CM.

          LDN    0
          STML   STORS       SET FLAG TO STORE RESPONSE
          LDML   CM+/CM/P.STOR,CSST CHECK IF CALLER WANTS RESPONSE
          SHN    /CM/L.STOR+2
          MJN    RESP10      IF STORE RESPONSE FLAG IS SET
 .U       IFEQ   UNIX,1
          LDML   RS+/RS/P.SHORT
          SHN    /RS/L.SHORT+2
          PJN    RESP10      IF NOT NORMAL RESPONSE, STORE RESPONSE
 .U       ELSE
          LDML   RS+/RS/P.RC
          SHN    /RS/N.RC+/RS/L.RC-16
          SBN    R.NRM
          NJN    RESP10      IF NOT NORMAL RESPONSE, STORE RESPONSE
 .U       ENDIF
          AOML   STORS       NONZERO MEANS DO NOT STORE RESPONSE
          UJK    RESPX

* READ IN AND OUT POINTERS OF RESPONSE BUFFER.

 RESP10   BSS
          LOADC  CM.PIT      LOAD ADDRESS OF PP INTERFACE TABLE
          ADN    /PIT/C.OUT  OFFSET OF OUT POINTER
          CRDL   P2          READ OUT POINTER
          SBN    /PIT/C.OUT-/PIT/C.IN  OFFSET OF 'IN' POINTER
          CRDL   P1          READ 'IN' POINTER

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

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

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

 RESP40   LDDL   LIM         FIRST BLOCK WRITE = (LIMIT - IN) WORDS
          SBDL   INP
          SHN    -3
          STDL   T4          NUMBER OF WORDS TO TRANSFER ON 1ST BLOCK
          SHN    2           CONVERT TO NUMBER OF PP WORDS
          ADC    RS
          STML   RESP60      RESPONSE ADDRESS FOR 2ND BLOCK WRITE
 RESP50   BSS
          LOADC  CM.RS       LOAD CM ADDRESS OF RESPONSE BUFFER
          STDL   T6          SAVE CM ADDRESS
          ADDL   T3          ADD 'IN' OFFSET
          CWML   RS,T4       WRITE RESPONSE TO CM
          LDDL   T5          RESPONSE LENGTH
          ZJN    RESP70      IF ONLY 1 BLOCK WRITE REQUIRED
          LDDL   T6          LOAD ADDRESS OF RESPONSE BUFFER
          LMC    400000B
          CWML   **,T5       WRITE 2ND PART OF RESPONSE TO CM
                             (BEGINNING OF RESPONSE BUFFER)
 RESP60   EQU    *-1

 RESP70   BSS
          LJM    RESPX
          SPACE  5,20
** NAME-- RESPIN
*
** PURPOSE-- UPDATE THE 'IN' POINTER IN THE CM RESPONSE BUFFER.
*
** INPUT-- INPNT = NEW 'IN' POINTER.
          SPACE  2
 RESNX    LJM    **
 RESPIN   EQU    *-1

* CHECK IF RESPONSE SHOULD BE SENT TO CM.

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

* UPDATE THE 'IN' POINTER.

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

* INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   PPNO-3      SET LAST BYTE NONZERO
 INTPRC   PSN    0           INTERRUPT OR PSN (MODIFIED)
          UJK    RESNX
          SPACE  5,20
** NAME-- RMR
*
** PURPOSE-- READ CM3 MICROCODE REVISION
          SPACE  2
 RMRX     LJM    **
 RMR      EQU    *-1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#200
          STML   CP+OPCD     ATTRIBUTE COMMAND
          LDC    0#36C
          STML   CP+FCP      PARAMETER TO READ REV NUMBER
          LDC    0#4050
          STML   CP+FCP+1    RETURN REV NUMBER IN RESPONSE
          LDML   UNITS,UX
          SHN    -3
          LPN    17B
          STDL   CMOD        CONTROLLER NUMBER AND DRIVER NUMBER
          LPN    7
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     SLAVE ADDRESS
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    RMR10       IF NOT SUCCESSFUL
          LDC    ID50
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    RMR10       IF ID 50 NOT FOUND
          LDML   RPB+19,T3
          LPC    377B        MASK MICROCODE REVISION NUMBER
          SHN    8
          STML   /SS/P.MREV,CSST
          LJM    RMRX
 RMR10    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 .E       IFEQ   ERRD,1      READ RAW DATA
          SPACE  5,20
** NAME-- RRD
*
** PURPOSE-- READ RAW DATA IF DATA FIELD ECC ERROR.  IF THE ERROR
*            CODE IS 62 AND THE OP CODE IN THE RESPONSE IS 1107,
*            THE SECTOR WITH THE UNCORRECTED MEDIA ERROR HAS BEEN
*            TRANSFERRED TO CENTRAL MEMORY.
          SPACE  2
 RRDX     LJM    **
 RRD      EQU    *-1
          LDDL   T5          ENDING STATUS FROM ID26
          LPC    0#FF
          LMC    0#D1
          NJN    RRDX        IF NOT DATA FIELD ECC ERROR
          LDML   RPB+8,T3
          STML   CP+FCP+3    CYLINDER
          LDML   RPB+9,T3
          STML   CP+FCP+4    HEAD, SECTOR
          LDN    5
          STML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMANDS
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          LDC    H1107
          STML   CP+OPCD     OPERATION CODE
          LDN    1           WRITE READ SECTORS PER BURST
          STML   CP+FCP+2    SECTOR COUNT
*
*         FIND THE CENTRAL MEMORY ADDRESS WHERE THE SECTOR WITH THE
*         MEDIA ERROR SHOULD BE STORED.
*
          RJM    UREQ        READ UNIT REQUEST FROM CM
          RJM    SETRQ       SETUP FOR 1ST REQUEST
          RJM    UNCMND      GET FIRST COMMAND
 RRD5     BSS
          LDML   /SS/P.CURTRK,CSST
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          SBML   CP+FCP+4    ADDRESS OF MEDIA ERROR
          ZJN    RRD10       IF CORRECT ADDRESS
          PJK    RRDX        IF ADDRESS NOT FOUND
          RJM    UBT         UPDATE BYTES TRANSFERRED
          ZJK    RRDX        IF NO MORE COMMANDS
          RJM    UDA         UPDATE DISK ADDRESS
          UJN    RRD5

 RRD10    BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJN    RRD20       IF NOT TRANSFER NOTIFICATION
          STDL   BURPOS      CLEAR BURST POSITION
          LDN    1
          STDL   BBS         BURSTS BEFORE SUSPEND
          RJM    SEL         SELECT THE CONTROLLER
          RJM    READ        READ ONE BURST
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          NJK    RRDX        IF SUCCESSFUL OR CONDITIONAL SUCCESS
 RRD20    BSS
          LDN    E00         CP MUST ISOLATE THE ERROR
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 .E       ENDIF
          SPACE  5,20
** NAME-- SAVSS
*
** PURPOSE-- WRITE THE SS TABLE TO THE COMMUNICATION BUFFER
*            IN THE UNIT INTERFACE TABLE.
*
          SPACE  2
 SAVX     LJM    **
 SAVSS    EQU    *-1
          LDN    C.SS        NUMBER OF WORDS TO WRITE
          STDL   WC
          LDDL   SSUN
          SBDL   UNUML
          PJN    SAVX        IF INVALID SS TABLE
          LOADR  UNITS+/UN/P.UIT,SSUN
          ADN    /UIT/C.UBUF OFFSET OF COMMUNICATION BUFFER
          CRDL   T1          GET ADDRESS OF COMMUNICATION BUFFER
          LOADF  T3          REFORMAT IT AND LOAD R REGISTER
          CWML   SSNR,WC     WRITE NON RESIDENT SS TABLE
          UJK    SAVX
          SPACE  5,20
** NAME-- SCB
*
** PURPOSE-- SET COMMAND IN PROGRESS BITS IN (UNITS,UX) FOR ONE
*            CONTROLLER
*
** ENTRY  A = BITS TO SET
*         CMOD = CONTROLLER TO SEARCH FOR UNITS
          SPACE  2
 SCBX     LJM    **
 SCB      EQU    *-1
          STDL   P1
          LDN    0
          STDL   T1
          UJN    SCB20
 SCB10    BSS
          LDN    P.UN
          RADL   T1          UPDATE POINTER TO UNITS TABLE
 SCB20    BSS
          SBDL   UNUML
          PJN    SCBX        IF END OF CONFIGURED UNITS
          LDML   UNITS,T1
          SHN    -3
          LPN    17B
          LMDL   CMOD
          NJN    SCB10       IF DIFFERENT CONTROLLER
          LDML   UNITS,T1
          LPC    0#1FFF
          LMDL   P1
          STML   UNITS,T1    SET -2 COMMANDS IN PROGRESS-
          UJN    SCB10
          SPACE  5,20
** NAME-- SCLOCK
*
** PURPOSE-- SETS THE CHANNEL LOCK.
          SPACE  2
 SCLX     LJM    **
 SCLOCK   EQU    *-1
 SCL30    BSS
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJN    SCL30       IF LOCK WAS NOT SET
          STDL   CLF         CHANNEL LOCK FLAG
          UJK    SCLX        EXIT, LOCK WAS SET
          SPACE  5,20
** NAME-- SCP
*
** PURPOSE-- SET UP COMMAND PACKET PARAMETERS FOR A WRITE
*            OR READ
          SPACE  2
 SCPX     LJM    **
 SCP      EQU    *-1
          LDN    RPL
          STML   CP          PACKET LENGTH
          AOML   /SS/P.CRN,CSST
          LPC    0#FFF1
          STML   /SS/P.CRN,CSST CLEAR CARRY BIT
          LPN    1
          SHN    14
          ADDL   UX
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDDL   FNC
          ZJN    SCP8        IF READ
          SBN    1
          ZJN    SCP4        IF WRITE
          LDC    E501        INVALID COMMAND
          RJM    INTERR      REPORT ERROR (NO RETURN)
 SCP4     BSS
          LDC    H2005
          UJN    SCP12
 SCP8     BSS
          LDC    H1005
 SCP12    BSS
          STML   CP+OPCD     OPERATION
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          LDC    H0931
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    SCP15       IF SECOND COMMAND
          LDML   /SS/MT,CSST
          UJN    SCP18
 SCP15    BSS
          LDML   /SS/MT2,CSST
 SCP18    BSS
          SHN    2
          PJN    SCP30       IF NOT USING MASTER TERMINATE
          LDN    0
          STDL   T3
          LDML   CP+FCP+4
          LPN    77B
          STDL   T1          STARTING SECTOR
          LDML   CP+FCP+4
          SHN    -8
          STDL   T2          STARTING TRACK
          LDN    SPT         SECTORS PER TRACK
          SBDL   T1
 SCP20    BSS
          RADL   T3          COMPUTE SECTORS
          AODL   T2
          SBN    MAXTR+1     TRACKS PER CYLINDER
          ZJN    SCP28       IF CALCULATION COMPLETE
          LDN    SPT         SECTORS PER TRACK
          UJN    SCP20
 SCP28    BSS
          LDDL   T3
          STML   CP+FCP+2    SECTOR COUNT
          UJK    SCPX
 SCP30    BSS
          LDC    BPS-1       ENSURE BURST BOUNDARY
          ADDL   TOTAL+1
          STDL   T1
          SHN    -16
          ADDL   TOTAL
          SHN    5
          STML   CP+FCP+2
          LDDL   T1
          SHN    -11
          RAML   CP+FCP+2    SECTOR COUNT
          UJK    SCPX
          SPACE  5,20
** NAME-- SDA
*
** PURPOSE-- SAVE DISK ADDRESS
          SPACE  2
 SDAX     LJM    **
 SDA      EQU    *-1
          LDDL   PTF
          ZJN    SDA10       IF INITIALIZATION CONFIDENCE TEST
          LDML   /SS/P.CT,CSST
          NJN    SDA20       IF NOT CONFIDENCE TEST FAILURE
 SDA10    BSS
          STML   RS+/RS/P.STRK STARTING TRACK
          STML   RS+/RS/P.SSEC STARTING SECTOR
          LDC    MAXCYL-1
          STML   RS+/RS/P.SCYL STARTING CYLINDER
          UJN    SDA30
 SDA20    BSS
          LDN    1
          STDL   T2
          LOADF  /SS/P.CURRQ,CSST RMA OF CURRENT REQUEST
          ADN    3
          CRML   RS+/RS/P.CHAN,T2 SAVE CYLINDER, TRACK, SECTOR IN RESPONSE
 SDA30    BSS
          LDML   RS+/RS/P.ERRID
          ZJN    SDA50       IF RESPONSE PACKET PRESENT
          ADC    -E60
          MJN    SDA40       IF RESPONSE PACKET NOT PRESENT
          ADC    -E110+E60
          MJN    SDA50       IF RESPONSE PACKET PRESENT
 SDA40    BSS
          LDML   /SS/P.CURTRK,CSST
          STML   RS+/RS/P.FTRK FAILING TRACK
          LDML   /SS/P.CURSEC,CSST
          UJN    SDA70
 SDA50    BSS
          LDN    ID29        DRIVE CONDITIONAL SUCCESS
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    SDA60       IF ID 29 FOUND
          LDN    ID32        RESPONSE EXTENT
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    SDA40       IF ID32 NOT FOUND
 SDA60    BSS
          LDML   RPB+9,T3
          SHN    -8
          STML   RS+/RS/P.FTRK FAILING TRACK
          LDML   RPB+9,T3
          LPC    0#FF
 SDA70    BSS
          STML   RS+/RS/P.FSEC FAILING SECTOR                                                                                      F
          LJM    SDAX
          SPACE  5,20
** NAME-- SEEK
*
** PURPOSE-- ISSUE INITIAL SEEK.
          SPACE  2
 SEEKX    LJM    **
 SEEK     EQU    *-1
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          MJN    SEEK4       IF ONE COMMAND ISSUED
          SHN    -/UN/L.CIP-2
          LPC    0#1FFF
          LMC    0#8000      INDICATE ONE COMMAND ISSUED
          UJN    SEEK8
 SEEK4    SHN    -/UN/L.CIP-2
          LPC    0#3FFF
          LMC    0#C000      INDICATE TWO COMMANDS ISSUED
 SEEK8    STML   UNITS,UX
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          LDML   UNITS,UX
          SHN    6
          MJN    SEEK12      IF DRIVE ALREADY RESERVED
          LDN    6           COMMAND PACKET LENGTH
          STML   CP
          LDC    H0400       RESERVE DRIVE COMMAND
          STML   CP+OPCD
 SEEK12   BSS
          AODL   CMNDS       COMMAND ISSUED COUNTER
          RJM    CPT         COMMAND PACKET TRANSFER
 SEEK20   EQU    *-1         FOR FORCING ERRORS
          UJK    SEEKX
          SPACE  5,20
** NAME-- SETRQ
*
** PURPOSE-- SET UP FOR FIRST REQUEST.
          SPACE  2
 SETRQX   LJM    **
 SETRQ    EQU    *-1
          LDML   /SS/P.REQ,CSST SAVE RMA OF REQUEST
          STML   /SS/P.FCOMRQ,CSST FIRST COMPLETED REQUEST (RMA)
          STML   /SS/P.CURRQ,CSST CURRENT REQUEST (RMA)
          LDML   /SS/P.REQ+1,CSST
          STML   /SS/P.FCOMRQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
          LDN    1
          STML   /SS/P.NCOMRQ,CSST NUMBER OF COMPLETED REQUESTS
          LDML   RQ+/RQ/P.TRACK,CSST
          STML   /SS/P.CURTRK,CSST CURRENT TRACK
          LDML   RQ+/RQ/P.SECTOR,CSST
          STML   /SS/P.CURSEC,CSST CURRENT SECTOR
          LDML   RQ+/RQ/P.INT,CSST 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,CSST 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-- SFP
*
** PURPOSE-- SEARCH FOR PARAMETER IDENTIFICATION IN RESPONSE PACKET
*
** INPUT
*         A = ID TO SEARCH FOR
** OUTPUT
*         A = POSITIVE IF ID FOUND
*         T3 = POINTER TO ID IF IT IS FOUND (RPB+5,T3)
          SPACE  2
 SFPX     LJM    **
 SFP      EQU    *-1
          STDL   T1          PARAMETER TO SEARCH FOR
          LDN    0
          STDL   T3          POINTER TO ID BEING SEARCHED FOR
          LDML   RPB
          ADN    1
          SHN    -1
          SBN    5           LENGTH OF MINIMUM RESPONSE PACKET
 SFP4     BSS
          STDL   T2          POINTER TO END OF PARAMETERS
          MJN    SFPX        EXIT, NO ID FOUND
          LDML   RPB+5,T3
          LMDL   T1
          LPC    0#FF
          ZJN    SFPX        IF ID FOUND
          LDML   RPB+5,T3
          SHN    -9
          ADN    1           ADJUST FOR ODD BYTE
          STDL   T4          WORD LENGTH OF PARAMETER
          RADL   T3          UPDATE POINTER TO ID BEING SEARCHED FOR
          LDDL   T2
          SBDL   T4
          UJN    SFP4
          SPACE  5,20
** NAME-- SFRR
*
** PURPOSE-- SETUP FOR REQUEST RETRY FOR ONE UNIT
*
** OUTPUT-- P5, T8 ARE UNCHANGED
          SPACE  2
 SFRRX    BSS
          LDN    0
          STDL   IF
          STML   /SS/P.RESET,CSST CLEAR RESET ISSUED FLAG
          LDML   UNITS,UX
          LPC    0#1FFF
          STML   UNITS,UX    CLEAR COMMAND IN PROGRESS BITS
          LJM    **
 SFRR     EQU    *-1
          RJM    GETSS       GET SS TABLE IF NECESSARY
          LDML   /SS/P.CT,CSST
          ZJN    SFRRX       IF CONFIDENCE TEST JUST RUN
          LDML   /SS/P.RESET,CSST
          NJN    SFRRX       IF SLAVE RESET IN PROGRESS
          LDML   UNITS,UX
          SHN    2
          PJN    SFRRX       IF NO COMMAND IN PROGRESS
          LDML   /SS/P.FNC,CSST
          NJN    SFRR3       IF NOT READ COMMAND
          LDML   /SS/P.NCR,CSST
          ZJN    SFRR3       IF NO RESPONSES TO SEND
          RJM    RDWTOK      SEND READ RESPONSE
 SFRR3    BSS
          LDML   /SS/P.CURRQ,CSST RESTORE RMA OF CURRENT REQUEST
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.CURRQ+1,CSST
          STML   /SS/P.REQ+1,CSST
          LDML   /SS/P.FPVA,CSST RESTORE PVA OF CURRENT REQUEST
          STML   /SS/P.PVA,CSST
          LDML   /SS/P.FPVA+1,CSST
          STML   /SS/P.PVA+1,CSST
          LDML   /SS/P.FPVA+2,CSST
          STML   /SS/P.PVA+2,CSST
          LDML   UNITS,UX
          SHN    2+/UN/L.TCIP
          PJN    SFRR5       IF NOT -2 COMMANDS IN PROGRESS-
          SODL   CMNDS       OUTSTANDING COMMANDS
          LDML   UNITS,UX
          LPC    0#9FFF
          STML   UNITS,UX    CLEAR -2 COMMANDS IN PROGRESS-
 SFRR5    BSS
          LDN    0
          STML   /SS/P.NCR,CSST ZERO OUT NUMBER OF COMPLETED WRITE REQUESTS
          SOML   /SS/P.NCOMRQ,CSST NUMBER OF COMPLETED REQUESTS
          ZJN    SFRR10      IF NO STREAMED READ REQUESTS
          LDML   /SS/P.PRERQ,CSST SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   /SS/P.CURRQ,CSST
          LDML   /SS/P.PRERQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
          RJM    DCR         DELETE COMPLETED REQUESTS FROM QUEUE
          UJN    SFRR15
 SFRR10   BSS
          SODL   CMNDS       OUTSTANDING COMMANDS
 SFRR15   BSS
          LJM    SFRRX
          SPACE  5,20
** NAME-- SFT
*
** PURPOSE-- SET FACILITY TIMEOUT TO 1/2 SECOND IF 8A OR LATER
*            MICROCODE.  THIS IS THE AMOUNT OF TIME THE CM3 WILL
*            WAIT FOR THE DRIVE TO GO NOT BUSY BEFORE REPORTING
*            AN ERROR.  WITH A TIMEOUT OF ONE HALF SECOND AND
*            VERSION 7 OR EARLIER MICROCODE,  DATA INTEGRITY
*            PROBLEMS OCCURRED.
          SPACE  2
 SFTX     LJM    **
 SFT      EQU    *-1
          RJM    RA6F        READ ATTRIBUTE 6F
          LDML   /SS/P.MREV,CSST
          SHN    -12
          SBN    8
          PJN    SFT2        IF 8A OR LATER MICROCODE
          LDML   RPB+21
          LMC    0#FFFF
          ZJK    SFTX        IF TIMEOUT ALREADY INFINITE
          LCN    0           SET TIMEOUT TO INFINITE
          STML   RPB+21
          LMN    1
          UJN    SFT5
 SFT2     BSS
          LDML   RPB+21
          LMN    7
          ZJK    SFTX        IF TIMEOUT ALREADY 1/2 SECOND
          LDN    7           SET TIMEOUT TO 1/2 SECOND
          STML   RPB+21
          LDC    0#A120
 SFT5     BSS
          STML   RPB+22
          RJM    WA6F        WRITE ATTRIBUTE 6F
          LDN    6
          STML   CP          COMMAND PACKET LENGTH
          LDC    H020A
          STML   CP+OPCD     SAVE OPERATING MODE IN EEPROM
          LDDL   CMOD
          LPN    7
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     SLAVE ADDRESS
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    SFTX        IF SUCCESSFUL
          LDN    E00         CPU MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- SNDRSP
*
** PURPOSE-- SEND THE RESPONSE TO CM.
*            USED WHEN SWITCHING TO THE NEXT REQUEST.
          SPACE  2
 SNDX     LJM    **
 SNDRSP   EQU    *-1
          RJM    RESP        SEND RESPONSE TO CM
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
          RJM    SRESP       SET UP RESPONSE BUFFER
          UJK    SNDX
          SPACE  5,20
** NAME-- SNDWRS
*
** PURPOSE-- SEND WRITE RESPONSES FOR WRITE REQUESTS THAT HAVE
*            BEEN SUCCESSFULLY STREAMED.
          SPACE  2
 SNDWX    LJM    **
 SNDWRS   EQU    *-1
          LDML   /SS/P.NCR,CSST NUMBER OF COMPLETED WRITE REQUESTS MINUS 1
          ZJN    SNDWX       IF NO COMPLETED STREAMED WRITE REQUESTS
          LDN    2
          STDL   WC
          LOADF  /SS/P.CURRQ,CSST
          CRML   NRQ,WC      READ FIRST REQUEST TO GET START OF CHAIN
 .U       IFNE   UNIX,1
          LDML   /SS/P.REQ,CSST  SET CURRQ TO END OF CHAIN SO DCR WILL
                                  DELINK ALL REQUESTS
          STML   /SS/P.CURRQ,CSST
          LDML   /SS/P.REQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
 .U       ENDIF
 SNDW10   BSS
          RJM    RESP        SEND RESPONSE TO CM
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
 .U       IFNE   UNIX,1
          LDN    0
          STML   RS+/RS/P.XFER  SET TRANSFER COUNT = 0 FOR ALL OTHER RESPONSES
          STML   RS+/RS/P.XFER+1
 .U       ENDIF
          LDML   NRQ+/RQ/P.NEXTPV  PUT PVA OF NEXT RESPONSE IN RESPONSE BUFFER
          STML   RS+/RS/P.PVA
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   RS+/RS/P.PVA+1
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   RS+/RS/P.PVA+2
 .U       IFEQ   UNIX,1
          LDML   /SS/P.CURRQ,CSST  SAVE RMA OF LAST RESPONSE RETURNED
          STML   /SS/P.PRERQ,CSST
          LDML   /SS/P.CURRQ+1,CSST
          STML   /SS/P.PRERQ+1,CSST
          LDML   NRQ+/RQ/P.NEXT  REQUESTS ARE DELINKED THROUGH CURRQ
          STML   /SS/P.CURRQ,CSST
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.CURRQ+1,CSST
 .U       ENDIF
          LOADF  NRQ+/RQ/P.NEXT  CM ADDRESS OF NEXT REQUEST
          CRML   NRQ,WC      READ NEXT REQUEST CHAIN POINTERS
          AOML   /SS/P.NCOMRQ,CSST INCREMENT NUMBER OF COMPLETED REQUESTS
                             (FOR DCR)
          SOML   /SS/P.NCR,CSST DECREMENT COUNT OF RESPONSES LEFT TO SEND
          NJK    SNDW10      IF MORE RESPONSES
          UJK    SNDWX
          SPACE  5,15
** NAME-- SNMSG
*
** PURPOSE-- SEND UNSOLICITED MESSAGE
          SPACE  2
 SNMSGX   LJM    **
 SNMSG    EQU    *-1
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          LDN    R.UNS       UNSOLICITED MESSAGE
          STML   RS+/RS/P.RC RESPONSE CODE
 .U       IFEQ   UNIX,1
          RJM    RESP        SEND RESPONSE TO CM
 .U       ELSE
          RJM    TERMP       SEND RESPONSE TO CM
 .U       ENDIF
          UJK    SNMSGX
          SPACE  5,20
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP TABLE LOCK IN THE
*            PP INTERFACE TABLE.
          SPACE  2
 SPLX     LJM    **
 SPLOCK   EQU    *-1
 .U       IFEQ   UNIX,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
 .U       ELSE
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET THE LOCKWORD
          UJK    SPLX
 .U       ENDIF
          SPACE  5,20
** NAME-- SQLOCK
*
** PURPOSE-- SETS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
          SPACE  2
 SQLX     LJM    **
 SQLOCK   EQU    *-1
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          UJK    SQLX
          SPACE  5,20
** NAME-- SRESP
*
** PURPOSE-- SET UP STATUS FOR RESPONSE BUFFER.
          SPACE  2
 SREX     LJM    **
 SRESP    EQU    *-1
          LDML   /SS/P.PVA,CSST SAVE PVA OF REQUEST
          STML   /SS/P.FPVA,CSST
          LDML   /SS/P.PVA+1,CSST
          STML   /SS/P.FPVA+1,CSST
          LDML   /SS/P.PVA+2,CSST
          STML   /SS/P.FPVA+2,CSST
*
          LDN    0
          STML   /SS/P.XFER,CSST TRANSFER COUNT
          STML   /SS/P.XFER+1,CSST
          UJK    SREX
          SPACE  5,20
** NAME-- SRI
*
** PURPOSE-- SET RESET ISSUED FLAG FOR ALL UNITS ON CMOD.
*            IT WILL BE CLEARED WHEN AN ASYNCHRONOUS RESPONSE
*            FOR THE DRIVE IS RECEIVED.
          SPACE  2
 SRIX     BSS
          LDDL   P1
          STDL   UX          RESTORE UX
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LJM    **
 SRI      EQU    *-1
          LDDL   UX
          STML   EPCT,CMOD   SAVE TABLE ISSUING THE RESET
          STDL   P1          SAVE UX
          LDN    0
          STDL   UX          POINTER TO UNITS TABLE
          UJN    SRI10
 SRI5     BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 SRI10    BSS
          SBDL   UNUML
          PJN    SRIX        IF END OF CONFIGURED UNITS
          LDML   UNITS,UX
          SHN    -3
          LPN    17B
          LMDL   CMOD
          NJN    SRI5        IF DIFFERENT CONTROLLER
          LDML   UNITS,UX
          LPC    0#F7FF
          STML   UNITS,UX    CLEAR DRIVE RESERVE BIT
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX SET CURRENT CLOCK
          LDN    3
          STML   /SS/P.RESET,CSST INDICATE RESET ISSUED
          UJK    SRI5
          SPACE  5,20
** NAME-- SR
*
** PURPOSE-- SELECT REQUEST FROM UNIT QUEUE
*
** EXIT
*         A = 0 IF REQUEST FOUND
          SPACE  2
 SRX      LJM    **
 SR       EQU    *-1
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    SRX         IF LOCK NOT SET
          LDN    2
          STDL   P5
          LDDL   CNUM
          NJK    SR50        IF ONE COMMAND ALREADY ISSUED
          LDML   /SS/P.REQ,CSST
          ADML   /SS/P.REQ+1,CSST
          NJK    SR24        IF REQUEST PRESENT
          LOADR  UNITS+/UN/P.UIT,UX LOAD CM ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV
          CRML   NRQ,P5      READ FIRST PVA AND RMA
          LDML   NRQ+/RQ/P.NEXT
          STML   /SS/P.REQ,CSST
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,CSST
          ADML   /SS/P.REQ,CSST
          NJN    SR20        IF REQUEST ON QUEUE
 SR16     BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDN    1           NO REQUEST FOUND
          UJK    SRX
 SR20     BSS
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA,CSST
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA+2,CSST
 SR24     BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDN    0           INDICATE REQUEST FOUND
          UJK    SRX
 SR50     BSS
          LDN    5
          STDL   WC
          LOADF  /SS/P.CURRQ,CSST
 SR54     BSS
          CRML   NRQ,WC      READ NEXT REQUEST
          LDML   NRQ+/RQ/P.NEXT
          STML   /SS/P.RMA2,CSST
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.RMA2+1,CSST
          ADML   /SS/P.RMA2,CSST
          NJK    SR80        IF NOT END OF QUEUE
          LOADR  UNITS+/UN/P.UIT,UX LOAD CM ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV
          CRML   NRQ,P5      READ FIRST PVA AND RMA
          LDML   NRQ+/RQ/P.NEXT
          STML   /SS/P.RMA2,CSST
          LMML   /SS/P.FCOMRQ,CSST
          NJN    SR75        IF REQUEST FOUND
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.RMA2+1,CSST
          LMML   /SS/P.FCOMRQ+1,CSST
          ZJK    SR16        IF NO REQUEST FOUND
 SR75     BSS
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.RMA2+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA2,CSST
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA2+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA2+2,CSST
          UJK    SR24
 SR80     BSS
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA2,CSST
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA2+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA2+2,CSST
          LDML   NRQ+/RQ/P.SWIT
          SHN    /RQ/L.SWIT+2
          PJK    SR24        IF SWITCH FLAG NOT SET
          UJK    SR16
          SPACE  5,20
** NAME-- STI
*
** PURPOSE-- SET TABLE INDEXES (UX AND CSST).  ALSO VERIFY THIS
*            IS THE CORRECT UNIT.
          SPACE  2
 STIX     LJM    **
 STI      EQU    *-1
          LDML   RPB+CRN
          LPC    777B
          STDL   UX          SET INDEX TO UNITS TABLE
          STDL   T8
          RJM    GETSS       GET SS TABLE FROM CM
          LDML   /SS/P.UNIT,CSST
          LMML   RPB+SLAD
          ZJK    STIX        IF CORRECT UNIT
          LDDL   T8
          STDL   UX          SET INDEX TO UNITS TABLE
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LJM    TERM10
          SPACE  5,20
** NAME-- TAC
*
** PURPOSE-- TERMINATE ALL COMMANDS ISSUED
          SPACE  2
 TACX     LJM    **
 TAC      EQU    *-1
          LDN    0
          STDL   CMOD        CONTROL MODULE NUMBER
          UJN    TAC15
 TAC10    BSS
          AODL   CMOD
          SBN    16
          ZJN    TACX        IF ALL COMMANDS TERMINATED
 TAC15    BSS
          LDN    0
          STDL   P5          RESET NOT ISSUED
          STDL   UX          POINTER TO UNITS TABLE
          UJN    TAC25
 TAC20    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 TAC25    BSS
          SBDL   UNUML
          PJN    TAC10       IF END OF CONFIGURED UNITS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    17B
          LMDL   CMOD
          NJN    TAC20       IF DIFFERENT CONTROL MODULE
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T1
          LDDL   T1+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJN    TAC20       IF UNIT DISABLED
          LDML   UNITS,UX
          SHN    2+/UN/L.CIP
          MJN    TAC40       IF COMMAND IN PROGRESS
          LDDL   PTF
          ZJN    TAC40       IF IN PATH TEST
          RJM    GETSS       GET SS TABLE FROM UNIT COMMUNICATIONS BUFFER
          LDML   /SS/P.CT,CSST
          NJN    TAC50       IF NOT IN CONFIDENCE TEST
 TAC40    BSS
          LDDL   P5
          NJN    TAC50       IF RESET ALREADY DONE
          RJM    LIR         LOGICAL INTERFACE RESET
          AODL   P5          RESET DONE FOR THIS CONTROLLER
 TAC50    BSS
          UJK    TAC20
          SPACE  5,20
** NAME-- TDP
*
** PURPOSE-- TEST DMA PATH
*
** EXIT-- A = 0 IF NO ERROR

          SPACE  2
 TDPX     LJM    **
 TDP      EQU    *-1

* TRANSFER FROM RECEIVERS TO CENTRAL MEMORY

          RJM    WOG         WRITE OPERAND GENERATOR, ENABLE TEST MODE
          LDN    H0009
          RJM    FUNC        SET SELECT OUT
          LDC    H0281
          RJM    FUNC        IPI TRANSFER FUNCTION (READ)
          LDC    H0C00       DMA READ
          RJM    TMT         TEST MODE TRANSFER
          LDML   EOG1,CH     EXPECTED OPERAND GENERATOR
          RJM    COG         DROP MASTER OUT, DESELECT, DISABLE TEST
                              MODE, CHECK OPERAND GENERATOR
          RJM    VTMD        VERIFY TEST MODE DATA

* TRANSFER FROM CENTRAL MEMORY TO TRANSMITTERS

          RJM    MCC         MASTER CLEAR CHANNEL.  THIS CLEARS THE LOST DATA
                              ERROR THAT OCCURS ON THE 25 MB CHANNEL WHEN ONLY
                              ONE OF 3 OPERAND GENERATOR WORDS ARE READ.
          RJM    PS          PORT SELECT
          RJM    WOG         WRITE OPERAND GENERATOR, ENABLE TEST MODE
          LDN    H0009
          RJM    FUNC        SET SELECT OUT
          LDC    H0381       IPI TRANSFER FUNCTION (WRITE)
          RJM    FUNC
          LDC    H0D00       DMA WRITE
          RJM    TMT         TEST MODE TRANSFER
          LDML   EOG2,CH     EXPECTED OPERAND GENERATOR
          RJM    COG         DROP MASTER OUT, DESELECT, DISABLE TEST
                              MODE, CHECK OPERAND GENERATOR
          UJK    TDPX
          SPACE  5,20
** NAME-- TERM
*
** PURPOSE-- TERMINATE UNIT REQUEST.
          SPACE  2
 TERM     CON    0           NORMAL TERMINATION
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    TERM2       IF NOT FORMAT COMMAND
          LDN    E58         FORMAT COMPLETE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   UNITS,UX
          SHN    -3
          LPN    17B
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    0
          STML   FIP         CLEAR FORMAT IN PROGRESS
          STML   /SS/P.CT,CSST  ENABLE RUNNING CONFIDENCE TEST
          UJK    TERM20
 TERM2    LDML   /SS/MT,CSST MAKE SURE ALL BYTES WERE TRANSFERRED
          SHN    2
          PJN    TERM3       IF NOT USING MASTER TERMINATE
          LDML   /SS/P.LISTL,CSST
          UJN    TERM6
 TERM3    BSS
          SHN    -2
          ADML   /SS/P.TOTAL+1,CSST
          ADML   /SS/P.LISTL,CSST
 TERM6    BSS
          ADML   /SS/P.NUMCM,CSST
          ZJN    TERM20      IF TERMINATION IS OK
 TERM10   BSS
          LDK    E76         UNEXPECTED RESPONSE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 TERM20   BSS
          STML   /SS/P.RQTRY,CSST CLEAR RETRY COUNT
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
          RJM    SNDWRS      SEND WRITE RESPONSES
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    DCR         DELETE COMPLETED REQUEST FROM QUEUE
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          LJM    MAIN20
          SPACE  5,20
** NAME-- TERMP
*
** PURPOSE-- TERMINATE PP REQUEST.
          SPACE  2
 TERX     LJM    **
 TERMP    EQU    *-1
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE 'IN' POINTER FOR RESPONSE BUFFER
          UJK    TERX
          SPACE  5,20
** NAME-- UBT
*
** PURPOSE-- UPDATE BYTES TRANSFERRED
*
** EXIT--  T2 = 0 IF CHECK FOR REQUEST SWITCH IS NECESSARY
          SPACE  2
 UBTX     BSS
          STDL   T2
          LJM    **
 UBT      EQU    *-1
          LDDL   BC          CM BYTES TRANSFERRED
          RAML   /SS/P.XFER+1,CSST UPDATE BYTES TRANSFERRED
          SHN    -16
          RAML   /SS/P.XFER,CSST
          LDDL   BC
          RAML   CMLIST+/CM/P.RMA+1,CSST UPDATE CM ADDRESS
          SHN    -16
          RAML   CMLIST+/CM/P.RMA,CSST
          LDML   CMLIST+/CM/P.LEN,CSST UPDATE BYTES LEFT TO TRANSFER
          SBDL   BC
          STML   CMLIST+/CM/P.LEN,CSST
          NJN    UBT10       IF MORE BYTES LEFT TO TRANSFER TO THIS
                             CM ADDRESS
          SOML   /SS/P.LISTL,CSST DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    UBT20       IF END OF RMA LIST
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
 UBT10    BSS
          LDN    1           INDICATE NO REQUEST SWITCH
          UJN    UBTX
 UBT20    BSS
          RJM    UNCMND      GET NEXT COMMAND
          ZJN    UBTX        IF NO MORE COMMANDS
          UJN    UBT10
          SPACE  5,20
** NAME-- UC
*
** PURPOSE-- UPDATE CLOCK.  THE CLOCK IS USED TO TIMEOUT COMMANDS
*            ISSUED TO THE CONTROL MODULE.
          SPACE  2
 UCX      LJM    **
 UC       EQU    *-1
          LDDL   CLCUR
          STDL   P6          SAVE CURRENT CLOCK
          IAN    14B
          STDL   CLCUR
          SBDL   P6
          PJN    UC5         IF CLOCK HASNT WRAPPED
          ADC    10000B
 UC5      BSS
          RADL   CLMCS       UPDATE MICROSECOND PORTION OF CLOCK
          LDDL   CLMCS
          ADC    -2000
          MJN    UCX         IF LESS THAN 2 MILLISECONDS
          STDL   CLMCS
          LDN    2
          RADL   CLMLS       UPDATE MILLISECOND PORTION OF CLOCK
          ADC    -1000
          MJN    UCX         IF LESS THAN 1 SECOND
          STDL   CLMLS
          AODL   CLSEC       UPDATE SECOND PORTION OF CLOCK
          UJN    UCX
          SPACE  5,20
** NAME-- UDA
*
** PURPOSE-- UPDATE DISK ADDRESS. THIS ALLOWS THE PP TO VERIFY THAT
*            A STREAMED REQUEST IS FOR THE NEXT SEQUENTIAL DISK SECTOR.
          SPACE  2
 UDAX     LJM    **
 UDA      EQU    *-1
          AOML   /SS/P.CURSEC,CSST INCREMENT SECTOR
          SBN    SPT
          MJN    UDAX        IF SAME TRACK
          STML   /SS/P.CURSEC,CSST
          AOML   /SS/P.CURTRK,CSST INCREMENT TRACK
          UJN    UDAX
          SPACE  5,20
** NAME-- UNCMND
*
** PURPOSE-- GET NEXT COMMAND FROM CM.  SET UP CMLIST AND LISTL
*            IN THE SS TABLE.  SET FNC AS THE INDEX TO A TABLE OF
*            COMMANDS FROM CM.
*
** EXIT-- A REGISTER = 0, IF NO MORE COMMANDS.
          SPACE  2
 UNCX     LJM    **
 UNCMND   EQU    *-1
          LDML   /SS/P.NUMCM,CSST
          ZJN    UNCX        IF NO MORE COMMANDS
          SOML   /SS/P.NUMCM,CSST  DECREMENT COMMAND COUNT
          LDML   /SS/P.FRST,CSST HAS FIRST COMMAND BEEN PROCESSED
          ZJN    UNC10       IF FIRST COMMAND HASN'T BEEN PROCESSED

*         READ NEXT COMMAND FROM CM.

          LDDL   CSST        ADDRESS OF SS TABLE
          ADK    CM
          STML   UNC4        ADDRESS TO STORE COMMAND
          AOML   /SS/P.LASTC,CSST INCREMENT OFFSET OF LAST COMMAND
          LDN    C.CM
          STDL   WC
          LOADF  /SS/P.REQ,CSST LOAD CM ADDRESS AND REFORMAT
          ADML   /SS/P.LASTC,CSST ADD OFFSET OF COMMAND
          CRML   *,WC       READ COMMAND FROM CM
 UNC4     EQU    *-1

*         IF INDIRECT ADDRESS, READ CM ADDRESS LIST.

 UNC10    BSS
          LDML   CM+/CM/P.LEN,CSST MAKE SURE IT IS AN EVEN NUMBER OF CM WORDS
          ADN    7
          SCN    7
          STML   CM+/CM/P.LEN,CSST
          STML   CMLIST+/CM/P.LEN,CSST
          SHN    -3
          STML   /SS/P.LISTL,CSST LENGTH OF CM ADDRESS AREA  (CM WORDS)
          LDML   CM+/CM/P.INDIR,CSST
          SHN    /CM/L.INDIR+2
          MJN    UNC15       IF INDIRECT ADDRESS
          LDN    1
          STML   /SS/P.LISTL,CSST IF NOT INDIRECT, ONLY 1 COMMAND.
          LDML   CM+/CM/P.RMA,CSST
          STML   CMLIST+/CM/P.RMA,CSST
          LDML   CM+/CM/P.RMA+1,CSST
          STML   CMLIST+/CM/P.RMA+1,CSST
          UJN    UNC20

 UNC15    BSS
          RJM    GLIST       GET CM ADDRESS LIST OF DATA AREA
 UNC20    BSS
          LDN    0
          STDL   FNC         SET UP INTERNAL FUNCTION CODE
 UNC30    LDML   CM+/CM/P.CODE,CSST GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ERRNZ  /CM/L.CODE
          LMML   UCMD,FNC    COMPARE COMMAND CODE
          ZJN    UNC40       IF COMMAND FOUND
          AODL   FNC
          SBN    UCMDL
          MJN    UNC30       IF MORE COMMANDS TO CHECK
 UNC35    BSS
          LDC    E501        ERROR IN COMMAND CODE
          RJM    INTERR      REPORT ERROR (NO RETURN)
 UNC40    BSS
          LDML   /SS/P.FRST,CSST
          ZJN    UNC60       IF FIRST COMMAND
          LDDL   FNC
          LMML   /SS/P.FNC,CSST FUNCTION CODE
          ZJN    UNC70       IF SAME AS LAST COMMAND
          UJN    UNC35
 UNC60    BSS
          LDDL   FNC
          STML   /SS/P.FNC,CSST SAVE COMMAND CODE
 UNC70    BSS
          AOML   /SS/P.FRST,CSST SET FIRST COMMAND FLAG NONZERO
          UJK    UNCX        EXIT A REGISTER NONZERO
          SPACE  5,20
** NAME-- UREQ
*
** PURPOSE-- READ A UNIT REQUEST FROM CM.
*
* INPUT--
*         CSST = POINTER TO SS TABLE
*
** OUTPUT-- RQ  CONTAINS CURRENT REQUEST.
*           FRST = 0
*           NUMCM = NUMBER OF COMMANDS.
          SPACE  2
 UREQX    LJM    **
 UREQ     EQU    *-1
          LDN    0
          STML   /SS/P.FRST,CSST SET FLAG WHEN REQUEST IS READ
          LDN    3           NUMBER OF WORDS TO READ
          STDL   WC
          LDDL   CSST        ADDRESS OF SS TABLE
          ADK    RQ          LOCATION OF REQUEST IN SS TABLE
          STML   UREQ8       ADDRESS TO PUT REQUEST
          ADN    8
          STML   UREQ4       ADDRESS TO PUT REQUEST
          LOADF  /SS/P.REQ,CSST LOAD CM REQUEST ADDRESS
          ADN    2
*
*         THE CP SAVES THE RMA BEFORE IT SETS THE STREAM BIT.  READING
*         THE STREAM BIT FIRST GUARANTEES THE RMA IS CORRECT WHEN THE
*         STREAM BIT IS SET.
*
          CRML   *,WC        READ CURRENT REQUEST
 UREQ4    EQU    *-1
          SBN    5
          CRML   *,WC        READ CURRENT REQUEST
 UREQ8    EQU    *-1
          LDML   RQ+/RQ/P.LEN,CSST DETERMINE NUMBER OF COMMANDS
          SHN    -3
          SBN    /RQ/C.CMND
          STML   /SS/P.NUMCM,CSST NUMBER OF COMMANDS
          LDN    /RQ/C.CMND
          STML   /SS/P.LASTC,CSST OFFSET OF COMMAND
          UJK    UREQX
          SPACE  5,20
** NAME-- VCTD
*
** PURPOSE-- VERIFY CONFIDENCE TEST DATA
          SPACE  2
 VCTDX    LJM    **
 VCTD     EQU    *-1
          LDN    0
          STDL   P1
          LDML   /SS/P.CURTRK,CSST
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          STDL   P2          PUT CURRENT TRACK, SECTOR IN ONE WORD
          LDDL   CSST
          STDL   P3
 VCTD5    BSS
          LDML   CTME,P3     ADDRESS IN TABLE
          LMDL   P2          CURRENT ADDRESS
          ZJK    VCTDX       IF SECTOR NOT WRITTEN
          AODL   P3
          AODL   P1
          LMN    3
          NJN    VCTD5       IF MORE TABLE LOCATIONS TO CHECK
          LDC    WPS         64-BIT WORDS PER SECTOR
          STDL   P3
          LDC    SPT*MAXTR+SPT SECTORS PER CYLINDER
          SBML   STT,CSST    SECTOR NUMBER
          SHN    2
          ADDL   CTPAT       CONFIDENCE TEST PATTERN FIRST WORD MINUS ONE
          STDL   P1          STARTING DATA PATTERN VALUE MINUS ONE
          LOADC  CM.CB       ADDRESS OF PP COMMUNICATIONS BUFFER
          STDL   P2
 VCTD10   BSS
          LDDL   P2
          LMC    400000B
          CRDL   T4          READ WORD OF SECTOR
          AODL   P1
          SBDL   T4
          NJN    VCTD20      IF DATA MISCOMPARE
          AODL   P1
          SBDL   T5
          NJN    VCTD20      IF DATA MISCOMPARE
          AODL   P1
          SBDL   T6
          NJN    VCTD20      IF DATA MISCOMPARE
          AODL   P1
          SBDL   T7
          NJN    VCTD20      IF DATA MISCOMPARE
          AODL   P2          INDEX TO WORD TO READ
          SODL   P3
          NJN    VCTD10      IF MORE WORDS TO VERIFY
          LJM    VCTDX
 VCTD20   BSS
          LDK    E111        CM-DRIVE DATA INTEGRITY
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDN    4
          STML   /SS/P.CT,CSST INDICATE DATA INTEGRITY ERROR
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- VPTD
*
** PURPOSE-- VERIFY PATH TEST DATA
          SPACE  2
 VPTDX    LJM    **
 VPTD     EQU    *-1
          LDN    0
          STDL   T1          INDEX TO BUFFER
 VPTD4    BSS
          LDML   IB,T1       WORD FROM INPUT BUFFER
          LMML   OB,T1       WORD FROM OUTPUT BUFFER
          NJN    VPTD10      IF ERROR
          AODL   T1
          SBN    50
          ZJN    VPTDX       IF VERIFY OK
          UJN    VPTD4       MORE WORDS TO CHECK
 VPTD10   BSS
          LDK    E110        PP-CM3 DATA INTEGRITY
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- VTMD
*
** PURPOSE-- VERIFY TEST MODE DATA.  DATA GENERATED FROM A
*            TEST MODE READ IS CHECKSUMMED AND COMPARED
*            AGAINST THE CORRECT VALUE.
          SPACE  2
 VTMDX    LJM    **
 VTMD     EQU    *-1
          LDN    25
          STDL   P1          CM WORDS TO TRANSFER
          LOADC  CM.CB
          CRML   RPB+32,P1   READ TEST MODE PATTERN
          LDN    0
          STDL   P2
          STDL   P3
          LDC    100         PP WORDS TO CHECKSUM
          STDL   P1
 VTMD10   BSS
          LDML   RPB+31,P1
          RADL   P2
          SHN    -16
          RADL   P3
          SODL   P1
          NJN    VTMD10      IF MORE WORDS TO CHECKSUM
          LDDL   P2
          LMML   EC1,CH
          NJN    VTMD20      IF ERROR
          LDDL   P3
          LMML   EC2,CH
          ZJK    VTMDX       IF NO ERROR
 VTMD20   BSS
          LDN    E18         DMA TEST MODE FAILURE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- WA6F
*
** PURPOSE-- WRITE ATTRIBUTE PARAMETER 6F
*
** ENTRY  CP+SLAD MUST BE SET
*
** EXIT   TO CALLING PROGRAM IF NO ERROR
          SPACE  2
 WA6FX    LJM    **
 WA6F     EQU    *-1
          LDN    0#2E
          STML   CP          COMMAND PACKET LENGTH
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTE COMMAND
 WA6F10   BSS
          LDML   RPB+5,T1    MOVE COMMAND PACKET
          STML   CP+4,T1
          AODL   T1
          LMN    20
          NJN    WA6F10
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJN    WA6FX       IF NO ERROR
          LDN    E00         CP MUST DETERMINE THE ERROR COD
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          TITLE  IPI CHANNEL SUBROUTINES
** NAME-- BCS
*
** PURPOSE-- PERFORM BUS CONTROL SEQUENCE
*
** INPUT
*         A = BUS A BITS 7,6 IN BITS 1,0 OF ACCUMULATOR
*             BIT 7 = 1 IF DATA ELSE RESPONSE OR COMMAND
*             BIT 6 = 1 IF INFORMATION IN
          SPACE  2
 BCSX     LJM    **
 BCS      EQU    *-1
          SHN    14
          ADC    H005B
          RJM    FUNC        SET SYNC OUT
          ACN    DC
          LDN    77B
 BCS4     FJM    BCS8,DC     IF SYNC IN
          SBN    1
          NJN    BCS4        IF TIMEOUT NOT EXPIRED
          LDN    E22         NO SYNC IN
          UJN    BCS20
 BCS8     IAN    DC
          STDL   STATUS      SAVE BUS ACKNOWLEDGE STATUS
          SFM    BCS25,DC    IF ERROR FLAG SET
          LPC    0#FF
          NJN    BCS16       IF BUS ACKNOWLEDGE IS WRONG
          LDDL   LF          LAST FUNCTION
          LMN    0#32
          RJM    FUNC        DROP SYNC OUT
          ACN    DC
          LDN    77B
 BCS12    FJM    BCSX,DC     IF SYNC IN DROPPED
          SBN    1
          NJN    BCS12       IF TIMEOUT NOT EXPIRED
          LDN    E23         SYNC IN DID NOT DROP
          UJN    BCS20
 BCS16    BSS
          LDN    E37         BUS ACKNOWLEDGE WRONG
 BCS20    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 BCS25    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,15
** NAME-- CPT
*
** PURPOSE-- COMMAND PACKET TRANSFER
*
** INPUT
*         CP - STARTING ADDRESS OF COMMAND PACKET
          SPACE  2
 CPT30    BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDDL   WC
          ZJN    CPTX        IF ALL WORDS TRANSFERRED
          LDN    E29         INCOMPLETE TRANSFER
          UJN    CPT10
 CPTX     LJM    **
 CPT      EQU    *-1
          RJM    SEL         SELECT THE CONTROLLER
          LDN    CMDOUT      BUS A FOR COMMAND
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0381       STREAM, WRITE
          RJM    FUNC        RAISE MASTER OUT
          ACN    DC
          LDML   CP
          ADN    3
          SHN    -1          CONVERT BYTE COUNT TO WORD COUNT
          OAM    CP,DC       SEND COMMAND PACKET
          STDL   WC          WORDS NOT TRANSFERRED
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX SET CURRENT CLOCK
          LDC    MS50
 CPT4     IJM    CPT30,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    CPT4        IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
 CPT10    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,15
** NAME-- DCM
*
** PURPOSE-- DESELECT THE CONTROL MODULE
          SPACE  2
 DCM10    CFM    DCMX,DC     IF ERROR FLAG NOT SET

*         ON A 25 MB CHANNEL A DESELECT SEQUENCE COULD CAUSE
*         A SEQUENCE ERROR.  THIS CODE CHANGE TO CLEAR ERROR
*         STATUS WAS DONE INSTEAD OF A HARDWARE FIX.

          LDC    H0100
          RJM    FUNC        CLEAR THE DMA ERROR
 DCMX     LJM    **
 DCM      EQU    *-1
          LDC    H0071
          RJM    FUNC        DROP SELECT OUT
          ACN    DC
          LDN    77B
 DCM4     FJM    DCM10,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    DCM4        IF TIMEOUT NOT EXPIRED
          LDN    E28         SLAVE IN DID NOT DROP
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- DCN
*
** PURPOSE-- DISCONNECT THE CHANNEL
          SPACE  2
 DCNX     BSS
          DCN    DC+40B      DISCONNECT THE CHANNEL
          LJM    **
 DCN      EQU    *-1
          STDL   WC          WORDS NOT TRANSFERRED
          SFM    DCN10,DC    IF ERROR FLAG SET
          ZJN    DCN20       IF ALL WORDS TRANSFERRED
          LDN    E07
          UJN    DCN40
 DCN10    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
 DCN20    BSS
          EJM    DCNX,DC     IF CHANNEL EMPTY
          LDN    E08         CHANNEL NOT EMPTY
 DCN40    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- DCT
*
** PURPOSE-- DETERMINE CHANNEL TYPE
*
** EXIT   CH = 0 IF 10 MB CHANNEL
*              1 IF 25 MB CHANNEL
          SPACE  2
 DCTX     BSS
          STDL   CH
          LJM    **
 DCT      EQU    *-1
          LDC    H0102
          RJM    FUNC        READ IPI REVISION REGISTER
          ACN    DC
          LDN    0
          EJM    DCTX,DC     IF 10 MB/S IPI CHANNEL
          LDN    1
          UJN    DCTX
          SPACE  5,15
** NAME-- DTM
*
** PURPOSE-- DETERMINE TRANSFER MODE
*
** OUTPUT
*         STATUS - TRANSFER SETTINGS, BIT 4 = 1 IF DATA STREAMING
*         CTM - USED TO CHANGE TRANSFER MODE WHEN SELECTING
          SPACE  2
 DTM30    CFM    DTMX,DC     IF ERROR FLAG NOT SET

*         ON A 25 MB CHANNEL A REQUEST TRANSFER SETTINGS SEQUENCE
*         COULD CAUSE A SEQUENCE ERROR.  THIS CODE CHANGE TO
*         CLEAR ERROR STATUS WAS DONE INSTEAD OF A HARDWARE FIX.

          LDC    H0100
          RJM    FUNC        CLEAR THE DMA ERROR
 DTMX     LJM    **
 DTM      EQU    *-1
          RJM    PS          PORT SELECT
          LDDL   CMOD        CONTROL MODULE NUMBER
          LPN    7
          SHN    12
          ADC    H8025
          RJM    FUNC        REQUEST TRANSFER SETTINGS
          ACN    DC
          LDN    77B
 DTM4     FJM    DTM8,DC     IF SLAVE IN
          SBN    1
          NJN    DTM4        IF TIMEOUT NOT EXPIRED
          LDN    E27         NO SLAVE IN
          UJN    DTM16
 DTM8     IAN    DC
          STDL   STATUS      SAVE TRANSFER SETTING
          SFM    DTM20,DC    IF ERROR FLAG SET
          LPN    0#10
          LMN    0#10
          SHN    7
          STDL   CTM         CHANGE TRANSFER MODE BIT
          LDDL   LF          LAST FUNCTION ISSUED
          LMC    0#54        CODE 7, DROP MASTER OUT
          RJM    FUNC        DROP MASTER OUT
          ACN    DC
          LDN    77B
 DTM12    FJM    DTM30,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    DTM12       IF TIMEOUT NOT EXPIRED
          LDN    E28         SLAVE IN DID NOT DROP
 DTM16    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 DTM20    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EI
*
** PURPOSE-- ENABLE INTERRUPT FROM CM3.  SINCE IT TAKES UP TO
*            20 MICROSECONDS FOR THE CM3 TO PUT ITS INTERRUPT
*            ON THE BUS, THE ENABLE IS DONE HERE AND THE READ
*            IS DONE IN GETUD
          SPACE  2
 EIX      LJM    **
 EI       EQU    *-1
          LDDL   UNUML
          ZJN    EIX         IF NO UNITS
          LDC    H0062       SELECT PORT A
          RJM    FAN
          LDC    H0715
          RJM    FAN         REQUEST CLASS 1, 2, OR 3 INTERRUPT
          UJN    EIX
          SPACE  5,20
** NAME-- FAN
*
** PURPOSE-- SEND A FUNCTION TO THE IPI CHANNEL, BUT DONT
*            PUT THE FUNCTION IN THE FUNCTION HISTORY TABLE
          SPACE  2
 FANX     LJM    **
 FAN      EQU    *-1
          DCN    DC+40B      ENSURE THE CHANNEL IS INACTIVE
                              THE CHANNEL MAY HAVE BEEN LEFT ACTIVE
                              BY A MASTER CLEAR, A ROUTINE SUCH AS DCM
                              OR AFTER A REPORTED ERROR.
          FAN    DC          SEND THE FUNCTION
          UJN    FANX
          SPACE  5,20
** NAME-- FUNC
*
** PURPOSE-- ISSUE FUNCTION TO IPI CHANNEL
*
** INPUT-- A REGISTER = FUNCTION CODE.
          SPACE  2
 FUNX     LJM    **
 FUNC     EQU    *-1
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
                              THE CHANNEL MAY HAVE BEEN LEFT ACTIVE
                              BY A MASTER CLEAR, A ROUTINE SUCH AS DCM
                              OR AFTER A REPORTED ERROR.
          FAN    DC          ISSUE THE FUNCTION
          STDL   LF          SAVE FUNCTION CODE
 .F       IFEQ   FHT,1       FUNCTION HISTORY TABLE
          STML   FBUF,FI     SAVE HISTORY OF FUNCTIONS ISSUED
          AODL   FI          INCREMENT FUNCTION BUFFER INDEX
          ADC    -FBUFL
          NJN    FUN4        IF NOT END OF BUFFER
          STDL   FI          INITIALIZE INDEX
 FUN4     BSS
 .F       ENDIF
          IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE
          LDN    E01         FUNCTION TIMEOUT
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- GES
*
** PURPOSE-- GET ENDING STATUS
*
** ENTRY
*         A = 0000  DO ENDING STATUS WITHOUT MASTER TERMINATE
*             000A  DO ENDING STATUS WITH MASTER TERMINATE
*
** OUTPUT
*         RETURNS TO CALLING PROGRAM IF STATUS IS READ WITHOUT ERROR
*         AND SUCCESSFUL IS SET IN STATUS
          SPACE  2
 GESX     LJM    **
 GES      EQU    *-1
          SHN    8
          ADC    H8039       INDICATE SUCCESSFUL IN BUS A
          RJM    FUNC        DROP MASTER OUT
          ACN    DC
          LDC    1024
 GES4     FJM    GES8,DC     IF SLAVE IN SET
          SBN    1
          NJN    GES4        IF TIMEOUT NOT EXPIRED
          LDN    E27         SLAVE IN NOT SET
          UJK    GES30
 GES8     IAN    DC
          STDL   STATUS      SAVE ENDING STATUS
          SFM    GES40,DC    IF ERROR FLAG SET
          SHN    17-7
          MJN    GESX        IF SUCCESSFUL
          LDDL   STATUS
          SHN    11
          PJN    GES15       IF NOT BUS PARITY
          LDK    E34
          UJK    GES30
 GES15    BSS
          LDDL   STATUS
          LPN    17B
          ZJK    GES25       IF REPORTING -ENDING STATUS WRONG-
          SBN    1
          NJN    GES18       IF NOT BUS CONTROL REJECTED
          LDDL   TBC
          ZJK    GES25       IF REPORTING -ENDING STATUS WRONG-
          LDN    0
          STDL   TBC         INDICATE NOT EXPECTING 01 STATUS
          RJM    DCM         DESELECT CONTROL MODULE
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GES16       IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GES16    BSS
          SBN    42          COMMAND TIMEOUT OF APPROXIAMTELY 42 SECONDS
          PJN    GES24       IF TIMEOUT
          LJM    MAIN15      TRANSFER NOTIFICATION OCCURRED BEFORE
                              THE COMPLETION RESPONSE, WAIT FOR
                              THE COMPLETION RESPONSE
 GES18    BSS
          SBN    8
          NJN    GES20       IF NOT -SYNC OUTS NOT EQUAL SYNC INS-
          LDK    E36
          UJN    GES30
 GES20    BSS
          PJN    GES23       IF NOT COMMAND REJECT
          ADN    6
          NJN    GES21       IF NOT CLASS 3 RESPONSE PRESENT
          RJM    RPT         READ RESPONSE PACKET
*         LDN    E00         RESPONSE MUST BE EVALUATED TO DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 GES21    BSS
          LDK    E35
          UJN    GES30
 GES23    BSS
          SBN    2
          NJN    GES25       IF NOT INTERNAL CONTROLLER ERROR
          LDK    E70
          UJN    GES30
 GES24    BSS
          LDN    E38         NO CONTROLLER RESPONSE
          UJN    GES30
 GES25    BSS
          LDN    E39         ENDING STATUS WRONG
 GES30    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 GES40    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- IR
*
** PURPOSE-- ISSUE INTERFACE RESET TO CM3
*
** ENTRY
*         A = 8215  FOR LOGICAL INTERFACE RESET
*             8415  FOR SLAVE RESET
*         CMOD = CONTROL MODULE NUMBER
          SPACE  2
 IRX      LJM    **
 IR       EQU    *-1
          STDL   P2
          RJM    MCC         MASTER CLEAR CHANNEL
          RJM    PS          PORT SELECT
          LDDL   CMOD        CONTROL MODULE NUMBER
          LPN    7
          SHN    12
          ADDL   P2
          RJM    FUNC        SET MASTER OUT
          PAUSE  20
          LDDL   LF          LAST FUNCTION ISSUED
          LMN    2
          RJM    FUNC        SET SYNC OUT
          PAUSE  10
          LDDL   LF
          LMN    2
          RJM    FUNC        DROP SYNC OUT
          LDDL   LF
          LMN    4
          RJM    FUNC        DROP MASTER OUT
          UJK    IRX
          SPACE  5,20
** NAME-- MCC
*
** PURPOSE-- MASTER CLEAR CHANNEL
          SPACE  2
 MCCX     LJM    **
 MCC      EQU    *-1
          LDN    H0000       MASTER CLEAR CHANNEL
          RJM    FUNC
          PAUSE  100         ALLOW CONTROLLER TIME TO DROP LINES
          SFM    MCC10,DC    CLEAR ERROR FLAG (MASTER CLEAR DOES NOT CLEAR ERROR
 MCC10    BSS                 FLAG ON THE 25 MB CHANNEL
          LDN    H0000       MASTER CLEAR CHANNEL
          RJM    FUNC         IN CASE SEQUENCE ERROR OCCURRED
          RJM    DCT         DETERMINE CHANNEL TYPE
          LDC    H7E42
          RJM    FUNC        SET IPI CHANNEL TRANSFER RATE
          UJN    MCCX
          SPACE  5,20
** NAME-- MR
*
** PURPOSE-- MASTER RESET ALL SLAVES ON THE CHANNEL
          SPACE  2
 MRX      LJM    **
 MR       EQU    *-1
          RJM    MCC         MASTER CLEAR CHANNEL
          LDN    1
          STDL   T2
 MR10     BSS
          LDC    H9213
          RJM    FUNC        BUS A, SET SYNC OUT
          PAUSE  10          MUST DELAY 10 MICROSECONDS MINIMUM
          LDC    H9211
          RJM    FUNC        DROP SYNC OUT
          SODL   T2
          MJN    MRX         IF BOTH PORTS RESET
          LDC    H0862       SELECT PORT B
          RJM    FUNC
          UJN    MR10
          SPACE  5,20
** NAME-- PS
*
** PURPOSE-- PORT SELECT.  SELECT PORT A OR B OF IPI CHANNEL
          SPACE  2
 PSX      LJM    **
 PS       EQU    *-1
          LDML   UNITS,UX
          SHN    11
          PJN    PS5         IF PORT A
          LDC    H0862       PORT B SELECT
          UJN    PS10
 PS5      BSS
          LDC    H0062       PORT A SELECT
 PS10     BSS
          RJM    FUNC
          UJN    PSX
          SPACE  5,20
** NAME--RI
*
** PURPOSE-- REQUEST INTERRUPTS FROM THE CM3
*
** OUTPUT
*         STATUS - CONTAINS BIT SIGNIFICANT ADDRESS OF CM3 WITH INTERRUPT
          SPACE  2
 RIX      LJM    **
 RI       EQU    *-1
 .U       IFEQ   UNIX,1
          RJM    PPRQ        CHECK FOR IDLE REQUEST
 .U       ENDIF
          LDC    H0715       REQUEST CLASS 1, 2, OR 3 INTERRUPT
          RJM    FUNC        BUS A, MASTER OUT
          PAUSE  20          DELAY
          ACN    DC
          EJM    RI5,DC      IF ERROR
          IAN    DC
          STDL   STATUS      SAVE BIT SIGNIFICANT ADDRESS
          LDC    H0711
          RJM    FUNC        DROP MASTER OUT
          CFM    RIX,DC      IF ERROR FLAG NOT SET
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
 RI5      BSS
          LDN    E02         CHANNEL EMPTY WHEN ACTIVATED
          RJM    PCER        PREPARE COMMAND ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RPT
*
** PURPOSE-- RESPONSE PACKET TRANSFER
*
** OUTPUT
*         RPB - STARTING LOCATION OF RESPONSE PACKET
*         (A) = 0
          SPACE  2
 RPT20    BSS
          STDL   WC          SAVE WORDS NOT TRANSFERRED
 RPT30    BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          LDDL   WC
          ZJN    RPTX        IF ALL WORDS TRANSFERRED
          LDN    E29         INCOMPLETE TRANSFER
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 RPTX     LJM    **
 RPT      EQU    *-1
          LDN    RSPIN       BUS A FOR RESPONSE
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0281       STREAM, READ
          RJM    FUNC        SET MASTER OUT
          ACN    DC
          LDN    5
          IAM    RPB,DC      INPUT REQUIRED WORDS
 RPT2     BSS
          NJN    RPT20       IF NOT ALL WORDS RECEIVED
          STDL   TBC         DO NOT EXPECT 01 ENDING STATUS
          LDML   RPB         BYTE COUNT MINUS 2
          ADN    3
          SHN    -1
          SBN    5
          ZJN    RPT4        IF ALL WORDS TRANSFERRED
          ADC    6-RPBL
          PJN    RPT2A       IF RESPONSE TOO LONG
          ADC    RPBL-6      INPUT EXACT LENGTH
          UJN    RPT3
 RPT2A    BSS
          LDC    RPBL-6
 RPT3     BSS
          IAM    RPB+5,DC    INPUT REMAINING WORDS
          NJN    RPT2        IF NOT ALL WORDS TRANSFERRED
 RPT4     BSS
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
 RPT8     BSS
          IJM    RPT30,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    RPT8        IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- SEL
*
** PURPOSE-- SELECT THE CONTROL MODULE AND VERIFY THE BIT SIGNIFICANT
*            RESPONSE
*
** INPUT
*         CMOD - CONTROL MODULE NUMBER
*         CTM - CHANGE TRANSFER MODE IF BIT 3 SET
*
** OUTPUT-- A = 0 IF NO ERROR
          SPACE  2
 SELX     LJM    **
 SEL      EQU    *-1
          RJM    PS          PORT SELECT
          LDDL   CMOD
          LPN    7
          SHN    12
          ADDL   CTM         CHANGE TRANSFR MODE MODIFIER
          ADN    H0029
          RJM    FUNC        SET SELECT OUT
          ACN    DC
          LDN    77B
 SEL4     FJM    SEL8,DC     IF SLAVE IN
          SBN    1
          NJN    SEL4        IF TIMEOUT NOT EXPIRED
          LDN    E20         CANT SELECT CM3
          UJN    SEL15
 SEL8     IAN    DC
          STDL   STATUS      SAVE BIT SIGNIFICANT RESPONSE
          LPC    377B
          LMML   SELT,CMOD
          ZJK    SELX        IF BIT SIGNIFICANT RESPONSE CORRECT
          LDN    E21         BIT SIGNIFICANT RESPONSE WRONG
 SEL15    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 SELT     BSS
          DATA   1,2,4,8     CONTROL MODULES ON PORT A
          DATA   16,32,64,128
          DATA   1,2,4,8     CONTROL MODULES ON PORT B
          DATA   16,32,64,128
          SPACE  5,20
** NAME-- SIS
*
** PURPOSE-- SAVE INTERRUPT STATUS
          SPACE  2
 SISX     LJM    **
 SIS      EQU    *-1
          PAUSE  1           ALLOW CM3 TIME TO PUT ITS ADDRESS
                              ON THE BUS
          AJM    SIS10,DC    IF NO FUNCTION REPLY
          ACN    DC+40B
          EJM    SIS10,DC    IF CHANNEL NOT FULL
          IAN    DC
 SIS10    BSS
          STDL   STATUS
          LDC    H0711
          RJM    FAN         DROP MASTER OUT
          LDC    H0862
          RJM    FAN         PORT B SELECT
          LDC    H0715
          RJM    FAN         REQUEST CLASS 1, 2, OR 3 INTERRTUP
          PAUSE  17          ALLOW CM3 TIME TO PUT ITS ADDRESS ON THE
                              BUS IF IT HAS AN INTERRUPT
          AJM    SIS20,DC    IF NO FUNCTION REPLY
          ACN    DC+40B
          EJM    SIS20,DC    IF CHANNEL NOT FULL
          IAN    DC
 SIS20    BSS
          STDL   STATUS+1
          LDC    H0711       DROP MASTER OUT
          RJM    FAN
          UJK    SISX
          SPACE  5,20
** NAME-- TMT
*
** PURPOSE-- TEST MODE TRANSFER
*
** ENTRY
*         A = 0C00 FOR DMA READ
*             0D00 FOR DMA WRITE
          SPACE  2
 TMTX     LJM    **
 TMT      EQU    *-1
          RJM    FUNC
          LDC    200
          STDL   T8          T8 CONTROLS THE TIMEOUT
          STML   CM.CB.T     BYTE COUNT
          ACN    DC
          LDN    3
          OAM    CM.CB.T,DC  BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
 TMT10    BSS
          LDC    H0700       READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          EJM    TMT20,DC    IF ERROR
          IAN    DC
          STDL   OS          SAVE OPERATIONAL STATUS
          SFM    TMT40,DC    IF ERROR FLAG SET
          LPN    1
          ZJN    TMTX        IF TRANSFER COMPLETE
          SODL   T8
          NJN    TMT10       IF TIMEOUT NOT EXPIRED
          LDC    H0A00       READ T REGISTER
          RJM    RDRG        READ REGISTER
          SHN    -1
          STDL   WC          SAVE WORD COUNT
          LDC    H0800       DMA TERMINATE
          RJM    FAN
          LDC    H00E1       READ STATUS REGISTER
          RJM    RDRG        READ REGISTER
          STDL   STATUS      SAVE CONTENTS OF STATUS REGISTER
          LDN    E29         INCOMPLETE TRANSFER
          UJN    TMT30
 TMT20    BSS
          LDN    E02         CHANNEL EMPTY WHEN ACTIVATED
 TMT30    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 TMT40    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- WR
*
** PURPOSE-- WRITE REGISTER
*
** ENTRY--  A = VALUE FOR REGISTER
*          T2 = WRITE REGISTER FUNCTION
          SPACE  2
 WRX      LJM    **
 WR       EQU    *-1
          STDL   T1
          LDDL   T2          WRITE REGISTER FUNCTION
          RJM    FUNC
          ACN    DC
          LDN    1           OUTPUT ONE WORD
          OAM    T1,DC
          RJM    DCN         DISCONNECT THE CHANNEL
          UJN    WRX
          SPACE  5,20
** NAME-- WFTC
*
** PURPOSE-- WAIT FOR TRANSFER COMPLETE
*
** EXIT-- TO CALLING ROUTINE WITH
*          A = 1 IF TRANSFER COMPLETE
*          A = 0 IF ERROR AND RESPONSE PACKET MUST BE READ FOR STATUS
          SPACE  2
 WFTC100  BSS
          STDL   BURPOS      BURST POSITION = 0
          SODL   BBS         BURSTS BEFORE SUSPENDING
          LDML   /SS/MT,CSST
          SHN    2
          MJN    WFTC110     IF USING MASTER TERMINATE
          LDN    0           NO MASTER TERMINATE
          UJN    WFTC120
 WFTC110  BSS
          SHN    -2
          LPN    77B
 WFTC120  BSS
          RJM    GES         GET ENDING STATUS
          LDN    1
 WFTCX    LJM    **
 WFTC     EQU    *-1
          LDC    6400
          STDL   T8          T8 CONTROLS THE TIMEOUT
          LDML   /SS/MT,CSST
          SHN    2
          PJK    WFTC11      IF NOT USING MASTER TERMINATE
          LDDL   T2
          NJK    WFTC11      IF NOT LAST SECTOR OF REQUEST
          LOADF  /SS/P.REQ,CSST
          ADN    3
          CRDL   T4          READ STREAM BIT IN REQUEST
          LDDL   T4
          SHN    2
          MJN    WFTC7       IF CONCATENATED REQEST
          AODL   T2          INDICATE NO REQUEST SWITCH
          LDC    0#800A
          STML   /SS/MT,CSST INDICATE THIS IS THE LAST SECTOR
          UJN    WFTC11
 WFTC7    BSS
          LDN    2
          STDL   T1          WORDS TO READ
          LDDL   CSST
          ADK    RQ
          STML   WFTC9       ADDRESS TO SAVE RMA AND PVA
          LDDL   CMADR+2
          LMC    400000B
          CRML   *,T1        REREAD RMA AND PVA
 WFTC9    EQU    *-1
 WFTC11   BSS
          LDC    H0700
          RJM    FUNC        READ OPERATIONAL STATUS
          ACN    DC
          EJM    WFTC40,DC   IF ERROR
          IAN    DC
          STDL   OS          SAVE OPERATIONAL STATUS
          LPN    1
          ZJK    WFTC100     IF TRANSFER COMPLETE
          SODL   T8
          NJN    WFTC11      IF TIMEOUT NOT EXPIRED
          LDC    H0A00       READ T REGISTER
          RJM    RDRG        READ REGISTER
          SHN    -1
          STDL   WC          SAVE WORD COUNT
          LDC    H0800       DMA TERMINATE FUNCTION
          RJM    FAN         SEND THE FUNCTION
          LDC    H00E1       READ STATUS REGISTER FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   STATUS
          SHN    6
          PJN    WFTC30      IF SLAVE IN DROPPED
          LDN    E30         SLAVE IN DID NOT DROP
          UJN    WFTC45
 WFTC30   BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          LDDL   STATUS
          LPN    60B
          LMN    20B
          ZJN    WFTC60      IF NO MORE DATA
          LDN    E29         INCOMPLETE TRANSFER
          UJN    WFTC45
 WFTC40   BSS
          LDN    E02         CHANNEL EMPTY WHEN ACTIVATED
 WFTC45   BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 WFTC60   BSS
*
*         AFTER THE CM3 HAS PAUSED A TRANSFER, IT MAY SEND TRANSFER
*         NOTIFICATION, THEN DROP SLAVE IN IMMEDIATELY AND RETURN 90
*         HEX AS ENDING STATUS.  THIS INDICATES COMMAND COMPLETE.
*         THE RESPONSE PACKET SHOULD REPORT AN ERROR.  WITH THE 10 MB
*         CHANNEL SLAVE IN DROPS BEFORE THE PP TRANSFERS A WORD, SO
*         THE ERROR FLAG DOES NOT SET.  WITH THE 25 MB CHANNEL, THE
*         ERROR FLAG MAY SET BECAUSE THE TIME BETWEEN RAISING MASTER
*         OUT AND BEING ABLE TO SEND DATA IS MUCH FASTER.
*
          LCN    0
          STML   /SS/P.LISTL,CSST TO GUARANTEE AN ERROR IS REPORTED
          AOML   WFTCC       ERROR COUNTER
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDN    0
          LJM    WFTCX
 WFTCC    CON    0           ERROR COUNTER
          SPACE  5,20
** NAME-- WFTE
*
** PURPOSE-- WAIT FOR T PRIME REGISTER EMPTY
*
** EXIT - TO CALLING ROUTINE IF T PRIME REGISTER GOES EMPTY,
*         ELSE REPORT AN ERROR
          SPACE  2
 WFTEX    LJM    **
 WFTE     EQU    *-1
          LDC    6666
          STDL   T8          T8 CONTROLS THE TIMEOUT
 WFTE10   BSS
          LDC    H0700
          RJM    FUNC        READ OPERATIONAL STATUS
          ACN    DC
          EJM    WFTE40,DC   IF ERROR
          IAN    DC
          STDL   OS          SAVE OPERATIONAL STATUS
          LPN    2
          NJN    WFTEX       IF T PRIME REGISTER EMPTY
          SODL   T8
          NJN    WFTE10      IF TIMEOUT NOT EXPIRED
          AOML   WFTEC       ERROR COUNTER
          LDC    H0A00       READ T REGISTER
          RJM    RDRG        READ REGISTER
          SHN    -1
          STDL   WC          SAVE WORD COUNT
          LDC    H0800       DMA TERMINATE FUNCTION
          RJM    FAN         SEND THE FUNCTION
          LDC    H00E1       READ STATUS REGISTER FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   STATUS
          SHN    6
          PJN    WFTE30      IF SLAVE IN DROPPED
          LDN    E30         SLAVE IN DID NOT DROP
          UJN    WFTE45
 WFTE30   BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          LDN    E29         INCOMPLETE TRANSFER
          UJN    WFTE45
 WFTE40   BSS
          LDN    E02         CHANNEL EMPTY WHEN ACTIVATED
 WFTE45   BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 WFTEC    CON    0           ERROR COUNTER
          SPACE  5,20
** NAME-- WOG
*
** PURPOSE-- WRITE OPERAND GENERATOR.  THIS DETERMINES THE NUMBER OF
*            WORDS TO TRANSFER.  FOR READS TO CM IT DETERMINES THE DATA
*            PATTERN AND FOR WRITES IT SETS THE STARTING VALUE FOR ITS
*            CRC CHECK OF THE DATA.
          SPACE  2
 WOGX     LJM    **
 WOG      EQU    *-1
          LDML   WOR,CH
          RJM    FUNC
 WOG10    EQU    *-1         FOR FORCING ERRORS
          LDML   TMWC,CH     TEST MODE WORD COUNT
          STML   WOGP+1
          ACN    DC
          LDN    2
          OAM    WOGP,DC     SEND THE PARAMETERS
          RJM    DCN         DISCONNECT THE CHANNEL
          LDML   ETMF,CH
          STDL   T2          WRITE REGISTER FUNCTION
          LDML   ETMP,CH     ENABLE TEST MODE
          RJM    WR          WRITE REGISTER
          UJN    WOGX
 WOGP     BSS
          DATA   0#1357      STARTING PATTERN
          DATA   0           STREAM 100 PP WORDS (MODIFIED)
          SPACE  2,6
 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE
          TITLE  INITIALIZATION
** NAME-- INIT
*
** PURPOSE-- INITIALIZE THE DRIVER
          SPACE  2
 INITX    LJM    **
 INIT     EQU    *-1
          LDK    EOM-CP      LENGTH OF BUFFERS
          STDL   T1
 INIT4    BSS
          LDN    0
          STML   CP-1,T1     ZERO OUT BUFFERS
          SODL   T1
          NJN    INIT4
          STDL   UX          INITIALIZE DIRECT CELLS
          STDL   LUX
          STML   FIP
          STDL   MALET
          STDL   P4
          STDL   P5
          STDL   P6
          STDL   PTF         PATH TEST
          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   PPNO
          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
          REFAD  IPIT+/PIT/P.CBUF,CM.CB  REFORMAT ADDRESS OF COMMUNICATION
                                         BUFFER AND SAVE IN CM.CB
          LDN    /CB/C.BUF
          RAML   CM.CB+2     DISPLACEMENT TO READ/WRITE BUFFER
          LDK    /CB/P.BUF*2 ADD BYTE DISPLACEMENT FOR READ/WRITE BUFFER
          ADML   IPIT+/PIT/P.CBUF+1
          STML   CM.CB.T+2
          SHN    -16
          ADML   IPIT+/PIT/P.CBUF
          STML   CM.CB.T+1 PP COMM. BUFFER IN T REGISTER FORMAT
          LDML   IPIT+/PIT/P.CBUFL  GET LENGTH OF COMMUNICATION BUFFER
          ADC    -P.CB*2
          PJN    INIT8       IF COMMUNICATION BUFFER LONG ENOUGH
          LDC    E20B
          RJM    INTERR      REPORT ERROR (NO RETURN)

* INITIALIZE UNITS AND SS TABLES

 INIT8    BSS
          LDML   IPIT+/PIT/P.UNITC NUMBER OF UNIT DESCRIPTIORS
          SHN    1
          STDL   T8          LENGTH OF UNIT DESCRIPTOR (CM WORDS)
          ZJK    INIT30      IF NO UNIT DESCRIPTORS
 INIT10   BSS
          LDN    C.UD        READ 2 CM WORDS
          STDL   WC
          LOADC  CM.PIT
          ADN    C.PIT
          ADDL   P6          INDEX TO UNIT DESCRIPTORS
          CRML   IBUF,WC     READ UNIT DESCRIPTOR
          LDML   IBUF+/UD/P.UQT  RMA = 0 IF NULL ENTRY
          ADML   IBUF+/UD/P.UQT+1
          ZJK    INIT25      IF NULL ENTRY

          LDN    C.UIT
          STDL   WC
          LOADF  IBUF+/UD/P.UQT  REFORMAT RMA OF UNIT INTERFACE TABLE
                                 AND SAVE IN UNITS TABLE
          STML   UNITS+/UN/P.UIT+2,UX
          CRML   UBUF,WC     READ UNIT INTERFACE TABLE
          LDDL   CMADR
          STML   UNITS+/UN/P.UIT,UX
          STML   SS+/SS/P.DP,P4 INITIALIZE DELINK POINTER
          LDDL   CMADR+1
          STML   UNITS+/UN/P.UIT+1,UX
          STML   SS+/SS/P.DP+1,P4
          LDDL   CMADR+2
          ADN    4
          STML   SS+/SS/P.DP+2,P4
          LDML   UBUF+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJK    INIT25      IF UNIT DISABLED
          LDML   UBUF+/UIT/P.UTYPE  CHECK DEVICE TYPE
          ADC    -410B       CHECK FOR 9853
          ZJN    INIT12      IF 9853
          LDC    E306        INVALID UNIT TYPE
          RJM    INTERR      REPORT ERROR (NO RETURN)
 INIT12   BSS
          LDML   IBUF+/UD/P.CHAN  GET CHANNEL FROM UNIT DESCRIPTOR
          STDL   T2
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    77B
          STDL   CHAN        CHANNEL NUMBER

          LDML   IBUF+/UD/P.UNIT
          LPN    7
          STML   SS+/SS/P.UNIT,P4
          STML   UNITS,UX
          LDDL   T2          CONTROLLER NUMBER
          LPN    7
          STDL   T1
          SHN    8
          RAML   SS+/SS/P.UNIT,P4  PUT UNIT IN SS TABLE
          LDDL   T1
          SHN    /UN/N.UNIT
          RAML   UNITS,UX    PUT UNIT IN UNITS TABLE
          LDDL   T2          PORT NUMBER
          LPC    100B
          RAML   UNITS,UX    PUT PORT IN UNITS TABLE
          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN SS TABLE
          STML   SS+/SS/P.LU,P4
          LDC    RS-SS-P.SS-P.SS
          SBDL   P4
          MJN    INIT15      IF NO ROOM FOR A RESIDENT TABLE
          LDC    SS
          ADDL   P4
          STML   UNITS+1,UX  POINTER FROM UNITS TABLE TO SS TABLE
          LDC    P.SS
          RADL   P4          INCREMENT TO NEXT RESIDENT SS TABLE
          UJN    INIT20
 INIT15   LDML   UBUF+/UIT/P.UBUFL  NUMBER OF 8-BIT BYTES IN COMMUNICATION BUFFER
          SHN    -3          NUMBER OF CM WORDS
          SBN    C.SS        MUST BE LARGER THAN SS ENTRY
          PJN    INIT18      IF BUFFER LARGE ENOUGH
          LDC    E308
          RJM    INTERR      REPORT ERROR (NO RETURN)
 INIT18   BSS
          LDN    C.SS
          STDL   WC
          LOADF  UBUF+/UIT/P.UBUF  LOAD ADDRESS OF COMMUNICATION BUFFER
          CWML   SSNR,WC       WRITE SS ENTRY TO COMMUNICATION BUFFER

* BUMP TO NEXT ENTRY.

 INIT20   BSS
          AODL   P5          NUMBER OF CONFIGURED UNITS
          LDN    P.UN
          RADL   UX          BUMP CONFIGURED UNIT INDEX
 INIT25   BSS
          LDN    C.UD
          RADL   P6          BUMP TO NEXT UNIT DESCRIPTOR ENTRY
          SBDL   T8          CHECK FOR END OF UNIT DESCRIPTORS
          ZJN    INIT30      IF NO MORE UNIT DESCRIPTORS
          LDDL   P5
          ADC    -UNUM
          NJK    INIT10      IF 64 OR LESS UNITS
          LDC    E208        TOO MANY CONFIGURED UNITS
          RJM    INTERR      REPORT ERROR (NO RETURN)
 INIT30   LDDL   UX
          STDL   UNUML       END OF ACTIVE UNIT TABLE
          STDL   SSUN        INVALIDATE TABLE AT SSNR
          RJM    CHGCH       SET CHANNEL INSTRUCTIONS
          LJM    INITX
          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
 CP       BSS    24          COMMAND PACKET FOR CM3
 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
 .F       IFEQ   FHT,1       FUNCTION HISTORY TABLE
 FBUF     BSS    16          FUNCTION HISTORY BUFFER
 FBUFL    EQU    *-FBUF      LENGTH OF FUNCTION BUFFER
 .F       ENDIF
          SPACE  2
 UNUM     EQU    64          SUPPORT 64 UNITS
 UNITS    BSS    UNUM*P.UN   RMA OF UNIT INTERFACE TABLE
 SS       BSS    P.SS        INFORMATION SAVED IN UNIT COMMUNICATION BUFFER
 NSS      EQU    RS-SS
 NSST     EQU    NSS/P.SS    NUMBER OF SS TABLES
 RSST     EQU    NSST-1
 RSSTL    EQU    RSST*P.SS
 SSNR     EQU    SS+RSSTL    CHANGEABLE SS TABLE
          ERRMI  NSST-1      IF NO ROOM FOR SS TABLES
*
*         THE LAST CARD IN THE DECK MUST BE /EOR SO THAT COMS CAN
*         ASSEMBLE MULTIPLE DECKS.
*
          END
/EOR
