          IDENT  E9P5831
          CIPPU
          MEMSEL 8
          TITLE  E9P5831 NOS/VE 5830 DISK DRIVER FOR I4
*
*         WORD 6 OF THE FOLLOWING COMMENT MUST BE THE REVISION NUMBER FOR CTI
*
          COMMENT *SMD* LVL=02
          COMMENT  COPYRIGHT FIDES INFORMATION SERVICES. 2005
 PRGNAM   MICRO  1,4,'F830'  1ST 4 CHARACTERS OF OVERLAY NAME
*
*         THIS IS THE PP DRIVER FOR THE 10 AND 25 MB/S CHANNELS THAT SUPPORT
*         THE 5830 DISK SUBSYSTEM WITH AN I4 IOU.  THE DRIVER SUPPORTS THE
*         FOLLOWING LOGICAL UNITS, 5832_1, 5832_2, 5833_1, 5833_1P, 5833_2,
*         5833_3P, 5833_4, 5838_1, 5838_1P, 5838_2, 5838_3P, 5838_4, 47444_1,
*         47444_1P, 47444_2, 47444_3P, AND 47444_4, 5837_1, 5837_1P, 5837_2,
*         5837_3P, 5837_4.
*         THE PROGRAM NAME IS E9P5831 AND THE DECK NAME IS IOM$E9P5831. 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.
*
          LIST   -$
*COPYC IODMAC1
*COPYC IODMAC2
*COPYC IODMAC3
*COPYC IODMAC4
*COPYC IODMAC5
          LIST   B,L,N,R
          EJECT
*
*         EQUATES FOR IPI ADAPTER
*
 H0000    EQU    0#0000      MASTER CLEAR ADAPTER
 H0009    EQU    0#0009      SET SELECT OUT
 H0029    EQU    0#0029      SELECT OUT, FULL WHEN SLAVE IN IS 1
 H005B    EQU    0#005B      SET SYNC OUT
 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
 H200     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
 H0900    EQU    0#0900      DMA NEW BURST TRANSFER
 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
 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
*
 FE       EQU    0           = 1, TO ENABLE FORCE ERROR CODE
 DC       EQU    22B         DISK CHANNEL
 DRNUM    EQU    0#FE        INITIALIZE VALUE FOR OFF-LINE DRIVE NUMBER (OFFLD)
 C.CHCNT  EQU    500         NUMBER OF REQUESTS TO PROCESS IF BUSY BEFORE
                              GIVING UP THE CHANNEL
 MS50     EQU    53475       50 MILLISECOND TIMEOUT FOR CERTAIN LOOPS
 RRL      EQU    3           REQUEST RETRY LIMIT
 SRT      EQU    720         SLAVE RESET TIMEOUT (SECONDS)
 FPT      EQU    600         FORMAT PACK TIMEOUT (SECONDS)
 CMT      EQU    62          COMMAND TIMEOUT (SECONDS)
 RLIE     EQU    26*8        RESPONSE LENGTH IF ERROR
 RPL      EQU    0#10        READ, WRITE COMMAND PACKET LENGTH
 H0041    EQU    0#0041      READ BUS B AND STATUS
 H0200    EQU    0#0200      REPORT ATTRIBUTES OPERATION CODE
 H0202    EQU    0#0202      RESTORE ATTRIBUTES OPERATION CODE
 H0209    EQU    0#0209      LOAD ATTRIBUTES OPERATION CODE
 H020A    EQU    0#020A      SAVE ATTRIBUTES OPERATION CODE
 H0700    EQU    0#0700      SET OPERATING MODE
 H1005    EQU    0#1005      READ OPERATION CODE
 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
 H8101    EQU    0#8101      PERFORM DRIVE HEAD SHIFT TEST OP CODE
 H8400    EQU    0#8400      READ PERFORMANCE LOG OP CODE
 H0931    EQU    0#0931      COMMAND EXTENT PARAMETER
 ID12     EQU    0#12        DEFECT MANAGEMENT
 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
 ID22     EQU    0#22        DEFECT MANAGEMENT
 ID23     EQU    0#23        DRIVE MESSAGE EXCEPTION
 ID24     EQU    0#24        INTERVENTION REQUIRED STATUS
 ID25     EQU    0#25        DRIVE ALTERNATE PORT EXCEPTION
 ID26     EQU    0#26        MACHINE EXCEPTION FOR DRIVE
 ID29     EQU    0#29        DRIVE CONDITIONAL SUCCESS
 ID32     EQU    0#32        FAILING ADDRESS
 ID6D     EQU    0#6D        HAS TRANSFER LENGTH

*         COMMAND/RESPONSE PACKET EQUATES

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

*         MAJOR STATUS EQUATES

 CC       EQU    1           COMMAND COMPLETE RESPONSE
 AR       EQU    4           ASYNCHRONOUS RESPONSE
 TN       EQU    5           TRANSFER NOTIFICATION
 CCS      EQU    0#18        COMMAND COMPLETE, SUCCESSFUL

*         LEFT SHIFTS FOR MAJOR STATUS

 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/CONTROLLER/DRIVE ERROR CODES

 E00      EQU    0           CP MUST DETERMINE ERROR CODE
 E01      EQU    1           FUNCTION TIMEOUT
 E02      EQU    2           CHANNEL EMPTY WHEN ACTIVATED
 E03      EQU    3           PERIOD COUNTER PARITY
 E04      EQU    4           PP-IPI PARITY ERROR
 E06      EQU    6           IOU ERROR
 E07      EQU    7           INCOMPLETE I4 TRANSFER
 E08      EQU    8           CHANNEL NOT EMPTY
 E09      EQU    9           CENTRAL MEMORY ERROR
 E10      EQU    10          INVALID CM RESPONSE CODE
 E11      EQU    11          CM RESPONSE CODE PARITY ERROR
 E12      EQU    12          CMI READ DATA PARITY ERROR
 E13      EQU    13          Y DATA ERROR
 E14      EQU    14          BAS PARITY ERROR
 E15      EQU    15          Z ERROR
 E16      EQU    16          Y ERROR
 E17      EQU    17          X ERROR
 E18      EQU    18          DMA TEST MODE FAILURE
 E19      EQU    19          DMA COUNT OVERFLOW
 E20      EQU    20          CANT SELECT CONTROLLER
 E21      EQU    21          BIT SIGNIFICANT RESPONSE ERROR
 E22      EQU    22          NO SYNC IN
 E23      EQU    23          SYNC IN DID NOT DROP
 E24      EQU    24          IPI SEQUENCE ERROR
 E25      EQU    25          IPI CHANNEL PARITY ERROR
 E27      EQU    27          SLAVE IN NOT SET
 E28      EQU    28          SLAVE IN DID NOT DROP
 E29      EQU    29          INCOMPLETE TRANSFER
 E30      EQU    30          CHANNEL STAYED ACTIVE
 E31      EQU    31          BUFFER COUNTER PARITY
 E32      EQU    32          SYNC COUNTER PARITY
 E33      EQU    33          LOST DATA
 E34      EQU    34          BUS PARITY
 E35      EQU    35          COMMAND REJECT
 E36      EQU    36          SYNC OUT NOT EQUAL SYNC INS
 E37      EQU    37          BUS B ACKNOWLEDGE INCORRECT
 E38      EQU    38          NO CONTROLLER RESPONSE
 E39      EQU    39          ENDING STATUS WRONG
 E50      EQU    50          EXECUTING CONTROLLER DIAGNOSTICS
 E51      EQU    51          CONTROLLER DIAGNOSTICS PASSED
 E52      EQU    52          CONTROLLER DIAGNOSTICS PASSES, LAST ERROR CODE RETURNED
 E54      EQU    54          DRIVE ALTERNATE PORT EVENT
 E55      EQU    55          RESTORING DRIVE
 E56      EQU    56          DRIVE RESTORATION COMPLETE
 E57      EQU    57          FORMATTING DRIVE
 E58      EQU    58          FORMAT COMPLETE
 E59      EQU    59          PARITY PROTECTION DISABLED
 E61      EQU    61          DRIVE FAILURE
 E62      EQU    62          MEDIA FAILURE
 E70      EQU    70          LRC ERROR ON READ
 E71      EQU    71          CONTROLLER INTERVENTION REQUIRED
 E72      EQU    72          CONTROLLER MACHINE EXCEPTION
 E73      EQU    73          COMMAND EXCEPTION
 E74      EQU    74          MICROCODE EXECUTION ERROR
 E75      EQU    75          CONTROLLER ALTERNATE PORT EVENT (MAPPED TO 53 BY CP CODE)
 E76      EQU    76          UNEXPECTED RESPONSE
 E78      EQU    78          CONTROLLER OVER TEMPERATURE
 E96      EQU    96          DRIVE HEAD SHIFT ERROR
 E110     EQU    110         PP-CONTROLLER DATA INTEGRITY
 E111     EQU    111         CM-DRIVE DATA INTERGRITY
 E120     EQU    120         SOFTWARE FAILURE
 E130     EQU    130         DEFECT MANAGEMENT TASK FAILED
 E140     EQU    140         XXXX CONFIGURED - YYYY FOUND
 E141     EQU    141         DRIVE INITIALIZATION REQUIRED
 E142     EQU    142         CONTROLLER DOES NOT SUPPORT PARALLEL
          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
 ACIP     BOOLEAN            ALTERNATE COMMAND IN PROGRESS
 NCR      BOOLEAN            NO CONTROLLER RESPONSE
 RIP      BOOLEAN            RESTORE IN PROGRESS
 SSTP     BOOLEAN            SS TABLE POINTER, EQUAL 1 IF INDEX INTO UNIT
                              COMMUNICATIONS BUFFER IS 100(16) BYTES
 PDCE     BOOLEAN            PARITY DRIVE CORRECTION ENABLED
 PORT     BOOLEAN            PORT TO IPI CHANNEL, 0 = PORT A, 1= PORT B
 CM       SUBRANGE 0,7       CONTROLLER NUMBER
 UNIT     SUBRANGE 0,37B     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
 UN       RECEND
          SPACE  5,20
*         SS TABLE DEFINITIONS. INFORMATION SAVED FOR EACH UNIT.

 SS       RECORD PACKED

*         IF THE SS TABLE IS NOT PP RESIDENT, IT IS SAVED IN THE UNIT COMMUNICATIONS
*         BUFFER.  THE BIT LABELED SSTP IN THE UNITS TABLE DETERMINES THE INDEX INTO
*         THE BUFFER THAT THE SS TABLED IS STORED.

 LOCK     BOOLEAN            ONLY USED WHEN INITIALLY WRITING THE SS TABLE TO CM
 LPN      SUBRANGE 0,77777B  LOGICAL PP NUMBER

 DOAR     BOOLEAN            DRIVE OPERATIONAL ASYNCH RECEIVED
 FILL1    SUBRANGE 0,37B     UNUSED
 DT       SUBRANGE 0,77B     DRIVE TYPE   INCREMENTED TO 6 BITS
 CRN      SUBRANGE 0,17B     USED TO MAKE COMMAND REFERENCE NUMBER UNIQUE

 CMOD     SUBRANGE 0,377B    CONTROLLER NUMBER
 UNIT     SUBRANGE 0,377B    UNIT NUMBER

 LU       PPWORD             LOGICAL UNIT
 FNC      PPWORD             FUNCTION CODE  READ = 0
                                            WRITE = 1
 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 HAVE NOT
                             BEEN READ FROM CM.)
 TOTAL    STRUCT 2           TOTAL SECTORS LEFT TO TRANSFER
                              8XXX IF USING MASTER TERMINATE
 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
 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 2           TOTAL CM BYTES TO TRANSFER FOR 2ND COMMAND
 SC       PPWORD             SET NONZERO IF POSSIBLE STATE CHANGE FOR DRIVE
 CRTS     PPWORD             CURRENT TRACK, SECTOR BEING RESTORED
 RQTRY    PPWORD             REQUEST RETRY COUNT
 RESET    PPWORD             RESET ISSUED IF NONZERO
 CT       PPWORD             NONZERO WHEN CONFIDENCE TEST IS COMPLETE
                              1 IF NO ERROR
                              2 IF ERROR
                              4 IF DATA INTEGRITY ERROR
                             40 IF OPERATIONAL ASYNCH RECEIVED FOR PARITY DRIVE
 RECOV    PPWORD             NONZERO IF IN RECOVERY
 DP       STRUCT 6           DELINK POINTER (REFORMATTED RMA)
 MREV     STRUCT 4           CONTROLLER MICROCODE 8-DIGIT PART NUMBER

 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

 CTME     EQU    /SS/P.PVA2  START OF 3 WORD TABLE WITH EACH WORD
                              CONTAINING THE HEAD AND SECTOR NUMBER OF
                              OF A MEDIA ERROR
 CRC      EQU    /SS/P.RMA2  CURRENT CYLINDER BEING RESTORED
 RTM      EQU    /SS/P.RMA2+1  REQUESTS TO MULTIPLEX PER CYLINDER DURING RESTORE
 ODN      EQU    /SS/P.TW2   OFF LINED DRIVE NUMBER
          SPACE  5,20
*         PP INTERFACE TABLE

 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
 ACTCH    BOOLEAN            ACTIVE CHECK, THE PP CLEARS THIS BIT WITHIN 1 MINUTE
 IDLREQ   BOOLEAN            IDLE REQUEST
 RESREQ   BOOLEAN            RESUME REQUEST
 PPIDLE   BOOLEAN            PP IDLE
          SUBRANGE 0,3777B   UNUSED
 LOCK     BOOLEAN            PP TABLE LOCK
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
          STRUCT 24          UNUSED
          ALIGN  16,64
 RSPVA    STRUCT 14          RESPONSE BUFFER (PVA)
          ALIGN  32,64
 RSBUF    RMA                RESPONSE BUFFER (RMA)
          ALIGN  48,64
 IN       PPWORD             IN POINTER
          ALIGN  48,64
 OUT      PPWORD             OUT POINTER
          ALIGN  48,64
 LIMIT    PPWORD             LIMIT POINTER

 PIT      RECEND
          SPACE  5,20
*         UNIT DESCRIPTORS.

 UD       RECORD PACKED

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

 UD       RECEND
          SPACE  5,20
*         UNIT INTERFACE TABLE

 UIT      RECORD PACKED

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

          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               = 400B, 844-4X   = 413B, 5833_1   = 426B, 47444_1P
                               = 401B, 885-1X   = 414B, 5833_1P  = 427B, 47444_2
                               = 402B, 885-42   = 415B, 5833_2   = 430B, 47444_3P
                               = 403B, 834      = 416B, 5833_3P  = 431B, 47444_4
                               = 404B, 836      = 417B, 5833_4   = 432B, 5837_1
                               = 405B, 895      = 420B, 5838_1   = 433B, 5837_1P
                               = 406B, 887      = 421B, 5838_1P  = 434B, 5837_2
                               = 407B, 9836     = 422B, 5838_2   = 435B, 5837_3P
                               = 410B, 9853     = 423B, 5838_3P  = 436B, 5837_4
                               = 411B, 5832_1   = 424B, 5838_4
                               = 412B, 5832_2   = 425B, 47444_1
 QCNT     PPWORD             QUEUE COUNT
 SHARE    BOOLEAN            NONZERO IF THIS UNIT IS BEING SHARED WITH MALET OR DFT
          ALIGN  16,64
 UBUFL    PPWORD             UNIT COMMUNICATION BUFFER LENGTH
 UBUF     RMA                UNIT COMMUNICATION BUFFER (RMA)
 ULOCK    BOOLEAN            UNIT IS RESERVED FOR EXCLUSIVE USE
          ALIGN  48,64
 ULOCKP   PPWORD             UNIT LOCK OWNER
 QLOCK    BOOLEAN            UNIT QUEUE LOCK
          ALIGN  48,64
 QLOCKP   PPWORD             UNIT QUEUE LOCK OWNER
          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)

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

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

 UIT      RECEND
          SPACE  5,20
*         PP REQUESTS.

 RQ       RECORD PACKED

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

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

 RQ       RECEND
          SPACE  5,20
*         COMMAND PART OF REQUEST

 CM       RECORD PACKED

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

 RS       RECORD PACKED

*         WORD 1.

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

*         WORD 2.
          ALIGN  32,64
 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.PPD    EQU    4           PARITY PROTECTION DISABLED
 K.UDN    EQU    3           UNIT DOWN
 K.CMDN   EQU    2           CONTROLLER DOWN
 K.CHDN   EQU    1           CHANNEL DOWN
 ERRID    PPWORD             ERROR IDENTIFIER

*         WORD 9

 MREVU    PPWORD             CONTROLLER MICROCODE PART NUMBER (UPPER)
 STREG    PPWORD             IPI CHIP STATUS REGISTER
 ERREG    PPWORD             IPI CHIP ERROR REGISTER
 MREVL    PPWORD             CONTROLLER MICROCODE PART NUMBER (LOWER)

*         WORD 10

 DMAER    PPWORD             DMA ERROR REGISTER
 OSR      PPWORD             OPERATIONAL STATUS REGISTER
 CR       PPWORD             CONTROL REGISTER
 ADT      PPWORD             ACTUAL DRIVE TYPE IF ERROR CODE IS 140

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

 RS       RECEND


 CM       RECEND
          SPACE  5,20
*         COMMAND CODES.

 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.ABN    EQU    3           ABNORMAL REQUEST TERMINATION
          SPACE  5,20
*         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)
 ODP      STRUCT 8           OVERLAY DIRECTORY
          STRUCT 56
 BUF      STRUCT 11192       DATA BUFFER FOR CONFIDENCE TEST
                              BYTES = SECTOR (8192) + 8 TIMES
                              (SECTORS (25) X TRACKS (15))
 CB       RECEND

*         THE RESPONSE BUFFER MUST BE 32 X 3 + 5 WORDS LONG TO HOLD
*         THE DATA FROM REPORTING ATTRIBUTE 68.

 RPBL     EQU    104         MAXIMUM LENGTH OF RESPONSE BUFFER
 CPL      EQU    48          MAXIMUM COMMAND PACKET LENGTH
 OVST     EQU    15430B      OVERLAY STARTING ADDRESS
 EOM      EQU    20000B
 CP       EQU    OVST-CPL    COMMAND PACKET FOR CONTROLLER
 RPB      EQU    CP-RPBL     RESPONSE PACKET BUFFER
 RS       EQU    RPB-P.RS    DISK RESPONSE

 IPIT     EQU    EOM-200B    PP INTERFACE TABLE
 UBUF     EQU    IPIT+P.PIT  UNIT INTERFACE TABLE
 IBUF     EQU    UBUF+P.UIT  UNIT DESCRIPTOR BUFFER
 NRQ      EQU    IPIT        NEXT REQUEST
 RQT      EQU    NRQ+8
          ERRMI  EOM-IPIT-P.SS  IF TABLE OVERFLOWS MEMORY
          ERRMI  EOM-IBUF-P.UD  IF TABLE OVERFLOWS MEMORY
 OB       EQU    EOM-128     OUTPUT BUFFER FOR PP/CONTROLLER PATH TEST
 IB       EQU    OB+64       INPUT BUFFER FOR PP/CONTROLLER PATH TEST
 IBL      EQU    50          LENGTH OF INPUT BUFFER
          ERRMI  EOM-IB-IBL  IF INPUT BUFFER OVERFLOWS 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    INIT-1

*         DIRECT CELLS

 DH       BSSZ   3           REFORMATTED RMA OF OVERLAY DIRECTORY
 CM.PIT   BSSZ   3           CM ADDRESS OF PP INTERFACE TABLE
                              THE BYTE ADDRESS IS
                               RIGHTMOST 10 BITS OF WORD 0 CONCATENATED WITH
                               RIGHTMOST 12 BITS OF WORD 1 CONCATENATED WITH
                               RIGHTMOST 6 BITS OF WORD 2 CONCATENATED WITH
                               3 BITS OF ZEROS
 T1       BSSZ   1
 T2       BSSZ   1
 T3       BSSZ   1
 T4       BSSZ   1
 T5       BSSZ   1
 T6       BSSZ   1
 T7       BSSZ   1
 T8       BSSZ   1
 T9       BSSZ   1
 SBS      EQU    T9          SECTORS TO TRANSFER BEFORE SUSPENDING

 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
 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 CONTROLLER
 WC       BSSZ   1           WORD COUNT
 SECPOS   BSSZ   1           SECTOR 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   1           TOTAL SECTORS TO TRANSFER
 SSUN     CON    7777B       UX VALUE OF CURRENT SS TABLE
 UNUML    BSSZ   1           LENGTH OF CONFIGURED UNIT ENTRIES
 TBC      BSSZ   1           NONZERO IF TRANSFER RESPONSE RECEIVED
                              BEFORE COMPLETION RESPONSE
 MALET    BSSZ   1           NONZERO IF MAINTENANCE SOFTWARE WANTS
                              THE CHANNEL
 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
 DT       BSSZ   1           DRIVE TYPE
 PD       BSSZ   1           PHYSICAL DRIVE
 MFID     BSSZ   1           MASK FOR TRANSFER MODE  0 = STREAM ALL
                                                     1 = INTERLOCK DATA
                                                   200 = INTERLOCK COMMANDS AND RESPONSES
                                                   201 = INTERLOCK ALL
 .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
          ELSE
*         THE FOLLOWING TWO DEFINITONS WERE INTRODUCED TO SPEED UP EI PROCESSING WHEN
*         NOT BOTH PORTS ARE ACTIVE.
*         NOTE: THIS WILL CAQUSE ERRORS WHEN THE DRIVER IS ASSEMBLED WITH THE FORCE ERROR OPTION

 PORTA    BSSZ   1           NR UNITS CONFIGURED ON PORT-A
 PORTB    BSSZ   1           NR UNITS CONFIGURED ON PORT-B
 .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)
 LPN      CON    1           LOGICAL PP NUMBER
 PTF      BSSZ   1           IF 0 EXECUTE PATH TEST
 IF       BSSZ   1           INITIALIZE FLAG, IF NOT 0 EITHER THE CONFIDENCE
                              TEST SHOULD BE RUN OR A UNIT SHOULD BE FORMATTED
          BSS    100B-*
          LJM    INIT
          DATA   10          I4/5830 DRIVER (FOR ANAD PROC)
 HANG     CON    0           AN EASY WAY TO SEE CERTAIN HANGS
          UJN    *
 FPD      DATA   0           FAILING PHYSICAL DRIVE
 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
 TMF      BSSZ   1           TEST MODE FLAG, NONZERO IF TEST MODE IN PROGRESS
 CLF      DATA   1           CHANNEL LOCK FLAG, 0 IF LOCK IS SET
 CTPAT    DATA   0           CONFIDENCE TEST PATTERN FIRST WORD
 IDLE     DATA   0           NUMBER OF TIMES DRIVER WAS IDLED
 T10      DATA   0
 T11      DATA   0
 T12      DATA   0

*         THIS TABLE CONTAINS LOCATIONS THAT ALLOW THE CODE TO BACK UP AND
*         RETRY A READ TO THE SAME SECTOR AFTER AN UNANTICIPATED PAUSE.

 BAT      BSSZ   6
          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 BUFFER WITHIN PP COMMUNICATION BUFFER
 CM.RS    BSSZ   3           ADDRESS OF RESPONSE BUFFER
 CM.INT   BSSZ   3           ADDRESS OF INTERRUPT WORD
 CM.CHAN  BSSZ   3           ADDRESS OF CHANNEL INTERLOCK TABLE

*         LOCATION DT IS THE INDEX TO THIS DRIVE TABLE

*         CONFIDENCE TEST CYLINDER

 CTC      DATA   843         5832_1
          DATA   834         5832_2
          DATA   1628        5833_1
          DATA   1628        5833_1P
          DATA   1628        5833_2
          DATA   1628        5833_3P
          DATA   1628        5833_4
          DATA   2619        5838_1
          DATA   2619        5838_1P
          DATA   2619        5838_2
          DATA   2619        5838_3P
          DATA   2619        5838_4
          DATA   2289        47444_1
          DATA   2289        47444_1P
          DATA   2289        47444_2
          DATA   2289        47444_3P
          DATA   2289        47444_4
          DATA   2094        5837_1
          DATA   2094        5837_1P
          DATA   2094        5837_2
          DATA   2094        5837_3P
          DATA   2094        5837_4
 DTS      EQU    *-CTC       DRIVE TYPES SUPPORTED

*         TRACKS PER CYLINDER

 TPC      DATA   4           5832_1
          DATA   4           5832_2
          DATA   7           5833_1
          DATA   7           5833_1P
          DATA   7           5833_2
          DATA   7           5833_3P
          DATA   7           5833_4
          DATA   9           5838_1
          DATA   9           5838_1P
          DATA   9           5838_2
          DATA   9           5838_3P
          DATA   9           5838_4
          DATA   15          47444_1
          DATA   15          47444_1P
          DATA   15          47444_2
          DATA   15          47444_3P
          DATA   15          47444_4
          DATA   17          5837_1
          DATA   17          5837_1P
          DATA   17          5837_2
          DATA   17          5837_3P
          DATA   17          5837_4

*         SECTORS PER TRACK

 SPT      DATA   12          5832_1
          DATA   24          5832_2
          DATA   22          5833_1
          DATA   22          5833_1P
          DATA   42          5833_2
          DATA   33          5833_3P
          DATA   42          5833_4
          DATA   18          5838_1
          DATA   18          5838_1P
          DATA   35          5838_2
          DATA   27          5838_3P
          DATA   35          5838_4
          DATA   13          47444_1
          DATA   13          47444_1P
          DATA   25          47444_2
          DATA   19          47444_3P
          DATA   25          47444_4
          DATA   7           5837_1
          DATA   7           5837_1P
          DATA   15          5837_2
          DATA   11          5837_3P
          DATA   15          5837_4

*         SECTORS PER CYLINDER

 SPC      CON    12*4        5832_1
          CON    24*4        5832_2
          CON    22*7-2      5833_1
          CON    22*7-2      5833_1P
          CON    42*7-2      5833_2
          CON    33*7-2      5833_3P
          CON    42*7-2      5833_4
          CON    18*9-4      5838_1
          CON    18*9-4      5838_1P
          CON    35*9-4      5838_2
          CON    27*9-4      5838_3P
          CON    35*9-4      5838_4
          CON    13*15-7     47444_1
          CON    13*15-7     47444_1P
          CON    25*15-7     47444_2
          CON    19*15-7     47444_3P
          CON    25*15-7     47444_4
          CON    7*17-3      5837_1
          CON    7*17-3      5837_1P
          CON    15*17-3     5837_2
          CON    11*17-3     5837_3P
          CON    15*17-3     5837_4

*         BYTES PER SECTOR

 BPS      CON    4096        5832_1
          CON    4096        5832_2
          CON    4096        5833_1
          CON    4096        5833_1P
          CON    4096        5833_2
          CON    8192        5833_3P
          CON    8192        5833_4
          CON    4096        5838_1
          CON    4096        5838_1P
          CON    4096        5838_2
          CON    8192        5838_3P
          CON    8192        5838_4
          CON    4096        47444_1
          CON    4096        47444_1P
          CON    4096        47444_2
          CON    8192        47444_3P
          CON    8192        47444_4
          CON    4096        5837_1
          CON    4096        5837_1P
          CON    4096        5837_2
          CON    8192        5837_3P
          CON    8192        5837_4

*         DATA DRIVES PER LOGICAL UNIT

 DD       DATA   1           5832_1
          DATA   2           5833_2
          DATA   1           5833_1
          DATA   1           5833_1P
          DATA   2           5833_2
          DATA   3           5833_3P
          DATA   4           5833_4
          DATA   1           5838_1
          DATA   1           5838_1P
          DATA   2           5838_2
          DATA   3           5838_3P
          DATA   4           5838_4
          DATA   1           47444_1
          DATA   1           47444_1P
          DATA   2           47444_2
          DATA   3           47444_3P
          DATA   4           47444_4
          DATA   1           5837_1
          DATA   1           5837_1P
          DATA   2           5837_2
          DATA   3           5837_3P
          DATA   4           5837_4

*         SPARE SECTORS PER CYLINDER

 SSPC     DATA   0           5832_1
          DATA   0           5832_2
          DATA   2           5833_1
          DATA   2           5833_1P
          DATA   2           5833_2
          DATA   2           5833_3P
          DATA   2           5833_4
          DATA   4           5838_1
          DATA   4           5838_1P
          DATA   4           5838_2
          DATA   4           5838_3P
          DATA   4           5838_4
          DATA   7           47444_1
          DATA   7           47444_1P
          DATA   7           47444_2
          DATA   7           47444_3P
          DATA   7           47444_4
          DATA   3           5837_1
          DATA   3           5837_1P
          DATA   3           5837_2
          DATA   3           5837_3P
          DATA   3           5837_4

*         INTERRUPT SIZE FOR 10 MB CHANNEL.  THESE VALUES ARE INITIALIZED
*         BY ROUTINE IIS.

 ISL      DATA   0           5832_1
          DATA   0           5832_2
          DATA   8192        5833_1
          DATA   8192        5833_1P
          DATA   8192        5833_2
          DATA   24576       5833_3P
          DATA   24576       5833_4
          DATA   8192        5838_1
          DATA   8192        5838_1P
          DATA   8192        5838_2
          DATA   24576       5838_3P
          DATA   24576       5838_4
          DATA   12288       47444_1
          DATA   12288       47444_1P
          DATA   12288       47444_2
          DATA   16384       47444_3P
          DATA   16384       47444_4
          DATA   8192        5837_1
          DATA   8192        5837_1P
          DATA   8192        5837_2
          DATA   24576       5837_3P
          DATA   24576       5837_4

*         INTERRUPT SIZE FOR 25 MB CHANNEL.  THESE VALUES ARE INITIALIZED
*         BY ROUTINE IIS.

 ISH      DATA   0           5832_1
          DATA   0           5832_2
          DATA   8192        5833_1
          DATA   8192        5833_1P
          DATA   8192        5833_2
          DATA   24576       5833_3P
          DATA   24576       5833_4
          DATA   8192        5838_1
          DATA   8192        5838_1P
          DATA   8192        5838_2
          DATA   24576       5838_3P
          DATA   24576       5838_4
          DATA   12288       47444_1
          DATA   12288       47444_1P
          DATA   12288       47444_2
          DATA   24576       47444_3P
          DATA   24576       47444_4
          DATA   8192        5837_1
          DATA   8192        5837_1P
          DATA   8192        5837_2
          DATA   24576       5837_3P
          DATA   24576       5837_4

*         SUSPEND INTERVAL FOR 10 MB CHANNEL (IN SECTORS)

 SIL      DATA   1000        5832_1
          DATA   1000        5832_2
          DATA   2           5833_1
          DATA   2           5833_1P
          DATA   1000        5833_2
          DATA   1000        5833_3P
          DATA   1000        5833_4
          DATA   2           5838_1
          DATA   2           5838_1P
          DATA   1000        5838_2
          DATA   1000        5838_3P
          DATA   1000        5838_4
          DATA   2           47444_1
          DATA   2           47444_1P
          DATA   1000        47444_2
          DATA   1000        47444_3P
          DATA   1000        47444_4
          DATA   2           5837_1
          DATA   2           5837_1P
          DATA   1000        5837_2
          DATA   1000        5837_3P
          DATA   1000        5837_4

*         SUSPEND INTERVAL FOR 25 MB CHANNEL (IN SECTORS)

 SIH      DATA   6           5832_1
          DATA   1000        5832_2
          DATA   6           5833_1
          DATA   6           5833_1P
          DATA   6           5833_2
          DATA   3           5833_3P
          DATA   1000        5833_4
          DATA   6           5838_1
          DATA   6           5838_1P
          DATA   6           5838_2
          DATA   3           5838_3P
          DATA   1000        5838_4
          DATA   6           47444_1
          DATA   6           47444_1P
          DATA   6           47444_2
          DATA   3           47444_3P
          DATA   1000        47444_4
          DATA   6           5837_1
          DATA   6           5837_1P
          DATA   6           5837_2
          DATA   3           5837_3P
          DATA   1000        5837_4

*         MODEL NUMBER.  THIS IS TWO BYTES FROM THE MODEL NUMBER
*         FIELD THAT IS UNIQUE FOR EACH DRIVE TYPE.

 MN       DATA   0#3137      5832_1
          DATA   0#3136      5832_2
          DATA   0#4C32      5833_1
          DATA   0#4C32      5833_1P
          DATA   0#4C32      5833_2
          DATA   0#4C32      5833_3P
          DATA   0#4C32      5833_4
          DATA   0#4C31      5838_1
          DATA   0#4C31      5838_1P
          DATA   0#4C31      5838_2
          DATA   0#4C31      5838_3P
          DATA   0#4C31      5838_4
          DATA   0#3153      47444_1
          DATA   0#3153      47444_1P
          DATA   0#3153      47444_2
          DATA   0#3153      47444_3P
          DATA   0#3153      47444_4
          DATA   0#4E31      5837_1
          DATA   0#4E31      5837_1P
          DATA   0#4E31      5837_2
          DATA   0#4E31      5837_3P
          DATA   0#4E31      5837_4
          SPACE  5,20
*         LOCATION CH IS THE INDEX INTO THIS CHANNEL TYPE TABLE

 TR       DATA   0#7E42      10 MB CHANNEL TRANSFER RATE
          DATA   0#FF42      25 MB CHANNEL TRANSFER RATE

 PAS      DATA   0#62        10 MB CHANNEL PORT A SELECT
          DATA   0#362       25 MB CHANNEL PORT A SELECT

 PBS      DATA   0#862       10 MB CHANNEL PORT B SELECT
          DATA   0#B62       25 MB CHANNEL PORT B SELECT

 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

 EDC      DATA   0           10 MB CHANNEL, USE SINGLE CMI SLOT
          DATA   0#4000      25 MB CHANNEL, USE DOUBLE CMI SLOT

 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

 CTS      DATA   0#F02       10 MB CHANNEL, CHANNEL TRANSFER SPEED
          DATA   0           25 MB CHANNEL, CHANNEL TRANSFER SPEED
          SPACE  5,20
*         FNC IS THE INDEX INTO THESE TABLES.  THE TABLES WERE CREATED
*         SO THAT WRITE AND READ COULD BE A COMMON ROUTINE.

 BAV      DATA   3           BUS CONTROL FOR DATA IN
          DATA   2           BUS CONTROL FOR DATA OUT

 TF1      DATA   0#281       TRANSFER FUNCTION TO STREAM, READ
          DATA   0#381       TRANSFER FUNCTION TO STREAM, WRITE

 TF2      DATA   0#0C00      LOAD T REGISTER FOR DMA READ
          DATA   0#0D00      LOAD T REGISTER FOR DMA WRITE

 TF3      DATA   0#A287      READ LAST SECTOR ON 25 MB CHANNEL (MASTER TERMINATE)
          DATA   0#A387      WRITE LAST SECTOR ON 25 MB CHANNEL (MASTER TERMINATE)

 TF4      DATA   0#2287      READ SECTOR ON 25 MB CHANNEL (NO MASTER TERMINATE)
          DATA   0#2387      WRITE SECTOR ON 25 MB CHANNEL (NO MASTER TERMINATE)

 .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, WHEN THE PP IS RESUMED
*         MAIN10 - TO RUN DIAGNOSTICS DURING ERROR RECOVERY
*         MAIN15 - AFTER SEEK, WRITE, OR READ COMMAND STARTED
*         MAIN20 - WHEN A WRITE, READ,OR RESTORE COMMMAND COMPLETES
          SPACE  2
 MAIN     BSS
          LOADOVL ITO        LOAD INITIALIZE TABLE OVERLAY
          RJM    IT          INITIALIZE TABLES
 MAIN10   BSS
          LOADOVL PTO        LOAD PATH TEST OVERLAY
          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    GETU        SELECT UNIT REQUESTS, SEEK,
                             AND PROCESS INTERRUPTS
          LDDL   CMNDS
          NJN    MAIN15      IF OUTSTANDING COMMANDS
 MAIN20   BSS
          SOML   CHLCNT
          NJN    MAIN15      IF PP DOESN'T HAVE TO GIVE UP CHANNEL
          RJM    CKC         CHECK IF CHANNEL MUST BE GIVEN UP
          UJN    MAIN15
          SPACE  5,10
 UCMD     BSS                COMMANDS FROM CENTRAL MEMORY
          CON    C.READ
          CON    C.WRITE
          CON    C.FORMAT
 UCMDL    EQU    *-UCMD
          TITLE  COMMANDS
** NAME-- LST
*
** PURPOSE-- LOW SPEED TRANSFER (10 MB CHANNEL).  A TRANSFER NOTIFICATION
*            RESPONSE HAS BEEN RECEIVED.  IF FNC IS 0 THIS IS A READ
*            OPERATION AND DATA WILL BE TRANSFERRED FROM THE CONTROLLER
*            BUFFER TO CM.  IF FNC IS NOT ZERO THIS IS A WRITE OPERATION
*            AND DATA WILL BE TRANSFERRED FROM CM TO THE CONTROLLER BUFFER.
*
** ENTRY  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.
*         FNC = 0  IF READ, 1 IF WRITE
          SPACE  2
 LST      CON    0
 LST20    BSS
          LDML   CMLIST+/CM/P.LEN,CSST  NUMBER OF BYTES LEFT TO TRANSFER
          STDL   BC          CM BYTES LEFT TO TRANSFER
          SBML   BPS,DT      BYTES PER SECTOR
          ADDL   SECPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    LST30       IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          LDML   BPS,DT      COMPUTE NUMBER OF CM BYTES TO TRANSFER THIS LOOP
          SBDL   SECPOS
          STDL   BC          NUMBER OF CM BYTES TO TRANSFER
 LST30    BSS
          LDDL   SECPOS
          NJN    LST60       IF BUS CONTROL ALREADY DONE
          LDML   BAV,FNC     BUS A VALUE
          RJM    BCS         BUS CONTROL SEQUENCE
 LST40    EQU    *-1         FOR FORCING ERRORS
          LDML   TF1,FNC     TRANSFER FUNCTION TO STREAM DATA
          RJM    FUNC        RAISE MASTER OUT
 LST50    EQU    *-1         FOR FORCING ERRORS
          UJN    LST70
 LST60    BSS
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
          ZJK    LST110      IF TIMEOUT
 LST70    BSS
          LDML   TF2,FNC     FUNCTION TO LOAD T REGISTERS
          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
 LST80    EQU    *-1         FOR FORCING ERRORS
          LDML   /SS/P.NCR,CSST  NUMBER OF COMPLETED REQUESTS
          ZJN    LST90       IF NO COMPLETED REQUESTS
          LDDL   FNC
          NJN    LST90       IF WRITE
          RJM    RDWTOK      SEND RESPONSE FOR GOOD READ
 LST90    BSS
          RJM    SFUP        SAVE FOR UNANTICIPATED PAUSE
          LDDL   BC
          RADL   SECPOS      UPDATE SECTOR POSITION
          SBML   BPS,DT      CHECK FOR END OF SECTOR
          ZJN    LST110      IF END OF SECTOR
          LDML   /SS/P.LISTL,CSST  CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          ZJN    LST100      IF ALL USER DATA FOR THIS SECTOR TRANSFERRED
          RJM    UBT         UPDATE BYTES TRANSFERRED
          UJK    LST20
 LST100   BSS
          LDML   BPS,DT      BYTES PER SECTOR
          SBDL   SECPOS
          STML   CM.CB.T     BYTES TO TRANSFER
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
          ZJN    LST110      IF TIMEOUT
          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
 LST110   BSS
          RJM    UBT         UPDATE BYTES TRANSFERRED
          RJM    WFTC        WAIT FOR TRANSFER COMPLETE
          ZJN    LST130      IF ERROR OR UNANTICIPATED PAUSE
          RJM    UDA         UPDATE DISK ADDRESS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJK    LST20       IF MORE DATA TO TRANSFER
 LST130   BSS
          LJM    MAIN15
          EJECT
** NAME-- HST
*
** PURPOSE-- HIGH SPEED TRANSFER (25 MB CHANNEL).  A TRANSFER NOTIFICATION
*            RESPONSE HAS BEEN RECEIVED.  IF FNC IS 0 THIS IS A READ
*            OPERATION AND DATA WILL BE TRANSFERRED FROM THE CONTROLLER
*            BUFFER TO CM.  IF FNC IS 1 THIS IS A WRITE OPERATION AND
*            DATA WILL BE TRANSFERRED FROM CM TO THE CONTROLLER BUFFER.
*
** ENTRY  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.
*         FNC = 0  IF READ, 1 IF WRITE
          SPACE  2
 HST      CON    0
 HST5     BSS
          LDML   /SS/P.TOTAL,CSST
          LPC    777B
          SBN    1
          NJK    HST30       IF NOT LAST SECTOR
          LDML   /SS/P.TOTAL,CSST
          SHN    2
          PJN    HST30       IF NO REQUEST CONCATENATION
          LOADF  /SS/P.REQ,CSST  ADDRESS OF REQUEST
          ADN    /RQ/C.SWIT
          CRDL   T4          READ STREAM BIT IN REQUEST
          LDDL   T4
          SHN    2
          MJN    HST25       IF CONCATENATED REQUEST
 HST10    BSS
          LDML   /SS/P.TOTAL,CSST
          LPC    777B
          STML   /SS/P.TOTAL,CSST  CLEAR MASTER TERMINATE BIT
 HST20    BSS
          LDML   TF3,FNC     SOFTWARE MASTER TERMINATE
          UJN    HST40
 HST25    BSS
          LDN    2
          STDL   T1          CM WORDS TO READ
          LDDL   CSST
          ADK    RQ
          STML   HST27       ADDRESS TO STORE PVA, RMA
          LDDL   CMADR+2
          LMC    400000B
          CRML   *,T1        REREAD PVA AND RMA
 HST27    EQU    *-1
 HST30    BSS
          LDML   TF4,FNC     NO SOFTWARE MASTER TERMINATE
 HST40    BSS
          RJM    FUNC        TRANSFER FUNCTION
 HST50    BSS
          LDC    H0C00       DMA TRANSFER FUNCTION
 HST60    BSS
          RJM    FUNC        SEND FUNCTION
 HST65    EQU    *-1         FOR FORCING ERRORS
          LDML   CMLIST+/CM/P.LEN,CSST  NUMBER OF BYTES LEFT TO TRANSFER
          STDL   BC
          SBML   BPS,DT      BYTES PER SECTOR
          ADDL   SECPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    HST76       IF LESS THAN ONE SECTOR LEFT TO TRANSFER
          LDML   BPS,DT
          SBDL   SECPOS
          STDL   BC          NUMBER OF BYTES TO TRANSFER
          IFEQ   FE,1
          LJM    HST76
 HST75    EQU    *-1         FOR FORCING ERRORS
          ENDIF
 HST76    BSS
          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
 HST78    EQU    *-1         FOR FORCING ERRORS
          LDML   /SS/P.NCR,CSST  NUMBER OF COMPLETED REQUESTS
          ZJN    HST80       IF NO COMPLETED REQUESTS
          LDDL   FNC
          NJN    HST80       IF WRITE
          RJM    RDWTOK      SEND RESPONSE FOR COMPLETED READ REQUEST
 HST80    BSS
          RJM    SFUP        SAVE FOR UNANTICIPATED PAUSE
          LDDL   BC
          RADL   SECPOS      UPDATE SECTOR POSITION
          SBML   BPS,DT
          ZJN    HST100      IF END OF SECTOR
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
          ZJN    HST100      IF TIMEOUT
          LDML   /SS/P.LISTL,CSST  CHECK IF MORE CM ADDRESS LENGTH PAIRS
          SBN    1
          ZJN    HST90       IF ALL USER DATA FOR THIS SECTOR TRANSFERRED
          RJM    UBT         UPDATE BYTES TRANSFERRED
          UJK    HST50
 HST90    BSS
          LDML   BPS,DT
          SBDL   SECPOS
          STML   CM.CB.T     BYTES TO TRANSFER
          RJM    WFTE        WAIT FOR T PRIME REGISTER EMPTY
          ZJN    HST100      IF TIMEOUT
          LDC    H0C00       WRITE T PRIME REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          OAM    CM.CB.T,DC  BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
 HST100   BSS
          LDN    0
          STDL   SECPOS      CLEAR SECTOR POSITION
          RJM    UBT         UPDATE BYTES TRANSFERRED
          RJM    WFC         WAIT FOR COMPLETION
          NJK    HST150      IF PAUSE
          RJM    UDA         UPDATE DISK ADDRESS
          LPC    777B
          NJN    HST110      IF NOT LAST SECTOR
          LDML   /SS/P.TOTAL,CSST
          SHN    2
          PJK    HST150      IF LAST SECTOR
          RJM    CSWIT       SWITCH TO NEXT REQUEST
 HST110   BSS
          SODL   SBS         SECTORS BEFORE SUSPEND
          ZJK    HST150      IF TIME TO SUSPEND
          LDDL   OS
          LPN    20B
          ZJK    HST5        IF NO PAUSE
 HST150   BSS
          RJM    DCM         DESELECT THE CONTROLLER
          LJM    MAIN15
          TITLE  COMMAND SUBROUTINES
** NAME-- CFFMT
*
** PURPOSE-- CLEAR THE FORCE FORMAT FLAG IN THE UNIT INTERFACE TABLE.
*
** EXIT   P5 IS UNCHANGED
          SPACE  2
 CFFMTX   LJM    **
 CFFMT    EQU    *-1
 CFFMT10  BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    CFFMT10     IF LOCK COULD NOT BE SET
          LDK    -/UIT/K.FRCFMT  CLEAR FORCE FORMAT FLAG
          STDL   T3
          LCN    0
          STDL   T2
          STDL   T4
          STDL   T5
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          RDCL   T2          -LOGICAL OR- THE FORCE FORMAT FLAG
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          UJK    CFFMTX
          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    17
          MJN    CFME20      IF NO COMMAND ENDING STATUS
          LDML   RPB+13,T3   COMMAND ENDING STATUS
          LPN    77B
          SBN    0#11
          ZJN    CFMEX       IF ECC ERROR
          SBN    2
          ZJN    CFMEX       IF MISSING SYNC
          SBN    6           CHECK SECTOR NOT FOUND
          UJN    CFMEX
          SPACE  5,20
** NAME-- CKC
*
** PURPOSE-- CHECK IF MAINTENANCE PP WANTS THE CHANNEL.
          SPACE  2
 CKCX     LJM    **
 CKC      EQU    *-1
          LDK    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
          LOADOVL IDRO       LOAD IDLE/RESUME OVERLAY
          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
          LOADOVL PTO        OVERLAY CONTAINING ROUTINE SCLOCK
          RJM    SCLOCK      SET CHANNEL LOCK
          UJK    CKCX
 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   LPN
          ZJN    CLK30       IF THIS PP HAS THE LOCK SET
          LDDL   T6
          LMC    400000B
          CWDL   T1          RESTORE THE ORIGINAL CONTENTS
          RJM    HANG        HANG, THE LOCKWORD WAS WRONG
 CLK30    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6
          LMC    400000B
          CWDL   T1          CLEAR THE LOCKWORD
          UJK    CLKX
          SPACE  5,20
** NAME-- 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   T3
          NJN    CRS5        IF REQUEST SWITCH
          LDML   /SS/P.TOTAL,CSST
          LPC    777B
          NJN    CRS10       IF NOT END OF TRANSFER
          UJN    CRS30
 CRS5     BSS
          RJM    CSWIT       SWITCH TO NEXT REQUEST
 CRS10    BSS
          LDDL   STATUS
          LPN    0#30
          NJN    CRS30       IF DELAY
          LDDL   SBS
          NJN    CRSX        IF MORE TO TRANSFER
 CRS30    BSS
          RJM    DCM         DESECLECT THE CONTROLLER
          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.SWIT,CSST
          LPC    777B
          LMC    0#8000      INDICATE MASTER TERMINATE
          STML   /SS/P.TOTAL,CSST  SECTORS TO TRANSFER
          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-- 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
          RJM    CTRS        CONFIDENCE TEST RECOVERY SUBROUTINE (NO RETURN)
          SPACE  5,20
** NAME-- DARH
*
** PURPOSE-- DRIVE ASYNCHRONOUS RESPONSE HANDLER
          SPACE  2
 DARHX    LJM    **
 DARH     EQU    *-1

*         SEARCH UNITS TABLE TO SEE IF THIS UNIT IS CONFIGURED

          LDDL   UX
          STDL   T8          SAVE INDEX TO UNITS TABLE
          LDN    0
          STDL   UX
          UJN    DARH20
 DARH10   BSS
          LDN    P.UN
          RADL   UX          INCREMENT TO NEXT UNITS TABLE
 DARH20   BSS
          SBDL   UNUML
          ZJK    DARH60      IF END OF CONFIGURED UNITS
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   RPB+SLAD
          LMML   /SS/P.UNIT,CSST
          NJN    DARH10      IF RESPONSE NOT FOR THIS CONFIGURED UNIT
          LDML   UNITS,UX
          LMML   UNITS,T8
          LPC    400B
          NJN    DARH10      IF RESPONSE NOT FOR THIS CHANNEL PORT
          LDK    ID26
          RJM    SFP         CHECK FOR MACHINE EXCEPTION
          MJK    DARH35      IF MACHINE EXCEPTION ID NOT FOUND
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          SBN    3
          ZJN    DARH30      IF 5833_1P
          SBN    5
          ZJN    DARH30      IF 5838_1P
          SBN    2
          ZJN    DARH30      IF 5838_3P
          SBN    3
          ZJN    DARH30      IF 47444_1P
          SBN    2
          ZJN    DARH30      IF 47444_3P
          SBN    3
          ZJN    DARH30      IF 5837_1P
          SBN    2
          ZJN    DARH30      IF 5837_3P
          ADN    15
          NJK    DARH40      IF NOT 5833_3P
 DARH30   BSS
          LDML   RPB+5,T3
          SHN    -8
          SBN    8
          MJK    DARH40      IF RESPONSE FOR LOGICAL UNIT
          LDML   RPB+9,T3
          SHN    -8
          LMC    0#FE
          ZJK    DARH40      IF RESPONSE FOR LOGICAL UNIT

*         AN OPERATIONAL RESPONSE FOR A PHYSICAL DRIVE OF A PARITY UNIT
*         COULD MEAN AN OFF LINED DRIVE WAS REPAIRED.  THE CONFIDENCE TEST
*         WILL FORMAT THE DRIVE IF NECESSARY AND START THE RESTORE OF THE DRIVE.
*         DRIVE RESET FROM THE OTHER ACCESS CAUSES AN OPERATIONAL, READY
*         TRANSITION.  DON'T INITIATE A RESTORE DUE TO A DRIVE RESET.

          LDML   RPB+6,T3
          SHN    3
          PJK    DARH55      IF NOT OPERATIONAL TRANSITION
          SHN    1
          MJK    DARH60      IF READY TRANSISTION
          LDML   /SS/P.RQTRY,CSST
          NJN    DARH40      IF IN ERROR RECOVERY
          LDML   DARH
          LMC    PI75
          NJN    DARH40      IF CALLING ROUTINE IS NOT PI (PREVENT INFINITE LOOP)
          LDN    40B
          STML   /SS/P.CT,CSST  FORCE CONFIDENCE TEST TO BE RUN
          LDM    /SS/P.DOAR,CSST
          LMC    0#8000      INDICATE OPERATIONAL ASYNCH RECEIVED
          STML   /SS/P.DOAR,CSST
          UJN    DARH60

*         DRIVE RESET FROM THE OTHER ACCESS CAUSES A NOT OPERATIONAL, NOT
*         READY TRANSITION RESPONSE.  DON'T LOG THIS ASYNCHRONOUS RESPONSE.

 DARH35   BSS
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER 24
          MJN    DARH55      IF PARAMETER NOT FOUND
          LDML   RPB+6
          LPC    0#3000
          LMC    0#3000
          ZJN    DARH60      IF NOT OPERATIONAL, NOT READY ASYNCH
          UJN    DARH55
 DARH40   BSS
          LDML   RPB+6,T3
          LPC    0#FAF0
          LMC    0#6000
          ZJN    DARH60      IF NO ERROR
 DARH55   BSS
          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
 DARH60   BSS
          LDDL   T8
          STDL   UX
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          UJK    DARHX
          SPACE  5,20
** NAME-- DCR
*
** PURPOSE-- DELETE COMPLETED REQUEST FROM THE UNIT QUEUE.
*
** ENTRY  UNITS+/UN/P.UIT = POINTER TO UNIT INTERFACE TABLE
*         IF A = 0, ISSUE SEEK IF REQUEST AND NO COMMAND ISSUED
*
** EXIT   P5, T8 ARE UNCHANGED
          SPACE  2
 DCRX     LJM    **
 DCR      EQU    *-1
          STDL   T9
          LDN    2
          STDL   P6
 DCR5     BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    DCR5        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
          LDML   RQT+/RQ/P.NEXT
          ADML   RQT+/RQ/P.NEXT+1
          NJK    DCR32       IF NOT END OF QUEUE
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    DCR32       IF 2 COMMANDS ISSUED TO CONTROLLER
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV
          CRML   RQT,P6      READ FIRST PVA AND RMA
          LDML   UNITS+/UN/P.UIT,UX  INITIALIZE DELINK POINTER TO FIRST REQUEST
          STML   /SS/P.DP,CSST
          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
 DCR32    BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD

          LDDL   T9
          NJK    DCR38       IF NOT CHECKING REQUEST QUEUE
          LDDL   P4
          ZJK    DCR36       IF QUEUE EMPTY
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          LDML   /SS/P.CT,CSST
          LPN    7
          ZJK    DCR38       IF CONFIDENCE TEST SHOULD BE RUN
          LDML   /SS/P.RQTRY,CSST
          NJK    DCR38       IF IN ERROR RECOVERY
          LDDL   IF
          NJK    DCR38       IF CONFIDENCE TEST SHOULD BE RUN
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJK    DCR44       IF 2 COMMANDS ISSUED TO CONTROLLER
          LDML   RQT+/RQ/P.NEXTPV  PUT PVA OF NEXT REQUEST IN SS TABLE
          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
          LDML   RQT+/RQ/P.NEXT  PUT RMA OF NEXT REQUEST IN SS TABLE
          STML   /SS/P.REQ,CSST
          LDML   RQT+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,CSST
          LDN    0
          STDL   CNUM        INDICATE FIRST COMMAND
          RJM    GETR        GET REQUEST
          LDDL   FNC
          SBN    2
          ZJN    DCR38       IF FORMAT
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    DCRX
 DCR36    BSS
          RJM    RESPIN
 DCR38    BSS
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    DCR44       IF 2 COMMANDS ISSUED TO CONTROLLER
          SHN    -/UN/L.TCIP-2
          LPC    0#3FFF
          STML   UNITS,UX    CLEAR CIP
          RJM    DUBC        DECREMENT UNIT BUSY COUNTER
          LJM    DCR50
 DCR44    BSS
          LDML   UNITS,UX
          LPC    0#BFFF
          STML   UNITS,UX    CLEAR TCIP

*         MOVE (RMA, PVA, TOTAL SECTORS) 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
          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-- DUBC
*
** PURPOSE-- DECREMENT UNIT BUSY COUNTER
          SPACE  2
 DUBCX    LJM    **
 DUBC     EQU    *-1
          LDML   UNITS,UX
          SHN    -3
          LPN    77B
          STDL   P1          POINTER TO UPSB TABLE
          LDML   UPSB,P1
          ZJN    DUBCX       IF NO DECREMENT NECESSARY
          SOML   UPSB,P1     DECREMENT UNITS PER PATH STRING BUSY COUNTER
          NJN    DUBCX       IF OTHER BUSY UNITS
          LDML   PSB
          ZJN    DUBCX       IF NO DECREMENT NECESSARY
          SOML   PSB         DECREMENT PATH STRINGS BUSY
          UJN    DUBCX
          SPACE  5,20
** NAME-- EFP
*
** PURPOSE-- ERROR FLAG PROCESSING
          SPACE  2
 EFP      CON    0
          LOADOVL ER1O       LOAD ERROR RECOVERY OVERLAY NUMBER 1
          LJM    EFP1
          SPACE  5,20
** NAME-- EP
*
** PURPOSE-- ERROR PROCESSING
          SPACE  2
 EP       CON    0
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   /SS/P.RQTRY,CSST
          NJN    EP5         IF NOT FIRST ERROR FOR REQUEST
          STML   /SS/P.RECOV,CSST  INDEX TO FIRST RECOVERY STEP (EPA)
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EP5      BSS
          LDDL   UX          TO FORCE CONFIDENCE TEST OR FORMAT ERROR RECOVERY
          STDL   LUX          TO COMPLETE BEFORE GOING TO ANOTHER UNIT
          RJM    PPRQ        CHECK FOR IDLE REQUEST
          LDN    0
          STML   /SS/P.SC,CSST  DO NOT WAIT FOR ASYNCH IN DPR
          STDL   MFID        MASK FOR INTERLOCK DATA IF 200 HEX
          LDML   RS+/RS/P.ERRID
          NJN    EP10        IF RESPONSE PACKET NOT APPLICABLE
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    EP10        IF PARAMETER 24 NOT FOUND
          LDML   RPB+6,T3
          SHN    3
          PJN    EP10        IF DRIVE WAS READY
          AOML   /SS/P.SC,CSST  FLAG SAYS WAIT FOR ASYNCH IN DPR
 EP10     BSS
          LDN    0
          STDL   TBC         DO NOT EXPECT 01 ENDING STATUS
          LDML   TMF
          NJN    EP15        IF ERROR DURING TEST MODE
          LDML   RS+/RS/P.ERRID
          ZJN    EP25        IF PROBABLY NOT IOU ERROR
          SBN    E20
          PJN    EP25        IF PROBABLY NOT IOU ERROR
 EP15     BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EP40
 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    EPF         IF FINAL REQUEST RETRY FAILED
          CON    EPG         IF LOGICAL RESET FAILS AFTER FINAL RETRY
          CON    EPD20       REQUEST RETRY ERROR AFTER SLAVE RESET
          CON    EPC10       AFTER READ PERFORMANCE LOG
          SPACE  5,20
*         REQUEST RETRY

 EPA      BSS
          LDML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNTER
          STDL   T2
          ZJN    EPA10       IF INTERMEDIATE RESPONSE ALREADY REPORTED
          LDML   UNITS,UX
          SHN    /UN/L.PDCE+2
          MJN    EPA3        IF PARITY DRIVE CORRECTION ENABLED
          LDDL   T2
          SBN    RRL+1
          UJN    EPA6
 EPA3     BSS
          LDDL   T2
          SBN    RRL+3+1
 EPA6     BSS
          PJK    EPC         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
          UJN    EPC
 EPA30    BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPA40

*         CONFIDENCE TEST

 EPB      BSS
          RJM    CTR         CONFIDENCE TEST RECOVERY

*         SLAVE RESET

 EPC      BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPC20
 EPC10    BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPC70

 EPCT     BSS    16          UX FOR RESET CONTROLLER

*         PATH TEST (ROUTINE PT WORKED ONCE, SLAVE RESET FAILED, MAY BE
*         DAISY CHAIN PROBLEM.)

 EPD      BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPD30
 EPD20    BSS                ENTER HERE IF ERROR AFTER SLAVE RESET
          LDDL   PTF
          NJN    EPD25       IF PATH TEST SUCCESSFUL
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          RJM    OFFCM       TURN OFF ALL UNITS ON CONTROLLER (NO RETURN)
 EPD25    BSS
          RJM    INTRS       INTERMEDIATE RESPONSE
          RJM    CTR         CONFIDENCE TEST RECOVERY
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPE10

*         IF FINAL REQUEST RETRY FAILED

 EPF      BSS
          RJM    CTR         CONFIDENCE TEST RECOVERY
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPF20
 EPF10    BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPF28

*         ENTER HERE IF PREVIOUS LOGICAL INTERFACE RESET WORKS OR FAILS

 EPG      BSS
          LOADOVL ER2O       LOAD ERROR RECOVERY OVERLAY NUMBER 2
          LJM    EPG10
 .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 OR WRITE
          CON    FERB        DROP SELECT DURING READ OR WRITE
          CON    FERC        LOWER ICI PARITY ERROR ON READ OR WRITE
          CON    FERD        DROP SELECT DURING READ OR WRITE
          CON    FERE        READ OR WRITE ONE TOO MANY WORDS
          CON    FERF        READ OR WRITE ONE TOO FEW WORDS
          CON    FERG        READ OR WRITE ONE TOO MANY WORDS
          CON    FERH        READ OR WRITE ONE TOO FEW WORDS
          CON    FERI        READ DATA IPI P.E. (RECOVERABLE)
          CON    FERJ        WRITE DATA IPI P.E. (RECOVERABLE)
          CON    FERK        SPIN DOWN UNIT
          CON    MAIN        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 OR WRITE
          CON    FERW        PARITY ERROR ON WRITE
          CON    FERY        PARITY ERROR ON WRITE
          CON    FERZ        TEST MODE READ 1 TOO MANY WORDS
          CON    FERAA       PARITY ERROR ON INPUT
          CON    FERAB       PARITY ERROR ON OUTPUT
          CON    FERAC       DMA PARITY ERROR
          CON    FERAD       BYTE COUNT EQUAL ZERO ON READ OR WRITE
 FETND    BSS
          SPACE  5,20
** NAME-- FERA
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON READ OR WRITE (10 MB CHANNEL)
*            EB,40,XX01 YYYY
*            EB,48,CCDD
*                X = SECTORS TO TRANSFER BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
*
** NOTE-- Y = 0 .. A  RECEOVERABLE ERROR
*             B  CHANNEL DOWNED
*         EXPECTED ERROR CODE = 0F(16)
          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 OR WRITE (10 MB CHANNEL)
*            EB,40,XX02 YYYY
*            EB,48,CCDD
*                X = SECTORS TO TRANSFER BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERB     BSS
          LDC    FERB10
 FERB5    BSS
          STML   LST50
          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   LST50       RESTORE FUNCTION
 FERB25   BSS
          LDDL   T3
          RJM    FUNC        SEND FUNCTION
          LJM    LST50+1     RETURN TO CALLING ROUTINE
          SPACE  5,20
** NAME-- FERC
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON READ OR WRITE (25 MB CHANNEL)
*            EB,40,XX03 YYYY
*            EB,48,CCDD
*                X = SECTORS TO TRANSFER BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERC     BSS
          LDC    FERC10
          UJN    FERD5
 FERC10   CON    0
          STDL   T3          SAVE FUNCTION
          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--FERB
*
** PURPOSE-- DROP SELECT DURING READ OR WRITE (25 MB CHANNEL)
*            EB,40,XX04 YYYY
*            EB,48,CCDD
*                X = SECTORS TO TRANSFER BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERD     BSS
          LDC    FERD10
 FERD5    BSS
          STML   HST65
          LJM    MAIN10
 FERD10   CON    0
          STDL   T3          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERD25      IF WRONG DRIVE
          SODL   FEST
          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   HST65       RESTORE FUNCTION
 FERD25   BSS
          LDDL   T3
          RJM    FUNC        SEND FUNCTION
          LJM    HST65+1     RETURN TO CALLING ROUTINE
          SPACE  5,20
** NAME-- FERE
*
** PURPOSE-- TRANSFER ONE TOO MANY WORDS (10 MB CHANNEL)
*            EB,40,0005
          SPACE  2
 FERE     BSS
          LDC    FERE15
          STML   LST80
          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-- TRANSFER ONE TOO FEW WORDS (10 MB CHANNEL)
*            EB,40,0006
*
** NOTE-- EXPECTED ERROR CODE = 1B(16)
          SPACE  2
 FERF     BSS
          LDC    FERF20
          STML   LST80
          LDC    FERF10
 FERF5    BSS
          STML   LST40
          LJM    MAIN15
 FERF10   CON    0
          SODL   BC          DECREMENT BY ONE BYTE
          SODL   BC
 FERF15   BSS
          LDC    BCS         RESTORE INSTRUCTION
          STML   LST40
          LJM    LST40-3
 FERF20   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          AODL   BC          RESTORE BYTE COUNT
          AODL   BC
 FERF25   BSS
          LDC    DCN         RESTORE INSTRUCTION
          STML   LST80
          LDDL   T3
          LJM    LST80-1
          SPACE  5,20
** NAME-- FERE
*
** PURPOSE-- TRANSFER ONE TOO MANY WORDS (25 MB CHANNEL)
*            EB,40,0007
          SPACE  2
 FERG     BSS
          LDC    FERG15
          STML   HST78
          LDC    FERG10
          UJN    FERH5
 FERG10   CON    0
          AODL   BC          INCREMENT BY ONE BYTE
          AODL   BC
          UJN    FERH15
 FERG15   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          SODL   BC          RESTORE BYTE COUNT
          SODL   BC
          UJN    FERH25
          SPACE  5,20
** NAME-- FERF
*
** PURPOSE-- TRANSFER ONE TOO FEW WORDS (25 MB CHANNEL)
*            EB,40,0008
          SPACE  2
 FERH     BSS
          LDC    FERH20
          STML   HST78
          LDC    FERH10
 FERH5    BSS
          STML   HST75
          LJM    MAIN15
 FERH10   CON    0
          SODL   BC          DECREMENT BY ONE BYTE
          SODL   BC
 FERH15   BSS
          LDC    HST75+1     RESTORE INSTRUCTION
          STML   HST75
          LJM    HST75+1
 FERH20   CON    0
          STDL   T3          SAVE WORDS NOT TRANSFERRED
          AODL   BC          RESTORE BYTE COUNT
          AODL   BC
 FERH25   BSS
          LDC    DCN         RESTORE INSTRUCTION
          STML   HST78
          LDDL   T3
          LJM    HST78-1
          SPACE  5,20
** NAME-- FERI
*
** PURPOSE-- FORCE IPI PARITY ERROR ON INPUT DURING READ (10 MB CHANNEL)
*            EB,40,0009
** NOTE-- EXPECTED ERROR CODE = 19(16)
          SPACE  2
 FERI     BSS
          LDC    FERI10
          UJN    FERJ5
 FERI10   CON    0
          STDL   T3          SAVE FUNCTION
          LDC    H0322       FORCE BUS A INPUT PARITY ERROR
          UJN    FERJ20
          SPACE  5,20
** NAME-- FERJ
*
** PURPOSE-- FORCE IPI PARITY ERROR ON OUTPUT DURING WRITE (10 MB CHANNEL)
*            EB,40,000A
          SPACE  2
 FERJ     BSS
          LDC    FERJ10
 FERJ5    BSS
          LJM    FERB5
 FERJ10   CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0122
 FERJ20   BSS
          RJM    FUNC        FORCE BUS A OUTPUT PARITY ERROR
          LJM    FERB20
          SPACE  5,20
** NAME-- FERK
*
** PURPOSE-- SPIN DOWN UNIT TO FORCE NOT READY ERROR
*            EB,40,000B CCDD
*                C = CONTROLLER NUMBER
*                D = LOGICAL UNIT
*            EB,4C,EE00
*                E = DRIVE TO SPIN DOWN
*         THIS SHOULD ONLY BE USED WHEN THERE ARE NO OUTSTANDING
*         COMMANDS TO THE CONTROLLER.
          SPACE  2
 FERK     BSS
          LDN    14
          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
          SHN    -8
          STDL   CMOD        CONTROLLER NUMBER
          LDC    0#351       DISC MODES
          STML   CP+FCP
          LDC    0#4000
          STML   CP+FCP+1    SPIN DOWN UNIT
          LDC    0#2D5
          STML   CP+FCP+2
          LDDL   P4
          STML   CP+FCP+3    DRIVE TO SPIN DOWN
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LJM    MAIN15
          SPACE  5,20
** NAME-- FERM
*
** PURPOSE-- CHANGE CYLINDER NUMBER TO ILLEGAL VALUE
*            TO FORCE AN ERROR ON WRITE OR READ
*            EB,40,XX0D YYYY
*            EB,48,CCDD
*                X = COMMANDS TO SEND BEFORE FORCING FIRST ERROR
*                Y + 1 = TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
*
** NOTE-- Y = 0 .. 3  RECOVERABLE ERROR
*             4  MEDIA ERROR
*         EXPECTED ERROR CODE = 49(16)
          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
*            EB,40,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
*            EB,40,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
*            EB,40,XX10 YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*
** NOTE-- Y = 0 .. 3  RECOVERABLE ERROR
*             4  CONTROLLER DOWNED
*         EXPECTED ERROR CODE = 49(16)
          SPACE  2
 FERP     BSS
          LDC    FERP10
 FERP5    BSS
          STML   CPTB10
          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   CPTB10      RESTORE INSTRUCTION
 FERP40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    CPTBX       RETURN TO PATH TEST
          SPACE  5,20
** NAME-- FERQ
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR IN CONFIDENCE TEST
*            EB,40,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
*            EB,40,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
*            EB,40,XX13 YYYY
*              X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*              Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*
** NOTE-- Y = 0 .. 4  RECOVERABLE ERROR
*             5  DRIVE DOWNED
*         EXPECTED ERROR CODE = 49(16)
          SPACE  2
 FERS     BSS
          LDC    FERS10
 FERS5    BSS
          STML   CPTA10
          LJM    MAIN15
 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   CPTA10      RESTORE INSTRUCTION
 FERS40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    CPTAX       RETURN TO CONFIDENCE TEST
          SPACE  5,20
** NAME-- FERT
*
** PURPOSE-- CHANGE ONE MEMORY LOCATION
*            EB,40,0014
*            EB,48,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 INPUT DATA PARITY ERROR UPPER (10 MB CHANNEL)
*            EB,40,0015
          SPACE  2
 FERU     BSS
          LDC    FERU5
          UJN    FERV5
 FERU5    CON    0
          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 (10 MB CHANNEL)
*            EB,40,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 (10 MB CHANNEL)
*            EB,40,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 DMA OUTPUT PARITY ERROR (25 MB CHANNEL)
*            EB,40,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#4013      FORCE PARITY ERROR
 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.
*            EB,40,XX19
*                XX = NUMBER OF TIMES TO FORCE THE ERROR
*
** NOTE-- EXPECTED ERROR CODE = 1D(16) FOR THE RECOVERABLE ERROR
          SPACE  2
 FERZ     BSS
          LDC    FERZ5
          STML   WOG10
          LJM    MAIN10
 FERZ5    CON    0
          STDL   T3          SAVE FUNCTION
          LDML   TMWC,CH
          ADN    1
          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+3
          SPACE  5,20
** NAME-- FERAA
*
** PURPOSE-- FORCE IPI PARITY ERROR ON INPUT (25 MB CHANNEL)
*                EB,40,001A
          SPACE  2
 FERAA    BSS
          LDC    FERAA10
          UJN    FERAB5
 FERAA10  CON    0
          STDL   T3          SAVE FUNCTION
          LDC    H0322       FORCE BUS A INPUT PARITY ERROR
          UJN    FERAB20
          SPACE  5,20
** NAME-- FERAA
*
** PURPOSE-- FORCE IPI PARITY ERROR ON OUTPUT (25 MB CHANNEL)
*                EB,40,001B
          SPACE  2
 FERAB    BSS
          LDC    FERAB10
 FERAB5   BSS
          LJM    FERD5
 FERAB10  CON    0
          STDL   T3          SAVE FUNCTION
          LDC    H0122       FORCE BUS A OUTPUT PARITY ERROR
 FERAB20  BSS
          RJM    FUNC
          LJM    FERD20
          SPACE  5,20
** NAME-- FERAC
*
** PURPOSE-- FORCE UPPER DMA PARITY ERROR (25 MB CHANNEL)
*                EB,40,001C
          SPACE  2
 FERAC    BSS
          LDC    FERAC5
          UJN    FERAD5
 FERAC5   CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0300       WRITE CONTROL REGISTER
          RJM    FAN
          LDC    0#4090      FORCE PARITY ERROR
          UJN    FERAD20
          SPACE  5,20
** NAME-- FERAD
*
** PURPOSE-- FORCE BYTE COUNT EQUAL 0 (25 MB CHANNEL)
*                EB,40,001D
          SPACE  2
 FERAD    BSS
          LDC    FERAD10
 FERAD5   BSS
          LJM    FERD5
 FERAD10  CON    0
          STDL   T3          SAVE FUNCTION CODE
          LDC    H0300       WRITE CONTROL REGISTER
          RJM    FAN
          LDC    0#4096      FORCE BYTE COUNT EQUAL 0
 FERAD20  BSS
          ACN    DC
          OAN    DC
          LJM    FERD20
 .F       ENDIF
          SPACE  5,20
** NAME-- FORMA
*
** PURPOSE-- FORMAT A CM REAL MEMORY ADDRESS.
*
** ENTRY--  A = ADDRESS OF A 2-WORD CM BYTE ADDRESS.
*
** EXIT--  CMADR- IS THE ADDRESS OF THE RESULTING 3-WORD REFORMATED
*          CM ADDRESS.  THE FORMAT CAN BE USED BY THE LOADC MACRO.
*           -ADDRESS-, WORD 0, BITS 0-13 AND
*                      WORD 1, BITS 3-15, ARE REFORMATTED TO-
*           -CMADR-,   WORD 0, BITS 0-9,
*                      WORD 1, BITS 0-11,
*                      WORD 2, BITS 0-5.
          SPACE  2
 FORX     LJM    **
 FORMA    EQU    *-1
          STDL   T1
          LDML   1,T1
          LPN    7
          NJN    FOR10       RMA ADDRESS ERROR
          LDIL   T1
          LPN    37B
          SHN    16
          LMML   1,T1
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STDL   CMADR+2
          LDIL   T1
          SHN    -5
          STD    CMADR
          LRD    CMADR
          LDDL   CMADR+2
          LMC    400000B
          UJK    FORX
 FOR10    BSS
          LDC    E304        RMA NOT WORD BOUNDARY
          RJM    INTERR      REPORT ERROR (NO RETURN)
          SPACE  5,20
** NAME-- GETR
*
** 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.
*            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 SECTORS 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    **
 GETR     EQU    *-1
          LDN    0
          STML   CP+FCP+1    UPPER WORD OF SECTOR COUNT
          LDDL   CSST
          STDL   P5          SAVE CURRENT SS TABLE POINTER
          LDC    IPIT
          STDL   CSST        START OF ALTERNATE SS TABLE
          LDDL   CNUM
          ZJN    GETR5       IF FIRST COMMAND
          LDML   /SS/P.RMA2,P5
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.RMA2+1,P5
          UJN    GETR10
 GETR5    BSS
          LDML   /SS/P.REQ,P5
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.REQ+1,P5
 GETR10   BSS
          STML   /SS/P.REQ+1,CSST
          RJM    UREQ        READ UNIT REQUEST FROM CM
          LDML   CM+/CM/P.CODE,CSST
          SHN    -12
          SBN    4
          STDL   FNC         SAVE FUNCTION
          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

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

          LDML   RQ+/RQ/P.SWIT,CSST
          LPC    777B
          STDL   TOTAL       SECTOR COUNT FOR REQUEST
          LDML   /SS/P.RQTRY,P5
          NJN    GETR30      IF IN ERROR RECOVERY
          LDM    /SS/P.DT,P5
          SHN    -4
          LPN    77B
          SBN    2
          MJN    GETR30      NO MASTER TERMINATE IF 5832
          LDDL   FNC
          SBN    1
          ZJN    GETR15      IF WRITE (USE MASTER TERMINATION)
          LDDL   TOTAL
          SBN    1
          ZJN    GETR30      IF MAU COUNT = 1 (NO MASTER TERMINATION)
          LDML   CM+/CM/P.LEN,CSST
          SBN    8
          ZJN    GETR30      IF ONLY ONE LIST
 GETR15   BSS
          LDDL   P5
          STDL   CSST        RESTORE POINTER TO SS TABLE
          LDDL   CNUM
          ZJN    GETR38      IF FIRST COMMAND FOR UNIT
          LDC    0#8000
          ADDL   TOTAL
          UJN    GETR35
 GETR30   BSS
          LDDL   P5
          STDL   CSST        RESTORE POINTER TO SS TABLE
          LDDL   CNUM
          ZJN    GETR40      IF FIRST COMMAND FOR UNIT
          LDDL   TOTAL
 GETR35   BSS
          STML   /SS/P.TW2,CSST
          UJN    GETR50
 GETR38   BSS
          LDC    0#8000
 GETR40   BSS
          ADDL   TOTAL
          STML   /SS/P.TOTAL,CSST
          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
          LDML   UNITS,UX
          SHN    -5
          LPN    40B
          STDL   T2          COMPUTE OFFSET INTO UNIT COMMUNICATIONS BUFFER
          LOADF  T3          REFORMAT IT AND LOAD R REGISTER
          ADDL   T2          OFFSET 0 OR 100(16) BYTES INTO BUFFER
          CRML   SSNR,WC     READ SS TABLE
          UJK    GETSSX
          SPACE  5,20
** NAME-- GETU
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL, ISSUE ALL
*            SEEKS, AND PROCESS INTERRUPTS FROM THE CONTROLLER
          SPACE  2
 GETUX    LJM    **
 GETU     EQU    *-1
          LDDL   UNUML
          ZJN    GETUX       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 CONTROLLER NUMBER AND PORT NUMBER
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          PJK    GETU50      IF NO COMMAND IN PROGRESS
          LDML   UNITS,UX
          SHN    /UN/L.PORT+2
          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    GETU24      IF NO INTERRUPT FOR THIS CONTROLLER
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          RJM    PI          PROCESS INTERRUPT (NO RETURN)
 GETU24   BSS
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          PJN    GETU40      IF 2ND COMMAND CAN BE ISSUED
 GETU25   BSS
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU30      IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU30   BSS
          SBN    CMT         COMMAND TIMEOUT
          PJK    GETU95      IF TIMEOUT

*         GO TO NEXT UNIT ENTRY.

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

*         ONE COMMAND IN PROGRESS

 GETU40   BSS
          LDDL   CMNDS
          SBN    32
          PJK    GETU25      IF 32 SEEKS ISSUED
          STDL   CNUM        INDICATE SECOND COMMAND TO UNIT
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDDL   IF
          ZJN    GETU45      IF NO INITIALIZATION NECESSARY
          LDML   /SS/P.CT,CSST
          LPN    7
          NJN    GETU25      IF CONFIDENCE TEST ALREADY RUN
          LDDL   CMNDS
          NJN    GETU35      IF OUTSTANDING COMMANDS
          STML   /SS/P.CT,CSST  IN CASE ASYNCH FOR PARITY DRIVE
          LOADOVL CDO        LOAD CHECK DRIVE OVERLAY
          RJM    CD          CHECK DRIVE
          STDL   T5
          LOADOVL CTO        LOAD CONFIDENCE TEST OVERLAY
          LDDL   T5
          NJN    GETU42      IF ERROR OR OFF LINED DRIVE
          RJM    CDA         CHECK DRIVE ATTRIBUTES
 GETU42   BSS
          RJM    CT          CONFIDENCE TEST
          LJM    GETUX
 GETU45   BSS
          LDML   /SS/P.CT,CSST
          LPN    7
          ZJK    GETU25      IF CONFIDENCE TEST SHOULD BE RUN
          LDDL   MALET
          NJK    GETU25      IF MAINTENANCE REQUEST
          LDML   UNITS,UX
          LPC    0#A00
          NJK    GETU25      IF RESTORE OR INITIALIZE ATTRIBUTES
          LDML   /SS/P.RQTRY,CSST
          NJK    GETU25      IF IN ERROR RECOVERY
          RJM    SR          SELECT REQUEST
          NJK    GETU25      IF REQUEST NOT FOUND
          RJM    GETR        GET REQUEST
          LDML   IPIT+CM+/CM/P.CODE
          SHN    -8
          LMC    C.FORMAT
          ZJK    GETU25      IF FORMAT COMMAND
          LJM    GETU85

*         NO COMMAND IN PROGRESS

 GETU50   BSS
          LDDL   IF
          NJK    GETU35      IF INITIALIZATION FLAG SET
          LDML   UNITS,UX
          SHN    /UN/L.ACIP+2
          PJK    GETU55      IF NO COMMAND IN PROGRESS FOR ALTERNATE ACCESS
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.ULOCK  INDEX TO LOCKWORD
          CRDL   T1          READ LOCKWORD
          LDDL   T1
          ZJN    GETU52      IF UNIT NOT LOCKED
          LDDL   T4
          SBDL   LPN
          NJK    GETU35      IF ALTERNATE PP HAS THE LOCK
 GETU52   BSS
          LDML   UNITS,UX
          LPC    0#DFFF
          STML   UNITS,UX    CLEAR ALTERNATE COMMAND IN PROGRESS BIT
          SHN    -3
          LPN    77B
          STDL   P1          INDEX TO UPASB TABLE
          SOML   UPASB,P1    DECREMENT UNITS PER ALTERNATE PATH STRING BUSY COUNTER
          NJN    GETU55      IF OTHER UNITS ON ALTERNATE STRING ARE BUSY
          SOML   APSB        DECREMENT ALTERNATE PATH STRINGS BUSY COUNTER

*         CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.

 GETU55   BSS
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5          READ UNIT DISABLED FLAG
          ADN    /UIT/C.ULOCK  INDEX TO LOCKWORD
          CRDL   P2          READ LOCKWORD
          LDDL   T8          QUEUE COUNT
          NJN    GETU56      IF REQUEST ON QUEUE
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJK    GETU35      IF RESTORE NOT IN PROGRESS
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDN    0
          STML   RTM,CSST    REQUESTS TO MULTIPLEX
 GETU56   BSS
          LDDL   T5+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJK    GETU35      IF UNIT DISABLED
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   UNITS,UX
          SHN    -3
          LPN    77B
          STDL   P1          INDEX TO UPSB AND UPASB TABLES
          LDDL   P3
          ADDL   P4
          ZJN    GETU60      IF NO ALTERNATE ACCESS
          SBDL   LPN
          ZJN    GETU60      IF NO ALTERNATE ACCESS
          LDDL   P2
          ZJN    GETU58      IF UNIT NOT LOCKED
          LDDL   P5
          SBDL   LPN
          NJK    GETU65      IF ALTERNATE PP HAS THE UNIT
          UJN    GETU60
 GETU58   BSS
          LDML   UPSB,P1
          SBML   UPASB,P1
          MJN    GETU60      IF THIS PP SHOULD ISSUE THE SEEK
          NJN    GETU65      IF ALTERNATE PP SHOULD ISSUE THE SEEK
          LDML   APSB
          SBML   PSB
          MJN    GETU65      IF ALTERNATE PP SHOULD ISSUE THE SEEK
 GETU60   BSS
          LDDL   CMNDS
          SBN    32
          PJN    GETU65      IF 32 SEEKS ISSUED
          LDML   /SS/P.RQTRY,CSST
          NJN    GETU62      IF IN ERROR PROCESSING FOR THIS UNIT
          LDDL   MALET
          NJN    GETU70      IF MAINTENANCE REQUEST
 GETU62   BSS
          RJM    LUT         LOCK UNIT TABLE
          NJN    GETU65      IF LOCK UNSUCCESSFUL
          STDL   CNUM        INDICATE 1ST COMMAND TO UNIT
          AOML   UPSB,P1     INCREMENT UNITS PER STRING BUSY COUNTER
          SBN    1
          NJN    GETU75      IF STRING ALREADY HAS A BUSY UNIT
          AOML   PSB         INCREMENT PATH STRINGS BUSY
          UJN    GETU75
 GETU65   BSS
          LDML   UNITS,UX
          LMC    0#2000
          STML   UNITS,UX    SET ALTERNATE COMMAND IN PROGRESS
          AOML   UPASB,P1    INCREMENT UNITS PER ALTERNATE STRING BUSY COUNTER
          SBN    1
          NJN    GETU70      IF NOT 1ST BUSY UNIT ON ALTERNATE STRING
          AOML   APSB        INCREMENT ALTERNATE PATH STRINGS BUSY COUNTER
 GETU70   BSS
          UJK    GETU35
 GETU75   BSS
          LDML   UNITS,UX
          SHN    /UN/L.PDCE+2
          PJN    GETU76      IF PARITY DRIVE CORRECTION DISABLED
          LDML   /SS/P.RQTRY,CSST
          NJN    GETU76      IF IN ERROR PROCESSING FOR THIS UNIT

*         INITIALIZE DRIVE ATTRIBUTES TO DISABLE PARITY DRIVE CORRECTION.

          LDC    H0202       RESTORE ATTRIBUTES OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
*         LDML   UNITS,UX    INDICATE ONE COMMAND IN PROGRESS
          LMC    0#8000
          STML   UNITS,UX
          AODL   CMNDS
          LDDL   UX
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDN    6
          STML   CP          COMMAND PACKET LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
          UJK    GETU90
 GETU76   BSS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJN    GETU78      IF NOT RESTORING DRIVE
          LDML   RTM,CSST    REQUESTS TO MULTIPLEX
          NJN    GETU78      IF NOT TIME TO RESTORE
          LDML   /SS/P.CT,CSST
          LPN    7
          NJN    GETU77      IF DON'T NEED TO RUN CONFIDENCE TEST
          AOML   RTM,CSST    FORCE REQUEST TO BE PRESENT TO RUN CONFIDENCE TEST
          RJM    DUBC        DECREMENT UNIT BUSY COUNTER
          UJK    GETU90
 GETU77   BSS
          LOADOVL CTO        LOAD CONFIDENCE TEST OVERLAY
          RJM    IRD         ISSUE RESTORE DRIVE
          UJN    GETU90
 GETU78   BSS
          RJM    SR          SELECT REQUEST
          NJK    GETU75      IF QUEUE LOCK NOT OBTAINED
          RJM    GETR        GET REQUEST
          LDML   /SS/P.CT,CSST
          LPN    7
          ZJN    GETU80      IF CONFIDENCE TEST NOT RUN
          LDDL   FNC
          SBN    2
          NJN    GETU85      IF NOT FORMAT
          LOADOVL CTO
          RJM    PFMT        PROCESS FORMAT PARAMETER
          NJN    GETU90      IF FORCE FORMAT FUNCTION
 GETU80   BSS
          LDML   UNITS,UX    SET COMMAND IN PROGRESS
          LMC    0#8000
          STML   UNITS,UX
          STDL   IF          SET INITIALIZATION FLAG
          UJN    GETU90
 GETU85   BSS
          RJM    SEEK        ISSUE INITIAL SEEK
 GETU90   BSS
          LJM    GETUX
 GETU95   BSS
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   /SS/P.RESET,CSST
          ZJN    GETU120     IF RESET NOT ISSUED
          LDML   EPCT,CMOD
          SBDL   UX
          NJN    GETU115     IF DIFFERENT UNIT
          LDC    SRT         SLAVE RESET TIMEOUT
          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
 GETU115  BSS
          LJM    GETU35
 GETU120  BSS
          LDN    E38         NO CONTROLLER RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 HSTF     BSSZ   1           HEAD SHIFT TEST FLAG
          SPACE  5,20
** NAME-- GLIST
*
** PURPOSE-- READ ONE ENTRY FROM THE CM ADDRESS LIST PORTION OF A COMMAND.
*
** ENTRY-- LISTL
*
** EXIT-- CMLIST, CM+/CM/P.RMA
          SPACE  2
 GLIX     LJM    **
 GLIST    EQU    *-1
          LDDL   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-- IDTP
*
** PURPOSE-- INPUT DATA TO PP (RPB+8)
*
** ENTRY  A = COMMAND PACKET LENGTH
*
** EXIT   TO CALLING ROUTINE IF NO ERROR
          SPACE  2
 IDTPX    LJM    **
 IDTP     EQU    *-1
          STML   CP          COMMAND PACKET LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    IDTP50      IF NOT TRANSFER NOTIFICATION RESPONSE
          RJM    VRP         VERIFY RESPONSE PACKET
          LDC    ID6D
          RJM    SFP         SEARCH FOR PARAMETER
          MJK    IDTP50      IF ID 6D NOT FOUND
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAIN      DATA TRANSFER IN
          RJM    BCS         BUS CONTROL SEQUENCE
          LDDL   MFID        MASK FOR INTERLOCK DATA
          LPN    1
          SHN    9
          LMC    H0281       STREAM, READ
          RJM    FUNC        RAISE MASTER OUT
          LDML   CP+OPCD
          LMC    0#8400
          NJN    IDTP10      IF NOT READ ERROR LOG
          LDC    H0C00       DMA READ
          RJM    FUNC
          ACN    DC
          LDML   RPB+5+2,T3  BYTE LENGTH OF RESPONSE
          LPC    0#1FFF      ENSURE BUFFER IS NOT OVERFLOWED
          STDL   T5
          STML   CM.CB.T
          LDN    3
          OAM    CM.CB.T,DC  BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
          LDN    0
          STDL   WC
          STML   /SS/P.TOTAL,CSST  SO THERE IS NO SOFTWARE MASTER TERMINATE
          RJM    WFTC        WAIT FOR TRANSFER COMPLETE
          UJN    IDTP45
 IDTP10   BSS
          ACN    DC
          LDML   RPB+5+2,T3
          STDL   T5
          ADN    1           IN CASE OF ODD BYTE LENGTH
          SHN    -1          PP WORDS TO INPUT
          LPC    377B        PROTECT AGAINST ILLEGAL LENGTH
          IAM    RPB+8,DC
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
 IDTP30   BSS
          IJM    IDTP40,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    IDTP30      IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          UJN    IDTP70
 IDTP40   BSS
          LDN    0
          RJM    GES         GET ENDING STATUS
 IDTP45   BSS
          RJM    DCM         DESELECT THE CONTROLLER
          LDDL   WC
          NJN    IDTP60      IF NOT ALL WORDS TRANSFERRED
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    IDTP50      IF NOT SUCCESSFUL
          RJM    VRP         VERIFY RESPONSE PACKET
          LJM    IDTPX
 IDTP50   BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          UJN    IDTP70
 IDTP60   BSS
          LDN    E29         INCOMPLETE TRANSFER
 IDTP70   BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- IH
*
** PURPOSE-- INTERRUPT HANDLER.  INPUT THE RESPONSE PACKET.  REPORT
*            ASYNCHRONOUS DRIVE ERROR RESPONSES FOR CONFIGURED UNITS.
*
** EXIT
*         A = MAJOR STATUS
*         THE DRIVE IS DESELECTED
          SPACE  2
 IHX      LJM    **
 IH       EQU    *-1
          LDDL   MFID        MASK FOR INTERLOCK DATA
          ZJN    IH10        IF STREAMING MODE

*         IF 10 MB CHANNEL AND INTERLOCK MODE, SOMETIMES AFTER SENDING
*         A COMMAND PACKET, THE ERROR FLAG WILL SET DURING THE FOLLOWING
*         BUS CONTROL SEQUENCE (IPI ERROR REGISTER = 0004).  MASTER
*         CLEARING THE CHANNEL AFTER THE COMMAND PACKET PREVENTS THIS PROBLEM.

          RJM    MCC         MASTER CLEAR CHANNEL
          RJM    PS          PORT SELECT
 IH10     BSS
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX  SAVE CLOCK IN TABLE
          LDML   CP+OPCD
          SHN    -8
          ZJN    IH40        IF LOGICAL INTERFACE RESET
          SBN    7
          NJN    IH20        IF NOT SPIN UP DRIVE
          LDC    115         115 SECOND TIMEOUT FOR SPIN UP DRIVE
          UJN    IH60
 IH20     BSS
          SBN    1
          ZJN    IH40        IF DRIVE RESET
          SBN    0#20
          NJN    IH30        IF NOT FORMAT
          LDML   CP
          LMN    0#E
          ZJN    IH40        IF NOT FORMAT OF ENTIRE DRIVE
          LDC    FPT         FORMAT PACK TIMEOUT
          UJN    IH60
 IH30     BSS
          LDML   /SS/P.RESET,CSST
          NJN    IH50        IF RESET ISSUED
 IH40     BSS
          LDN    CMT         COMMAND TIMEOUT
          UJN    IH60
 IH50     BSS
          LDC    SRT         SLAVE RESET TIMEOUT
 IH60     BSS
          STDL   T7          SAVE TIMEOUT VALUE
 IH70     BSS
          RJM    RI          REQUEST INTERRUPTS
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          NJN    IH90        IF INTERRUPT PRESENT
          RJM    UC          UPDATE CLOCK
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    IH80        IF CLOCK HAS NOT WRAPPED
          ADC    0#10000
 IH80     BSS
          SBDL   T7
          MJN    IH70        IF TIMEOUT NOT EXPIRED
          LDK    E38         NO CONTROLLER RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 IH90     BSS
          RJM    DTM         DETERMINE TRANSFER MODE
          RJM    SEL         SELECT THE CONTROLLER
          STDL   CTM         CLEAR CHANGE TRANSFER MODE FLAG
          RJM    RPT         RESPONSE PACKET TRANSFER
          RJM    DCM         DESELECT THE CONTROLLER
          LDML   RPB+MAJST   MAJOR STATUS
          SHN    -4
          LPN    0#F
          LMN    AR
          NJN    IH100       IF NOT ASYNCHRONOUS RESPONSE
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJN    IH110       IF ASYNCHRONOUS RESPONSE FOR CONTROLLER
          LDML   RPB+OPCD
          SHN    -8
          LMC    0#FF
          NJN    IH100       IF ASYNCH ASSOCIATED WITH A COMMAND
          RJM    DARH        DRIVE ASYNCHRONOUS RESPONSE HANDLER
          LDML   CP+OPCD
          LMC    0#100
          ZJN    IH100       IF ASYNCHRONOUS RESPONSE EXPECTED
          UJN    IH120       GO LOOK FOR ANOTHER INTERRUPT
 IH100    BSS
          LDML   RPB+MAJST   MAJOR STATUS
          LJM    IHX
 IH110    BSS
          LDK    ID16
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    IH100       IF ID16 NOT FOUND
          LDML   RPB+6,T3
          SHN    -8
          PJN    IH100       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
 IH120    BSS
          LJM    IH70        GO LOOK FOR ANOTHER INTERRUPT
          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
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          RJM    HANG
          SPACE  5,20
** NAME-- INTRS
*
** PURPOSE-- SEND INTERMEDIATE RESPONSE.
          SPACE  2
 INTRSX   LJM    **
 INTRS    EQU    *-1
          LDDL   PTF
          ZJN    INTRS10     JUMP IF PATH TEST
          LDML   RS+/RS/P.ERRID
          LMC    E76         IF UNEXPECTED, PROCESS AS UNSOLICITED
          NJN    INTRS20     JUMP IF ERROR NOT UNEXPECTED RESPONSE
 INTRS10  BSS
          RJM    SNMSG       SEND UNSOLICTED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          UJN    INTRSX
 INTRS20  BSS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJN    INTRS30     IF NOT RESTORING DRIVE
          LDML   RTM,CSST
          ZJN    INTRS10     IF RESPONSE FOR RESTORE
 INTRS30  BSS
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
          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-- LA6E
*
** PURPOSE-- LOAD ATTRIBUTE PARAMETER 6E.  DISABLING UNANTICIPATED PAUSES
*            DISABLES CORRECTION OF READ ERRORS WITH A PARITY DRIVE.
          SPACE  2
 LA6EX    LJM    **
 LA6E     EQU    *-1
          LDC    0#46E
          STML   CP+FCP      PARAMETER 6E
          LDC    H0209
          RJM    SOU         SET OPERATION CODE AND UNIT
*         LDML   UNITS,UX
          SHN    /UN/L.PDCE+2
          PJN    LA6E10      IF PARITY DRIVE CORRECTION DISABLED
          LDC    0#C080      ALLOW PARITY DRIVE CORRECTION
          UJN    LA6E20
 LA6E10   BSS
          LDC    0#C0A0      DISABLE UNANTICIPATED PAUSES
 LA6E20   BSS
          STML   CP+FCP+1    MODE FOR DATA
          LDN    0
          STML   CP+FCP+2
          LDN    12          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          UJK    LA6EX
          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
          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    EP          ERROR PROCESSING (NO RETURN)
*COPYC IODMAC6
          SPACE  5,20
** NAME-- LOCK
*
** PURPOSE-- SET THE LOCKWORD
*
** ENTRY
*         T7 = RMA POINTER
*         T5 = OFFSET TO LOCKWORD FROM RMA
*
** EXIT
*         A = 0 IF LOCK SUCCESSFULLY SET
          SPACE  2
 LOCKX    LJM    **
 LOCK     EQU    *-1
 LOCK10   BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        UNIT/PP INTERFACE TABLE ADDRESS
          ADDL   T5          ADD LOCKWORD OFFSET, SAVE CM ADDRESS
          STDL   T6          SAVE CM ADDRESS
          RDSL   T1          SET INTERMEDIATE VALUE
          LDDL   T1
          ZJN    LOCK30      IF LOCK COULD BE SET
          ADDL   T2
          ADC    -177777B-177777B
          ZJN    LOCK10      IF INTERMEDIATE VALUE
          LDDL   T2
          LPC    77777B
          ADC    100000B
          STDL   T2          SET THE VE BIT
          LDDL   T6
          LMC    400000B
          CWDL   T1          RESTORE THE LOCKWORD AND SET THE VE BIT
          LDDL   T4
          SBDL   LPN         CHECK IF LOCK ALREADY SET
          NJN    LOCK20      IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 LOCK20   UJK    LOCKX       IF LOCK WAS ALREADY SET, EXIT A = 0
                             IF LOCK COULD NOT BE SET, EXIT A .NE. 0
 LOCK30   BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   LPN
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    LOCKX
          SPACE  5,20
** NAME-- LUT
*
** PURPOSE-- LOCK UNIT TABLE
*
** EXIT   A = 0 IF UNIT LOCKED TO THIS PP
          SPACE  2
 LUT10    BSS
          LDDL   T4
          SBDL   LPN
 LUTX     LJM    **
 LUT      EQU    *-1
          LDC    0#8000
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          STDL   T4
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.ULOCK  INDEX TO LOCKWORD
          STDL   T6
          RDSL   T1          ATTEMPT TO LOCK UNIT
          LDDL   T1
          NJN    LUT10       IF ALREADY LOCKED
          LDC    0#8000
          STDL   T1
          LDDL   LPN
          STDL   T4          LOGICAL PP NUMBER
          LDDL   T6
          LMC    400000B
          CWDL   T1          WRITE THE LOCKWORD
          LDN    0
          UJK    LUTX
          SPACE  5,20
** NAME-- ODFP
*
** PURPOSE-- OUTPUT DATA FROM PP
*
** ENTRY  A = COMMAND PACKET LENGTH
          SPACE  2
 ODFPX    BSS
          RJM    VRP         VERIFY RESPONSE PACKET
          LJM    **
 ODFP     EQU    *-1
          STML   CP          COMMAND PACKET LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          NJN    ODFPX       IF COMMAND SUCCESSFUL
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- PAUS
*
** PURPOSE-- DELAY PROGRAM EXECUTION FOR A SPECIFIED NUMBER OF
*            MICROSECONDS.
*
** ENTRY  A REGISTER SPECIFIES NUMBER OF MICROSECONDS
*          TO BE DELAYED.
          SPACE  2
 PAUSX    LJM    **
 PAUS     EQU    *-1
 PAUS10   SBN    1           EACH ITERATION OF THIS LOOP
          STDL   T1           IS ONE MICROSECOND (I4 ONLY)
          NJN    PAUS10
          UJK    PAUSX
          SPACE  5,20
** NAME-- PCER
*
** PURPOSE-- PREPARE COMMON ERROR RESPONSE
*
** ENTRY  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
          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
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
          LDDL   P2
          NJN    PCER50      IF ERROR ALREADY ISOLATED
          LDN    ID14
          RJM    SFP         SEARCH FOR ID 14
          MJN    PCER30      IF NOT CONTROLLER INTERVENTION REQUIRED
          LDK    E71
          UJN    PCER50
 PCER30   BSS
          LDN    ID16
          RJM    SFP         SEARCH FOR ID 16
          MJN    PCER40      IF NOT CONTROLLER MACHINE EXCEPTION
          LDML   RPB+6,T3
          SHN    8
          PJN    PCER31      IF NOT CONTROLLER OVER TEMPERATURE
          LDK    E78
          UJN    PCER50
 PCER31   BSS
          LDK    E72
          UJN    PCER50
 PCER40   BSS
          LDN    ID17
          RJM    SFP         SEARCH FOR ID 17
          MJN    PCER70      IF NOT CONTROLLER COMMAND EXCEPTION
          LDK    E73         COMMAND EXCEPTION
 PCER50   BSS
          UJN    PCER100
 PCER70   BSS
          LDN    ID13
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER90      IF NOT ID13
          LDK    E74         MICROCODE EXECUTION ERROR
          UJN    PCER100
 PCER90   BSS
          LDN    ID15
          RJM    SFP         SEARCH FOR ID 15
          MJN    PCER110     IF NOT ALTERNATE PORT EXCEPTION
          LDK    E75
 PCER100  BSS
          UJN    PCER160
 PCER110  BSS
          LDN    ID12
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    PCER120     IF ID12 FOUND
          LDK    ID22
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER130     IF NOT ID22
 PCER120  BSS
          LDK    E130        DEFECT MANAGEMENT TASK FAILED
          UJN    PCER160
 PCER130  BSS
          LDK    ID23
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER140     IF NOT ID23
          LDML   RPB+6,T3    FIRST WORD AFTER ID23
          SHN    5
          PJN    PCER150     IF NOT MESSAGE FROM DRIVE DIAGNOSTICS
          LDK    E61         DRIVE ERROR
          UJN    PCER160
 PCER140  BSS
          LDK    ID25
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER150     IF NOT ID25
          LDK    E54         DRIVE ALTERNATE PORT ERROR
          UJN    PCER160
 PCER150  BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
 PCER160  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    H200        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    PCER170     IF ERROR FLAG WAS NOT SET
          LDML   RS+/RS/P.CR  CONTROL REGISTER
          SHN    5
          PJN    PCER170     IF TEST MODE NOT SET
          LDC    H00E1       READ STATUS REGISTER
          RJM    RDRG        READ REGISTER
          STDL   STATUS
 PCER170  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  CONTROLLER MICROCODE PART NUMBER
          STML   RS+/RS/P.MREVU
          LDML   /SS/P.MREV+1,CSST
          STML   RS+/RS/P.MREVL
          LDML   /SS/P.RQTRY,CSST
          STML   RS+/RS/P.RTRY  REQUEST RETRY COUNT
          RJM    SDA         SAVE DISK ADDRESS
          LDDL   CHAN
          STML   RS+/RS/P.CHAN  CHANNEL NUMBER
          RJM    SPA         SAVE PHYSICAL ADDRESS
          LDN    0
          STML   RS+/RS/P.ID
          UJK    PCERX
          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
          LDN    8
          STML   RS+/RS/P.RESPL  NORMAL RESPONSE LENGTH
          LDN    0
          STML   RS+/RS/P.DATERR  ABNORMAL STATUS WORD
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE WORD
          LDML   /SS/P.LU,CSST  LOGICAL UNIT
          LPC    0#FF
          LMC    /RS/K.SHORT  INDICATE ONE-WORD RESPONSE
          STML   RS+/RS/P.SHORT
          UJK    PDRX
          SPACE  5,20
** NAME-- PI
*
** PURPOSE-- PROCESS INTERRUPT
          SPACE  2
 PI       CON    0
          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 CONTROLLER
          RJM    STI         SET TABLE INDEXES
          LDDL   T6
          LPN    0#A
          ZJK    PI100       IF NOT SUCCESSFUL OR NOT CONDITIONAL SUCCESS
          LPN    2
 PI12     ZJK    PI20        IF SUCCESSFUL
          LDN    ID29
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PI14        IF ID29 NOT FOUND
          LDML   RPB+5,T3
          SHN    -8
          SBN    11
 PI14     MJK    PI20        IF BYTE CONTAINING CORRECTION BITS NOT PRESENT
          LDML   RPB+8,T3
          LPC    0#C0
          ZJN    PI12        IF NOT PARITY DRIVE CORRECTION
          LDML   RPB+OPCD
          SHN    -8
          SBN    0#10
          ZJN    PI16        IF READ
          SBN    0#10
          NJN    PI20        IF NOT WRITE
 PI16     BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
          LDC    RLIE
          STML   RS+/RS/P.RESPL  BYTE LENGTH OF RESPONSE
          LDC    0#8000
          STML   RS+/RS/P.RC  NORMAL RESPONSE
          LDN    E62         MEDIA ERROR
          STML   RS+/RS/P.ERRID
          LDML   /SS/P.RQTRY,CSST
          ZJN    PI19        MUST BE MICRCODE ERROR, DO NOT FLAW
          LDK    /RS/K.DATERR  SOFTWARE FLAW THE ALLOCATION UNIT
          STML   RS+/RS/P.DATERR
 PI19     LJM    TERM6       GO SEND RESPONSE AND DELINK THE REQUEST
 PI20     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
          STDL   FNC         0 IF READ, 1 IF WRITE
          LDDL   CH
          ZJN    PI50        IF 10 MB CHANNEL
          RJM    HST         HIGH SPEED TRANSFER (NO RETURN)
 PI50     BSS
          RJM    LST         LOW SPEED TRANSFER (NO RETURN)
 PI60     BSS
          RJM    DCM         DESELECT THE CONTROLLER
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJK    PI100       IF ASYNCH FOR CONTROLLER
          LDML   RPB+OPCD
          SHN    -8
          SBN    0#10
          ZJN    PI65        IF READ
          SBN    0#10
          NJN    PI70        IF NOT WRITE
 PI65     BSS
          RJM    STI         SET TABLE INDEXES
          LDDL   T6
          SHN    CS
          PJN    PI100       IF NOT CONDITIONAL SUCCESS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
          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
          UJN    PI75
 PI70     BSS
          RJM    DARH        DRIVE ASYNCHRONOUS RESPONSE HANDLER
 PI75     BSS                MUST BE TAG FOR FIRST LOCATION AFTER RJM DARH
          LJM    MAIN15
 PI100    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- PPRQ
*
** PURPOSE-- CHECK FOR ANY PP REQUESTS
          SPACE  2
 PPRQX    LJM    **
 PPRQ     EQU    *-1
          LCN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDC    0#7FFF
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDCL   T1          CLEAR ACTIVE CHECK BIT, READ PPIT WORD 1
          LDDL   T4
          LPC    0#6000
          ZJN    PPRQX       IF NOT IDLE OR RESUME
          LOADOVL IDRO       LOAD IDLE/RESUME OVERLAY
          RJM    PIR         PROCESS IDLE RESUME (NO RETURN)
          SPACE  5,20
** NAME-- RAUP
*
** PURPOSE-- RESTORE AFTER UNANTICIPATED PAUSE.  RESTORING THESE
*            LOCATIONS ALLOWS A READ TO BE RETRIED FOR THE SECTOR
*            THAT GOT THE UNANTICIPATED PAUSE.
          SPACE  2
 RAUPX    LJM    **
 RAUP     EQU    *-1
          LDML   BAT
          STML   CMLIST+/CM/P.RMA,CSST
          LDML   BAT+1
          STML   CMLIST+/CM/P.RMA+1,CSST
          LDML   BAT+2
          STML   CMLIST+/CM/P.LEN,CSST
          LDML   BAT+3
          STML   /SS/P.LISTL,CSST
          LDML   BAT+4
          STML   CM+/CM/P.RMA,CSST
          LDML   BAT+5
          STML   CM+/CM/P.RMA+1,CSST
          UJN    RAUPX
          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 THE
*                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 2ND 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/P.TOTAL,CSST  TOTAL SECTORS LEFT TO TRANSFER
          LPC    777B
          ZJN    RDWT80      IF UNEXPECTED RESPONSE
          LDN    0
          STDL   SECPOS      SET SECTOR POSITION = 0
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX  SET CURRENT CLOCK
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DEVICE TYPE
          LDDL   CH
          ZJN    RDWT40      IF 10 MB CHANNEL
          LDML   SIH,DT      SUSPEND INTERVAL
          UJN    RDWT50
 RDWT40   BSS
          LDML   SIL,DT      SUSPEND INTERVAL
 RDWT50   BSS
          STDL   SBS         SECTORS TO TRANSFER BEFORE SUSPENDING
          UJK    RDWX
 RDWT80   BSS
          LJM    TERM10
          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-- RESP
*
** PURPOSE-- WRITE STATUS BUFFER TO CM RESPONSE BUFFER.
          SPACE  2
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  2
 RESPX    LJM    **
 RESP     EQU    *-1

*         CHECK IF RESPONSE SHOULD BE SENT TO CM.

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

*         READ IN AND OUT POINTERS OF RESPONSE BUFFER.

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

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

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

*         WRITE RESPONSE TO CM.

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

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

*         CHECK IF RESPONSE SHOULD BE SENT TO CM.

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

*         UPDATE THE 'IN' POINTER.

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

*         INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   LPN-3       SET LAST BYTE NONZERO
 INTPRC   PSN    0           INTERRUPT OR PSN (MODIFIED)
          UJK    RESNX
          SPACE  5,20
** NAME-- SA
*
** PURPOSE-- SAVE ATTRIBUTES
          SPACE  2
 SAX      LJM    **
 SA       EQU    *-1
          LDC    H020A
          STML   CP+OPCD     SAVE ATTRIBUTES OPERATION CODE
          LDN    6           COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          UJN    SAX
          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
          LDML   UNITS,UX
          SHN    -5
          LPN    40B
          STDL   T2          COMPUTE OFFSET INTO UNIT COMMUNICATIONS BUFFER
          LOADF  T3          REFORMAT IT AND LOAD R REGISTER
          ADDL   T2          OFFSET, 0 OR 100(16) BYTES
          CWML   SSNR,WC     WRITE NON RESIDENT SS TABLE
          UJK    SAVX
          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
          SCN    0#E
          STML   /SS/P.CRN,CSST  CLEAR CARRY BIT
          LPN    1
          SHN    14
          ADDL   UX
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDC    H0931
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDDL   FNC
          ZJN    SCP20       IF READ
          SBN    1
          ZJN    SCP10       IF WRITE
          LDC    E501        INVALID COMMAND
          RJM    INTERR      REPORT ERROR (NO RETURN)
 SCP10    BSS
          LDC    H2005
          UJN    SCP30
 SCP20    BSS
          LDC    H1005
 SCP30    BSS
          RJM    SOU         SET OPERATION CODE AND UNIT
*         LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    SCP40       IF SECOND COMMAND
          LDML   /SS/P.TOTAL,CSST
          UJN    SCP50
 SCP40    BSS
          LDML   /SS/P.TW2,CSST
 SCP50    BSS
          SHN    2
          PJN    SCP70       IF NOT USING MASTER TERMINATE
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DEVICE TYPE
          LDN    0
          STDL   T3
          LDML   CP+FCP+4
          LPN    77B
          STDL   T1          STARTING SECTOR
          LDML   CP+FCP+4
          SHN    -8
          STDL   T2          STARTING TRACK
          LDML   SPT,DT      SECTORS PER TRACK
          SBDL   T1
 SCP60    BSS
          RADL   T3          COMPUTE SECTORS
          AODL   T2
          SBML   TPC,DT      TRACKS PER CYLINDER
          ZJN    SCP80       IF CALCULATION COMPLETE
          LDML   SPT,DT
          UJN    SCP60
 SCP70    BSS
          LDDL   TOTAL
          UJN    SCP90
 SCP80    BSS
          LDDL   T3
          SBML   SSPC,DT     SPARE SECTORS PER CYLINDER
 SCP90    BSS
          STML   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

*         MAKE THE CYLINDER NUMBER MATCH THE ONE IN THE REQUEST IF THE
*         DRIVE NEEDS INITIALIZED.

          LDML   RS+/RS/P.ERRID
          ADC    -E140
          MJN    SDA5        IF ERROR CODE NOT E140 OR E141
          SBN    E141-E140+1
          MJN    SDA20       IF ERROR CODE IS E140 OR E141
 SDA5     BSS
          LDML   /SS/P.CT,CSST
          ZJN    SDA10       IF CONFIDENCE TEST FAILURE
          LMN    4
          NJN    SDA20       IF NOT CONFIDENCE TEST FAILURE
 SDA10    BSS
          STML   RS+/RS/P.STRK  STARTING TRACK
          STML   RS+/RS/P.SSEC  STARTING SECTOR
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DEVICE TYPE
          LDML   CTC,DT      CONFIDENCE TEST CYLINDER
          STML   RS+/RS/P.SCYL  STARTING CYLINDER
          LDML   RS+/RS/P.ERRID
          ZJK    SDA50       IF RESPONSE PACKET PRESENT
          RJM    SSA         SET STARTING TRACK, SECTOR
          UJN    SDA30
 SDA20    BSS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJN    SDA25       IF NOT RESTORE
          LDML   RTM,CSST
          NJN    SDA25       IF NOT RESTORE
          STML   RS+/RS/P.STRK  SAVE STARTING AND FAILING ADDRESS
          STML   RS+/RS/P.SSEC
          STML   RS+/RS/P.FTRK
          STML   RS+/RS/P.FSEC
          LDML   CRC,CSST    CURRENT RESTORE CYLINDER
          STML   RS+/RS/P.SCYL
          UJN    SDA30
 SDA25    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    -E61
          MJN    SDA40       IF RESPONSE PACKET NOT PRESENT
          ADC    -E110+E61
          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
          UJK    SDA70
 SDA50    BSS
          LDN    ID29        DRIVE CONDITIONAL SUCCESS
          RJM    SFP         SEARCH FOR PARAMETER
          PJK    SDA54       IF ID 29 FOUND
          LDN    ID26
          RJM    SFP         SEARCH FOR PARAMETER
          MJK    SDA58       IF ID26 NOT FOUND
          LDML   RPB+5,T3
          SHN    -8
          SBN    17
          MJK    SDA58       IF NO COMMAND ENDING STATUS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJN    SDA53       IF NOT DOING RESTORE
          LDML   RTM,CSST
          NJN    SDA53       IF NOT DOING RESTORE
          LDML   /SS/P.RQTRY,CSST
          SBN    3
          NJN    SDA53       IF NOT TIME TO SKIP MEDIA ERROR
          LOADOVL ER1O       LOAD ERROR RECOVERY OVERLAY 1
          RJM    SMD         SKIP MEDIA DEFECT
          UJN    SDA80
 SDA53    BSS
          AODL   T3
 SDA54    BSS
          AODL   T3
          UJN    SDA60
 SDA58    BSS
          LDN    ID32        RESPONSE EXTENT
          RJM    SFP         SEARCH FOR PARAMETER
          MJK    SDA40       IF ID32 NOT FOUND
 SDA60    BSS
          LDML   RPB+9,T3
          SHN    2
          MJK    SDA40       IF NO ADDRESS PRESENT
          SHN    -10
          STML   RS+/RS/P.FTRK  FAILING TRACK
          LDML   RPB+9,T3
 SDA70    BSS
          LPC    0#FF
          STML   RS+/RS/P.FSEC  FAILING SECTOR
 SDA80    BSS
          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#3FFF
          LMC    0#8000      INDICATE ONE COMMAND ISSUED
          UJN    SEEK8
 SEEK4    BSS
          SHN    -/UN/L.CIP-2
          LPC    0#3FFF
          LMC    0#C000      INDICATE TWO COMMANDS ISSUED
 SEEK8    BSS
          STML   UNITS,UX
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          AODL   CMNDS       COMMAND ISSUED COUNTER
          RJM    CPT         COMMAND PACKET TRANSFER
 SEEK20   EQU    *-1         FOR FORCING ERRORS
          UJK    SEEKX
          SPACE  5,20
** NAME-- SFFMT
*
** PURPOSE-- SET THE FORCE FORMAT FLAG IN THE UNIT INTERFACE TABLE.
*
          SPACE  2
 SFFMTX   LJM    **
 SFFMT    EQU    *-1
 SFFMT10  BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    SFFMT10     IF LOCK COULD NOT BE SET
          LDK    /UIT/K.FRCFMT  SET FORCE FORMAT 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 FORCE FORMAT FLAG
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          UJK    SFFMTX
          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
*
** ENTRY
*         A = ID TO SEARCH FOR
** EXIT
*         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
*
** EXIT   P5, T8 ARE UNCHANGED
*         A = UNITS,UX
          SPACE  2
 SFRR100  BSS
          RJM    DUBC        DECREMENT UNITS BUSY COUNTER
 SFRRX    BSS
          LDN    0
          STML   /SS/P.RESET,CSST  CLEAR RESET ISSUED FLAG
          STDL   IF          CLEAR INITIALIZATION FLAG
          LDML   UNITS,UX
          LPC    0#3FFF
          STML   UNITS,UX    CLEAR COMMAND IN PROGRESS BITS
          LJM    **
 SFRR     EQU    *-1
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY

*         IF INITIALIZATION, FORMAT, OR CONFIDENCE TEST, COMMAND IN
*         PROGRESS CAN SET WITHOUT INCREMENTING CMNDS

          LDML   /SS/P.CT,CSST
          ZJN    SFRR100     IF ERROR DURING CONFIDENCE TEST
          LDML   /SS/P.RESET,CSST
          NJN    SFRR100     IF SLAVE RESET IN PROGRESS
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          PJN    SFRRX       IF NO COMMAND IN PROGRESS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJN    SFRR2       IF RESTORE NOT IN PROGRESS
          LDML   RTM,CSST
          ZJN    SFRR3       IF THIS COMMAND IS A RESTORE
          UJN    SFRR4
 SFRR2    BSS
          SHN    /UN/L.PDCE-/UN/L.RIP
          PJN    SFRR4       IF NOT ATTRIBUTE COMMAND
 SFRR3    BSS
          LJM    SFRR10
 SFRR4    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#BFFF
          STML   UNITS,UX    CLEAR -2 COMMANDS IN PROGRESS-
 SFRR5    BSS
          LDN    0
          STML   /SS/P.NCR,CSST  ZERO OUT NUMBER OF COMPLETED 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
          LDN    1           SO DCR DOES NO SEEK
          RJM    DCR         DELETE COMPLETED REQUESTS FROM QUEUE
          UJN    SFRR15
 SFRR10   BSS
          RJM    DUBC        DECREMENT UNIT BUSY COUNTER
          SODL   CMNDS       OUTSTANDING COMMANDS
 SFRR15   BSS
          LJM    SFRRX
          SPACE  5,20
** NAME-- SFUP
*
** PURPOSE-- SAVE FOR UNANTICIPATED PAUSE.  THE LOCATIONS SAVED
*            WILL ALLOW THE CODE TO BACK UP ONE SECTOR AFTER AN
*            UNANTICIPATED PAUSE.
          SPACE  2
 SFUPX    LJM    **
 SFUP     EQU    *-1
          LDDL   SECPOS
          NJN    SFUPX       IF NOT AT A SECTOR BOUNDARY
          LDML   CMLIST+/CM/P.RMA,CSST
          STML   BAT
          LDML   CMLIST+/CM/P.RMA+1,CSST
          STML   BAT+1
          LDML   CMLIST+/CM/P.LEN,CSST
          STML   BAT+2
          LDML   /SS/P.LISTL,CSST
          STML   BAT+3
          LDML   CM+/CM/P.RMA,CSST
          STML   BAT+4
          LDML   CM+/CM/P.RMA+1,CSST
          STML   BAT+5
          UJN    SFUPX
          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
 SNDW10   BSS
          RJM    RESP        SEND RESPONSE TO CM
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
          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
          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
          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
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
          LDC    RLIE
          STML   RS+/RS/P.RESPL  BYTE LENGTH OF RESPONSE
          LDN    R.UNS       UNSOLICITED MESSAGE
          STML   RS+/RS/P.RC  RESPONSE CODE
          RJM    RESP        SEND RESPONSE TO CM
          UJK    SNMSGX
          SPACE  5,20
** NAME-- SOU
*
** PURPOSE-- SET OPERATION CODE AND UNIT
*
** ENTRY  (A) = 1/UNIT TYPE, 17/OPERATION CODE
*
** EXIT   (A) = (UNITS,UX)
          SPACE  2
 SOUX     LJM    **
 SOU      EQU    *-1
          STML   CP+OPCD     OPERATION CODE
          MJN    SOU10       IF USING (PD) FOR THE DRIVE NUMBER
          LDML   /SS/P.UNIT,CSST
          UJN    SOU20
 SOU10    BSS
          LDDL   CMOD
          LPN    7           GET RID OF PORT NUMBER
          SHN    8
          ADDL   PD
 SOU20    BSS
          STML   CP+SLAD     ADDRESS FOR COMMAND PACKET
          LDML   UNITS,UX
          UJN    SOUX
          SPACE  5,20
** NAME-- SPA
*
** PURPOSE-- SAVE PHYSICAL ADDRESS.  IF THE FAILING LOGICAL UNIT CONSISTS
*            OF MULTIPLE PHYSICAL DRIVES, THE FAILING DRIVE NUMBER COULD BE
*            DIFFERENT THAN THE LOGICAL UNIT NUMBER.  THIS SAVES THE ADDRESS
*            OF THE FAILING PHYSICAL DRIVE.
*
** EXIT   FPD = FAILING PHYSICAL DRIVE
          SPACE  2
 SPAX     LJM    **
 SPA      EQU    *-1
          LCN    0
          STML   FPD         INDICATE NO FAILING PHYSICAL DRIVE
          LDML   UNITS,UX
          LPC    777B
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE NUMBER
          LDML   RS+/RS/P.ERRID
          ZJN    SPA10       IF DRIVE ERROR
          SBN    E54
          MJN    SPAX        IF NOT DRIVE ERROR (ERROR ID < 53)
          SBN    E62-E54
          MJN    SPA10       IF DRIVE ERROR (ERROR ID 54 - 61)
          SBN    E96-E62
          ZJN    SPA10       IF DRIVE ERROR (ERROR ID 96)
          SBN    E130-E96
          NJN    SPAX        IF NOT ERROR ID 130
 SPA10    BSS
          LDN    ID22
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    SPA20       IF ID22 FOUND
          LDN    ID23
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    SPA20       IF ID 23 FOUND
          LDN    ID29
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    SPA30       IF ID29 NOT FOUND
 SPA20    BSS
          LDML   RPB+5+3,T3  PHYSICAL DRIVE NUMBER IN BYTE 5
          UJN    SPA55
 SPA30    BSS
          LDN    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    SPA40       IF NOT ID24
          LDML   RPB+5,T3
          SHN    -8
          SBN    7
          MJK    SPA70       IF NO PHYSICAL DRIVE NUMBER
          LDML   RPB+5+3,T3  PHYSICAL DRIVE NUMBER IN BYTE 6
          UJN    SPA60
 SPA40    BSS
          LDN    ID25
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    SPA50       IF ID25 FOUND
          LDN    ID26
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    SPA70       IF ID26 NOT FOUND
          LDML   RPB+5,T3
          SHN    -8
          SBN    8
          MJN    SPA70       IF NO PHYSICAL DRIVE
 SPA50    BSS
          LDML   RPB+5+4,T3  PHYSICAL DRIVE IN BYTE 7
 SPA55    BSS
          SHN    -8
 SPA60    BSS
          LPC    0#FF
          STML   FPD         FAILING PHYSICAL DRIVE
          LMC    0#FE
          ZJN    SPA70       IF ERROR FOR LOGICAL UNIT
          LDML   UNITS,UX
          LPC    740B
          LMML   FPD
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE NUMBER
 SPA70    BSS
          LJM    SPAX
          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-- 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 ALREADY SELECTED
          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
          LDML   UNITS+/UN/P.UIT,UX  INITIALIZE DELINK POINTER TO FIRST REQUEST
          STML   /SS/P.DP,CSST
          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
 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
          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-- 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-- SSA
*
** PURPOSE-- SET STARTING ADDRESS FOR CONFIDENCE TEST
          SPACE  2
 SSAX     LJM    **
 SSA      EQU    *-1
          LDDL   DT
          SBN    2
          PJN    SSA10       IF NOT SSD
          LDML   TPC,DT
          SBN    1
          STML   /SS/P.CURTRK,CSST  CURRENT TRACK
          LDML   SPT,DT
          SBN    4
          UJN    SSA20
 SSA10    BSS
          LDN    0
          STML   /SS/P.CURTRK,CSST  CURRENT TRACK
 SSA20    BSS
          STML   /SS/P.CURSEC,CSST  CURRENT SECTOR
          UJK    SSAX
          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
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LDML   /SS/P.UNIT,CSST
          LMML   RPB+SLAD
          ZJK    STIX        IF CORRECT UNIT
          LJM    TERM10
          SPACE  5,20
** NAME-- TERM
*
** PURPOSE-- TERMINATE UNIT REQUEST.
          SPACE  2
 TERM     CON    0
          LDML   RPB+OPCD
          ADC    -H0202
          NJN    TERM2       IF NOT RESTORE ATTRIBUTE COMMAND
          LDML   UNITS,UX
          SHN    /UN/L.PDCE+2
          PJN    TERM10      IF ATTRIBUTE RESPONSE NOT EXPECTED
          UJK    TERM60
 TERM2    BSS
          ADC    H0202-0#E005
          NJN    TERM5       IF NOT RESTORE COMMAND
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          PJN    TERM10      IF RESTORE RESPONSE NOT EXPECTED
          UJK    TERM40
 TERM5    BSS
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
 TERM6    BSS
          LDML   /SS/P.TOTAL,CSST  MAKE SURE ALL BYTES WERE TRANSFERRED
          LPC    777B
          ADML   /SS/P.LISTL,CSST
          ADML   /SS/P.NUMCM,CSST
          ZJN    TERM20      IF TERMINATION IS OK
 TERM10   BSS
          LDK    E76         UNEXPECTED RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 TERM20   BSS
          RJM    SNDWRS      SEND WRITE RESPONSES
          RJM    RESP        SEND RESPONSE TO CPU
          LDML   UNITS,UX
          LPC    0#800       RESTORE IN PROGESS BIT
          RJM    DCR         DELETE COMPLETED REQUEST FROM QUEUE
          LDN    0
          STML   /SS/P.RQTRY,CSST  CLEAR RETRY COUNT
          STML   /SS/P.RECOV,CSST  SO SPIN UP CAN OCCUR IN ROUTINE COD
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          MJN    TERM30      IF COMMAND IN PROGRESS
          SHN    /UN/L.RIP-/UN/L.CIP
          PJN    TERM25      IF RESTORE NOT IN PROGRESS
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          SOML   RTM,CSST    UPDATE COUNT OF REQUESTS TO MULTIPLEX
          LDN    0
          STML   /SS/P.REQ,CSST  SO SR ROUTINE STARTS AT BEGINNING OF QUEUE
          STML   /SS/P.REQ+1,CSST
          UJN    TERM30
 TERM25   BSS
          RJM    UUT         UNLOCK UNIT TABLE
 TERM30   BSS
          LJM    MAIN20
 TERM40   BSS
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DRIVE TYPE
          LDN    0
          STML   /SS/P.CRTS,CSST  SET CURRENT RESTORE TRACK, SECTOR
          AOML   CRC,CSST    INCREMENT CURRENT RESTORE CYLINDER
          SBML   CTC,DT
          MJN    TERM50      IF MORE CYLINDERS TO RESTORE
          ZJN    TERM50      IF MORE CYLINDERS TO RESTORE
          LDC    /UIT/K.PARPRO+DRNUM  PARITY PROTECTION ENABLED
          RJM    UPPS        UPDATE PARITY PROTECTION STATUS
          LDN    E56         RESTORE COMPLETE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   UNITS,UX
          LPC    740B
          ADML   ODN,CSST
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          LDML   UNITS,UX
          LPC    0#F7FF
          STML   UNITS,UX    CLEAR RESTORE IN PROGRESS
          RJM    UUT         UNLOCK UNIT TABLE
 TERM50   BSS
          LDN    5
          STML   RTM,CSST    REQUESTS TO MULTIPLEX
 TERM60   BSS
          LDML   UNITS,UX    CLEAR COMMAND IN PROGRESS, CLEAR PDCE
          LPC    0#DFF
          STML   UNITS,UX
          RJM    DUBC        DECREMENT UNIT BUSY COUNTER
          SODL   CMNDS       COMMANDS ISSUED COUNTER
          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
          SPACE  2
 UBT20    BSS
          RJM    UNCMND      GET NEXT COMMAND
 UBTX     LJM    **
 UBT      EQU    *-1
          LDDL   BC          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    UBTX        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
          UJN    UBTX
          SPACE  5,20
** NAME-- UC
*
** PURPOSE-- UPDATE CLOCK.  THE CLOCK IS USED TO TIMEOUT COMMANDS
*            ISSUED TO THE CONTROLLER.
          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     BSS
          SOML   /SS/P.TOTAL,CSST  SECTORS TO TRANSFER
          LJM    **
 UDA      EQU    *-1
          AOML   /SS/P.CURSEC,CSST  INCREMENT SECTOR
          SBML   SPT,DT      SECTORS PER TRACK
          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 CENTRAL MEMORY.
*
** 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-- UPPS
*
** PURPOSE-- UPDATE PARITY PROTECTION STATUS TO UIT.
*
*
          SPACE  2
 UPPSX    LJM    **
 UPPS     EQU    *-1
          STDL   T1          NEW STATUS
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          STDL   T2
          CRDL   T5          READ UNIT INTERFACE TABLE
          LDDL   T5+/UIT/P.PARPRO
          LPC    -/UIT/K.PBITS MASK OUT OLD PARITY PROTECTION STATUS
          ADDL   T1          NEW PARITY PROTECTION STATUS
          STDL   T5+/UIT/P.PARPRO
          LDDL   T2
          LMC    400000B
          CWDL   T5          REWRITE UPDATED PARITY PROTECTION STATUS
          UJK    UPPSX
          SPACE  5,20
** NAME-- UREQ
*
** PURPOSE-- READ A REQUEST FROM CM.  THE REQUEST IS READ WITH 2
*            3-WORD INPUTS SO THAT THE RMA WILL BE CORRECT IF THE
*            STREAM BIT IS SET.  ROUTINE GETR DOES NOT LOCK THE
*            QUEUE FOR PERFORMANCE REASONS, SO THE CP AND PP COULD
*            BE CHANGING THE QUEUE AT THE SAME TIME.
*
** ENTRY  CSST = POINTER TO SS TABLE
*
** EXIT   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
          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-- UUT
*
** PURPOSE-- UNLOCK UNIT TABLE
          SPACE  2
 UUTX     LJM    **
 UUT      EQU    *-1
          LDN    0
          STDL   T1
          STDL   T4
          STML   /SS/P.REQ,CSST
          STML   /SS/P.REQ+1,CSST  SO SR ROUTINE STARTS AT BEGINNING OF QUEUE
          LCN    0
          STDL   T2
          STDL   T3
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.ULOCK  INDEX TO LOCKWORD
          RDCL   T1          CLEAR THE LOCK
          UJN    UUTX
          SPACE  5,20
** NAME-- VRP
*
** PURPOSE-- VERIFY RESPONSE PACKET
*
** EXIT-- TO CALLER IF 2ND, 3RD, AND 4TH WORDS OF RESPONSE CORRECT
          SPACE  2
 VRPX     LJM    **
 VRP      EQU    *-1
          LDML   RPB+CRN
          LMML   CP+CRN
          NJN    VRP10       IF COMMAND REFERENCE NUMBER WRONG
          LDML   RPB+OPCD
          LMML   CP+OPCD
          NJN    VRP10       IF OPERATION CODE WRONG
          LDML   RPB+SLAD
          LMML   CP+SLAD
          ZJN    VRPX        IF SLAVE ADDRESS CORRECT
 VRP10    BSS
          LDK    E76         UNEXPECTED RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          TITLE  IPI CHANNEL SUBROUTINES
** NAME-- BCS
*
** PURPOSE-- PERFORM BUS CONTROL SEQUENCE
*
** ENTRY
*         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     BSS
          FJM    BCS8,DC     IF SYNC IN
          SBN    1
          NJN    BCS4        IF TIMEOUT NOT EXPIRED
          LDN    E22         NO SYNC IN
          UJN    BCS20
 BCS8     BSS
          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    BSS
          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    EP          ERROR PROCESSING (NO RETURN)
 BCS25    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,15
** NAME-- CPT
*
** PURPOSE-- COMMAND PACKET TRANSFER
*
** ENTRY
*         CP - STARTING ADDRESS OF COMMAND PACKET
          SPACE  2
 CPT30    BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROLLER
          LDDL   WC
          ZJN    CPTX        IF ALL WORDS TRANSFERRED
          LDN    E29         INCOMPLETE TRANSFER
          UJK    CPT10
 CPTX     LJM    **
 CPT      EQU    *-1
          RJM    SEL         SELECT THE CONTROLLER
          LDN    CMDOUT      BUS A FOR COMMAND
          RJM    BCS         BUS CONTROL SEQUENCE
          LDDL   MFID        MASK FOR INTERLOCK DATA
          LPC    0#200
          LMC    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    EP          ERROR PROCESSING (NO RETURN)

          IFEQ   FE,1
 CPTAX    LJM    **
 CPTA     EQU    *-1
          RJM    CPT         COMMAND PACKET TRANSFER
 CPTA10   EQU    *-1
          UJN    CPTAX
 CPTBX    LJM    **
 CPTB     EQU    *-1
          RJM    CPT         COMMAND PACKET TRANSFER
 CPTB10   EQU    *-1
          UJN    CPTBX
          ENDIF
          SPACE  5,20
** NAME-- DCM
*
** PURPOSE-- DESELECT THE CONTROLLER
          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    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    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,20
** NAME-- DCW
*
** PURPOSE-- DISCARD CHANNEL WORD
          SPACE  2
 DCWX     LJM    **
 DCW      EQU    *-1
          EJM    DCWX,DC     IF NO WORD PRESENT
          IAN    DC          INPUT CHANNEL WORD
          UJN    DCWX
          SPACE  5,20
** NAME-- DTM
*
** PURPOSE-- DETERMINE TRANSFER MODE
*
** EXIT
*         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        CONTROLLER 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     BSS
          IAN    DC
          STDL   STATUS      SAVE TRANSFER SETTING
          SFM    DTM20,DC    IF ERROR FLAG SET
          LPN    0#10
          LMN    0#10
          SHN    5
          LMDL   MFID        MASK FOR INTERLOCK DATA
          LPC    0#200
          SHN    2
          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    EP          ERROR PROCESSING (NO RETURN)
 DTM20    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EI
*
** PURPOSE-- ENABLE INTERRUPT FROM CONTROLLER.  SINCE IT TAKES UP TO
*            20 MICROSECONDS FOR THE CONTROLLER TO PUT ITS INTERRUPT
*            ON THE BUS, THE ENABLE IS DONE HERE AND THE READ
*            IS DONE IN GETU
          SPACE  2
 EIX      LJM    **
 EI       EQU    *-1
          LDDL   UNUML
          ZJN    EIX         IF NO UNITS
          IFEQ   FE,0
          LDDL   PORTA
          ZJN    EI10
          ENDIF
          LDML   PAS,CH      SELECT PORT A
          IFEQ   FE,0
          UJN    EI20
 EI10     LDML   PBS,CH      SELECT PORT B
          ENDIF
 EI20     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.
          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
*
** ENTRY-- 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
          IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE
          LDN    E01         FUNCTION TIMEOUT
          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
** EXIT
*         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
 GES5     BSS
          FJM    GES10,DC    IF SLAVE IN SET
          SBN    1
          NJN    GES5        IF TIMEOUT NOT EXPIRED
          LDN    E27         SLAVE IN NOT SET
          RJM    EP          ERROR PROCESSING (NO RETURN)
 GES10    BSS
          IAN    DC
          STDL   STATUS      SAVE ENDING STATUS
          SFM    GES20,DC    IF ERROR FLAG SET
          SHN    17-7
          MJN    GESX        IF SUCCESSFUL
          LOADOVL ER1O       LOAD ERROR RECOVERY OVERLAY NUMBER 1
          RJM    IEE         ISOLATE ENDING STATUS ERRORS (NO RETURN)
 GES20    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- ID
*
** PURPOSE-- INPUT DATA
          SPACE  2
 IDX      LJM    **
 ID       EQU    *-1
          ACN    DC
          IAM    IB,DC
          UJN    IDX
          SPACE  5,20
** NAME-- IR
*
** PURPOSE-- ISSUE INTERFACE RESET TO CONTROLLER
*
** ENTRY
*         A = 8215  FOR LOGICAL INTERFACE RESET
*             8415  FOR SLAVE RESET
*         CMOD = CONTROLLER NUMBER
          SPACE  2
 IRX      LJM    **
 IR       EQU    *-1
          STDL   P2
          RJM    MCC         MASTER CLEAR CHANNEL
          RJM    PS          PORT SELECT
          LDDL   CMOD        CONTROLLER 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-- LTR
*
** PURPOSE-- LOAD T REGISTERS
*
** ENTRY  A = 0C00 FOR READ OR 0D00 FOR WRITE
          SPACE  2
 LTRX     LJM    **
 LTR      EQU    *-1
          RJM    FUNC        SEND FUNCTION
          ACN    DC
          LDN    3
          OAM    BC,DC       BYTE COUNT, RMA
          RJM    DCN         DISCONNECT THE CHANNEL
          UJN    LTRX
          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    MASTER CLEAR DOES NOT CLEAR ERROR FLAG ON 25 MB CHANNEL
 MCC10    BSS
          LDN    H0000       MASTER CLEAR CHANNEL
          RJM    FUNC         IN CASE SEQUENCE ERROR OCCURRED
          RJM    DCT         DETERMINE CHANNEL TYPE
          LDML   TR,CH
          RJM    FUNC        SET IPI CHANNEL TRANSFER RATE
          LDC    H0300
          STDL   T2          WRITE CONTROL REGISTER FUNCTION
          LDML   EDC,CH      ENABLE DOUBLE CMI SLOT IF 25 MB CHANNEL
          RJM    WR          WRITE REGISTER
          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
          LDML   PAS,CH
          RJM    FUNC        SELECT PORT A
          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
          LDML   PBS,CH
          RJM    FUNC        SELECT PORT B
          UJN    MR10
          SPACE  5,20
** NAME-- OD
*
** PURPOSE-- OUTPUT DATA
          SPACE  2
 ODX      LJM    **
 OD       EQU    *-1
          ACN    DC
          OAM    OB,DC
          UJN    ODX
          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    /UN/L.PORT+2
          PJN    PS5         IF PORT A
          LDML   PBS,CH      PORT B SELECT
          UJN    PS10
 PS5      BSS
          LDML   PAS,CH      PORT A SELECT
 PS10     BSS
          RJM    FUNC
          UJN    PSX
          SPACE  5,20
** NAME-- RDRG
*
** PURPOSE-- READ REGISTER
*
** ENTRY--  A = FUNCTION CODE
          SPACE  2
 RDRG10   BSS
          LDN    0
 RDRGX    LJM    **
 RDRG     EQU    *-1
          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--RI
*
** PURPOSE-- REQUEST INTERRUPTS FROM THE CONTROLLER
*
** EXIT
*         STATUS - CONTAINS BIT SIGNIFICANT ADDRESS OF CONTROLLER WITH INTERRUPT
          SPACE  2
 RIX      LJM    **
 RI       EQU    *-1
          RJM    PPRQ        CHECK FOR IDLE REQUEST
          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    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- ROS
*
** PURPOSE-- READ OPERATIONAL STATUS
          SPACE  2
 ROSX     LJM    **
 ROS      EQU    *-1
          LDC    H0700       READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          EJM    ROS10,DC    IF ERROR
          IAN    DC
          STDL   OS          SAVE OPERATIONAL STATUS
          UJN    ROSX
 ROS10    BSS
          LDN    E02         CHANNEL EMPTY WHEN ACTIVATED
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RPT
*
** PURPOSE-- RESPONSE PACKET TRANSFER
*
** EXIT
*         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    EP          ERROR PROCESSING (NO RETURN)
 RPTX     LJM    **
 RPT      EQU    *-1
          LDN    RSPIN       BUS A FOR RESPONSE
          RJM    BCS         BUS CONTROL SEQUENCE
          LDDL   MFID        MASK FOR INTERLOCK DATA
          LPC    0#200
          LMC    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
          LPN    77B         PROTECT AGAINST ILLEGAL RESPONSE LENGTH
          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    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- SEL
*
** PURPOSE-- SELECT THE CONTROLLER AND VERIFY THE BIT SIGNIFICANT
*            RESPONSE
*
** ENTRY
*         CMOD - CONTROLLER NUMBER
*         CTM - CHANGE TRANSFER MODE IF BIT 3 SET
*
** EXIT   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     BSS
          FJM    SEL8,DC     IF SLAVE IN
          SBN    1
          NJN    SEL4        IF TIMEOUT NOT EXPIRED
          LDN    E20         CAN'T SELECT CONTROLLER
          UJN    SEL15
 SEL8     BSS
          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    EP          ERROR PROCESSING (NO RETURN)
 SELT     BSS
          DATA   1,2,4,8     CONTROLLERS ON PORT A
          DATA   16,32,64,128
          DATA   1,2,4,8     CONTROLLERS ON PORT B
          DATA   16,32,64,128
          SPACE  5,20
** NAME-- SIS
*
** PURPOSE-- SAVE INTERRUPT STATUS
          SPACE  2
 SISX     LJM    **
 SIS      EQU    *-1
          LDN    0
          IFEQ   FE,0
          STDL   STATUS+1    ZERO OUT B-BUS STATUS
          ENDIF
          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
          IFEQ   FE,0
          LDDL   PORTA
          NJN    SIS20       PORT-A IS IN USE
          LDDL   STATUS      IT WAS PORT-B, MOVE STATUS TO PROPER PLACE
          STDL   STATUS+1
          LDN    0
          STDL   STATUS
          UJN    SISX        NO OTHER PORTS USED
 SIS20    LDDL   PORTB
          UJN    SISX        PORT-B IS NOT USED
          ENDIF
          LDML   PBS,CH
          RJM    FAN         PORT B SELECT
          LDC    H0715
          RJM    FAN         REQUEST CLASS 1, 2, OR 3 INTERRUPT
          PAUSE  5           ALLOW CONTROLLER TIME TO PUT ITS ADDRESS ON THE
                              BUS IF IT HAS AN INTERRUPT
          AJM    SIS30,DC    IF NO FUNCTION REPLY
          ACN    DC+40B
          EJM    SIS30,DC    IF CHANNEL NOT FULL
          IAN    DC
 SIS30    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
          RJM    ROS         READ 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
          RJM    EP          ERROR PROCESSING (NO RETURN)
 TMT40    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- WFC
*
** PURPOSE-- WAIT FOR COMPLETION.
*
** EXIT   TO CALLING ROUTINE IF NO ERROR WITH
*         A = 0  IF ENTRY CONDITION MET
*         OS =  OPERATIONAL STATUS
          SPACE  2
 WFCX     BSS
          SFM    WFC30,DC    IF ERROR FLAG SET
          LJM    **
 WFC      EQU    *-1
          LDC    6400
          STDL   T8          T8 CONTROLS THE TIMEOUT
 WFC10    BSS
          RJM    ROS         READ OPERATIONAL STATUS
          LPN    1
          ZJK    WFCX        IF TRANSFER COMPLETE
          SODL   T8
          NJN    WFC10       IF TIMEOUT NOT EXPIRED
          LDC    H0A00       READ T REGISTER
          RJM    RDRG        READ REGISTER
          SHN    -1
          STDL   WC          SAVE WORD COUNT

*         FOR THE CASE OF A 0-WORD TRANSFER, THE CONTROLLER DOES NOT READ
*         ENDING STATUS.  CLEAR THE T REGISTER SO HARDWARE WILL READ ENDING
*         STATUS.

          LDC    0#E00       CLEAR T REGISTER FUNCTION
          RJM    FUNC        SEND FUNCTION
          PAUSE  25          ALLOW TIME FOR ENDING STATUS SEQUENCE TO COMPLETE
          RJM    ROS         READ OPERATIONAL STATUS
          LDC    H0800       DMA TERMINATE FUNCTION
          RJM    FAN         SEND THE FUNCTION
          SFM    WFC30,DC    IF ERROR FLAG SET
          LDC    H00E1       READ STATUS REGISTER FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   STATUS
          LDDL   OS          OPERATIONAL STATUS
          LPN    20B
          NJN    WFC20       IF PAUSE
 WFC15    LDN    E29         INCOMPLETE TRANSFER
          RJM    EP          ERROR PROCESSING (NO RETURN)
*
*         AFTER THE CONTROLLER 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.  IT MAY ALSO SEND
*         AN ENDING STATUS OF A0 OR B0.  THIS INDICATES PAUSE AND THE CONTROLLER
*         WANTS TO RESEND THE SAME SECTOR.
*
 WFC20    BSS
          LDC    H0041       READ BUS B FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   STATUS
          LPN    60B
          LMN    20B
          ZJN    WFC25       IF NO MORE DATA
          LDDL   FNC
          NJN    WFC15       IF NOT READ
          RJM    RAUP        RESTORE AFTER UNANTICIPATED PAUSE
          UJN    WFC28
 WFC25    BSS
          LCN    0
          STML   /SS/P.LISTL,CSST  TO GUARANTEE AN ERROR IS REPORTED
          LDN    0
          STML   /SS/P.TOTAL,CSST  TO GUARANTEE AN ERROR IS REPORTED
 WFC28    BSS
          LDN    1
          LJM    WFCX
 WFC30    BSS
          LOADOVL ER1O       LOAD ERROR RECOVERY OVERLAY NUMBER 1
          RJM    EFH         ERROR FLAG HANDLING (NO RETURN)
          SPACE  5,20
** NAME-- WFI
*
** PURPOSE-- WAIT FOR INACTIVE
          SPACE  2
 WFIX     LJM    **
 WFI      EQU    *-1
 WFI10    BSS
          IJM    WFIX,DC     IF SLAVE IN DROPPED
          SBN    1
          NJN    WFI10       IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- WFTC
*
** PURPOSE-- WAIT FOR TRANSFER COMPLETE
*
** EXIT-- TO CALLING ROUTINE WITH
*          A = 1  IF TRANSFER COMPLETE
*          A = 0  IF ERROR WHICH REQUIRES RESPONSE TO BE READ OR PAUSE
*          T3 = 0  IF NO REQUEST SWITCH
          SPACE  2
 WFTC100  BSS
          STDL   SECPOS      SECTOR POSITION = 0
          SODL   SBS         SECTORS BEFORE SUSPENDING
          LDDL   T2
          RJM    GES         GET ENDING STATUS
          LDN    1
 WFTCX    LJM    **
 WFTC     EQU    *-1
          LDN    0
          STDL   T2          RIGHT MOST 4 BITS OF MASTER STATUS
          STDL   T3          INDICATE NO REQUEST SWITCH
          LDC    6400
          STDL   T8          T8 CONTROLS THE TIMEOUT
          LDML   /SS/P.TOTAL,CSST
          SHN    2
          PJK    WFTC11      IF NOT USING MASTER TERMINATE
          SHN    -2
          LPC    777B
          SBN    1
          NJN    WFTC11      IF NOT LAST SECTOR OF REQUEST
          LOADF  /SS/P.REQ,CSST
          ADN    /RQ/C.SWIT
          CRDL   T4          READ STREAM BIT IN REQUEST
          LDDL   T4
          SHN    2
          MJN    WFTC7       IF CONCATENATED REQUEST
          LDN    0#A
          STDL   T2          RIGHT MOST 4 BITS OF MASTER STATUS
          UJN    WFTC11
 WFTC7    BSS
          LDN    2
          STDL   T1          WORDS TO READ
          STDL   T3          INDICATE REQUEST SWITCH
          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
          RJM    ROS         READ 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
          LDDL   FNC
          NJN    WFTC35      IF NOT READ
          LDDL   STATUS
          LPN    60B
          ZJN    WFTC35      IF NOT PAUSE
          RJM    RAUP        RESTORE AFTER UNANTICIPATED PAUSE
          UJN    WFTC70
 WFTC35   BSS
          LDN    E29         INCOMPLETE TRANSFER
 WFTC45   BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
 WFTC60   BSS
*
*         THE CONTROLLER MAY DROP SLAVE IN ANYTIME DURING THE TRANSFER AND
*         RETURN 90 HEX AS ENDING STATUS.  THIS INDICATES COMMAND COMPLETE.
*         THE RESPONSE PACKET SHOULD REPORT AN ERROR.
*
          LCN    0
          STML   /SS/P.LISTL,CSST  TO GUARANTEE AN ERROR IS REPORTED
          LDN    0
          STML   /SS/P.TOTAL,CSST  TO GUARANTEE AN ERROR IS REPORTED
 WFTC70   BSS
          RJM    MCC         DESELECT, CLEAR T REGISTERS
          LDN    0
          LJM    WFTCX
          SPACE  5,20
** NAME-- WFTE
*
** PURPOSE-- WAIT FOR T PRIME REGISTER EMPTY
*
** EXIT - (A) .NE. 0 IF T PRIME REGISTER GOES EMPTY
          SPACE  2
 WFTEX    LJM    **
 WFTE     EQU    *-1
          LDC    6666
          STDL   T8          T8 CONTROLS THE TIMEOUT
 WFTE10   BSS
          RJM    ROS         READ OPERATIONAL STATUS
          LPN    2
          NJN    WFTEX       IF T PRIME REGISTER EMPTY
          SODL   T8
          NJN    WFTE10      IF TIMEOUT NOT EXPIRED
          UJN    WFTEX
          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        WRITE OPERAND REGISTER
 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  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

*         THE FOLLOWING TABLE OF VALUES IS NEEDED TO SUPPORT ALTERNATE
*         ACCESS TO THE DRIVES.

 PSB      BSS    0           PATH STRINGS BUSY.  INCREMENTED WHEN UPSB GOES
                              FROM 0 TO 1.  DECREMENTED WHEN UPSB GOES FROM 1
                              TO 0.
 APSB     EQU    PSB+1       ALTERNATE PATH STRINGS BUSY.  INCREMENTED WHEN
                              UPASB GOES FROM 0 TO 1.  DECREMENTED WHEN UPASB
                              GOES FROM 1 TO 0.
 UPSB     EQU    APSB+1      UNITS PER STRING BUSY.  INCREMENTED WHEN THE FIRST
                              SEEK TO A UNIT IS ISSUED.  DECREMENTED WHEN ALL
                              COMMANDS FOR A UNIT HAVE COMPLETED.
                                 WORD 0  PORT 0  CONTROLLER 0  STRING 0
                                      1       0             0         1
                                      2       0             0         2
                                      3       0             0         3
                                      4       0             1         0
                                      5       0             1         1
                                      .       .             .         .
                                      .       .             .         .
                                      .       .             .         .
                                     63       1             7         3
 UPSBL    EQU    64          UPSB TABLE LENGTH
 UPASB    EQU    UPSB+UPSBL  UNITS PER ALTERNATE STRING BUSY.  INCREMENTED IF
                              LOCAL TABLE SAYS NO SEEK ISSUED AND ALGORITHM
                              DETERMINES ALTERNATE PP SHOULD OR HAS ISSUED THE
                              SEEK.  DECREMENTED IF LOCAL TABLE SAYS ALTERNATE
                              PATH ISSUED SEEK AND UNIT NOT LOCKED.
 UPASBL   EQU    64          UPASB TABLE LENGTH
 UNUM     EQU    64          SUPPORT 64 UNITS
 UNITS    EQU    UPASB+UPASBL  START OF UNITS TABLE
 UNITSL   EQU    UNUM*P.UN   LENGTH OF UNITS TABLES
 SS       EQU    UNITS+UNITSL  START OF SS TABLE
 NSS      EQU    RS-SS       LOCATIONS AVAILABLE FOR SS TABLES
 NSST     EQU    NSS/P.SS    NUMBER OF SS TABLES
 RSST     EQU    NSST-1      RESIDENT SS TABLES
 RSSTL    EQU    RSST*P.SS   LENGTH OF RESIDENT SS TABLES
 SSNR     EQU    SS+RSSTL    CHANGEABLE SS TABLE


          ERRMI  NSST-1      IF NO ROOM FOR SS TABLES
          SPACE  5,20
** NAME-- INIT
*
** PURPOSE-- REFORMAT AND SAVE ADDRESS OF PPIT AND OVERLAY
*            DIRECTORY.  THIS CODE MAY BE OVERLAYED AFTER IT
*            IS EXECUTED.
          SPACE  2
 INIT     BSS
          REFAD  DSRTP,CM.PIT  REFORMAT ADDRESS OF PP INTERFACE TABLE
                                AND SAVE IN CM.PIT
          ADN    /PIT/C.CBUF
          CRDL   P1          READ RMA OF PP COMMUNICATIONS BUFFER
          LOADF  P3          REFORMAT ADDRESS OF COMMUNICATIONS BUFFER
          ADN    /CB/C.ODP
          CRDL   T1          READ RMA OF OVERLAY DIRECTORY
          REFAD  T3,DH       REFORMAT ADDRESS OF OVERLAY DIRECTORY
                              AND SAVE AT DH
          LJM    MAIN
          OVERLAY (CHECK DRIVE),OVST
          ROUTINE CDO        CHECK DRIVE OVERLAY
** NAME-- ALN
*
** PURPOSE-- ADD LOGICAL PP NUMBER TO UNIT INTERFACE TABLE LOCKWORD.
*            IT IS USED TO DETERMINE IF THE DRIVE IS BEING SUPPORTED
*            IN ALTERNATE OR REDUNDANT ACCESS MODE.
*
** ENTRY
*         UNIT MUST BE LOCKED
          SPACE  2
 ALNX     LJM    **
 ALN      EQU    *-1
          RJM    LUT         LOAD R REGISTER FOR UNIT INTERFACE TABLE
          LDDL   T6          INDEX TO LOCKWORD
          LMC    400000B
          CRDL   T1          READ LOCKWORD
          LDDL   T2
          NJN    ALN10       IF PP NUMBER PRESENT
          LDDL   T3
          LMDL   LPN
          ZJN    ALNX        IF PP NUMBER ALREADY IN LOCKWORD
          LDDL   LPN
          STDL   T2
          UJN    ALN20
 ALN10    BSS
          LMDL   LPN
          ZJN    ALNX        IF PP NUMBER ALREADY IN LOCKWORD
          LDDL   T3
          NJN    ALN30       IF 2ND PP NUMBER PRESENT
          LDDL   LPN
          STDL   T3
 ALN20    BSS
          LDDL   T6
          LMC    400000B
          CWDL   T1
          UJK    ALNX
 ALN30    BSS
          LMDL   LPN
          ZJN    ALNX        IF PP NUMBER ALREADY IN LOCKWORD
          LDC    E505        CM HAS CHANGED
          RJM    INTERR      REPORT ERROR (NO RETURN)
          SPACE  5,20
** NAME-- CD
*
** PURPOSE-- CHECK DRIVE.  CHECK TO SEE IF THE DRIVE IS CLUSTERED AND
*            FORMATTED TO MATCH THE EXPECTED DRIVE TYPE.  IF THE COMMAND
*            IS FORMAT, FORMAT AND CLUSTER THE DRIVE.  IF A DRIVE OF A
*            PARITY UNIT IS OFF LINED, ISSUE A SPIN UP DRIVE COMMAND TO
*            DETERMINE IF THE DRIVE IS USEABLE, FORMAT THE OFF LINED DRIVE
*            IF NECESSARY, AND SET FLAG BITS TO INITIATE A RESTORE OF 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 RECEIVED
*         A RESUME.  ALSO, FROM GETU IF A REQUEST IS PRESENT AND THE CAUSE
*         OF AN ERROR MUST BE ISOLATED BETWEEN MEDIA AND OTHER.
*
** EXIT   A NONZERO IF ERROR OR DRIVE OFF LINED
          SPACE  2
 CDX      LJM    **
 CD       EQU    *-1
          RJM    ALN         ADD LOGICAL PP NUMBER TO LOCKWORD
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DEVICE TYPE

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

          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

*         IF THE LOGICAL UNIT HAS PARALLEL DATA DRIVES, ENSURE THAT THE
*         CONTROLLER SUPPORTS PARALLEL MODE.

 CD20     BSS
          LDML   DD,DT       DATA DRIVES PER LOGICAL UNIT
          SBN    1
          ZJN    CD30        IF THIS DRIVE WILL WORK IN SERIAL MODE
          LDC    H0200       REPORT ATTRIBUTE OPERATION CODE
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
*         LDC    0#36C
          STML   CP+FCP
          LDC    0#80DA
          STML   CP+FCP+1    REPORT PARAMETER DA
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   RPB+8+1
          SHN    9
          MJN    CD30        IF CONTROLLER SUPPORTS PARALLEL DRIVES
          LDC    E142        CONTROLLER DOES NOT SUPPORT PARALLEL
          LJM    CD75

*         ENSURE MODEL NUMBER OF DRIVE IS CORRECT.  IF THE DRIVE IS 5833_1P OR
*         5833_3P AND THE DRIVE IS OFF LINED, IT MAY BE NECESSARY TO OBTAIN THE
*         MODEL NUMBER FROM THE SECOND DRIVE.

 CD30     BSS
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
          RJM    DDT         DETERMINE DRIVE TYPE
          PJN    CD35        IF DRIVE DEFINED IN ATTRIBUTE 68
 CD32     BSS
          LDN    1
          UJK    CDX
 CD35     BSS
          LDC    H0200
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#36C
          STML   CP+FCP
          LDC    0#8050
          STML   CP+FCP+1
          LDML   TD          TOTAL DRIVES
          LMN    1
          ZJN    CD37        IF SINGLE DRIVE
          LDML   CP+SLAD
          SCN    0#38
          STML   CP+SLAD     ENSURE STRING BIT CLEAR
 CD37     BSS
          LDK    77
          STDL   T1
 CD38     BSS
          STML   RPB-1,T1    INITIALIZE RESPONSE BUFFER
          SODL   T1
          NJN    CD38        IF MORE WORDS TO INITIALIZE
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   TD
          STDL   T1
          LDN    0
          STDL   T2
 CD39     BSS
          LDML   RPB+8+26,T2
          NJN    CD40        IF MODEL NUMBER PRESENT
          SODL   T1
          ZJN    CD50        IF NO MODEL NUMBER
          LDN    12
          RADL   T2
          UJN    CD39
 CD40     BSS
          LMML   MN,DT       EXPECTED MODEL NUMBER
          ZJN    CD80        IF CORRECT MODEL NUMBER
 CD50     BSS
          LDN    0
          STDL   T1
 CD60     BSS
          LDML   RPB+8+26    SEARCH FOR ACTUAL MODEL NUMBER
          LMML   MN,T1
          ZJN    CD70        IF ACTUAL MODEL NUMBER FOUND
          AODL   T1
          SBN    22
          MJN    CD60        IF MORE MODELS TO CHECK
          LDC    E141        DRIVE INITIALIZATION REQUIRED
          STML   RS+/RS/P.ADT
          UJN    CD80
 CD70     BSS
          LDDL   T1
          STML   RS+/RS/P.ADT  ACTUAL DRIVE TYPE
          LDC    E140        XXXX CONFIGURED YYYY FOUND
 CD75     BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LJM    EPF10       SEND ABNORMAL RESPONSE
 CD80     BSS
          LDML   /SS/P.FNC,CSST
          SBN    2
          NJN    CD110       IF NOT FORMAT COMMAND
          LDML   HSTF
          ZJN    CT90        IN NOT HEAD SHIFT DETECT
          LDN    0
          LJM    CDX
 CT90     RJM    IU          INITIALIZE UNIT
          UJK    CD150
 CD110    BSS
          RJM    COR         CHECK OPERATIONAL AND READY
 CD112    MJK    CD32        IF ERROR
          LDML   RS+/RS/P.ADT
          LMC    E141
          ZJN    CD118       IF NOT CLUSTERED OR WRONG MODEL
          LDM    RS+/RS/P.ADT
          SBDL   DT
          NJN    CD118       IF WRONG TYPE
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
          RJM    DDT         DETERMINE DRIVE TYPE
          MJK    CD112       IF ERROR
          RJM    IUF         IS UNIT FORMATTED
          ZJN    CD118       IF UNIT FORMATTED CORRECTLY
          STML   RS+/RS/P.ADT  ACTUAL DRIVE TYPE
 CD118    BSS
          LDML   RS+/RS/P.ADT  ACTUAL DRIVE TYPE
          STDL   T1
          SBDL   DT          EXPECTED DRIVE TYPE
          ZJN    CD150       IF CORRECT DRIVE TYPE
          LDDL   T1          ACTUAL DRIVE TYPE
          SBN    22
          PJN    CD120       IF DRIVE TYPE WAS NOT DETERMINED
          LDC    E140        XXXX CONFIGURED - FOUND YYYY
          STDL   T1
 CD120    BSS
          LDDL   T1          ERROR CODE (140 OR 141)
          RJM    EP          ERROR PROCESSING (NO RETURN)
 CD150    BSS
          RJM    COD         CHECK FOR OFF LINE DRIVE
          LJM    CDX
          SPACE  5,20
** NAME-- COD
*
** PURPOSE-- CHECK FOR OFF LINED DRIVE.  THIS ROUTINE CHECKS FOR AN
*            OFF LINED DRIVE OF A PARITY UNIT.  IT WILL ISSUE A SPIN UP DRIVE
*            COMMAND TO SEE IF THE DRIVE IS USEABLE, AND IF SO, FORMAT
*            THE UNIT IF NECESSARY, THEN SET UP TABLES SO THAT ROUTINE GETU
*            WILL RESTORE THE DISK IN THE BACKGROUND.
*
** EXIT-- A NONZERO IF DRIVE OFF LINE
          SPACE  2
 COD200   BSS
          LDN    1
          UJN    CODX
 COD100   BSS
          LDN    0
 CODX     LJM    **
 COD      EQU    *-1
          LDDL   DT          DRIVE TYPE
          SBN    3
          ZJN    COD10       IF 5833_1P
          SBN    5
          ZJN    COD10       IF 5838_1P
          SBN    2
          ZJN    COD10       IF 5838_3P
          SBN    3
          ZJN    COD10       IF 47444_1P
          SBN    2
          ZJN    COD10       IF 47444_3P
          SBN    3
          ZJN    COD10       IF 5837_1P
          SBN    2
          ZJN    COD10       IF 5837_3P
          ADN    15
          NJN    COD100      IF NOT 5833_3P
 COD10    BSS

*         THE RESET FORCES THE CONTROLLER TO CHECK FOR A PENDING INTERRUPT.
*         THE PENDING INTERRUPT COULD INDICATE THAT A RESTORE HAS COMPLETED
*         AND PREVENT THIS SIDE FROM STARTING A RESTORE.

          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RAS         REPORT ADDRESSEE STATUS
          SHN    8
          MJN    COD15       IF OFF LINE DRIVE
          LDC    /UIT/K.PARPRO+DRNUM  PARITY PROTECTION ENABLED
          RJM    UPPS        UPDATE PARITY PROTECTION STATUS
          UJN    COD100      EXIT - NO OFF LINE DRIVE
 COD15    SHN    1
          PJN    COD20       IF RESTORE NOT IN PROGRESS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          MJK    COD200      IF THIS PP DOING THE RESTORE
 COD20    BSS
          LDML   /SS/P.RECOV,CSST
          ADML   /SS/P.RQTRY,CSST
          ZJN    COD23       IF FIRST TIME FOR CONFIDENCE TEST
          LDDL   PD
          RJM    UPPS        UPDATE PARITY PROTECTION STATUS
          UJK    COD200
 COD23    LDML   RPB+9
          LPN    77B
          STDL   PD
          STML   ODN,CSST    OFF LINED DRIVE NUMBER
          RJM    SUD         SPIN UP DRIVE
          ZJK    COD200      IF ERROR
          LDC    /UIT/K.RESTDR   SET RESTORING DRIVE FLAG
          ADDL   PD              DRIVE NUMBER BEING RESTORED
          RJM    UPPS        UPDATE PARITY PROTECTION STATUS
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5          READ UNIT FORCE FORMAT FLAG
          LDDL   T5+/UIT/P.FRCFMT
          SHN    /UIT/L.FRCFMT+2
          PJK    COD25       IF NOT FORCE FORMAT
          LDN    1           INDICATE UNIT CLUSTERED
          RJM    FU          FORMAT UNIT
          RJM    CFFMT       CLEAR FORCE FORMAT FLAG IN UIT
          UJK    COD40
 COD25    LDC    0#302
          STML   CP+OPCD     REPORT ADDRESSEE STATUS OPERATION CODE
          LDN    10          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDML   RPB+9
          SHN    3
          PJN    COD30       IF UNIT NOT FORMATTED
          LDML   RPB+7
          LPN    77B
          LMML   DD,DT
          NJN    COD30       IF WRONG NUMBER OF DATA DRIVES
          LDML   RPB+11
          LMML   BPS,DT
          ZJN    COD40       IF CORRECT SECTOR SIZE
 COD30    BSS
          LDN    1           INDICATE UNIT CLUSTERED
          RJM    FU          FORMAT UNIT
 COD40    BSS
          LDML   UNITS,UX
          LPC    0#F7FF
          LMC    0#800
          STML   UNITS,UX    SET RESTORE IN PROGRESS
          LDN    E55         RESTORING DRIVE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   UNITS,UX
          LPC    740B
          ADML   ODN,CSST
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          LDN    0
          STML   CRC,CSST    CURRENT RESTORE CYLINDER
          STML   /SS/P.CRTS,CSST  CURRENT TRACK, SECTOR TO RESTORE
          STML   RTM,CSST    REQUESTS TO MULTIPLEX PER CYLINDER DURING RESTORE
          STML   RS+/RS/P.SCYL  STARTING CYLINDER
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          LJM    COD200
          SPACE  5,20
** NAME-- COR
*
** PURPOSE-- CHECK OPERATIONAL AND READY
*
** EXIT
*         A = NEGATIVE VALUE IF ANY PHYSICAL DRIVE OF THE LOGICAL UNIT
*             IS NOT OPERATIONAL OR NOT READY.
          SPACE  2
 CORX     LJM    **
 COR      EQU    *-1
          LCN    0
          STML   CORF        INDICATE NO OFF-LINE DRIVE
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
          LPN    70B
          NJN    COR5        IF NOT DRIVE NUMBER 0-7
          RJM    RAS         REPORT ADDRESSEE STATUS
          LPN    77B
          STML   CORF        FAILING DRIVE
 COR5     BSS
          RJM    DDT         DETERMINE DRIVE TYPE
          MJN    CORX        IF ERROR
          LDC    0#301+400000B  REPORT CONDITION OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#2D5
          STML   CP+FCP
          LDDL   PD
          SHN    8
          STML   CP+FCP+1    PHYSICAL DRIVE OF LOGICAL UNIT
          LDML   TD          TOTAL DRIVES IN CLUSTER
          LMN    1
          ZJN    COR10       IF 1X DRIVE
          LDML   /SS/P.UNIT,CSST
          SCN    0#38
          STML   CP+SLAD     LOGICAL ADDRESS
 COR10    BSS
          LDN    10          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDML   CORF
          LMD    PD
          ZJN    COR25       IF THIS DRIVE IS OFF LINE
          LDML   RPB+6
          SHN    10
          MJN    COR30       IF NOT OPERATIONAL
          SHN    1
          MJN    COR30       IF NOT READY
 COR25    BSS
          RJM    UPD         UPDATE DRIVE NUMBER
          NJK    COR5        IF MORE DRIVES TO CHECK
 COR30    BSS
          LJM    CORX
 CORF     DATA   0
          SPACE  5,20
** NAME-- CU
*
** PURPOSE-- CLUSTER UNIT
          SPACE  2
 CUX      LJM    **
 CU       EQU    *-1
          LDC    0#968
          STML   CP+FCP      CLUSTER PARAMETER
          LDC    H0209
          RJM    SOU         SET OPERATION CODE AND UNIT
          LPN    37B
          SHN    8
          ADN    1
          STML   CP+FCP+1    FIRST DRIVE
          ADC    0#800
          STML   CP+FCP+3    SECOND DRIVE
          ADC    0#800
          STML   CP+FCP+5    3RD DRIVE
          ADC    0#800
          STML   CP+FCP+7    4TH DRIVE
          LDC    0#8A80
          STML   CP+FCP+2
          STML   CP+FCP+4
          STML   CP+FCP+6
          STML   CP+FCP+8
          LDDL   DT
          NJN    CU10        IF NOT 5832_1
          LDC    0#8600
          UJK    CU60
 CU10     BSS
          SBN    1
          ZJK    CU70        IF 5832_2
          SBN    6
          MJN    CU12        IF 5833_
          SBN    5
          MJN    CU12        IF 5838_
          SBN    5
          MJN    CU12        IF 47444_
          ADN    1           BIAS FOR 5837_
          UJN    CU17
 CU12     ADN    6
 CU17     SBN    2
          MJN    CU50        IF 5833_1 OR 5838_1 OR 47444_1 OR 5837_1
          NJN    CU20        IF NOT 5833_1P OR 5838_1P OR 47444_1P OR 5837_1P
          LDC    0#1000
          RAML   CP+FCP+3
          LDC    0#8A10
          UJK    CU80
 CU20     BSS
          SBN    2
          MJK    CU90        IF 5833_2 OR 5838_2 OR 47444_2 OR 5837_2
          NJN    CU40        IF NOT 5833_3P OR 5838_3P OR 47444_3P OR 5837_3P
          LDC    0#8A10
          STML   CP+FCP+8
 CU40     BSS
          LDC    0#1168
          STML   CP+FCP      CLUSTER PARAMETER
          LDN    0#18        COMMAND PACKET LENGTH
          UJN    CU100
 CU50     BSS
          LDC    0#8A00
 CU60     BSS
          STML   CP+FCP+2
          LDC    0#568
          STML   CP+FCP      CLUSTER PARAMETER
          LDN    0#C         COMMAND PACKET LENGTH
          UJN    CU100
 CU70     BSS
          LDC    0#8680
          STML   CP+FCP+2
 CU80     BSS
          STML   CP+FCP+4
 CU90     BSS
          LDN    0#10        COMMAND PACKET LENGTH
 CU100    BSS
          STML   CP
          RJM    ODFP        OUTPUT DATA FROM PP

*         WAIT FOR ASYNCHRONOUS RESPONSE FROM DRIVE

          LDC    0#100       SO IH EXPECTS AN ASYNCHRONOUS RESPONSE
          STML   CP+OPCD
          RJM    IH          INTERRUPT HANDLER
          LJM    CUX
          SPACE  5,20
** NAME-- DDT
*
** PURPOSE-- DETERMINE DRIVE TYPE FOR DRIVE SPECIFIED BY LOCATION PD
*
** EXIT
*         A = DRIVE TYPE (0-21) IF DRIVE FOUND AND CLUSTERED
*           = 141(10) IF NOT CLUSTERED AS NOS/VE DEFINED DRIVE
*           = NEGATIVE VALUE IF DRIVE NOT FOUND OR ERROR
*        T3 = POINTER TO PARAMETER 68
*        TD = NUMBER OF PHYSICAL DRIVES PER LOGICAL UNIT IF THE DRIVE
*             IS CLUSTERED
          SPACE  2
 DDTX     LJM    **
 DDT      EQU    *-1
          RJM    RMR         READ MICROCODE REVISION
          LDC    0#8068
          STML   CP+FCP+1    REPORT PARAMETER 68
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   RPB+5+2
          SHN    -1
          STDL   T1
          LDDL   PD          PHYSICAL DRIVE
          SHN    8
          ADN    1
          STDL   T2          EXPECTED PARAMETER WORD WITH UNIT NUMBER
          LDN    0
          STDL   T3          INDEX TO PARAMETER 68
          LDN    1
          STML   TD          PHYSICAL DRIVES PER LOGICAL UNIT
 DDT10    BSS
          LDML   RPB+8,T3
          LMC    0#568
          NJN    DDT25       IF NOT SINGLE UNIT
          LDML   RPB+8+1,T3
          LMDL   T2
          NJK    DDT55       IF DIFFERENT UNIT
          LDML   RPB+8+2,T3
          SHN    8
          PJK    DDT80       IF NOT CLUSTERED
          SHN    17
          MJN    DDT15       IF SOLID STATE DISK
          LDN    2           583X_1 OR 47444_1
          UJN    DDT20
 DDT15    BSS
          LDN    0           5832_1
 DDT20    BSS
          LJM    DDT100
 DDT25    BSS
          LDML   RPB+8,T3
          LMC    0#968
          NJN    DDT40       IF NOT 2 UNITS
          LDML   RPB+8+1,T3
          LMDL   T2
          ZJN    DDT28       IF UNIT FOUND
          LDML   RPB+8+3,T3
          LMDL   T2
          NJK    DDT60       IF DIFFERENT UNIT
 DDT28    BSS
          LDN    2
          STML   TD          PHYSICAL DRIVES PER LOGICAL UNIT
          LDML   RPB+8+4,T3
          SHN    6
          MJN    DDT30       IF NOT SSD
          LDN    1
          UJN    DDT38
 DDT30    BSS
          SHN    4
          PJN    DDT35       IF PARITY DRIVE
          LDN    4           583X_2 OR 47444_2
          UJN    DDT38
 DDT35    BSS
          LDN    3           583X_1P OR 47444_1P
 DDT38    BSS
          UJK    DDT50
 DDT40    BSS
          LDML   RPB+8,T3
          LMC    0#D68
          NJN    DDT42       IF NOT 3 UNITS
          LDML   RPB+8+1,T3
          LMDL   T2
          ZJN    DDT41       IF UNIT FOUND
          LDML   RPB+8+3,T3
          LMDL   T2
          ZJN    DDT41       IF UNIT FOUND
          LDML   RPB+8+5,T3
          LMDL   T2
          NJK    DDT63       IF DIFFERENT UNIT
 DDT41    BSS
          LDN    3
          STML   TD          PHYSICAL DRIVES PER LOGICAL UNIT
          UJK    DDT80
 DDT42    BSS
          LDML   RPB+8,T3
          LMC    0#1168
          NJK    DDT75       IF ILLEGAL PARAMETER
          LDML   RPB+8+1,T3
          LMDL   T2
          ZJN    DDT43       IF UNIT FOUND
          LDML   RPB+8+3,T3
          LMDL   T2
          ZJN    DDT43       IF UNIT FOUND
          LDML   RPB+8+5,T3
          LMDL   T2
          ZJN    DDT43       IF UNIT FOUND
          LDML   RPB+8+7,T3
          LMDL   T2
          NJN    DDT65       IF DIFFERENT UNIT
 DDT43    BSS
          LDN    4
          STML   TD          PHYSICAL DRIVES PER LOGICAL UNIT
          LDML   RPB+8+8,T3
          SHN    10
          PJN    DDT45       IF PARITY DRIVE
          LDN    6           583X_4 OR 47444_4
          UJN    DDT50
 DDT45    BSS
          LDN    5           583X_3P OR 47444_3P
 DDT50    BSS
          UJN    DDT100
 DDT55    BSS
          LDN    3
          UJN    DDT70
 DDT60    BSS
          LDN    5
          UJN    DDT70
 DDT63    BSS
          LDN    7
          UJN    DDT70
 DDT65    BSS
          LDN    9
 DDT70    BSS
          RADL   T3          UPDATE POINTER TO PARAMETER 68
          SBDL   T1
          MJK    DDT10       IF MORE PARAMETERS TO CHECK
 DDT75    BSS
          LCN    0           DRIVE NOT FOUND OR ERROR
          UJN    DDT100
 DDT80    BSS
          LDC    E141        DRIVE NOT CLUSTERED OR NOT FORMATTED
 DDT100   BSS
          STML   RS+/RS/P.ADT  CLUSTER CONFIG. BASED ON 5833_
          MJN    DDT120      IF DRIVE NOT FOUND OR ERROR
          ADC    -E141
          ZJN    DDT110      IF DRIVE NOT CLUSTERED OR FORMATTED
          LDDL   DT
          SBN    7
          MJN    DDT110      IF 5832 OR 5833
          SBN    5
          MJN    DDT105      IF 5838
          SBN    5
          MJN    DDT106      IF 47444
          LDN    15
          UJN    DDT107      5837
 DDT105   LDN    5
          UJN    DDT107
 DDT106   LDN    10
 DDT107   RAML   RS+/RS/P.ADT  ADD BIAS ADT FOR MODEL 5838/47444/5837
 DDT110   LDML   RS+/RS/P.ADT
 DDT120   LJM    DDTX
 TD       DATA   0           TOTAL PHYSICAL DRIVES PER LOGICAL UNIT
          SPACE  5,20
** NAME-- DPR
*
** PURPOSE-- DRIVE POWER ON RESET.  THIS MASTER CLEARS THE DRIVE(S),
*            BREAKS AN OPPOSITE ACCESS RESERVE AND RUNS DIAGNOSTICS.
*            IT IS ISSUED BY THE CONTROLLER EVEN IF THE DRIVE IS NOT
*            OPERATIONAL.  IT IS ISSUED BY THE CONTROLLER TO THE OFF
*            LINE DRIVE OF A LOGICAL UNIT.
          SPACE  2
 DPRX     LJM    **
 DPR      EQU    *-1
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
 DPR10    BSS
          RJM    DDT         DETERMINE DRIVE TYPE
          MJN    DPR20       IF ERROR
          LDML   TD          TOTAL DRIVES IN LOGICAL UNIT
          LMN    1
          ZJN    DPR20       IF 1X DRIVE
          LDDL   DT
          ZJN    DPR13       IF 1X DRIVE EXPECTED
          SBN    2
          ZJN    DPR13       IF 5833_1 DRIVE
          SBN    5
          ZJN    DPR13       IF 5838_1 DRIVE
          SBN    5
          ZJN    DPR13       IF 47444_1 DRIVE
          SBN    5
          NJK    DPR16       IF NOT 5837_1 DRIVE
 DPR13    BSS
          LDML   /SS/P.UNIT,CSST
          SCN    0#38
          UJN    DPR30
 DPR16    BSS
          LDDL   PD
          LPN    70B
          NJN    DPR40       IF RESET ALREADY ISSUED
          LDML   /SS/P.UNIT,CSST
          UJN    DPR30
 DPR20    BSS
          LDDL   CMOD
          LPN    7
          SHN    8
          ADDL   PD
 DPR30    BSS
          STML   CP+SLAD     LOGICAL ADDRESS
          LDC    H0800       ABORT COMMAND
          STML   CP+OPCD
          LDC    0#254
          STML   CP+FCP
          LDC    0#400       RESET AS AT POWER ON
          STML   CP+FCP+1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          RJM    LIR         LOGICAL INTERFACE RESET (IN CASE OF MULTIPLE RESPONSES)
 DPR40    BSS
          RJM    UPD         UPDATE PHYSICAL DRIVE ADDRESS
          NJK    DPR10       IF MORE PHYSICAL UNITS IN LOGICAL UNIT

*         IF THE UNIT IS NOT READY, THE DRIVE RESET COULD RESULT IN A
*         STATE CHANGE.  THE STATE CHANGE COULD TAKE AS LONG AS 15 SECONDS.
*         IF A CONTROLLER IS POWERED ON AND A DRIVE IS RESERVED TO ANOTHER
*         CONTROLLER, THE CONTROLLER THAT IS POWERED ON WILL REPORT THAT
*         THE DRIVE IS NOT OPERATIONAL AND NOT READY.

          LDML   /SS/P.SC,CSST
          ZJN    DPR70       IF THERE SHOULD BE NO STATE CHANGE
 DPR50    BSS
          RJM    RI          REQUEST INTERRUPTS
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          NJN    DPR70       IF INTERRUPT PRESENT
          RJM    UC          UPDATE CLOCK
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    DPR60       IF CLOCK HASN'T WRAPPED
          ADC    0#10000
 DPR60    BSS
          SBN    15          COMMAND TIMEOUT
          MJN    DPR50       IF TIMEOUT NOT EXPIRED
 DPR70    BSS
          LJM    DPRX
          SPACE  5,20
** NAME-- DU
*
** PURPOSE-- DECLUSTER UNIT
*
** ENTRY -- TD = PHYSICAL DRIVES PER LOGICAL UNIT
          SPACE  2
 DUX      LJM    **
 DU       EQU    *-1
          LDC    H0209+400000B  LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDML   TD
          SBN    1
          ZJN    DU10        IF ONE PHYSICAL DRIVE PER LOGICAL UNIT
          LDML   CP+SLAD
          SCN    0#38        CLEAR STRING NUMBER
          STML   CP+SLAD
 DU10     BSS
          LDC    0#568
          STML   CP+FCP
          LDML   CP+SLAD
          LPN    77B         MASK DRIVE NUMBER
          SHN    8
          ADN    1
          STML   CP+FCP+1    PARAMETER WORD WITH DRIVE NUMBER
          LDDL   DT
          SBN    2
          PJN    DU20        IF 5833 OR 5838 OR 47444 OR 5837
          LDC    0#8500      DECLUSTER 5832
          UJN    DU30
 DU20     BSS
          LDC    0#8900      DECLUSTER NON 5832
 DU30     BSS
          STML   CP+FCP+2
          LDN    12          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDC    0#100       SO IH EXPECTS AN ASYNCHRONOUS RESPONSE
          STML   CP+OPCD
 DU40     BSS
          RJM    IH          INTERRUPT HANDLER
          SOML   TD
          NJN    DU40        IF ANOTHER ASYNCHRONOUS RESPONSE EXPECTED
          UJK    DUX
          SPACE  5,20
** NAME-- FU
*
** PURPOSE-- FORMAT UNIT
*
** ENTRY
*         - A = 0  IF DRIVE IS DECLUSTERED
*         - PD MUST BE THE PHYSICAL DRIVE TO FORMAT
          SPACE  2
 FUX      LJM    **
 FU       EQU    *-1
          STML   T10
          LDN    E57         FORMATTING DRIVE
          RJM    PER         PREPARE ERROR RESPONSE
          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 DIAGNOSTIC CYLINDER

          LDC    0#280E+400000B  FORMAT OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#2D5       PARAMETER TO SELECT DRIVE
          STML   CP+FCP
          LDDL   PD
          SHN    8
          STML   CP+FCP+1    DRIVE TO FORMAT
          LDC    0#1E5
          STML   CP+FCP+2    DON'T READ HEADERS
          LDC    0#1DF
          STML   CP+FCP+3    FORMAT THE DIAGNOSTIC CYLINDER
          LDDL   DT          DRIVE TYPE
          SBN    2
          MJN    FU10        IF 5832
          LDML   T10
          ZJN    FU5         IF DRIVE DECLUSTERED
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     LOGICAL ADDRESS
 FU5      BSS
          LDN    0#E         COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP

*         FORMAT THE DATA CYLINDERS

 FU10     BSS
          LDC    0#7DD       FACTORY FORMAT PARAMETER
          STML   CP+FCP+3
          LDML   DD,DT
          STML   CP+FCP+4    DATA DRIVES PER LOGICAL UNIT
          LDN    0
          STML   CP+FCP+5    UPPER BYTES OF SECTOR SIZE
          LDML   BPS,DT      BYTES PER SECTOR
          STML   CP+FCP+6
          LDML   T10
          ZJN    FU20        IF DRIVE DECLUSTERED
          LDC    0#53B
          STML   CP+FCP+3    LOGICAL SECTOR SIZE
          LDN    0
          STML   CP+FCP+4    UPPER BYTES OF SECTOR SIZE
          LDML   BPS,DT
          STML   CP+FCP+5
          LDN    0#12        COMMAND PACKET LENGTH
          UJN    FU30
 FU20     BSS
          LDN    0#14        COMMAND PACKET LENGTH
 FU30     BSS
          RJM    ODFP        OUTPUT DATA FROM PP
          LDN    E58         FORMAT COMPLETE
          RJM    PER         PREPARE ERROR RESPONSE
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          UJK    FUX
          SPACE  5,20
** NAME-- IU
*
** PURPOSE-- INITIALIZE UNIT.  DECLUSTER UNIT IF CLUSTERED, FORMAT
*            ALL THE PHYSICAL UNITS OF THE LOGICAL UNIT AS NECESSARY,
*            THEN CLUSTER THE UNIT.
          SPACE  2
 IUX      LJM    **
 IU       EQU    *-1
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
 IU10     BSS
          RJM    DDT         DETERMINE DRIVE TYPE
          MJN    IU30        IF DRIVE NOT IN CONTROLLER TABLE
          LDML   RPB+8+2,T3
          SHN    8
          PJN    IU20        IF UNIT NOT CLUSTERED
          RJM    DU          DECLUSTER UNIT
 IU20     BSS
          LOADF  CMLIST+/CM/P.RMA,CSST  ADDRESS OF LIST WITH FORMAT PARAMETER
          CRDL   P1          READ WORD WITH PARAMETER
          LDDL   P3
          SBN    1
          ZJN    IU30        IF UNCONDITIONAL FORMAT
          RJM    DDT         DETERMINE DRIVE TYPE
          RJM    IUF         IS UNIT FORMATTED
          ZJN    IU40        IF UNIT FORMATTED
 IU30     BSS
          LDN    0           TO INDICATE DRIVE DECLUSTERED
          RJM    FU          FORMAT UNIT
 IU40     BSS
          RJM    UPD         UPDATE DRIVE NUMBER
          NJN    IU10        IF MORE DRIVES TO CHECK
          RJM    CU          CLUSTER UNIT
          UJK    IUX
          SPACE  5,20
** NAME-- IUF
*
** PURPOSE-- IS UNIT FORMATTED
*
** EXIT   A = 0 IF DRIVE FORMATTED WITH CORRECT SECTOR SIZE
*           = 141 IF NOT CORRECTLY FORMATTED
          SPACE  2
 IUFX     LJM    **
 IUF      EQU    *-1
          LDML   RPB+8+2,T3  PARAMETER 68 BYTE 3
          SHN    8
          PJN    IUF2        IF UNIT NOT CLUSTERED
          LDML   /SS/P.UNIT,CSST
          UJN    IUF3
 IUF2     BSS
          LDDL   CMOD
          LPN    7           GET RID OF PORT NUMBER
          SHN    8
          ADDL   PD
 IUF3     BSS
          STML   CP+SLAD     CONTROLLER, DRIVE ADDRESS
          LDC    0#302
          STML   CP+OPCD     REPORT ADDRESSEE STATUS OPERATION CODE
          LDN    6           COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDML   RPB+9
          SHN    3
          PJN    IUF10       IF NOT FORMATTED
          LDML   RS+/RS/P.ADT
          STDL   T1          ACTUAL DRIVE TYPE
          SBN    DTS
          MJN    IUF5        IF RS+/RS/P.ADT CONTAINS DRIVE TYPE
          LDDL   DT
          STDL   T1          EXPECTED DRIVE TYPE
 IUF5     BSS
          LDML   RPB+9
          SHN    2
          MJN    IUF7        IF CLUSTERED
 IUF6     BSS
          LDML   RPB+7
          UJN    IUF8
 IUF7     BSS
          SHN    2
          PJN    IUF6        IF NO PARITY DRIVE
          LDML   RPB+7
          SBN    1
 IUF8     BSS
          LPN    77B         MASK ACTUAL DATA DRIVES FOR FORMAT
          LMML   DD,T1       EXPECTED DATA DRIVES
          NJN    IUF10       IF WRONG NUMBER OF DATA DRIVES
          LDML   RPB+11      ACTUAL SECTOR SIZE
          LMML   BPS,T1      EXPECTED SECTOR SIZE
          ZJK    IUFX        IF CORRECT SECTOR SIZE
 IUF10    BSS
          LDC    E141        INDICATE NOT FORMATTED
          UJK    IUFX
          SPACE  5,20
** NAME-- PER
*
** PURPOSE-- PREPARE ERROR RESPONSE
*
** ENTRY  (A) = ERROR CODE
          SPACE  2
 PERX     LJM    **
 PER      EQU    *-1
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   UNITS,UX
          LPC    740B
          ADDL   PD
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          UJN    PERX
          SPACE  5,20
** NAME-- RAS
*
** PURPOSE-- REPORT ADDRESSEE STATUS
*
** EXIT   (A) = RPB+9
          SPACE  2
 RASX     LJM    **
 RAS      EQU    *-1
          LDC    0#302       REPORT ADDRESSEE STATUS OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDML   RPB+9
          UJN    RASX
          SPACE  5,20
** NAME-- RMR
*
** PURPOSE-- READ CONTROLLER MICROCODE REVISION
          SPACE  2
 RMRX     LJM    **
 RMR      EQU    *-1
          LDC    H0200       REPORT ATTRIBUTE OPERATION CODE
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
*         LDC    0#36C
          STML   CP+FCP      PARAMETER TO READ REV NUMBER
          LDC    0#8050
          STML   CP+FCP+1    REPORT PARAMETER 50
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   RPB+8+13    SAVE MICROCODE PART NUMBER
          STML   /SS/P.MREV,CSST
          LDML   RPB+8+14
          STML   /SS/P.MREV+1,CSST
          LDDL   DT
          ZJN    RMR20       IF 1X UNIT
          SBN    2
          ZJN    RMR20       IF 5833_1X UNIT
          SBN    5
          ZJN    RMR20       IF 5838_1X UNIT
          SBN    5
          ZJN    RMR20       IF 47444_1X UNIT
          SBN    5
          ZJN    RMR20       IF 5837_1X UNIT
          LDML   /SS/P.MREV+1,CSST
          LPN    77B
          SBN    2
          PJN    RMR20       IF MICROCODE SUPPORTS PARALLEL AND PARITY
 RMR10    BSS
          LDK    E142        MICROCODE DOES NOT SUPPORT PARALLEL
          RJM    EP          ERROR PROCESSING (NO RETURN)
 RMR20    BSS
          LJM    RMRX
          SPACE  5,20
** NAME-- SOC
*
** PURPOSE-- SET OPERATION CODE AND CONTROLLER
*
** ENTRY  (A) = OPERATION CODE
*
** EXIT   (A) = 36C(16)
          SPACE  2
 SOCX     LJM    **
 SOC      EQU    *-1
          STML   CP+OPCD     OPERATION CODE
          LDDL   CMOD
          LPN    7
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     SLAVE ADDRESS
          LDC    0#36C
          UJN    SOCX
          SPACE  5,20
** NAME-- SUD
*
** PURPOSE-- SPIN UP DRIVE.  THIS ROUTINE WILL ALSO REPORT
*            THAT PARITY PROTECTION IS DISABLED IF THIS IS THE
*            FIRST TIME THE DRIVE IS CHECKED AFTER THE DRIVER
*            IS LOADED.
*
** ENTRY-- A = PHYSICAL DRIVE TO SPIN UP
*
** EXIT-- A = NONZERO IF COMMAND SUCCESSFUL
          SPACE  2
 SUDX     LJM    **
 SUD      EQU    *-1
          SHN    8
          STML   CP+FCP+1    DRIVE TO SPIN UP
          LDML   /SS/P.DOAR,CSST
          LPC    0#8000
          ADML   IDLE
          NJN    SUD5        IF NOT REPORTING DRIVE OFF-LINE
          LDDL   PD          FAILING PHYSICAL DRIVE
          LPC    37B
          RJM    UPPS        UPDATE PARITY PROTECTION STATUS IN UIT
          LDK    E59         PARITY PROTECTION DISABLED
          RJM    PER         PREPARE ERROR RESPONSE
          LDN    /RS/K.PPD   PARITY PROTECTION DISABLED
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 SUD5     BSS
          LDC    0#2D5
          STML   CP+FCP      PHYSICAL DRIVE PARAMETER
          LDC    0#301
          STML   CP+OPCD     REPORT CONDITION OPERATION CODE
          LDN    10          COMMAND PACKET LENGTH
          RJM    ODFP        INPUT DATA TO PP
          LDML   RPB+6
          SHN    10
          MJK    SUD10       IF DRIVE NOT OPERATIONAL
          LDC    0#700
          STML   CP+OPCD     SET OPERATING MODE OPERATION CODE
          LDC    0#351
          STML   CP+FCP+2
          LDC    0#8000
          STML   CP+FCP+3    PARAMETER TO SELECT SPIN UP
          LDN    14
          STML   CP          COMMAND PACKET LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LPN    8
          NJK    SUDX        IF COMMAND SUCCESSFUL
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          RJM    LIR         LOGICAL INTERFACE RESET (TO CLEAR ERROR RESPONSE)
 SUD10    BSS
          LDN    0
          UJK    SUDX
          SPACE  5,20
** NAME-- UPD
*
** PURPOSE-- UPDATE PHYSICAL DRIVE NUMBER
*
** EXIT
*         A NOT 0 IF NUMBER UPDATED
*         A = 0   DONE, NO UPDATE MADE
          SPACE  2
 UPDX     LJM    **
 UPD      EQU    *-1
          LDDL   DT
          ZJN    UPDX        IF NO UPDATE NECESSARY (5832_1)
          SBN    2
          ZJN    UPDX        IF NO UPDATE NECESSARY (5833_1)
          SBN    5
          ZJN    UPDX        IF NO UPDATE NECESSARY (5838_1)
          SBN    5
          ZJN    UPDX        IF NO UPDATE NECESSARY (47444_1)
          SBN    5
          ZJN    UPDX        IF NO UPDATE NECESSARY (5837_1)
          LDDL   PD
          SHN    -3
          SBN    3
          ZJN    UPDX        IF NO UPDATE NECESSARY
          LDDL   DT
          SBN    4
          ZJN    UPD10       IF 5833_2
          ADN    3
          ZJN    UPD10       IF 5832_2
          SBN    8
          ZJN    UPD10       IF 5838_2
          SBN    5
          ZJN    UPD10       IF 47444_2
          SBN    5
          NJK    UPD20       IF NOT 5837_2
 UPD10    BSS
          LDDL   PD
          SHN    -3
          SBN    1
          ZJK    UPDX        IF NO UPDATE NECESSARY
 UPD20    BSS
          LDDL   DT
          SBN    3
          ZJN    UPD25       IF 5833_1P
          SBN    5
          ZJN    UPD25       IF 5838_1P
          SBN    5
          ZJN    UPD25       IF 47444_1P
          SBN    5
          NJN    UPD30       IF NOT 5837_1P
 UPD25    LDN    30B         STRING 3
          UJN    UPD40
 UPD30    BSS
          LDN    10B         UPDATE TO NEXT STRING
 UPD40    BSS
          RADL   PD
          LJM    UPDX
          ERRMI  EOM-*       IF OVERLAY OVERFLOWS MEMORY
          OVERLAY (CONFIDENCE TEST),OVST
          ROUTINE CTO        CONFIDENCE TEST OVERLAY
** NAME-- BCTB
*
** PURPOSE-- BUILD CONFIDENCE TEST WRITE BUFFER
          SPACE  2
 BCTBX    LJM    **
 BCTB     EQU    *-1
          IAN    14B
          STML   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
          SBML   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-- CDA
*
** PURPOSE-- CHECK DRIVE ATTRIBUTES
*          - ENSURE PARITY DRIVE CORRECTION DISABLED
*          - ENSURE FACILITY TIMEOUT IS 20 SECONDS
*          - ENSURE DRIVE INTERRUPT SIZE IS CORRECT FOR WRITES
          SPACE  2
 CDAX     LJM    **
 CDA      EQU    *-1

*         SHOULD HEAD SHIFT SCREEN BE RUN

          LDML   HSTF
          ZJN    CDA05       PROCEED WITH CHECK ATTRIBUTES
          RJM    HSDT        RUN HEAD SCREEN DETECTION TEST
          UJN    CDAX        EXIT

*         RESTORE DRIVE ATTRIBUTES

 CDA05    LDC    H0202       RESTORE ATTRIBUTES OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6
          RJM    ODFP        OUTPUT DATA FROM PP

*         CHECK ATTRIBUTE 6E.  ENSURE PARITY DRIVE CORRECTION IS DISABLED.

          LDC    H0200
          STML   CP+OPCD     REPORT ATTRIBUTE OPERATION CODE
          LDC    0#36C
          STML   CP+FCP      REPORT ATTRIBUTE 6E
          LDC    0#806E
          STML   CP+FCP+1
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   RPB+8
          LMC    0#46E
          NJK    CDA50       IF RESPONSE INCORRECT
          LDML   UNITS,UX    INDICATE PARITY DRIVE CORRECTION DISABLED
          LPC    0#FDFF
          STML   UNITS,UX
          LDML   RPB+9
          LMC    0#C0A0
          ZJN    CDA10       IF PARITY DRIVE CORRECTION DISABLED
          RJM    LA6E        LOAD ATTRIBUTE 6E
          RJM    SA          SAVE ATTRIBUTES

*         CHECK ATTRIBUTE PARAMETER 6F

 CDA10    BSS
          LDC    H0200
          STML   CP+OPCD     REPORT ATTRIBUTES OPERATION CODE
          LDC    0#36C
          STML   CP+FCP      REPORT PARAMETER 6F
          LDC    0#806F
          STML   CP+FCP+1
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   RPB+8
          LMC    0#276F
          NJK    CDA50       IF RESPONSE INCORRECT
          LDML   RPB+8+11
          LMML   BPS,DT
          NJN    CDA15       IF BURST SIZE WRONG
          LDML   RPB+8+16
          LMC    0#131
          ZJK    CDA30       IF FACILITY TIMEOUT CORRECT
 CDA15    BSS
          LDN    0
          STDL   T1
 CDA20    BSS
          LCN    0           PARAMETERS WITH FFFF WILL NOT BE CHANGED
          STML   CP+4,T1
          AODL   T1
          LMN    20
          NJN    CDA20       IF MORE WORDS TO MOVE
          STML   CP+FCP+8    SET INTERRUPT SIZE AND BURST SIZE
          STML   CP+FCP+10
          LDML   BPS,DT
          STML   CP+FCP+9
          STML   CP+FCP+11
          LDC    0#131       SET FACILITY TIMEOUT TO 20 SECONDS
          STML   CP+FCP+16
          LDC    0#2D40
          STML   CP+FCP+17
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTES OPERATION CODE
          LDC    0#276F
          STML   CP+FCP      PARAMETER 6F
          LDN    46          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          RJM    SA          SAVE ATTRIBUTES

*         CHECK ATTRIBUTE PARAMETER D8

 CDA30    BSS
          LDDL   DT          DRIVE TYPE
          SBN    2
          MJK    CDAX        IF INTERRUPT SIZE NOT USED
          LDC    H0200
          STML   CP+OPCD     REPORT ATTRIBUTES OPERATION CODE
          LDC    0#36C
          STML   CP+FCP      REPORT PARAMETER D8
          LDC    0#80D8
          STML   CP+FCP+1
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   RPB+8
          LMC    0#09D8
          NJK    CDA50       IF RESPONSE INCORRECT
          LDDL   CH
          ZJN    CDA32       IF 10 MB CHANNEL
          LDML   ISH,DT      INTERRUPT SIZE FOR 25 MB CHANNEL
          UJN    CDA34
 CDA32    BSS
          LDML   ISL,DT      INTERRUPT SIZE FOR 10 MB CHANNEL
 CDA34    BSS
          STDL   T2
          LDML   RPB+8+2
          LMDL   T2
          NJN    CDA40       IF INTERRUPT SIZE FOR WRITES IS WRONG
          LDML   RPB+8+4
          LMML   BPS,DT
          ZJK    CDAX        IF BURST SIZE FOR WRITES IS CORRECT
 CDA40    BSS
          LDN    0
          STML   CP+FCP+1
          STML   CP+FCP+3
          LDML   BPS,DT
          STML   CP+FCP+4    BURST SIZE FOR WRITES
          LDDL   T2          SET INTERRUPT SIZE FOR WRITES
          STML   CP+FCP+2
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTES OPERATION CODE
          LDC    0#9D8
          STML   CP+FCP      PARAMETER D8
          LDN    16          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          RJM    SA          SAVE ATTRIBUTES
          UJK    CDAX
 CDA50    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- CSC
*
** PURPOSE-- COMPUTE SECTOR COUNT TO TRANSFER
          SPACE  2
 CSCX     BSS
          LDML   SPT,DT      SECTORS PER TRACK
          SBML   /SS/P.CURSEC,CSST
          SBML   SSPC,DT     SPARE SECTORS PER CYLINDER
          RADL   TOTAL
          STML   /SS/P.TOTAL,CSST  SECTORS TO TRANSFER
          LJM    **
 CSC      EQU    *-1
          LDDL   DT
          SBN    2
          PJN    CSC5        IF NOT SSD
          LDML   TPC,DT
          SBN    1
          STML   /SS/P.CURTRK,CSST  CURRENT TRACK
          LDML   SPT,DT      SECTORS PER TRACK
          SBN    1
          STML   /SS/P.CURSEC,CSST  CURRENT SECTOR
 CSC5     BSS
          LDML   /SS/P.CURTRK,CSST
          STDL   T1          TRACK
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          STML   CP+FCP+4    TRACK, SECTOR FOR COMMAND PACKET
          LDML   CTC,DT      CONFIDENCE TEST CYLINDER
          STML   CP+FCP+3    CYLINDER FOR COMMAND PACKET
          LDN    0
          STDL   TOTAL
          STML   CP+FCP+1    UPPER WORD OF SECTOR COUNT
 CSC10    BSS
          AODL   T1
          LMML   TPC,DT      TRACKS PER CYLINDER
          ZJK    CSCX        IF LAST TRACK
          LDML   SPT,DT      SECTORS PER TRACK
          RADL   TOTAL
          UJN    CSC10
          SPACE  5,20
** NAME-- CT
*
** PURPOSE-- CONFIDENCE TEST.  ENSURE DRIVE ATTRIBUTES ARE LOADED AND
*            SAVED, THEN WRITE, READ, AND VERIFY DATA ON A RESERVED CYLINDER.
*
** 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 RECEIVED
*         A RESUME.  ALSO, FROM GETU IF A REQUEST IS PRESENT AND THE CAUSE
*         OF AN ERROR MUST BE ISOLATED BETWEEN MEDIA AND OTHER.
          SPACE  2
 CTX      LJM    **
 CT       EQU    *-1
          LDML   HSTF
          NJN    CT05        IF IN HEAD SHIFT TEST
          RJM    CTDT        CONFIDENCE TEST DATA TRANSFER
 CT05     LDML   /SS/P.FNC,CSST
          SBN    2
          NJN    CT10        IF NOT FORMAT COMMAND
          STML   HSTF        CLEAF HEAD SHIFT FLAG
          STDL   IF          CLEAR INITIALIZATION FLAG
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          LDN    1
          STDL   CMNDS       ONE COMMAND IN PROGRESS
          RJM    DCR         DELINK COMPLETED REQUEST
          RJM    RESPIN      UPDATE -IN- POINTER FOR RESPONSE BUFFER
          RJM    UUT         UNLOCK UNIT TABLE
          UJN    CT20
 CT10     BSS
          RJM    SFRR        CLEAR CIP, IF, UPSB
 CT20     BSS
          LDN    1
          STML   /SS/P.CT,CSST  INDICATE TEST COMPLETED SUCCESSFULLY
          LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    CT30        IF CONFIDENCE TEST PART OF REQUEST RECOVERY
          LDN    0
          STML   /SS/P.RQTRY,CSST  CLEAR REQUEST RETRY COUNTER
          STML   /SS/P.RECOV,CSST  SO SPIN UP CAN OCCUR IN ROUTINE COD
 CT30     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    SSA         SET STARTING ADDRESS
          RJM    BCTB        BUILD CONFIDENCE TEST BUFFER
 CTDT5    BSS                ENTRY IF MEDIA ERROR
          RJM    CSC         COMPUTE SECTOR COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          IFEQ   FE,1
          RJM    CPTA        FOR FORCING ERRORS
          ELSE
          RJM    CPT         COMMAND PACKET TRANSFER
          ENDIF
 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
          LDML   BPS,DT      BYTES PER SECTOR
          STDL   BC
          LDC    H0381       STREAM, WRITE
          RJM    FUNC
          LDML   SPC,DT      SECTORS PER CYLINDER
          SBML   /SS/P.TOTAL,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
          LDC    H0D00       DMA WRITE
          RJM    LTR         LOAD T REGISTERS
          RJM    WFTC        WAIT FOR TRANSFER COMPLETE
          ZJK    CTDT10      IF PAUSE
          RJM    DCM         DESELECT THE CONTROLLER
          RJM    UDA         UPDATE DISK ADDRESS
          NJK    CTDT10      IF MORE SECTORS TO TRANSFER
 CTDT20   BSS
          RJM    IH          INTERRUPT HANDLER
          SBN    0#12
          ZJN    CTDT40      IF COMPLETE AND CONDITIONAL SUCCESS
          SBN    0#18-0#12
          ZJN    CTDT40      IF COMPLETE AND SUCCESSFUL
          SBN    0#42-0#18
          ZJN    CTDT20      IF ASYNCH AND CONDITIONAL SUCCESS
          LJM    CTDT100

*         READ THE CYLINDER

 CTDT40   BSS
          LDN    0
          STDL   FNC         INDICATE READ FUNCTION
          RJM    SSA         SET STARTING ADDRESS
 CTDT50   BSS                ENTRY IF MEDIA ERROR
          RJM    CSC         COMPUTE SECTOR 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
          LDML   CM.CB.T+1   SET RMA TO SAVE DATA READ
          STDL   RMA
          LDML   CM.CB.T+2
          STDL   RMA+1
          LDC    H0281       STREAM, READ
          RJM    FUNC
          LDC    H0C00       DMA READ
          RJM    LTR         LOAD T REGISTERS
          RJM    WFTC        WAIT FOR TRANSFER TO COMPLETE
          ZJK    CTDT60      IF PAUSE

*         VERIFY THE DATA IN ONE SECTOR

          RJM    DCM         DESELECT THE CONTROLLER
          RJM    VCTD        VERIFY CONFIDENCE TEST DATA
          RJM    UDA         UPDATE DISK ADDRESS
          NJK    CTDT60      IF MORE SECTORS TO TRANSFER
 CTDT70   BSS
          RJM    IH          INTERRUPT HANDLER
          SBN    0#12
          ZJN    CTDT110     IF COMPLETE AND CONDITIONAL SUCCESS
          SBN    0#18-0#12
          ZJN    CTDT110     IF COMPLETE AND SUCCESSFUL
          SBN    0#42-0#18
          ZJN    CTDT70      IF ASYNCH AND CONDITIONAL SUCCESS
 CTDT100  BSS
          LDN    E00         CP MUST ISOLATE THE ERROR
          RJM    EP          ERROR PROCESSING (NO RETURN)
 CTDT110  BSS
          LJM    CTDTX
          SPACE  5,20
** NAME-- CTRS
*
** PURPOSE-- CONFIDENCE TEST RECOVERY SUBROUTINE
          SPACE  2
 CTRS     CON    0
          LDML   RPB+11,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
          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
          LDML   TPC,DT
          SBML   /SS/P.CURTRK,CSST
          SBN    1
          NJN    CTR52       IF NOT LAST TRACK
          LDML   SPT,DT      SECTORS PER TRACK
          SBML   SSPC,DT     SPARE SECTORS PER CYLINDER
          UJN    CTR54
 CTR52    BSS
          LDML   SPT,DT      SECTORS PER TRACK
 CTR54    BSS
          STDL   T3          SECTORS PER TRACK
          AOML   /SS/P.CURSEC,CSST  UPDATE SECTOR NUMBER
          SBDL   T3
          MJN    CTR60       IF SAME TRACK
          STML   /SS/P.CURSEC,CSST
          AOML   /SS/P.CURTRK,CSST  UPDATE TRACK NUMBER
          LMML   TPC,DT      TRACKS PER CYLINDER
          NJN    CTR60       IF NOT LAST SECTOR ON CYLINDER
          RJM    LIR         LOGICAL INTERFACE RESET (TO CLEAR ASYNCH)
          LDDL   FNC
          NJK    CTDT40      IF WRITE
          LJM    CTDTX
 CTR60    BSS
          RJM    LIR         LOGICAL INTERFACE RESET (TO CLEAR ASYNCHS)
          LDDL   FNC
          NJK    CTDT5       IF WRITE
          LJM    CTDT50      GO TO READ ENTRY POINT
          SPACE  5,20
** NAME-- GAS
*
** PURPOSE-- GET ADDRESSEE STATUS
*
** EXIT   (A) = RPB+9
          SPACE  2
 GASX     LJM    **
 GAS      EQU    *-1
          LDC    0#302       REPORT ADDRESSEE STATUS OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDML   RPB+9
          UJN    GASX
          SPACE  5,20
** NAME-- HSDT
*
** PURPOSE-- RUN HEAD SHIFT DETECTION TEST
*         SPACE  2
 HSDTX    LJM    **
 HSDT     EQU    *-1
          LDML   /SS/P.MREV+1,CSST
          LPN    77B
          SBN    0#14        REV LEVEL 14
          PJN    HSDT5       IF MICROCODE SUPPORTS HEAD SHIFT SCREEN
          UJK    HSDT35      EXIT
 HSDT5    LCN    0
          STML   HSDDR       INDICATE NO OFF-LINE DRIVE
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
          LPN    70B
          NJN    HSDT15      IF NOT DRIVE NUMBER 0-7
          RJM    GAS         REPORT ADDRESSEE STATUS
          LPN    77B
          STML   HSDDR       OFF-LINE DRIVE NUMBER
 HSDT10   LDML   HSDDR
          MJN    HSDT15      IF NO OFF-LINE DRIVE
          LMD    PD
          ZJK    HSDT30      IF THIS DRIVE IS OFF-LINE
 HSDT15   LDC    H8101       PERFORM HEAD SHIFT TEST OP CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#2D5
          STML   CP+FCP      PARAMETER TO SELECT DRIVE
          LDDL   PD
          LPN    37B
          SHN    8
          STML   CP+FCP+1    PHYSICAL DRIVE NUMBER
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          NJN    HSDT30      IF COMMAND SUCCESSFUL
          LDK    ID23
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    HSDT20      IF ID23
          LDN    E00
          UJN    HSDT25      CP MUST DETERMINE ERROR
 HSDT20   LDML   RPB+8,T3    OCTET 5/6
          LPN    20B
          ZJN    HSDT26      IF NOT HEAD SHIFT ERROR
          LDK    E96         DRIVE HEAD SHIFT ERROR
 HSDT25   RJM    PCER        PREPARE COMMON ERROR RESPONSE
 HSDT26   RJM    INTRS       SEND INTERMEDIATE RESPONSE
          RJM    LIR         LOGICAL INTERFACE RESET
 HSDT30   RJM    IPD         UPDATE DRIVE NUMBER
          NJK    HSDT10      IF MORE DRIVES TO TEST
 HSDT35   UJK    HSDTX
 HSDDR    DATA   0
          SPACE  5,20
** NAME-- IPD
*
** PURPOSE-- INCREMENT PHYSICAL DRIVE NUMBER
*
** EXIT
*         A NOT 0 IF NUMBER UPDATED
*         A = 0   DONE, NO UPDATE MADE
          SPACE  2
 IPDX     LJM    **
 IPD      EQU    *-1
          LDDL   DT
          SBN    2
          ZJN    IPDX        IF NO INCREMENT NECESSARY (5833_1)
          LDDL   PD
          SHN    -3
          SBN    3
          ZJN    IPDX        IF NO INCREMENT NECESSARY
          LDDL   DT
          SBN    4
          ZJN    IPD10       IF 5833_2
          ADN    3
          NJN    IPD20       IF NOT 5832_2
 IPD10    BSS
          LDDL   PD
          SHN    -3
          SBN    1
          ZJN    IPDX        IF NO INCREMENT NECESSARY
 IPD20    BSS
          LDDL   DT
          SBN    3
          NJN    IPD30       IF NOT 5833_1P
          LDN    30B         STRING 3
          UJN    IPD40
 IPD30    BSS
          LDN    10B         INCREMENT TO NEXT STRING
 IPD40    BSS
          RADL   PD
          UJN    IPDX
          SPACE  5,20
** NAME-- IRD
*
** PURPOSE-- ISSUE RESTORE DRIVE
          SPACE  2
 IRDX     LJM    **
 IRD      EQU    *-1
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DEVICE TYPE
          LDML   UNITS,UX    INDICATE ONE COMMAND IN PROGRESS
          LMC    0#8000
          STML   UNITS,UX
          AODL   CMNDS       COMMANDS ISSUED TO CONTROLLER
          LDN    0#18
          STML   CP          COMMAND PACKET LENGTH
          LDDL   UX
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDC    H0931
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDC    0#E005      RESTORE DRIVE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#2D5
          STML   CP+FCP+5    SELECT PHYSICAL DRIVE PARAMETER
          LDML   ODN,CSST
          SHN    8
          STML   CP+FCP+6    DRIVE NUMBER TO RESTORE
          LDC    0#2E3
          STML   CP+FCP+7    RESTORE OPTION PARAMETER
          LDML   /SS/P.CRTS,CSST
          LPN    77B
          STML   /SS/P.CURSEC,CSST
          LDML   /SS/P.CRTS,CSST
          SHN    -8
          STML   /SS/P.CURTRK,CSST
          RJM    CSC         COMPUTE SECTOR COUNT TO TRANSFER
          STML   CP+FCP+2    SECTORS TO RESTORE
          LDML   CRC,CSST
          STML   CP+FCP+3    CYLINDER TO RESTORE
          LMML   CTC,DT      LAST CYLINDER
          NJN    IRD20       IF NOT LAST CYLINDER
          LDC    0#901       NO OP PARAMETER
          STML   CP+FCP
          LDC    0#100       ON LINE DRIVE
          UJN    IRD30
 IRD20    BSS
          LDC    0#200       RESTORE DRIVE
 IRD30    BSS
          STML   CP+FCP+8
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    IRDX
          SPACE  5,20
** NAME-- PFMT
*
** PURPOSE-- PROCESS FORMAT PARAMETER.
          SPACE  2
 PFMTX    LJM    **
 PFMT     EQU    *-1
          LOADF  CMLIST+/CM/P.RMA,CSST  ADDRESS OF LIST WITH FORMAT PARAMETER
          CRDL   P1          READ WORD WITH PARAMETER
          LDDL   P3
          SBN    2
          PJK    PFMT10      IF SET/CLEAR FORCE, HS DETECT, OR RUN CT
          UJK    PFMT27
 PFMT10   NJN    PFMT20      IF NOT CLEAR FORCE FORMAT BIT
          RJM    CFFMT       CLEAR FORCE FORMAT BIT
          UJN    PFMT35
 PFMT20   SBN    1
          NJN    PFMT25      IF NOT SET FORCE FORMAT BIT
          RJM    SFFMT       SET FORCE FORMAT BIT
          UJN    PFMT35
 PFMT25   SBN    1
          NJN    PFMT30      IF RUN CT TO ENABLE RESTORE
          LDN    1
          STML   HSTF        SET FLAG TO RUN HEAD SHIFT TEST
 PFMT27   LDN    0
          STML   /SS/P.CT,CSST  ENABLE RUNNING CONFIDENCE TEST
          UJK    PFMTX       EXIT
 PFMT30   LDN    40B
          STML   /SS/P.CT,CSST  FORCE CONFIDENCE TEST TO BE RUN
          LDM    /SS/P.DOAR,CSST
          LMC    0#8000      INDICATE OPERATIONAL ASYNCH RECEIVED
          STML   /SS/P.DOAR,CSST
 PFMT35   RJM    PDR         PREPARE NORMAL DISK RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          AODL   CMNDS       DCR WILL DECREMENT CMNDS
          RJM    DCR         DELINK COMPLETED REQUEST
          RJM    RESPIN      UPDATE -IN- POINTER FOR RESPONSE BUFFER
          RJM    UUT         UNLOCK UNIT TABLE
          LDN    1           FORCE EXIT FROM -GETU-
          UJK    PFMTX
          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
          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
          LDML   BPS,DT      BYTES PER SECTOR
          SHN    -3
          STDL   P3          CM WORDS PER SECTOR
          LDML   SPC,DT      SECTORS PER CYLINER
          SBML   /SS/P.TOTAL,CSST  SECTOR NUMBER
          SHN    2
          ADML   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
          RJM    SFRR        CLEAR CIP, IF
          LDN    4
          STML   /SS/P.CT,CSST  INDICATE DATA INTEGRITY ERROR
          LDK    E111        CM-DRIVE DATA INTEGRITY
          RJM    EP          ERROR PROCESSING (NO RETURN)
          ERRMI  EOM-*       IF OVERLAY OVERFLOWS MEMORY
          OVERLAY (ERROR RECOVERY OVERLAY ONE),OVST
          ROUTINE ER1O       ERROR RECOVERY OVERLAY NUMBER ONE
** NAME-- EFH
*
** PURPOSE-- ERROR FLAG HANDLING
          SPACE  5,20
 EFH      CON    0
          LDC    H00F1       READ IPI ERROR REGISTER FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   T1
          LPC    0#300
          NJN    EFH10       IF BUS ACKNOWLEDGE OR ENDING STATUS ERROR
          LDC    H00E1       READ STATUS REGISTER FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   STATUS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
 EFH10    BSS
          LDC    H0041       READ BUS B FUNCTION
          RJM    RDRG        READ REGISTER
          STDL   STATUS
          LDDL   T1
          LPC    0#100
          ZJN    EFH20       IF ENDING STATUS ERROR
          LDN    E37         BUS B ACKNOWLEDGE INCORRECT
          UJN    EFH30
 EFH20    BSS
          RJM    IEE         ISOLATE ENDING STATUS ERRORS (NO RETURN)
 EFH30    BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EFP
*
** PURPOSE-- ERROR FLAG PROCESSING.  THIS IS THE PORTION OF EFP
*            THAT CAN BE IN AN OVERLAY.
          SPACE  2
 EFP1     BSS
          LDC    H0800       DMA TERMINATE
          RJM    FAN
          LDC    H0600       READ DMA ERROR REGISTER
          RJM    RDRG
          STDL   T1
          SHN    9
          MJK    EFP60       IF IPI ERROR
          SHN    11
 EFP2     BSS
          PJN    EFP3        IF NOT DMA COUNT OVERFLOW
          LDN    E19         DMA COUNT OVERFLOW
          UJN    EFP40
 EFP3     BSS
          SHN    1
          MJK    EFP85       IF ILLEGAL FUNCTION
          SHN    1
          MJN    EFP5        IF UNCORRECTED CM ERROR
          SHN    1
          PJN    EFP10       IF NOT CM REJECT
 EFP5     BSS
          LDN    E09         CENTRAL MEMORY ERROR
          UJN    EFP40
 EFP10    BSS
          SHN    1
          PJN    EFP15       IF NOT INVALID CM RESPONSE CODE
          LDN    E10
          UJN    EFP40
 EFP15    BSS
          SHN    1
          PJN    EFP20       IF NOT CM RESPONSE CODE PARITY ERROR
          LDN    E11
          UJN    EFP40
 EFP20    BSS
          SHN    1
          PJN    EFP25       IF NOT CMI READ DATA PARITY ERROR
          LDN    E12
          UJN    EFP40
 EFP25    BSS
          SHN    5
          PJN    EFP35       IF NOT Y BOARD DATA ERROR
          LDN    E13
          UJN    EFP40
 EFP35    BSS
          SHN    1
          PJN    EFP45       IF NOT BAS PARITY ERROR
          LDN    E14
 EFP40    BSS
          UJN    EFP75
 EFP45    BSS
          SHN    1
          PJN    EFP50       IF NOT Z BOARD ERROR
          LDN    E15
          UJN    EFP75
 EFP50    BSS
          SHN    1
          PJN    EFP55       IF NOT J BOARD ERROR
          LDN    E16
          UJN    EFP75
 EFP55    BSS
          SHN    1
          PJK    EFP130      IF NOT L BOARD ERROR
          LDN    E17
          UJN    EFP75
 EFP60    BSS
          LDC    H00F1       READ IPI ERROR REGISTER
          RJM    RDRG
          SHN    2
          PJN    EFP65       IF NOT BUFFER COUNTER PARITY
          LDN    E31
          UJN    EFP75
 EFP65    BSS
          SHN    2
          PJN    EFP70       IF NOT SYNC COUNTER PARITY
          LDN    E32
          UJN    EFP75
 EFP70    BSS
          SHN    1
          PJN    EFP80       IF NOT PERIOD COUNTER PARITY
          LDN    E03
 EFP75    BSS
          UJN    EFP108
 EFP80    BSS
          SHN    1
          MJN    EFP85       IF PARITY ERROR ON FUNCTION
          SHN    1
          PJN    EFP95       IF NOT PARITY ERROR ON FUNCTION
 EFP85    BSS
          LDN    E01         FUNCTION TIMEOUT
          UJN    EFP108
 EFP95    BSS
          SHN    3
          PJN    EFP100      IF NOT LOST DATA
          LDN    E33
          UJN    EFP150
 EFP100   BSS
          SHN    1
          MJN    EFP105      IF UPPER ICI PARITY ERROR
          SHN    1
          PJN    EFP110      IF NOT LOWER ICI PARITY ERROR
 EFP105   BSS
          LDN    E04
 EFP108   BSS
          UJN    EFP150
 EFP110   BSS
          SHN    1
          PJN    EFP115      IF NOT IPI SEQUENCE ERROR
          LDN    E24
          UJN    EFP150
 EFP115   BSS
          SHN    1
          MJN    EFP128      IF UPPER IPI CHANNEL PARITY ERROR
          SHN    1
          MJN    EFP128      IF LOWER IPI CHANNEL PARITY ERROR
          LDDL   CH
          ZJN    EFP130      IF 10 MB CHANNEL
          LDDL   T1          DMA ERROR REGISTER
          SHN    3
          LJM    EFP2
 EFP128   BSS
          LDN    E25
          UJN    EFP150
 EFP130   BSS
          LDN    E06         IOU ERROR
 EFP150   BSS
          STML   RS+/RS/P.ERRID
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- FS
*
** PURPOSE-- FORMAT ONE SECTOR.  FOR A 1P LOGICAL UNIT, THIS GUARANTEES
*            THAT A LATER READ TO THIS SECTOR WILL GET AN LRC ERROR RATHER
*            THAN RETURNING OLD DATA DUE TO PARITY DRIVE CORRECTION.
          SPACE  2
 FSX      LJM    **
 FS       EQU    *-1
          LDML   RPB+9,T3
          SHN    -8
          LMML   ODN,CSST
          ZJN    FSX         IF ERROR ON OFF LINE DRIVE
          RJM    LIR         LOGICAL INTERFACE RESET
          LDC    0#2807      FORMAT OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    H0931
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDN    0
          STML   CP+FCP+1
          LDN    1
          STML   CP+FCP+2    SECTOR COUNT
          LDML   RS+/RS/P.SCYL
          STML   CP+FCP+3    CYLINDER TO FORMAT
          LDML   /SS/P.CURTRK,CSST
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          STML   CP+FCP+4    TRACK, SECTOR TO FORMAT
          LDC    0#1E5
          STML   CP+FCP+5    DON'T READ HEADERS
          LDC    0#2D5
          STML   CP+FCP+6    PARAMETER TO SELECT PHYSICAL DRIVE
          LDML   ODN,CSST
          SHN    8
          STML   CP+FCP+7    DRIVE TO FORMAT
          LDN    0#16        COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          UJK    FSX
          SPACE  5,20
** NAME-- IEE
*
** PURPOSE-- ISOLATE ENDING STATUS ERRORS
          SPACE  2
 IEE      CON    0
          LDDL   STATUS
          SHN    11
          PJN    IEE10       IF NOT BUS PARITY
          LDK    E34
          UJN    IEE25
 IEE10    BSS
          LDDL   STATUS
          LPN    17B
          ZJN    IEE12       IF REPORTING -ENDING STATUS WRONG-
          SBN    1
          NJN    IEE20       IF NOT BUS CONTROL REJECTED
          LDDL   TBC
 IEE12    ZJK    IEE60       IF REPORTING -ENDING STATUS WRONG-
          LDN    0
          STDL   TBC         INDICATE NOT EXPECTING 01 STATUS
          RJM    DCM         DESELECT THE CONTROLLER
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    IEE15       IF CLOCK HASNT WRAPPED
          ADC    0#10000
 IEE15    BSS
          SBN    CMT         COMMAND TIMEOUT
          PJN    IEE55       IF TIMEOUT
          LJM    MAIN15      TRANSFER NOTIFICATION OCCURRED BEFORE
                              THE COMPLETION RESPONSE, WAIT FOR
                              THE COMPLETION RESPONSE
 IEE20    BSS
          SBN    8
          NJN    IEE30       IF NOT -SYNC OUTS NOT EQUAL SYNC INS-
          LDK    E36
 IEE25    BSS
          UJN    IEE70
 IEE30    BSS
          PJN    IEE50       IF NOT COMMAND REJECT
          ADN    6
          NJN    IEE35       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
 IEE35    BSS
          LDK    E35
          UJN    IEE70
 IEE50    BSS
          SBN    2
          NJN    IEE60       IF NOT LRC ERROR
          LDK    E70
          UJN    IEE70
 IEE55    BSS
          LDN    E38         NO CONTROLLER RESPONSE
          UJN    IEE70
 IEE60    BSS
          LDN    E39         ENDING STATUS WRONG
 IEE70    BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- SMD
*
** PURPOSE-- SKIP MEDIA DEFECT
          SPACE  2
 SMDX     LJM    **
 SMD      EQU    *-1
          LDN    ID26
          RJM    SFP         SEARCH FOR PARAMETER
          LDML   RPB+11,T3   SECTOR IN ERROR
          STML   /SS/P.CRTS,CSST
          SHN    -8
          STML   /SS/P.CURTRK,CSST
          STML   RS+/RS/P.FTRK  FAILING TRACK
          LDML   RPB+11,T3
          LPN    77B
          STML   /SS/P.CURSEC,CSST
          STML   RS+/RS/P.FSEC  FAILING SECTOR
          AOML   /SS/P.CRTS,CSST  UPDATE RESTORE ADDRESS TO NEXT SECTOR
          LPN    77B
          SBML   SPT,DT
          NJN    SMD10       IF NOT LAST SECTOR
          LDML   /SS/P.CRTS,CSST
          LPC    0#FF00
          ADC    0#100
          STML   /SS/P.CRTS,CSST
 SMD10    BSS
          LDML   /SS/P.CRTS,CSST  8/TRACK, 8/SECTOR
          ADC    -0#600
          SBML   SPT,DT      SECTORS PER TRACK
          ADN    2           SPARE SECTORS PER CYLINDER
          NJN    SMD20       IF NOT LAST SECTOR OF CYLINDER
          STML   /SS/P.CRTS,CSST  SET CURRENT RESTORE TRACK, SECTOR
          AOML   CRC,CSST    INCREMENT CURRENT RESTORE CYLINDER
 SMD20    BSS
          LDDL   DT
          SBN    3
          NJN    SMD30       IF NOT 1P UNIT
          RJM    FS          FORMAT 1 SECTOR
 SMD30    BSS
          UJK    SMDX
          ERRMI  EOM-*       IF OVERLAY OVERFLOWS MEMORY
          OVERLAY (ERROR RECOVERY OVERLAY TWO),OVST
          ROUTINE ER2O       ERROR RECOVERY OVERLAY NUMBER 2
** NAME-- CLR
*
** PURPOSE-- CHECK FOR LABEL READ.  NOS/VE ATTEMPTS TO READ THE LABEL
*            BEFORE IT FORMATS.  THE DRIVER DOES NOT KNOW WHETHER THE
*            DRIVE IS TO BE FORMATTED.  THUS, IF AN ERROR OCCURS READING
*            THE LABEL, THE DRIVE CAN NOT ALWAYS BE DOWNED.
*
** EXIT   (A) .LT. 0 IF NOT LABEL READ AT DEADSTART, OTHERWISE
*         (A) .EQ. SECTOR NUMBER TO BE READ
          SPACE  2
 CLR20    BSS
          LCN    0
 CLRX     LJM    **
 CLR      EQU    *-1
          LDDL   PTF
          ZJN    CLR20       IF INITIALIZATION PATH TEST
          LDML   /SS/P.CT,CSST
          NJN    CLR20       IF NOT INITIALIZATION CONFIDENCE TEST
          LDML   RS+/RS/P.ERRID
          ADC    -E140
          ZJN    CLR10       IF WRONG DRIVE TYPE CONFIGURED
          SBN    E141-E140
          NJN    CLR20       IF NOT *DRIVE INITIALIZATION REQUIRED*
 CLR10    BSS
          LDML   /SS/P.FNC,CSST
          ADML   RQ+/RQ/P.CYL,CSST
          ADML   RQ+/RQ/P.TRACK,CSST
          NJN    CLR20       IF NOT NOS/VE LABEL
          LDML   RQ+/RQ/P.SECTOR,CSST
          UJN    CLRX
          SPACE  5,20
** NAME-- EP
*
** PURPOSE-- ERROR PROCESSING.  THIS IS THE PORTION OF ERROR RECOVERY
*            THAT CAN BE IN AN OVERLAY.
          SPACE  2
 EP40     BSS
          LDML   /SS/P.RQTRY,CSST
          SBN    11
          PJN    EP50        IF RETRY LIMIT REACHED
          RJM    TAC         TERMINATE ALL COMMANDS
          LJM    MAIN10
 EP50     BSS
          LDK    /RS/K.CHDN  CHANNEL DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    OFFCH       TURN OFF ALL UNITS ON CHANNEL
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          LJM    MAIN15

*         REQUEST RETRY

 EPA40    BSS
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNTER
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDML   UNITS,UX
          SHN    /UN/L.PDCE+2
          MJN    EPA45       IF PARITY DRIVE CORRECTION ENABLED
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+1
          UJN    EPA50
 EPA45    BSS
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+3+1
 EPA50    BSS
          MJN    EPB40       IF NOT RETRY LIMIT

*         CONFIDENCE TEST

          LDML   /SS/P.CT,CSST
          ZJN    EPC20       IF INITIALIZATION CONFIDENCE TEST
          AOML   /SS/P.RECOV,CSST  INDEX TO NEXT RECOVERY STEP (EPB)
          LDN    0
          STML   /SS/P.CT,CSST  ENABLE STARTING CONFIDENCE TEST
 EPB40    BSS
          LJM    MAIN10

*         SLAVE RESET

 EPC20    BSS
          LDML   RS+/RS/P.ERRID
          SBN    E38
          NJN    EPC25       IF NOT -NO CONTROLLER RESPONSE-
          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
 EPC25    BSS
          LDML   /SS/P.RECOV,CSST
          ZJK    EPC37       IF INITIALIZATION CONFIDENCE TEST OR NO RESPONSE
          SBN    2            TO LOGICAL RESET
          ZJK    EPC50       IF SLAVE RESET ALREADY ISSUED
          LDML   /SS/P.CT,CSST
          ZJK    EPC30       IF NO COMPLETION CODE FOR CONFIDENCE TEST
          LMN    1
          NJK    EPC35       IF FAILURE ALREADY INDICATED
          LDK    /RS/K.DATERR  SOFTWARE FLAW THE ALLOCATION UNIT
          STML   RS+/RS/P.DATERR
          LDML   RS+/RS/P.ERRID
          SBN    E38
          NJN    EPC25.1     IF FAILURE ADDRESS SHOULD BE VALID
          LDML   RQ+/RQ/P.TRACK,CSST
          STML   RS+/RS/P.FTRK  FAILIING TRACK ADDRESS
          LDML   RQ+/RQ/P.SECTOR,CSST
          STML   RS+/RS/P.FSEC  FAILING SECTOR ADDRESS
 EPC25.1  LDN    E62         MEDIA ERROR
          STML   RS+/RS/P.ERRID
          LDN    0           INDEX TO NEXT RECOVERY STEP (EPA)
          STML   /SS/P.RECOV,CSST  TO PREVENT INFINITE LOOP IF RESET FAILS
          RJM    IPDE        IS PARITY DRIVE ENABLED
          NJN    EPC26       IF NO PARITY DRIVE OR NO FAILING DRIVE
          LDDL   T2
          SHN    9
          MJN    EPC26       IF RESTORE IN PROGRESS
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+3+1
          MJN    EPC27       IF RECOVERY HASN'T BEEN TRIED WITH PARITY DRIVE CORRECTION
 EPC26    BSS
          LJM    EPF30
 EPC27    BSS
          LDML   UNITS,UX
          LMC    0#200
          STML   UNITS,UX    SET PARITY DRIVE CORRECTION ENABLED BIT (PDCE)
          RJM    LA6E        LOAD ATTRIBUTE PARAMETER 6E
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LJM    MAIN15
 EPC30    BSS
          RJM    SFRR        CLEAR CIP, IF
          LDN    2
          STML   /SS/P.CT,CSST  INDICATE CONFIDENCE TEST FAILED
 EPC35    BSS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EPC37    BSS
          LDML   RS+/RS/P.ERRID
          NJN    EPC40       IF NOT DRIVE ERROR
          LDML   /SS/P.FNC,CSST
          SBN    2
          ZJN    EPC40       IF FORMAT COMMAND
          RJM    IPDE        IS PARITY DRIVE ENABLED
          NJN    EPC40       IF NO PARITY DRIVE OR NO FAILING DRIVE
          LDML   /SS/P.CT,CSST
          ZJN    EPC38       IF INITIALIZATION CONFIDENCE TEST
          LDML   RQ+/RQ/P.TRACK,CSST
          STML   /SS/P.CURTRK,CSST
          LDML   RQ+/RQ/P.SECTOR,CSST  SO THE CORRECT ADDRESS IS LOGGED WHEN
          STML   /SS/P.CURSEC,CSST     THE DRIVE IS SET OFF LINE
 EPC38    BSS
          LJM    EPE10
 EPC40    BSS
          LDN    2
          STML   /SS/P.RECOV,CSST  INDEX TO NEXT STEP OF RECOVERY (EPC)

*         BEFORE FORMATTING, AN ATTEMPT IS MADE TO READ THE LABEL IN
*         EACH OF THE FIRST 3 DAUS.  THIS CODE SKIPS THE SLAVE RESET
*         FOR THE LAST 2 DAUS.  SLAVE RESET TAKES APPROXIMATELY 3
*         MINUTES.

          RJM    CLR         CHECK FOR LABEL READ
          MJN    EPC43       IF RESET SHOULD BE ISSUED
          NJK    EPF26       IF SKIPPING SLAVE RESET
 EPC43    BSS
          LDN    E50         SLAVE RESET STARTED
          STML   RS+/RS/P.ERRID
          RJM    INTRS       INTERMEDIATE RESPONSE
          LDDL   PTF         PATH TEST FLAG
          ZJN    EPC45       IF INITIALIZATION PATH TEST
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDC    0#C000      COMMAND IN PROG., 2 COMMANDS IN PROG.
          RJM    SCB         SET COMMAND IN PROGRESS BITS
 EPC45    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
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDDL   T5
          ZJN    EPC70       IF CONTROLLER WAS NOT HUNG
          LDN    7           GO TO EPC70 IF ERROR
          STML   /SS/P.RECOV,CSST
          LDML   /SS/P.MREV+1,CSST
          LPN    77B
          SBN    0#15        REV LEVEL 15
          PJN    EPC70       SKIP REL IF REV 15. FC HANG WORK AROUND
          RJM    REL         READ ERROR LOG
          ZJN    EPC70       IF NO ERROR CODE
          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    6           INDEX TO NEXT STEP OF RECOVERY (EPD20)
          STML   /SS/P.RECOV,CSST
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNT
          LJM    MAIN10
 EPC100   BSS
          LDDL   PTF
          ZJN    EPC110      IF IN PATH TEST
          LDML   /SS/P.CT,CSST
          ZJN    EPC110      IF INITIALIZATION CONFIDENCE 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    EPD30
 EPC110   BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CONTROLLER (NO RETURN)

*         PATH TEST (ROUTINE PT WORKED ONCE, SLAVE RESET FAILED, MAY BE
*         DAISY CHAIN PROBLEM.)

 EPD30    BSS
          LDML   /SS/P.RECOV,CSST
          LMN    3
          ZJN    EPD40       IF PATH TEST ALREADY STARTED
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNT
          LDN    3
          STML   /SS/P.RECOV,CSST  INDEX TO THIS RECOVERY STEP (EPD)
          LDN    0            ITS BUFFER TO DISK
          STDL   UX          POINTER TO UNITS TABLE
          UJN    EPD35
 EPD32    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 EPD35    BSS
          SBDL   UNUML
          ZJN    EPD37       IF END OF CONFIGURED UNITS
          RJM    SFRR        SET UP FOR REQUEST RETRY
          UJN    EPD32
 EPD37    BSS
          STDL   CMNDS       NO OUTSTANDING COMMANDS
          STDL   PTF         FORCE RUNNING PATH TEST
          LJM    MAIN10
 EPD40    BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CONTROLLER (NO RETURN)

*         DRIVE DIAGNOSTICS

 EPE10    BSS
          LDN    4           INDEX TO NEXT RECOVERY PROCEDURE (EPF)
          STML   /SS/P.RECOV,CSST
          LDN    0
          STML   T11         RETRY COUNT FOR OFF LINING DRIVE
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNT
          RJM    RCC         RESTART CONTROLLER COMMAND
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    CLR         CHECK FOR LABEL READ
          PJN    EPE30       IF LABEL READ AND NOT CLUSTERED CORRECTLY
          RJM    PDD         PERFORM DRIVE DIAGNOSTICS
          LDML   /SS/P.CT,CSST
          LMN    4
          ZJN    EPE40       IF DATA INTEGRITY ERROR
 EPE30    BSS
          LJM    MAIN10
 EPE40    BSS
          LDK    E111        CM-DRIVE DATA INTEGRITY
          STML   RS+/RS/P.ERRID  RESET ERROR IDENTIFIER

*         IF FINAL REQUEST RETRY FAILED

 EPF20    BSS
          RJM    IPDE        IS PARITY DRIVE ENABLED
          NJK    EPF26       IF NO PARITY DRIVE OR NO FAILING DRIVE
          LDDL   T2
          SHN    9
          PJN    EPF24       IF RESTORE NOT IN PROGRESS
          LDDL   T2
          LMML   RS+/RS/P.UNIT  FAILING DRIVE
          LPN    37B
          NJK    EPF26       IF ERROR NOT ON DRIVE BEING RESTORED
 EPF24    BSS
          LDML   /SS/P.FNC,CSST
          SBN    2
          ZJK    EPF26       IF FORMAT COMMAND
          LDML   T11
          SBN    2           ALLOW 2 RETRIES TO OFF LINE DRIVE
          PJK    EPF26       IF RETRIES EXHAUSTED
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    4
          STML   /SS/P.RECOV,CSST  INDEX TO NEXT RECOVERY STEP (EPF)
          AOML   T11         RETRY COUNT FOR OFF LINING DRIVE
          RJM    OFD         OFF LINE FAILING DRIVE
          LDN    /RS/K.PPD   PARITY PROTECTION DISABLED
          STML   RS+/RS/P.ID
          LDML   RS+/RS/P.UNIT
          LPC    37B
          RJM    UPPS        UPDATE PARITY PROTECTION STATUS IN UIT
          LDK    E59         PARITY PROTECTION DISABLED
          STML   RS+/RS/P.ERRID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDML   UNITS,UX
          LPC    0#F7FF
          STML   UNITS,UX    ENSURE RESTORE IN PROGRESS IS CLEAR
          UJK    EPG15
 EPF26    BSS
          RJM    CLR         CHECK FOR LABEL READ
          PJN    EPF28       IF LABEL READ AT DEADSTART
          LDK    /RS/K.UDN   UNIT DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    OFFUN       TURN OFF UNIT
          UJN    EPF40
 EPF28    BSS
          LDN    1
          STDL   CMNDS       SO DCR ROUTINE LEAVES CMNDS EQUAL TO 0
 EPF30    BSS
          LDC    R.ABN*0#4000  ABNORMAL TERMINATION
          STML   RS+/RS/P.RC  RESPONSE CODE
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
          LDC    RLIE
          STML   RS+/RS/P.RESPL  BYTE LENGTH OF RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          LDN    1           SO DCR DOES NO SEEK
          RJM    DCR         DELINK REQUEST
 EPF40    BSS
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
          LDN    5
          STML   /SS/P.RECOV,CSST  INDEX TO NEXT RECOVERY STEP (EPG)
          RJM    LIR         LOGICAL INTERFACE RESET

*         ENTER HERE IF PREVIOUS LOGICAL INTERFACE RESET WORKS OR FAILS

 EPG10    BSS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          MJN    EPG12       IF RESTORE IN PROGRESS
          RJM    UUT         UNLOCK UNIT TABLE
 EPG12    BSS
          RJM    RCC         RESTART CONTROLLER COMMANDS
 EPG15    BSS
          LDN    0
          STDL   IF          CLEAR INITIALIZATION FLAG
          STML   /SS/P.RQTRY,CSST  CLEAR RETRY COUNT
          LJM    MAIN10
          SPACE  5,20
**NAME-- IPDE
*
** PURPOSE-- IS PARITY DRIVE ENABLED
*
** EXIT-- A NONZERO IF NO PARITY DRIVE OR NO FAILING DRIVE
*         T2 = RESPONSE BUFFER + 9  FROM REPORT ADDRESSEE STATUS IF A = 0
          SPACE  2
 IPDE50   BSS
          LDN    1
 IPDEX    LJM    **
 IPDE     EQU    *-1
          LDM    /SS/P.DT,CSST
          SHN    -4
          LPN    77B
          STDL   DT          DEVICE TYPE
          SBN    3
          ZJN    IPDE10      IF 5833_1P
          SBN    5
          ZJN    IPDE10      IF 5838_1P
          SBN    2
          ZJN    IPDE10      IF 5838_3P
          SBN    3
          ZJN    IPDE10      IF 47444_1P
          SBN    2
          ZJN    IPDE10      IF 47444_3P
          SBN    3
          ZJN    IPDE10      IF 5837_1P
          SBN    2
          ZJN    IPDE10      IF 5837_3P
          ADN    15
          NJK    IPDEX       IF NOT 5833_3P
 IPDE10   BSS
          LDML   FPD
          SHN    10
          MJN    IPDEX       IF NO FAILING DRIVE
          LDN    0
          STDL   T1
 IPDE15   BSS
          LDML   RPB,T1      SAVE RESPONSE BUFFER
          STML   IPIT,T1
          AODL   T1
          SBN    50
          NJN    IPDE15      IF MORE WORDS TO SAVE
          RJM    LIR         LOGICAL INTERFACE RESET
          LDC    0#302       REPORT ADDRESSEE STATUS OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDML   RPB+9
          STDL   T2
          LDN    0
          STDL   T1
 IPDE20   BSS
          LDML   IPIT,T1     RESTORE RESPONSE BUFFER
          STML   RPB,T1
          AODL   T1
          SBN    50
          NJN    IPDE20      IF MORE WORDS TO RESTORE
          LDDL   T2
          SHN    3
          PJK    IPDE50      IF LOGICAL UNIT IS NOT READ READY
          SHN    1
          PJK    IPDE50      IF NO PARITY DRIVE
          SHN    4
          PJN    IPDE30      IF NO OFF LINED DRIVE
          SHN    1
          PJK    IPDE50      IF RESTORE NOT IN PROGRESS
 IPDE30   BSS
          LDN    0
          UJK    IPDEX
          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    EP          ERROR PROCESSING (NO RETRUN)
          SPACE  5,20
** NAME-- OFD
*
** PURPOSE-- OFF LINE FAILING DRIVE
          SPACE  2
 OFDX     LJM    **
 OFD      EQU    *-1
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTE OPERATION CODE
          LDC    0#2D5
          STML   CP+FCP      PARAMETER WITH FAILING DRIVE NUMBER
          LDML   RS+/RS/P.UNIT
          LPN    37B
          SHN    8
          STML   CP+FCP+1    FAILING DRIVE NUMBER
          LDC    0#1D9
          STML   CP+FCP+2    PARAMETER TO OFF LINE DRIVE
          LDN    12          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          UJN    OFDX
          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 CONTROLLER.
          SPACE  2
 OFFCM    CON    0
          LDK    /RS/K.CMDN  CONTROLLER DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          LDDL   UX
          STDL   P5          POINTER TO CURRENT UNITS TABLE
          LDN    0
          STDL   UX          UNITS TABLE INDEX
 OFFCM10  BSS
          LDML   UNITS,P5    COMPARE IF SAME CONTROLLER
          LMML   UNITS,UX
          LPC    740B
          NJN    OFFCM20     IF NOT THE SAME CONTROLLER
          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
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          LJM    MAIN10
          SPACE  5,20
** NAME-- OFFUN
*
** PURPOSE-- SET THE DISABLE FLAG IN THE UNIT INTERFACE TABLE.
*
** EXIT   P5 IS UNCHANGED
          SPACE  2
 OFUX     LJM    **
 OFFUN    EQU    *-1
 OFFUN10  BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    OFFUN10     IF LOCK COULD NOT BE SET
          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
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD

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

          RJM    SFRR        SETUP FOR REQUEST RETRY (MAKE CMNDS ACCURATE)
          LPC    0#F7FF
          STML   UNITS,UX    CLEAR RESTORE IN PROGRESS FLAG
          UJK    OFUX
          SPACE  5,20
** NAME-- PDD
*
** PURPOSE-- PERFORM DRIVE DIAGNOSTICS
          SPACE  2
 PDDX     LJM    **
 PDD      EQU    *-1
          LDC    H8100       PERFORM DRIVE DIAGNOSTIC OP CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#2D5
          STML   CP+FCP      PARAMETER TO SELECT DRIVE
          LDML   RS+/RS/P.UNIT
          LPN    37B
          SHN    8
          STML   CP+FCP+1    PHYSICAL DRIVE NUMBER
          LDN    10          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          UJN    PDDX
          SPACE  5,20
** NAME-- RCC
*
** PURPOSE-- RESTART CONTROLLER COMMANDS.  SET UP TABLES SO THAT
*            ROUTINE GETUD WILL RESTART ALL CONTROLLER COMMANDS.
          SPACE  2
 RCCX     BSS
          LDML   T12
          STDL   UX          RESTORE UNITS TABLE POINTER
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          LJM    **
 RCC      EQU    *-1
          LDDL   UX
          STML   T12         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    -7
          LPN    17B
          LMDL   CMOD
          NJN    RCC10       IF DIFFERENT CONTROLLER
          RJM    SFRR        SETUP FOR REQUEST RETRY
          UJK    RCC10
          SPACE  5,20
** NAME-- REL
*
** PURPOSE-- READ ERROR LOG
*
** EXIT
*         WC = ERROR CODE OR ZERO IF NO ERROR CODE
          SPACE  2
 RELX     LJM    **
 REL      EQU    *-1
          LDC    H8400
          STML   CP+OPCD     READ PERFORMANCE LOG COMMAND
          LDDL   CMOD
          LPN    7           GET RID OF PORT NUMBER
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     CONTROLLER NUMBER
          LDN    6           COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDN    1
          STDL   T3          CM WORDS TO INPUT
          LDN    0
          STDL   T1          POINTER TO ERROR INFORMATION
          STDL   T2          PREVIOUS ERROR NUMBER
          STDL   WC          ERROR CODE
          LOADC  CM.CB       ADDRESS OF FIRST ERROR BUFFER
          STDL   T4
 REL10    BSS
          LDDL   T1
          SHN    7
          ADDL   T4
          LMC    400000B
          CRML   RPB+15,T3   INPUT FIRST WORD OF ERROR BUFFER
          LDML   RPB+15
          SHN    -8
          ZJN    REL20       IF NO ERROR
          SBDL   T2
          MJN    REL20       IF PREVIOUS ERROR WAS LAST ONE
          ADDL   T2
          STDL   T2          SAVE ERROR NUMBER
          LDML   RPB+15
          LPC    0#FF
          ADC    -0#FA
          MJN    REL14       IF 2ND WORD HAS ERROR CODE
          SBN    3
          PJN    REL14       IF 2ND WORD HAS ERROR CODE
          ADC    0#FA+3
          SHN    8
          UJN    REL16
 REL14    BSS
          LDML   RPB+16
 REL16    BSS
          STDL   WC          SAVE ERROR CODE
          AODL   T1
          LMN    4
          NJK    REL10       IF NOT ALL ERROR BUFFERS CHECKED
 REL20    BSS
          LDDL   WC          ERROR CODE (IF NONZERO)
          LJM    RELX
          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    -/UN/N.UNIT
          LPN    17B
          LMDL   CMOD
          NJN    SCB10       IF DIFFERENT CONTROLLER
          LDML   UNITS,T1
          LPC    0#3FFF
          LMDL   P1
          STML   UNITS,T1    SET -2 COMMANDS IN PROGRESS-
          UJN    SCB10
          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
          LDML   EPCT,CMOD
          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
          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    -/UN/N.UNIT
          LPN    17B
          LMDL   CMOD
          NJN    SRI5        IF DIFFERENT CONTROLLER
          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-- TAC
*
** PURPOSE-- TERMINATE ALL COMMANDS ISSUED
          SPACE  2
 TACX     LJM    **
 TAC      EQU    *-1
          PAUSE  100000      DELAY 170 MILLISECONDS TO ALLOW MAX.
                              DATA IN BUFFER TO BE WRITTEN TO DISK
                              AND TO GUARANTEE AT LEAST 2 SECONDS
                              ELAPSES BEFORE CHANNEL IS DOWNED
          AOML   /SS/P.RQTRY,CSST
          LDDL   PTF
          ZJN    TACX        IF IN PATH TEST
          LDN    0
          STDL   CMOD        CONTROLLER NUMBER
          STDL   UX
          UJN    TAC25
 TAC10    BSS
          AODL   CMOD
          UJN    TAC25
 TAC20    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
          SBDL   UNUML
          PJN    TACX        IF END OF CONFIGURED UNITS
 TAC25    BSS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    17B
          SBDL   CMOD
          MJN    TAC20       IF THIS CONTROLLER ALREADY RESET
          NJN    TAC10       IF CMOD TOO SMALL
          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
          RJM    RCC         RESTART CONTROLLER COMMANDS
          RJM    LIR         LOGICAL INTERFACE RESET
          UJK    TAC10
          ERRMI  EOM-*       IF OVERLAY OVERFLOWS MEMORY
          OVERLAY (IDLE/RESUME),OVST
          ROUTINE IDRO       IDLE REQUEST, RESUME REQUEST OVERLAY
** NAME-- CCLOCK
*
** PURPOSE-- CLEARS CHANNEL LOCK
          SPACE  2
 CCLX     LJM    **
 CCLOCK   EQU    *-1
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          STML   CLF         CHANNEL LOCK FLAG
          LDDL   CHAN        CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD
          UJK    CCLX
          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 UX 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          READ UNIT DISABLED FLAG
          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 PROCESSING FOR THIS UNIT
          UJN    CUB10
          SPACE  5,20
** NAME-- DLN
*
** PURPOSE-- DELETE LOGICAL PP NUMBER FROM UNIT INTERFACE TABLE LOCKWORD.
*            IT IS USED TO DETERMINE IF THE DRIVE IS BEING SUPPORTED IN
*            ALTERNATE OR REDUNDANT ACCESS MODE.  ALSO ENSURE THAT THE UNIT
*            LOCK IS CLEAR.
          SPACE  2
 DLNX     LJM    **
 DLN      EQU    *-1
          LDN    0
          STDL   UX          POINTER TO UNITS TABLE
          UJN    DLN20
 DLN10    BSS
          LDN    P.UN
          RADL   UX          UPDATE TO NEXT UNITS TABLE
 DLN20    BSS
          SBDL   UNUML
          ZJN    DLNX        IF END OF CONFIGURED UNITS
          RJM    LUT         LOCK UNIT TABLE
          NJN    DLN30       IF ALTERNATE PP HAS THE LOCK
          RJM    UUT         UNLOCK UNIT TABLE
 DLN30    BSS
          LCN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.ULOCK  INDEX TO UNIT LOCKWORD
          STDL   T6
          CRDL   P1          READ UNIT LOCKWORD
          LDDL   P2
          SBDL   LPN
          NJN    DLN40       IF 1ST PP NOT THIS ONE
          STDL   T2
          UJN    DLN50
 DLN40    BSS
          LDDL   P3
          SBDL   LPN
          NJK    DLN10       IF 2ND PP NOT THIS ONE
          STDL   T3
 DLN50    BSS
          LDDL   T6
          LMC    400000B
          RDCL   T1          DELETE LOGICAL PP NUMBER FROM LOCKWORD
          PAUSE  4           IN CASE ALTERNATE PP LOCKING UNIT AT THE
                              SAME TIME
          UJK    DLN30       ENSURE PP NUMBER DELETED
          SPACE  5,20
** NAME-- PIR
*
** PURPOSE-- PROCESS IDLE RESUME
          SPACE  2
 PIR      CON    0
          RJM    SPLOCK      SET PP TABLE LOCK
          LDDL   T4
          SHN    /PIT/L.IDLREQ+2
          MJN    PIR10       IF IDLE REQUEST
          LDDL   T4
          LPC    0#4FFE      CLEAR ACTIVE CHECK BIT, RESUME REQUEST BIT,
          STDL   T4           IDLE STATUS BIT, AND LOCK BIT IN PP
          LDDL   CM.PIT+2     INTERFACE TABLE
          LMC    400000B
          CWDL   T1
          LJM    MAIN
 PIR10    BSS
          AOML   IDLE        NUMBER OF TIMES DRIVER IDLED
          LDN    0            ITS BUFFER TO DISK
          STDL   UX          POINTER TO UNITS TABLE
          UJN    PIR12
 PIR11    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 PIR12    BSS
          SBDL   UNUML
          ZJN    PIR13       IF END OF CONFIGURED UNITS
          RJM    SFRR        SET UP FOR REQUEST RETRY
          UJN    PIR11
 PIR13    BSS
          STDL   CMNDS       NO OUTSTANDING COMMANDS
          RJM    DLN         DELETE LOGICAL PP NUMBER FROM LOCKWORD
          LDML   CLF
          NJN    PIR15       IF 2 CONSECUTIVE IDLES AND CHANNEL LOCK
                              ALREADY CLEAR
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 PIR15    BSS
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          CRDL   T1
          LDDL   T4          CLEAR ACTIVE CHECK BIT, IDLE REQUEST BIT,
          LPC    0#2FFE       AND SET IDLE STATUS BIT
          LMC    0#1000
          STDL   T4
          LDDL   CM.PIT+2
          LMC    400000B
          CWDL   T1
 PIR20    BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PIR20
          SPACE  5,20
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP TABLE LOCK IN THE
*            PP INTERFACE TABLE.
          SPACE  2
 SPLX     LJM    **
 SPLOCK   EQU    *-1
 SPLOCK4  BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDN    1
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDSL   T1          ATTEMPT TO SET PP TABLE LOCK
          LDDL   T4
          LPN    1
          ZJK    SPLX        IF LOCK SET
          UJK    SPLOCK4
          ERRMI  EOM-*       IF OVERLAY OVERFLOWS MEMORY
          OVERLAY (INITIALIZE TABLES),OVST
          ROUTINE ITO        INITIALIZE TABLES
** NAME-- CHGCH
*
** PURPOSE-- SET CHANNEL NUMBER IN CHANNEL INSTRUCTIONS
*
** ENTRY  CHAN = CHANNEL NUMBER
          SPACE  2
 CHGX     LJM    **
 CHGCH    EQU    *-1
          LDN    0
          STDL   T1          CHANGE DISK CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGX        END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   CHAN        CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CHG10
 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE
          SPACE  5,20
** NAME-- IIS
*
** PURPOSE-- INITIALIZE INTERRUPT SIZE.  INTERRUPT SIZE CONTROLS
*            THE LENGTH OF TIME BEFORE THE TARGET SECTOR THAT THE
*            CONTROLLER LOOKS FOR RPS.
*
** ENTRY-- P5 = NUMBER OF CONFIGURED UNITS
          SPACE  2
 IISX     LJM    **
 IIS      EQU    *-1
          LDDL   P5
          STDL   T1
 IIS10    BSS
          LDDL   T1
          SODL   T1
          SBN    17
          PJN    IIS10       IF UNUML BIGGER THAN TABLE
          LDML   IS4K10M,T1
          STML   ISL+2
          STML   ISL+3
          STML   ISL+4
          LDML   IS8K10M,T1
          STML   ISL+5
          STML   ISL+6
          LDML   IS4K25M,T1
          STML   ISH+2
          STML   ISH+3
          STML   ISH+4
          LDML   IS8K25M,T1
          STML   ISH+5
          STML   ISH+6
          UJK    IISX

*         INTERRUPT SIZE USED BASED ON UNITS CONFIGURED IF
*         10 MB CHANNEL AND 4096 BYTE SECTOR SIZE.

 IS4K10M  DATA   8192,8192,8192,8192
          DATA   12288,12288,12288,12288
          DATA   12288,12288,12288,12288
          DATA   16384,16384,16384,16384,20480

*         INTERRUPT SIZE USED BASED ON UNITS CONFIGURED IF
*         10 MB CHANNEL AND 8192 BYTE SECTOR SIZE.

 IS8K10M  DATA   8192,8192,8192,16384
          DATA   16384,16384,16384,16384
          DATA   16384,16384,16384,16384
          DATA   16384,16384,16384,16384,16384

*         INTERRUPT SIZE USED BASED ON UNITS CONFIGURED IF
*         25 MB CHANNEL AND 4096 BYTE SECTOR SIZE.

 IS4K25M  DATA   8192,8192,12288,16384
          DATA   16384,16384,16384,16384
          DATA   24576,24576,24576,24576
          DATA   28672,28672,28672,32768,40960

*         INTERRUPT SIZE USED BASED ON UNITS CONFIGURED IF
*         25 MB CHANNEL AND 8192 BYTE SECTOR SIZE.

 IS8K25M  DATA   8192,16384,16384,16384
          DATA   16384,16384,16384,24576
          DATA   24576,24576,24576,24576
          DATA   24576,24576,32768,32768,32768
          SPACE  5,20
** NAME-- IT
*
** PURPOSE-- INITIALIZE TABLES
*
** ENTRY  CM.PIT = CM BYTE ADDRESS OF THE PP INTERFACE TABLE.
          SPACE  2
 ITX      LJM    **
 IT       EQU    *-1
          LDK    OVST-PSB    LENGTH OF BUFFERS
          STDL   T1
 IT10     BSS
          LDN    0
          STML   PSB-1,T1    ZERO OUT BUFFERS
          SODL   T1
          NJN    IT10
          IFEQ   FE,0
          STDL   PORTA
          STDL   PORTB
          ENDIF
          STDL   UX          INITIALIZE DIRECT CELLS
          STDL   LUX
          STDL   MALET
          STDL   P4
          STDL   P5
          STDL   P6
          STDL   T7
          STDL   CMOD
          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   LPN
          REFAD  IPIT+/PIT/P.RSBUF,CM.RS  REFORMAT CM ADDRESS OF RESPONSE
                                          BUFFER AND SAVE IN CM.RS
          LDML   IPIT+/PIT/P.LIMIT  GET LIMIT OF RESPONSE BUFFER
          STDL   LIM
          REFAD  IPIT+/PIT/P.INT,CM.INT  REFORMAT CM ADDRESS OF INTERRUPT
                                         WORD AND SAVE IN CM.INT
          REFAD  IPIT+/PIT/P.CHAN,CM.CHAN  REFORMAT CM ADDRESS OF
                                           CHANNEL TABLE AND SAVE IN CM.CHAN
          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    IT20        IF COMMUNICATION BUFFER LONG ENOUGH
          LDC    E20B
          RJM    INTERR      REPORT ERROR (NO RETURN)

*         INITIALIZE UNITS AND SS TABLES.  THE TABLES WILL BE IN ASCENDING ORDER
*         BY CONTROLLER NUMBER.  FOR EACH CONTROLLER TABLES WILL BE IN ASCENDING
*         ORDER FOR ITS DRIVES.

 IT20     BSS
          LDML   IPIT+/PIT/P.UNITC  NUMBER OF UNIT DESCRIPTIORS
          SHN    1
          STDL   T8          LENGTH OF UNIT DESCRIPTOR (CM WORDS)
          ZJK    IT90        IF NO UNIT DESCRIPTORS
 IT30     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    IT70        IF NULL ENTRY
          LDML   IBUF+/UD/P.CNTRLR
          STDL   T2
          SHN    -3
          ADDL   T2
          LPN    17B
          LMDL   CMOD
          NJK    IT70        IF DIFFERENT CONTROLLER
          LDML   IBUF+/UD/P.UNIT
          LPN    37B
          LMDL   T7
          NJK    IT70        IF DIFFERENT DRIVE
          LDDL   P5
          ADC    -UNUM
          NJN    IT40        IF 64 OR LESS UNITS
          LDC    E208        TOO MANY CONFIGURED UNITS
          RJM    INTERR      REPORT ERROR (NO RETURN)
 IT40     BSS
          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
          LDDL   CMADR+1
          STML   UNITS+/UN/P.UIT+1,UX
          LDML   UBUF+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJK    IT70        IF UNIT DISABLED
          LDML   UBUF+/UIT/P.UTYPE  CHECK DEVICE TYPE
          LPN    77B
          SBN    9
          MJN    IT50        IF INVALID UNIT TYPE
          SBN    22
          MJN    IT60        IF VALID UNIT TYPE
 IT50     BSS
          LDC    E306        INVALID UNIT TYPE
          RJM    INTERR      REPORT ERROR (NO RETURN)
 IT60     BSS
          ADN    22
          SHN    4
          STML   SS+/SS/P.DT,P4  DEVICE TYPE
          LDDL   T2
          SHN    -8
          STDL   CHAN        CHANNEL NUMBER
          LDDL   CMOD
          LPN    7
          SHN    8
          ADDL   T7
          STML   SS+/SS/P.UNIT,P4  PUT CONTROLLER, UNIT NUMBER IN SS TABLE
          LDDL   CMOD
          SHN    5
          ADDL   T7
          STML   UNITS,UX    PUT PORT, CONTROLLER, UNIT NUMBER IN UNITS TABLE
          IFEQ   FE,0
          SHN    /UN/L.PORT+2
          MJN    IT62
          AODL   PORTA
          UJN    IT63
 IT62     AODL   PORTB
          ENDIF
 IT63     LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN SS TABLE
          STML   SS+/SS/P.LU,P4
          LDDL   LPN
          STML   SS+/SS/P.LPN,P4  SAVE LOGICAL PP NUMBER
          LDK    RSST-1      RESIDENT SS TABLES MINUS ONE
          SBDL   P5
          MJN    IT65        IF NO ROOM FOR A RESIDENT TABLE
          LDC    SS
          ADDL   P4
          STML   UNITS+/UN/P.SSPTR,UX  POINTER FROM UNITS TABLE TO SS TABLE
          LDC    P.SS
          RADL   P4          INCREMENT TO NEXT RESIDENT SS TABLE
          UJN    IT69
 IT65     BSS
          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    IT68        IF BUFFER LARGE ENOUGH
          LDC    E308
          RJM    INTERR      REPORT ERROR (NO RETURN)
 IT68     BSS
          RJM    WST         WRITE SS TABLE TO UNIT COMMUNICATIONS BUFFER
 IT69     BSS
          AODL   P5          NUMBER OF CONFIGURED UNITS
          LDN    P.UN
          RADL   UX          BUMP CONFIGURED UNIT INDEX
          UJN    IT80
 IT70     BSS
          LDN    C.UD
          RADL   P6          BUMP TO NEXT UNIT DESCRIPTOR ENTRY
          SBDL   T8          CHECK FOR END OF UNIT DESCRIPTORS
          NJK    IT30        IF MORE UNIT DESCRIPTORS
 IT80     BSS
          LDN    0
          STDL   P6          INDEX TO UNIT DESCRIPTORS
          AODL   T7          INCREMENT DRIVE NUMBER
          SBN    32
          MJK    IT30        IF LEGAL UNIT NUMBER
          STDL   T7
          AODL   CMOD        INCREMENT CONTROLLER NUMBER
          SBN    16
          MJK    IT30        IF LEGAL CONTROLLER NUMBER
 IT90     BSS
          LDDL   UX
          STDL   UNUML       END OF ACTIVE UNIT TABLE
          STDL   SSUN        INVALIDATE TABLE AT SSNR
          RJM    CHGCH       SET CHANNEL INSTRUCTIONS
          RJM    IIS         INITIALIZE INTERRUPT SIZE
          LJM    ITX
          SPACE  5,20
 SAVAX    LJM    **
 SAVAD    EQU    *-1
          STML   2,T2
          LDDL   CMADR
          STI    T2
          LDDL   CMADR+1
          STML   1,T2
          UJK    SAVAX
          SPACE  5,20
** NAME-- WST
*
** PURPOSE-- WRITE SS TABLE TO UNIT COMMUNICATIONS BUFFER
          SPACE  2
 WSTX     LJM    **
 WST      EQU    *-1
          LDN    C.SS
          STDL   WC
 WST10    BSS
          LDC    0#8000
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          STDL   T5
          LOADF  UBUF+/UIT/P.UBUF  LOAD ADDRESS OF COMMUNICATION BUFFER
          STDL   T1
          RDSL   T2          TRY TO LOCK THE BUFFER
          LDDL   T2
          SHN    /SS/L.LOCK+2
          MJN    WST10       IF ANOTHER PP HAS THE LOCK
          ZJN    WST20       IF 1ST HALF OF BUFFER AVAILABLE
          LDDL   T2
          SBDL   LPN
          ZJN    WST20       IF THIS PP OWNS THE 1ST HALF OF THE BUFFER
          LDDL   T1
          LMC    400000B
          CWDL   T2          CLEAR THE LOCK
          LDML   UNITS,UX
          LMC    0#400
          STML   UNITS,UX
          LDN    0#20
 WST20    BSS
          ADDL   T1
          LMC    400000B
          CWML   SSNR,WC     WRITE SS ENTRY TO COMMUNICATION BUFFER
          LJM    WSTX
          ERRMI  IPIT-*      IF CODE OVERFLOWS INTO TABLES
          OVERLAY (PATH TEST),OVST
          ROUTINE PTO        PATH TEST OVERLAY
** 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
 BPTB10   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    BPTB10
          SPACE  5,20
** NAME-- CCA
*
** PURPOSE-- CHECK CONTROLLER ATTRIBUTES
*          - DISABLE USAGE STATISTIC COUNTING
*          - ENABLE MASTER TERMINATE
*          - DISABLE EXTENT RESPONSE FOR MASTER TERMINATE
*          - ENABLE REPORTING DEVICE FAULT LOG
*          - SET SPEED SELECTION TO 10 MB/S IF 10 MB CHANNEL
*          - SET SPEED SELECTION TO 25 MB/S IF 25 MB CHANNEL
          SPACE  2
 CCAX     LJM    **
 CCA      EQU    *-1
          LDDL   CMOD
          LPN    7           GET RID OF CHANNEL PORT
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     CONTROLLER ADDRESS
          LDC    0#201
          STDL   MFID        INTERLOCK COMMANDS, RESPONSES AND DATA
          RJM    LIR         LOGICAL INTERFACE RESET

*         RESTORE CONTROLLER ATTRIBUTES

          LDC    H0202
          STML   CP+OPCD     RESTORE ATTRIBUTES OPERATION CODE
          LDN    6           COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          RJM    SDTM        SET DATA TRANSFER MODE FOR INTERLOCK

*         CHECK ATTRIBUTE PARAMETERS D1, D2, D3, D4, AND D6

          LDC    H0200
          STML   CP+OPCD     REPORT ATTRIBUTES OPERATION CODE
          LDC    0#76C
          STML   CP+FCP
          LDC    0#80D1      REPORT PARAMETERS D1,D2,D3,D4,D6
          STML   CP+FCP+1
          LDC    0#D2D3
          STML   CP+FCP+2
          LDC    0#D4D6
          STML   CP+FCP+3
          LDN    14          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDN    0
          STDL   T1
          STDL   T2
 CCA10    BSS
          LDML   RPB+8,T1
          LMML   CCAT,T1
          NJK    CCA80       IF PARAMETER ID NOT FOUND
          AODL   T1
          AODL   T1
          SBN    10
          MJN    CCA10       IF NOT ALL PARAMETER IDS CHECKED
 CCA20    BSS
          LDML   RPB+8+1,T2
          LMML   CCAT+1,T2
          NJN    CCA30       IF PARAMETER SET WRONG
          AODL   T2
          AODL   T2
          SBN    8
          MJN    CCA20       IF NOT ALL PARAMETERS CHECKED
          LDML   RPB+8+11
          LPC    0#F02
          LMML   CTS,CH
          ZJK    CCA70       IF ATTRIBUTE D6 CORRECT

*         LOAD/SAVE ATTRIBUTES

 CCA30    BSS
          LDN    0
          STDL   T1
 CCA40    BSS
          LDML   CCAT,T1     BUILD COMMAND PACKET
          STML   CP+4,T1
          AODL   T1
          LMN    9
          NJN    CCA40       IF FIRST 11 PARAMETER WORDS NOT MOVED
          LDML   RPB+8+9
          STML   CP+FCP+9    PORT A,B CONTROLLER ADDRESS
          LDML   RPB+8+10
          STML   CP+FCP+10   PORT C,D CONTROLLER ADDRESS
          LDML   RPB+8+11
          LPC    0#F0FD
          LMML   CTS,CH
          STML   CP+FCP+11   SELECT CHANNEL TRANSFER RATE
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTES OPERATION CODE
          LDN    30          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          LDC    0#200
          STDL   MFID        INTERLOCK COMMANDS AND RESPONSES ONLY
          RJM    SDTM        SET DATA TRANSFER MODE
          RJM    SA          SAVE ATTRIBUTES
          LDML   RPB+8+11
          LPC    0#F02
          LMML   CTS,CH
          ZJN    CCA70       IF CHANNEL TRANSFER SPEED CORRECT
          LDC    H8415       SLAVE RESET
          STML   /SS/P.RESET,CSST  INDICATE RESET ISSUED
          RJM    IR          ISSUE RESET
          RJM    IH          INTERRUPT HANDLER
          LDN    0
          STML   /SS/P.RESET,CSST  INDICATE RESET COMPLETE
          LDN    ID16
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    CCA80       IF PARAMETER NOT FOUND
          LDML   RPB+6,T3
          LPC    0#FEE0
          LMC    0#6000
          NJN    CCA80       IF SLAVE RESET FAILED
 CCA70    BSS
          STDL   MFID        CLEAR MASK FOR INTERLOCK DATA
          RJM    DTM         DETERMINE TRANSFER MODE
          RJM    SEL         ENSURE STREAMING FOR COMMANDS AND RESPONSES
          STDL   CTM         CLEAR CHANGE TRANSFER MODE FLAG
          RJM    DCM         DESELECT THE CONTROLLER
          RJM    SDTM        SET DATA TRANSFER MODE TO STREAMING
          LJM    CCAX
 CCA80    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 CCAT     BSS                EXPECTED CONTROLLER ATTRIBUTES
          DATA   0#2D1,0#100
          DATA   0#2D2,0#100
          DATA   0#2D3,0#100
          DATA   0#2D4,0#100
          DATA   0#7D6
          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
 COG10    BSS
          LDDL   CH
          ZJN    COGX        IF 10 MB CHANNEL

*         THE OPERAND GENERATOR FOR THE 25 MB CHANNEL IS 3 WORDS.
*         IF NOT ALL WORDS ARE READ, A CHANNEL ERROR MAY OCCUR.

          RJM    DCW         DISCARD SECOND WORD
          RJM    DCW         DISCARD THIRD WORD
 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    COG10       IF OPERAND GENERATOR IS CORRECT
          LDN    E18         DMA TEST MODE FAILURE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          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 THE PP HAS RECEIVED A RESUME
*         3)  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        CONTROLLER NUMBER
          STDL   UX
          RJM    GETSS       GET SS TABLE FROM CM IF NECESSARY
          RJM    MR          MASTER RESET
          UJN    PT20
 PT8      BSS
          AODL   CMOD
          UJN    PT20
 PT16     BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
          SBDL   UNUML
          PJN    PT100       IF END OF CONFIGURED UNITS
 PT20     BSS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    17B
          SBDL   CMOD
          MJN    PT16        IF THIS CONTROLLER ALREADY TESTED
          NJN    PT8         IF CMOD TOO SMALL
          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 FROM CM IF NECESSARY
          RJM    PS          PORT SELECT
          AOML   TMF         INDICATE TEST MODE IN PROGRESS
          RJM    TDP         TEST DMA PATH
          STML   TMF         TMF = 0, TEST MODE COMPLETE
          RJM    CCA         CHECK CONTROLLER ATTRIBUTES

*         WRITE BUFFER

          LDN    12
          STML   CP          COMMAND PACKET LENGTH
          LDC    H6200
          STML   CP+OPCD     WRITE TO BUFFER COMMAND
          LDC    0#531
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDN    0
          STML   CP+FCP+1    UPPER WORD OF BYTE COUNT
          LDC    IBL*2
          STML   CP+FCP+2    BYTE LENGTH
          IFEQ   FE,1
          RJM    CPTB        FOR FORCING ERRORS
          ELSE
          RJM    CPT         COMMAND PACKET TRANSFER
          ENDIF
          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
          LDN    IBL         WORD COUNT
          RJM    OD          OUTPUT DATA
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
          RJM    WFI         WAIT FOR INACTIVE
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROLLER
          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
          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
          LDN    IBL         WORD COUNT
          RJM    ID          INPUT DATA
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
          RJM    WFI         WAIT FOR INACTIVE
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROLLER
          LDDL   WC
          NJN    PT80        IF NOT ALL WORDS TRANSFERRED
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    PT90        IF NOT SUCCESSFUL

*         DON'T VERIFY DATA.  THE CONTROLLER BUFFER CAN BE CHANGED
*         BETWEEN THE WRITE AND READ OF THE BUFFER.

          LDML   /SS/P.RECOV,CSST
          LMN    3
          ZJN    PT70        IF PATH TEST PART OF RECOVERY FOR I/O REQUEST
          LDN    0
          STML   /SS/P.RQTRY,CSST  CLEAR REQUEST RETRY COUNTER
 PT70     BSS
          LJM    PT8
 PT80     BSS
          LDN    E29         INCOMPLETE TRANSFER
          UJN    PT94
 PT90     BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
 PT94     BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
          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
          STML   CLF         CHANNEL LOCK FLAG
          UJK    SCLX        EXIT, LOCK WAS SET
          SPACE  5,20
** NAME-- SDTM
*
** PURPOSE-- SET DATA TRANSFER MODE
          SPACE  2
 SDTMX    LJM    **
 SDTM     EQU    *-1
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTES OPERATION CODE
          LDC    0#46E
          STML   CP+FCP      PARAMETER 6E
          LDDL   MFID
          LPN    1
          ADC    0#C080
          STML   CP+FCP+1    MODE FOR DATA
          LDN    0
          STML   CP+FCP+2
          LDN    12          COMMAND PACKET LENGTH
          RJM    ODFP        OUTPUT DATA FROM PP
          UJK    SDTMX
          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    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-- 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   OB,P1       READ TEST MODE PATTERN
          LDN    0
          STDL   P2
          STDL   P3
          LDC    100         PP WORDS TO CHECKSUM
          STDL   P1
 VTMD10   BSS
          LDML   OB-1,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    EP          ERROR PROCESSING (NO RETURN)
          ERRMI  OB-*        IF CODE OVERFLOWS INTO TABLES

*         THE LAST CARD IN THE DECK MUST BE /EOR SO THAT COMS CAN
*         ASSEMBLE MULTIPLE DECKS.

          END
/EOR
