          IDENT  E5P5831
          CIPPU
          MEMSEL 16
          TITLE  E5P5831 NOS/VE HPS DISK DRIVER FOR S0
*
*         WORD 6 OF THE FOLLOWING COMMENT MUST BE A REVISION NUMBER
*         FOR CTI.
*
          COMMENT *SMD* LVL=02
          COMMENT  COPYRIGHT FIDES INFORMATION SERVICES. 2003
*
*         THIS IS THE PP DRIVER FOR THE 10 MB/S IPI CHANNEL THAT SUPPORTS
*         THE 5830 DISK SUBSYSTEM ON A CYBER 930 SYSTEM. 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 E5P5831 AND THE DECK NAME IS IOM$E5P5831. 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   -$
* BEGIN IODMAC1
          SPACE  5
** THE FOLLOWING SET OF MACROS PROVIDE A MEANS OF AIDING THE PP COMPASS
** PROGRAMMER IN MAKING REFERENCES TO CYBIL STRUCTURES.  A PARALLEL DEF-
** INITION DECK IS CREATED TO MATCH THE CYBIL DECLARATIONS.  THIS DECK IS
** INPUT TO PP ASSEMBLIES WHICH REFERENCE THE STRUCTURES.
** REFERENCES TO FIELDS OF A RECORD ARE MADE ACCORDING TO THE FOLLOWING
**
**   1.ALL FIELD NAMES ARE QUALIFIED BY THE RECORD NAME.
**      B.RECORD=BYTE LENGTH OF RECORD
**      P.RECORD=LENGTH OF RECORD IN PP WORDS
**      C.RECORD=LENGTH OF RECORD IN CP WORDS
**
**   2.FIELD DEFINITIONS PRODUCE A SET OF SYMBOLS FOR CODE REFERENCE...
**      /RECORD/C.FIELD=CP WORD OFFSET OF FIELD WITHIN RECORD
**      /RECORD/P.FIELD=PP WORD OFFSET OF FIELD WITHIN RECORD
**      /RECORD/L.FIELD=LEFTMOST BIT OF FIELD IN FIRST PP WORD (0=2**15)
**                      IN UNPACKED RECORDS, FIELDS NOT DESCRIBED AS
**                      MULTIPLES OF BYTES ARE ASSUMED TO BE RIGHT ALIGNED
**                      WITHIN AN INTEGRAL NUMBER OF BYTES.  GARBAGE IS
**                      ASSUMED IN THE LEFT (UNUSED) BIT POSITIONS.
**      /RECORD/N.FIELD=NUMBER OF BITS IN THE FIELD (INCLUDING UNUSED BITS
**                      IN JUSTIFIED FIELDS).
**      /RECORD/B.FIELD=BYTE COUNT OF FIELD.
          SPACE  5
** RECORD DEFINITION MACRO
** NAME IS NAME WITH WHICH THE REFERENCES TO THE FIELDS OF THE RECORD
** MUST BE QUALIFIED.  PACKING IS *PACKED* OR OTHER TO INDICATE THE
** ATTRIBUTE OF THE CYBIL RECORD DEFINITION.
          SPACE  3
          MACRO  RECORD,NAME,PACKING
          QUAL   NAME
BITC      SET    0
PACKED    SET    0
          IFC    EQ,*PACKING*PACKED*,1
PACKED    SET    1
          ENDM
          SPACE  5
** RECEND MACRO
** DEFINE THE END OF A RECORD
          SPACE  3
          MACRO  RECEND,NAME
          QUAL
B.NAME    SET    /NAME/BITC+7
B.NAME    SET    B.NAME/8
P.NAME    SET    B.NAME+1
P.NAME    SET    P.NAME/2
C.NAME    SET    P.NAME+3
C.NAME    SET    C.NAME/4
          ENDM
          SPACE  5
** FIELD DEFINITION MACRO
** THIS MACRO DEFINES A FIELD WITHIN A RECORD IN TERMS OF ITS STARTING
** PP WORD NUMBER, LEFTMOST BIT WITHIN THE PP WORD, NUMBER OF BITS IN
** THE FIELD, AND NUMBER OF BYTES IN THE FIELD.
** NAME-NAME OF FIELD FOR QUALIFIED REFERENCES
** LENGTH-NUMBER OF BITS IN FIELD
          SPACE  3
          MACRO  FIELD,NAME,LENGTH
*PP WORD OFFSET
P.NAME    SET    BITC/16

* CP WORD OFFSET
C.NAME    SET    BITC/64

* LEFTMOST BIT IN WORD 0 (0 FROM LEFTMOST, 15=RIGHTMOST)
L.NAME    SET    BITC-P.NAME*16

* BIT LENGTH
N.NAME    SET    LENGTH

* BYTE COUNT
B.NAME    SET    LENGTH+7
B.NAME    SET    B.NAME/8

* INCREMENT BIT COUNTER
BITC      SET    BITC+N.NAME
          ENDM
          SPACE  5
** LOG2 MACRO
** THIS IS A SUPPORT MACRO TO ASSIST IN DETERMINING SUBRANGE STORAGE
** REQUIREMENTS.  THE PARAMETER IS THE VALUE WHICH MUST BE SIZED.
** THE BIT COUNT REQUIRED TO REPRESENT THE PARAMETER VALUE IS RETURNED
** IN ASSEMBLY VARIABLE LOG2$.
          SPACE  3
LOG2      MACRO  N
          LOCAL  J
LOG2$     SET    1
J         SET    N/2
          DUP    32
          IFGT   J,0,2
LOG2$     SET    LOG2$+1
J         SET    J/2
          ENDD
          ENDM
          SPACE  5
** MGEN MACRO
** THIS IS A SUPPORT MACRO FOR THE LOAD/STORE MACROS
** THE LENGTH PARAMETER IS THE LENGTH OF A FIELD OF RJ BITS IN A
** 16 BIT WORD.  THE VALUE OF MASK$ UPON EXIT FROM THE MACRO IS
** A 16 BIT MASK TO ZERO FILL THE RIGHT JUSTIFIED BIT PATTERN.
          SPACE  3
MGEN      MACRO  LENGTH
MASK$     SET    0
          DUP    LENGTH
MASK$     SET    MASK$+MASK$+1
          ENDD
          ENDM
          SPACE  5
** ALIGN MACRO
** MACRO TO ALIGN THE CURRENT BIT COUNTER TO BE *OFFSET* MOD *MODULUS*
** EXAMPLE ALIGN 0,8 FORCES BYTE BOUNDARY.
          SPACE  3
ALIGN     MACRO  OFFSET,MODULUS
          LOCAL M

* VERIFY PARAMETERS
          IFGE   OFFSET,MODULUS,1
M         ERR                      MODULUS MUST EXCEED OFFSET
          IFLE   MODULUS,0,1
M         ERR                      MODULUS MUST EXCEED 0

M         SET    BITC+MODULUS-OFFSET-1
M         SET    M/MODULUS*MODULUS
BITC      SET    M+OFFSET
          ENDM
          SPACE  5
** INTEGER MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS A CYBIL INTEGER
          SPACE  3
          MACRO  INTEGER,NAME
          ALIGN  0,8
NAME      FIELD  64
          ENDM
          SPACE  5
** CHARACTER MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS AN EIGHT BIT CHARACTER
          SPACE  3
          MACRO  CHARC,NAME
          IFEQ   PACKED,0,1
          ALIGN  0,8               BYTE ALIGNED IF UNPACKED
NAME      FIELD  8
          ENDM
          SPACE  5
** ORDINAL MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS AN ORDINAL OF RANGE 0..N
          SPACE  3
          MACRO  ORDINAL,NAME,N
          LOCAL Q
Q         SET    N-1
NAME      SUBRANGE 0,Q
          ENDM
          SPACE  5
** BOOLEAN MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS A BOOLEAN VALUE
          SPACE  3
          MACRO  BOOLEAN,NAME
PK        IFEQ   PACKED,1
* PACKED RECORD
NAME      FIELD  1
PK        ELSE
* NOT PACKED, FORCE BYTE BOUNDARY THEN RIGHT ALIGNMENT
          ALIGN  0,8
          ALIGN  7,8
NAME      FIELD  1
PK        ENDIF
          ENDM
          SPACE  5
** STRING MACRO
** THIS MACRO GENERATES A STRING OF SPECIFIED LENGTH
          SPACE  3
          MACRO  STRING,NAME,LENGTH
          ALIGN  0,8               STRINGS ARE ALWAYS BYTE ALIGNED
NAME      FIELD  LENGTH*8
          ENDM
          SPACE  5
** STRUCT MACRO
** THIS MACRO IS USED WHEN A STRUCTURE (BYTE ALIGNED) AND OF SPECIFIED
** BYTE LENGTH IS EMBEDDED IN A RECORD.
          SPACE  3
          MACRO  STRUCT,NAME,LENGTH
          ALIGN  0,8
NAME      FIELD  LENGTH*8
          ENDM
          SPACE  5
** SUBRANGE MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS A SUBRANGE OF A..B
          SPACE  3
          MACRO  SUBRANGE,NAME,A,B
          LOCAL Q
PK        IFEQ   PACKED,1
* PACKED RECORD
ANEGP     IFLT   A,0
Q         SET    -A
          IFLE   Q,B,1
Q         SET    B+1
          LOG2   Q
Q         SET    LOG2$+1
ANEGP     ELSE
          LOG2   B
Q         SET    LOG2$
ANEGP     ENDIF

NAME      FIELD  Q
PK        ELSE

* UNPACKED RECORD
          ALIGN  0,8
ANEGU     IFLT   A,0
* NEGATIVE LOWER BOUNT REQUIRES 8 BYTES
NAME      FIELD  64
ANEGU     ELSE

* USE UPPER BOUND
          LOG2   B
Q         SET    LOG2$+7
Q         SET    Q/8*8
NAME      FIELD  Q
ANEGU     ENDIF

PK        ENDIF
          ENDM
          SPACE  5
** PPWORD MACRO
** THIS MACRO CAUSES THE NAMED FIELD TO BE DEFINED AS AN ALIGNED PP WORD
** IT IS USED AS A DOCUMENTATION AID TO REMIND THE PROGRAMMER THAT THE
** CYBIL STRUCTURE IS DESIGNED TO ACCOMODATE PP REFERENCE.
          SPACE  3
          MACRO  PPWORD,NAME
          ALIGN  0,16
NAME      FIELD  16
          ENDM
          SPACE  5
** RMA MACRO
** THIS IS A CONVENIENCE MACRO FOR RMA FIELD DEFINITION (BYTE ALIGNMENT
** IS ASSUMED).
          SPACE  3
          MACRO  RMA,NAME
          ALIGN  0,8
NAME      FIELD  32
          ENDM
          SPACE  5
** MLOAD MACRO
** MACRO TO PERFORM A 16 BIT LOAD FROM PP MEMORY USING THE LDDL OR LDML
** INSTRUCTION.  USED TO SUPPORT THE LOAD MACRO.
          SPACE  3
MLOAD     MACRO  W
M         IFLE   W,77B
          LDDL   W
M         ELSE
          LDML   W
M         ENDIF
          ENDM
          SPACE  5
** MSTORE MACRO
** MACRO TO PERFORM A 16 BIT STORE TO PP MEMORY USING THE STDL OR STML
** INSTRUCTION.  USED TO SUPPORT THE STORE MACRO.
          SPACE  3
MSTORE    MACRO  W
M         IFLE   W,77B
          STDL   W
M         ELSE
          STML   W
M         ENDIF
          ENDM
* END IODMAC1
* BEGIN IODMAC2
          SPACE  5
** THESE MACROS MAY USE T1-T8 WITH IN LINE CODE GENERATION OR INDIRECTLY
** THROUGH CALLS TO THE LOAD/STORE SUPPORT ROUTINES
          SPACE  5
** LOAD MACRO
** LOAD A FIELD INTO A AND RIGHT JUSTIFY, ZERO FILL THE REGISTER
** INPUT..RLOC=LOCATION OF BEGINNING OF RECORD
**        RNAME=RECORD NAME
**        FIELD=FIELD NAME (MUST BE LESS THAN 17 BITS LONG)
** OUTPUT..(A)=/RECORD/FIELD RJZF
** USES T1, T2 WHEN FIELDS CROSS PP WORD BOUNDARIES
          SPACE  3
LOAD      MACRO  RLOC,RNAME,FIELD
          LOCAL T
ERCHK     IFGT   /RNAME/N.FIELD,16
M         ERR    FIELD TOO LARGE
ERCHK     ELSE

* TEST WHETHER FIELD CROSSES PP WORD BOUNDARIES AND IF IT DOES NOT,
* GENERATE THE LOAD IN LINE.
L1        IFLE   /RNAME/N.FIELD+/RNAME/L.FIELD,16

* LOAD IT
          LDML   /RNAME/P.FIELD+RLOC

* SHIFT IT
T         SET    16-/RNAME/N.FIELD-/RNAME/L.FIELD
          IFNE   T,0,1
          SHN    -T

* MASK IT
M0        IFNE   /RNAME/L.FIELD,0
M1        IFNE   /RNAME/N.FIELD,16
          MGEN   /RNAME/N.FIELD
M2        IFGT   MASK$,77B
          LPC    MASK$
M2        ELSE
          LPN    MASK$
M2        ENDIF
M1        ENDIF
M0        ENDIF

L1        ELSE

* CROSSES WORD BOUNDARIES
          RJM    LOADF
          VFD    4/0,12/RLOC+/RNAME/P.FIELD
          VFD    4//RNAME/L.FIELD,12//RNAME/N.FIELD

L1        ENDIF

ERCHK     ENDIF

          ENDM
          SPACE  5
** STORE MACRO
** THIS MACRO STORES THE CONTENTS OF A INTO A FIELD IN PP MEMORY.
** THE FIELD MAY CROSS PP WORD BOUNDARIES BUT MUST NOT EXCEED 16
** BITS IN LENGTH.
** INPUT...RLOC=LOCATION OF BEGINNING OF RECORD
**         RNAME=RECORD NAME
**         FIELD=FIELD NAME (MUST BE A FIELD OF 16 OR LESS BITS IN LENGTH)
**         (A)=RJZF VALUE TO STORE.  (IT MUST NOT EXCEED FIELD WIDTH OR
**             UNPREDICTABLE RESULTS WILL OCCUR).
**
** OUTPUT..RECORD UPDATED IN PP MEMORY.
**
** USES T1, T2 PLUS REFERENCE STOREF
          SPACE  3
STORE     MACRO  RLOC,RNAME,FIELD
          LOCAL  X
ERCHK     IFGT   /RNAME/N.FIELD,16
M         ERR    FIELD TOO LARGE
ERCHK     ELSE

* TEST WHETHER FIELD CROSSES PP WORD BOUNDARIES AND IF IT DOES NOT,
* GENERATE IN LINE CODE.
L1        IFLE   /RNAME/N.FIELD+/RNAME/L.FIELD,16
L2        IFEQ   /RNAME/N.FIELD,16

* FULL PP WORD
          STML   /RNAME/P.FIELD+RLOC

L2        ELSE

* ALIGN SOURCE VALUE
X         SET    16-/RNAME/N.FIELD-/RNAME/L.FIELD
          IFNE   X,0,1
          SHN    X

* STORE ALIGNED VALUE
          STDL   T1

* LOAD DEST. FIELD
          LDML   /RNAME/P.FIELD+RLOC

* FORM SHIFTED MASK VALUE
          MGEN   /RNAME/N.FIELD

          DUP    X
MASK$     SET    MASK$+MASK$
          ENDD

* GENERATE MASK INSTRUCTION
          LPC    -MASK$

* INSERT DATA
          ADDL   T1

* REPLACE
          STML   /RNAME/P.FIELD+RLOC

L2        ENDIF

L1        ELSE

* FIELD CROSSES WORD BOUNDARIES
          RJM    STOREF
          VFD    4/0,12/RLOC+/RNAME/P.FIELD
          VFD    4//RNAME/L.FIELD,12//RNAME/N.FIELD

L1        ENDIF
ERCHK     ENDIF
          ENDM
* END IODMAC2
*BEGIN IODMAC3
          SPACE  5
** COMMON PP ROUTINE AID MACROS
          SPACE  2
** MACRO TO DEFINE A SUBROUTINE ENTRY POINT TO BE CALLED BY RJM NAME
          PURGMAC  SUBR
          MACRO  SUBR,NAME
QQQ$RET   SET    *
          LJM    *
          ORG    *-1
NAME      DATA   0
          ENDM
          SPACE  5
** MACRO TO EXECUTE A RETURN FROM A SUBROUTINE
** IT MUST FOLLOW A SUBR DECLARATION
          PURGMAC  RETURN
RETURN    MACRO
M         IFGT   *-QQQ$RET,37B
          LJM    QQQ$RET
M         ELSE
          UJN    QQQ$RET
M         ENDIF
          ENDM
          SPACE  5
** MACRO TO PROVIDE QUALIFIED SYMBOL DEFINITION (HEX)
**  NAME=NAME TO QUALIFY IN DEFINITION
**  QUAL=QUALIFIES NAME
**  VALUE=HEX DIGIT STRING (0-9,A-F)
          SPACE  3
          MACRO  SYMDEFH,NAME,QUALS,VALUE
          QUAL   QUALS
NAME      EQU    0#_VALUE
          QUAL   *
          ENDM
          SPACE  5
** MACRO TO PROVIDE QUALIFIED SYMBOL DEFINITION (DEFAULT BASE)
** NAME=NAME TO QUALIFY IN DEFINITION
** QUALS=QUALIFIES NAME
** VALUE=DIGIT STRING (OCTAL OR DECIMAL OR HEX)
          SPACE  3
          MACRO  SYMDEF,NAME,QUALS,VALUE
          QUAL   QUALS
NAME      EQU    VALUE
          QUAL   *
          ENDM


* END IODMAC3
*BEGIN IODMAC4
          SPACE  5,20
*
** NAME-- LMK,LPK,LDK,ADK,ZJK,NJK,PJK,MJK,UJK
*
** PURPOSE-- DETERMINE FOR THOSE INSTRUCTIONS HAVING A SHORT AND LONG
*            FORM WHICH INSTRUCTION FORM NEEDS TO BE GENERATED.
*
** CALLING SEQUENCE-- SAME AS THE REGULAR PP INSTRUCTION
*
** RESTRICTIONS-- SYMBOLS REFERENCED BY THESE MACROS SHOULD BE
*                 DEFINED PRIOR TO THE MACRO CALL.

*        NO-ADDRESS AND CONSTANT INSTRUCTIONS

NEWOP     ECHO   ,I=(LM,LP,LD,AD)

I_K       MACRO  P1
L         IF     DEF,P1
L         IFLE   P1,77B
L         IFGE   P1,0
          I_N    P1
L         ELSE   1
          I_C    P1
          ENDM
NEWOP     ENDD

*         JUMP INSTRUCTIONS

NEWOP     ECHO   ,I=(ZJ,NJ,PJ,MJ),J=(NJ,ZJ,MJ,PJ)
*
I_K       MACRO  P1
L         IF     DEF,P1
L         IFGE   *-P1,0
L         IFLT   *-P1,40B
          I_N    P1
L         ELSE   2
          J_N    *+3
          LJM    P1
          ENDM
NEWOP     ENDD

UJK       MACRO  P1
L         IF     DEF,P1
L         IFGE   *-P1,0
L         IFLT   *-P1,40B
          UJN    P1
L         ELSE   1
          LJM    P1
          ENDM
          SPACE  5,20
** NAME-- AJM,SCF,IJM,CCF,FJM,SFM,EJM,CFM,IAN,IAM,OAN,OAM,ACN,DCN
*         FAN,FNC,FSJM,FCJM,IAPM,OAPM,CMCH,CHCM,MCLR
*
** PURPOSE-- REDEFINE I/O INSTRUCTIONS SO THAT THE ADDRESS OF CHANNEL
*            INSTRUCTIONS CAN BE SAVED IN A TABLE.
NEWOP     ECHO   ,OP=(AJM,SCF,IJM,DCN,FJM,SFM,EJM,CFM,IAN,IAM,OAN,OAM,AC
,N,FAN,FNC,FSJM,FCJM,IAPM,OAPM,CCF,CMCH,CHCM,MCLR)
*
 OP_.     OPSYN  OP          E.G.  IAN. = IAN
*
          PURGMAC OP
OP        MACRO  P1,P2
          LOCAL  TAG
L         IFC    EQ,$P2$$
TAG       OP_.   P1
T_P1      RMT                IAN,OAN,ACN,DCN,FAN
          CON    TAG
          RMT
L         ELSE
TAG       OP_.   P1,P2
T_P2      RMT                AJM,IJM,FJM,EJM,IAM,OAM,FCN,IAPM,OAPM,
*                            SCF,CCF,SFM,CFM,FSJM,FCJM,CHCM,CMCH,MCLR
          CON    TAG
          RMT
L         ENDIF
OP        ENDM
NEWOP     ENDD
          SPACE  5,20
** NAME-- LOADC
*
** PURPOSE-- LOAD A CM ADDRESS INTO THE R AND A REGISTERS.
*
** CALLING SEQUENCE-- LOADC   CMR,CMA
*     CMR = ADDRESS OF THE WORD TO BE LOADED INTO THE R REGISTER.
*     CMR+1 = ADDRESS OF WORD TO BE LOADED INTO THE A REGISTER.
*     CMA = ADDRESS OF THE VALUE TO BE ADDED TO THE A REGISTER.
*           (CMA IS OPTIONAL)

 LOADC    MACRO  CMR,CMA
 L        IFLE   CMR,76B
 L        IFGE   CMR,0
          LRDL   CMR
          LDDL   CMR+1
 L        ELSE
          LRML   CMR
          LDML   CMR+1
 L        ENDIF

 P        IFC    NE,$CMA$$
 M        IFLE   CMA,77B
 M        IFGE   CMA,0
          ADDL   CMA
 M        ELSE
          ADML   CMA
 M        ENDIF
 P        ENDIF
          ENDM
          SPACE  5,20
** NAME--LOADR
*
** PURPOSE-- LOAD A CM ADDRESS INTO THE R AND A REGISTERS.
*            AN INDEXED MEMORY LOCATION SPECIFIES THE ADDRESS.
*
** CALLING SEQUENCE-- LOADR   CMR,INDEX
*     THE CM ADDRESS IS CONTAINED IN THE LOCATIONS STARTING AT
*         CMR INDEXED BY INDEX.

 LOADR    MACRO  CMR,INDEX
          LRML   CMR,INDEX
          LDML   CMR+1,INDEX
          ENDM
          SPACE  5,20
** NAME--LOADF
*
** PURPOSE-- REFORMAT A CM ADDRESS AND LOAD IT INTO THE R AND A REGISTERS.
*
** CALLING SEQUENCE-- LOADF   CMR,INDEX
*     THE UNFORMATTED CM ADDRESS IS CONTAINED IN THE LOCATIONS
*          STARTING AT CMR INDEXED BY INDEX.
*     INDEX IS OPTIONAL.

 LOADF    MACRO  CMR,INDEX
 N        IFC    NE,$INDEX$$
          LRML   CMR,INDEX
          LDML   CMR+1,INDEX
          SHN    -3
 N        ELSE
 P        IFLE   CMR,76B
 P        IFGE   CMR,0
          LRDL   CMR
          LDDL   CMR+1
 P        ELSE
          LRML   CMR
          LDML   CMR+1
 P        ENDIF
          SHN    -3
 N        ENDIF
          ENDM
          SPACE  5,20
** NAME-- REFAD
*
** PURPOSE-- REFORMAT AND SAVE A CM ADDRESS.
*
** CALLING SEQUENCE-- REFAD   CMR,SAV
*     THE UNFORMATTED CM ADDRESS IS CONTAINED IN THE LOCATIONS
*          STARTING AT CMR.
*     THE REFORMATTED CM ADDRESS IS STORED IN THE LOCATIONS
*          STARTING AT SAV.
*
 REFAD    MACRO  CMR,SAV
 L        IFLE   CMR,76B
 L        IFGE   CMR,0
          LDDL   CMR
 M        IFLE   SAV,76B
 M        IFGE   SAV,0
          STDL   SAV
          LDDL   CMR+1
          SHN    -3
          STDL   SAV+1
 M        ELSE
          STML   SAV
          LDDL   CMR+1
          SHN    -3
          STML   SAV+1
 M        ENDIF
 L        ELSE
          LDML   CMR
 P        IFLE   SAV,76B
 P        IFGE   SAV,0
          STDL   SAV
          LDML   CMR+1
          SHN    -3
          STDL   SAV+1
 P        ELSE
          STML   SAV
          LDML   CMR+1
          SHN    -3
          STML   SAV+1
 P        ENDIF
 L        ENDIF
          ENDM
          SPACE  5,20
 PAUSE    MACRO  X           DELAY X MICROSECONDS
 R        IFLE   X,77B
          LDN    X
 R        ELSE
          LDC    X
 R        ENDIF
          HOLD               WAIT INSTRUCTION
          ENDM
          SPACE  5,20
 MASKP    MACRO  FIELD
          LOCAL  X
 X        SET    16-N.FIELD-L.FIELD
          MGEN   N.FIELD
 MSK      SET    MASK$
          DUP    X
 MSK      SET    MSK+MSK
          ENDD
          ENDM
* END IODMAC4
          LIST   B,L,N,R
          EJECT

*         EQUATES FOR IPI ADAPTER

 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
 H0122    EQU    0#0122      IPI BUS A OUTPUT PARITY ERROR
 H0281    EQU    0#0281      STREAM, READ
 H0322    EQU    0#0322      IPI BUS A INPUT PARITY ERROR
 H0381    EQU    0#0381      STREAM, WRITE
 H0711    EQU    0#0711      DROP MASTER OUT
 H0715    EQU    0#0715      REQUEST CLASS 1, 2, OR 3 INTERRUPT
 H0A81    EQU    0#0A81      STREAM, READ, DMA
 H0C22    EQU    0#0C22      ICI OUTPUT PARITY ERROR
 H7E42    EQU    0#7E42      IPI CHANNEL TRANSFER RATE
 H8025    EQU    0#8025      MASTER OUT, FULL WHEN SLAVE IN IS 1
 H8039    EQU    0#8039      SELECT OUT, FULL WHEN SLAVE IN IS 1
 H8215    EQU    0#8215      SET MASTER OUT, LOGICAL INTERFACE RESET
 H8415    EQU    0#8415      SET MASTER OUT, SLAVE RESET
 H9211    EQU    0#9211      DROP SYNC OUT
 H9213    EQU    0#9213      SET SYNC OUT

*         MISCELLANEOUS EQUATES

 FE       EQU    0           = 1, TO ENABLE FORCE ERROR CODE
 TB       EQU    0           = 1, TO ENABLE TRACE BUFFER OF COMMANDS AND RESPONSES
 DC       EQU    22B         DISK CHANNEL
 DRNUM    EQU    0#FE        INITIALIZE VALUE FOR OFF-LINE DRIVE NUMBER (OFFLD)
 C.CHCNT  EQU    100         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    32          COMMAND TIMEOUT (SECONDS)
 RLIE     EQU    26*8        RESPONSE LENGTH IF ERROR
 RPL      EQU    0#10        READ, WRITE COMMAND PACKET LENGTH
 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
 H0800    EQU    0#0800      ABORT OPERATION CODE
 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

*         RESPONSE TYPES FOR MAJOR STATUS

 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

*         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
 E20      EQU    20          CAN'T 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 PASSED, 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
 E306     EQU    1406B       INVALID UNIT TYPE
 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
 FILL1    BOOLEAN            UNUSED (TABLE INDEX FOR I4)
 PDCE     BOOLEAN            PARITY DRIVE CORRECTION ENABLED
 FILL2    BOOLEAN            UNUSED (PORT FOR I4)
 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 4           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

 DOAR     BOOLEAN            DRIVE OPERATIONAL ASYNCH RECEIVED
 FILL1    SUBRANGE 0,37B     UNUSED
 DT       SUBRANGE 0,77B     DEVICE TYPE
 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 MASTER TERMINATE BEING USED
 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
 NCOMW    PPWORD             NUMBER OF COMPLETED WRITE 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 SECTORS 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 4           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
*         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

          PPWORD             DMA ERROR REGISTER (I4 ONLY)
          PPWORD             OPERATIONAL STATUS REGISTER (I4 ONLY)
          PPWORD             CONTROL REGISTER (I4 ONLY)
 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 (UNUSED)
 PARTNR   RMA                PARTNERS COMMUNICATION BUFER (RMA)(UNUSED)

 CONTRL   STRUCT 8           LOAD CONTROLWARE COMMAND (UNUSED)
 CMCTRL   STRUCT 8           LOAD CONTROLLER CONTROLWARE (UNUSED)
 ODP      STRUCT 8           OVERLAY DIRECTORY (UNUSED)
          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    200         MAXIMUM LENGTH OF RESPONSE BUFFER
 EOM      EQU    40000B
 RPB      EQU    37400B      RESPONSE PACKET BUFFER
 RS       EQU    RPB-P.RS    DISK RESPONSE
          ERRMI  EOM-RPB-RPBL  IF RESPONSE BUFFER OVERFLOWS MEMORY
 IPIT     EQU    RPB+64      PP INTERFACE TABLE
 UBUF     EQU    IPIT+P.PIT  UNIT INTERFACE TABLE
 IBUF     EQU    UBUF+P.UIT  UNIT DESCRIPTOR BUFFER
 NRQ      EQU    IPIT        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    RPB+64      OUTPUT BUFFER FOR PP/CONTROLLER PATH TEST
 IB       EQU    RPB+128     INPUT BUFFER FOR PP/CONTROLLER PATH TEST
 IBN      EQU    IB+50       END OF INPUT BUFFER
          ERRMI  EOM-IBN     IF TABLES OVERFLOW MEMORY
 RQ       EQU    /SS/P.RQ    REQUEST
 CM       EQU    RQ+/RQ/P.CMND  CURRENT COMMAND
 CMLIST   EQU    /SS/P.CMLIST  INDIRECT RMA LIST
          EJECT
          CON    MAIN-1

*         DIRECT CELLS

 CM.PIT   BSSZ   2           CM ADDRESS OF PP INTERFACE TABLE
                              WORD 1 IS UPPER 16 BITS OF RMA
                              WORD 2 TIMES 8 IS LOWER RMA
 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

 CHAN     BSSZ   1           CHANNEL NUMBER
 STATUS   BSSZ   1           IPI CHANNEL STATUS
 CMNDS    BSSZ   1           NUMBER OF OUTSTANDING COMMANDS
 CMOD     BSSZ   1           CONTROLLER NUMBER
 UX       BSSZ   1           INDEX TO UNITS TABLE
 FI       BSSZ   1           INDEX TO FUNCTION HISTORY BUFFER
 P1       BSSZ   1
 P2       BSSZ   1
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
 WC       BSSZ   1           WORD COUNT FOR DATA TRANSFER
 WD       BSSZ   1           WORD COUNT FOR CM TRANSFER

 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 LF       BSSZ   1           LAST FUNCTION TO IPI ADAPTER
 CNUM     BSSZ   1           0 IF ONE COMMAND, OTHERWISE 2 COMMANDS ISSUED TO
                              THE CONTROLLER
 BYTES    BSSZ   1           NUMBER OF BYTES TO TRANSFER FROM CURRENT SECTOR
 SECPOS   BSSZ   1           SECTOR BUFFER TRANSFER POSITION (TO CM)
 DELAY    BSSZ   1           DELAY BITS FROM ENDING STATUS
 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
 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
 CLF      DATA   1           CHANNEL LOCK FLAG, 0 IF LOCK SET
 CTM      BSSZ   1           USED TO CHANGE TRANSFER MODE TO STREAMING
                             FOR COMMAND AND RESPONSE PACKETS
 CLCUR    BSSZ   1           CHANNEL 14 CLOCK CURRENT VALUE
 CLMCS    BSSZ   1           CLOCK, MICROSECOND
 CLMLS    BSSZ   1           CLOCK, MILLISECOND
 CLSEC    BSSZ   1           CLOCK, SECOND
 CTPAT    BSSZ   1           CONFIDENCE TEST PATTERN FIRST WORD
 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
 STORS    BSS    1           STORE RESPONSE FLAG (USED BY RESPIN)
                               = 0, IF A RESPONSE IS SENT TO CM
                               = NONZERO, IF NO RESPONSE WAS SENT TO CM
 .F       IFEQ   FE,1
 FEST     DATA   0           FORCE ERROR START COUNT
 FEND     DATA   0           FORCE ERROR END COUNT
 FEUN     DATA   0           UNIT NUMBER TO FORCE ERROR ON
 .F       ENDIF
          IFEQ   TB,1
 Z1       BSSZ   6           RMA POINTER TO TRACE BUFFER
          ENDIF
          SPACE  2
          BSS    72B-*
 DSRTP    DATA   2,0         RMA OF PP INTERFACE TABLE AT DEADSTART
 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    MAIN
          DATA   9           IPI/930 5830  DISK DRIVER (FOR ANAD PROC)
 HANG     CON    0           AN EASY WAY TO SEE CERTAIN HANGS
          UJN    *
 FPD      DATA   0           FAILING PHYSICAL DRIVE
 IDLE     DATA   0           NUMBER OF TIMES DRIVER WAS IDLED
          SPACE  2
*         THE FOLLOWING CM ADDRESSES ARE SET DURING INITIALIZATION
*                WORD 1 IS UPPER 16 BITS OF RMA
*                WORD 2 TIMES 8 IS LOWER RMA

 CM.CB    BSSZ   2           ADDRESS OF BUFFER WITHIN PP COMM. BUFFER
 CM.RS    BSSZ   2           ADDRESS OF RESPONSE BUFFER
 CM.INT   BSSZ   2           ADDRESS OF INTERRUPT WORD
 CM.CHAN  BSSZ   2           ADDRESS OF CHANNEL INTERLOCK TABLE

 T10      DATA   0
 T11      DATA   0
 T12      DATA   0

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

 IS       DATA   0           5832_1
          DATA   0           5832_2
          DATA   8192        5833_1
          DATA   8192        5833_1P
          DATA   8192        5833_2
          DATA   8192        5833_3P
          DATA   8192        5833_4
          DATA   8192        5838_1
          DATA   8192        5838_1P
          DATA   8192        5838_2
          DATA   8192        5838_3P
          DATA   8192        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

*         SUSPEND INTERVAL (IN SECTORS)

 SI       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           5833_1
          DATA   2           5833_1P
          DATA   1000        5833_2
          DATA   1000        5833_3P
          DATA   1000        5833_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

*         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

 .F       IFEQ   FE,1
          BSS    60          FOR PATCHES DURING CHECKOUT
 .F       ENDIF
          TITLE  MAIN LOOP
** NAME-- MAIN
*
** PURPOSE-- MAIN IDLE LOOP.  LOOK FOR REQUESTS FROM CENTRAL MEMORY
*            AND LOOK FOR INTERRUPTS FROM THE CONTROLLERS.
*
** ENTRY
*         MAIN - AFTER DRIVER IS LOADED
*         MAIN5 - WHEN THE PP IS RESUMED
*         MAIN10 - TO RUN DIAGNOSTICS DURING ERROR RECOVERY
*         MAIN15 - AFTER SEEK, WRITE, OR READ COMMAND STARTED,
*         MAIN20 - WHEN A WRITE, READ,OR RESTORE COMMMAND COMPLETES
          SPACE  2
 MAIN     BSS
          REFAD  DSRTP,CM.PIT REFORMAT ADDRESS OF PP INTERFACE TABLE
                               AND SAVE IN CM.PIT
 MAIN5    BSS
          RJM    IT          INITIALIZE TABLES
 MAIN10   BSS
          RJM    PT          PATH TEST
 MAIN15   BSS
 .F       IFEQ   FE,1        FORCE ERROR IN RUNNING PP DRIVER
          RJM    FER         FORCE ERROR ROUTINE
 .F       ENDIF
          RJM    EI          ENABLE INTERRUPTS
          RJM    PPRQ        CHECK FOR ANY PP REQUESTS
          RJM    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-- READ
*
** PURPOSE-- PROCESS READ DATA COMMAND.  A TRANSFER NOTIFICATION RESPONSE
*            HAS BEEN RECEIVED AND THE CONTROLLER HAS AT LEAST ONE SECTOR
*            OF DATA IN ITS BUFFER.  TRANSFER THE DATA FROM THE CONTROLLER
*            BUFFER TO CM.
*
** 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.
          SPACE  2
 READ     CON    0
 READ10   BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES LEFT TO TRANSFER
          STDL   BYTES       BYTES LEFT TO TRANSFER
          SBML   BPS,DT      BYTES PER SECTOR
          ADDL   SECPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    READ20      IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          LDML   BPS,DT      COMPUTE NUMBER OF BYTES TO TRANSFER THIS LOOP
          SBDL   SECPOS
          STDL   BYTES       NUMBER OF BYTES TO TRANSFER TO CURRENT SECTOR
 READ20   BSS
          LDDL   BYTES
          SHN    -1
          STDL   WC          PP WORDS TO TRANSFER
          LDDL   SECPOS
          NJN    READ50      IF BUS CONTROL ALREADY DONE
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
 READ30   EQU    *-1         FOR FORCING ERRORS
          LDC    H0A81       STREAM, READ, DMA
          RJM    FUNC        RAISE MASTER OUT
 READ40   EQU    *-1         FOR FORCING ERRORS
          ACN    DC
 READ50   BSS
          LOADF  CMLIST+/CM/P.RMA,CSST CM ADDRESS OF DATA AREA
          CHCM   WC,DC       TRANSFER DATA
          LDDL   WC
          NJN    READ60      IF NOT ALL WORDS TRANSFERRED
          LDDL   BYTES
          RADL   SECPOS      UPDATE SECTOR POSITION
          SBML   BPS,DT      CHECK FOR END OF SECTOR
          ZJN    READ60      IF END OF SECTOR
          LDML   /SS/P.LISTL,CSST CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          NJN    READ90      IF MORE CM DATA TO TRANSFER
          LDML   BPS,DT      BYTES PER SECTOR
          SBDL   SECPOS
          SHN    -1
          STDL   WC          PP WORDS TO TRANSFER
          LOADC  CM.CB
          CHCM   WC,DC       MUST TRANSFER A FULL SECTOR
 READ60   BSS
          LDC    MS50
 READ70   BSS
          IJM    READ80,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    READ70      IF TIMEOUT NOT EXPIRED
          RJM    CSI         CHECK SLAVE IN
 READ80   BSS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJN    READ100     IF MORE TO TRANSFER
          LJM    MAIN15
 READ90   BSS
          RJM    UBT         UPDATE BYTES TRANSFERRED
 READ100  BSS
          LJM    READ10
          EJECT
** NAME-- WRITE
*
** PURPOSE-- PROCESS THE WRITE DATA COMMAND.  A TRANSFER NOTIFICATION RESPONSE
*            HAS BEEN RECEIVED.  TRANSFER DATA 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.
          SPACE  2
 WRITE    CON    0
 WRI10    BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES LEFT TO TRANSFER
          STDL   BYTES       BYTES LEFT TO TRANSFER
          SBML   BPS,DT      BYTES PER SECTOR
          ADDL   SECPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    WRI20       IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          LDML   BPS,DT      COMPUTE NUMBER OF BYTES TO TRANSFER THIS LOOP
          SBDL   SECPOS
          STDL   BYTES       NUMBER OF BYTES TO TRANSFER TO CURRENT SECTOR
 WRI20    BSS
          LDDL   BYTES
          SHN    -1
          STDL   WC          PP WORDS TO TRANSFER
          LDDL   SECPOS
          NJN    WRI50       IF BUS CONTROL ALREADY DONE
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
 WRI30    EQU    *-1         FOR FORCING ERRORS
          LDC    H0381       STREAM, WRITE, DMA
          RJM    FUNC        RAISE MASTER OUT
 WRI40    EQU    *-1         FOR FORCING ERRORS
          ACN    DC
 WRI50    BSS
          LOADF  CMLIST+/CM/P.RMA,CSST CM ADDRESS OF DATA AREA
          CMCH   WC,DC       TRANSFER DATA
          LDDL   WC
          NJN    WRI60       IF NOT ALL WORDS TRANSFERRED
          LDDL   BYTES
          RADL   SECPOS      UPDATE SECTOR POSITION
          SBML   BPS,DT      CHECK FOR END OF SECTOR
          ZJN    WRI60       IF END OF SECTOR
          LDML   /SS/P.LISTL,CSST CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          NJN    WRI90       IF MORE CM DATA TO TRANSFER
          LDML   BPS,DT      BYTES PER SECTOR
          SBDL   SECPOS
          SHN    -1
          STDL   WC          PP WORDS TO TRANSFER
          LOADC  CM.CB
          CMCH   WC,DC       MUST TRANSFER A FULL SECTOR
 WRI60    BSS
          LDC    MS50
 WRI70    BSS
          IJM    WRI80,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    WRI70       IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 WRI80    BSS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJN    WRI100      IF MORE TO TRANSFER
          LJM    MAIN15
 WRI90    BSS
          RJM    UBT         UPDATE BYTES TRANSFERRED
 WRI100   BSS
          LJM    WRI10
          TITLE  COMMAND SUBROUTINES
** 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
          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
          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-- BCTB
*
** PURPOSE-- BUILD CONFIDENCE TEST WRITE BUFFER
          SPACE  2
 BCTBX    LJM    **
 BCTB     EQU    *-1
          IAN    14B
          LPC    0#7FFF
          STDL   CTPAT       CONFIDENCE TEST PATTERN FIRST WORD MINUS ONE
          STDL   P1
          LDN    0
          STDL   P3
          LOADC  CM.CB       ADDRESS OF PP COMMUNICATIONS BUFFER
          STDL   P2
 BCTB10   BSS
          AODL   P1          BUILD INCREMENTING PATTERN
          STDL   T1
          AODL   P1
          STDL   T2
          AODL   P1
          STDL   T3
          AODL   P1
          STDL   T4
          SBDL   CTPAT
          ADC    -P.CB-4+/CB/P.BUF
          PJN    BCTBX       IF ALL WORDS STORED
          LDDL   P2
          ADDL   P3
          CWDL   T1          STORE IN PP COMMUNICATIONS BUFFER
          AODL   P3
          UJN    BCTB10
          SPACE  5,20
** NAME-- BPTB
*
** PURPOSE-- BUILD PATH TEST BUFFER
          SPACE  2
 BPTBX    LJM    **
 BPTB     EQU    *-1
          LDN    0
          STDL   T1          INDEX TO OUTPUT BUFFER
          LDN    10
          STDL   T2          TIMES TO REPEAT PATTERN
 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
          SPACE  2
 CCAX     LJM    **
 CCA      EQU    *-1
          LDDL   CMOD
          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
          LMC    0#F02
          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
          LMC    0#F02
          STML   CP+FCP+11   SELECT 10 MB/S 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
          LMC    0#F02
          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
          MJK    CCA80       IF PARAMETER NOT FOUND
          LDML   RPB+6,T3
          LPC    0#FEE0
          LMC    0#6000
          NJK    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 FOR 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-- CCLOCK
*
** PURPOSE-- CLEARS CHANNEL LOCK
          SPACE  2
 CCLX     LJM    **
 CCLOCK   EQU    *-1
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          STDL   CLF         CHANNEL LOCK FLAG
          LDDL   CHAN        CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD
          UJK    CCLX
          SPACE  5,20
** NAME-- 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

*         RESTORE DRIVE ATTRIBUTES

          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 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#2D00
          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
          LDML   RPB+8+2
          LMML   IS,DT
          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
          LDC    0#9D8
          STML   CP+FCP      PARAMETER D8
          LDML   IS,DT       SET INTERRUPT SIZE FOR WRITES
          STML   CP+FCP+2
          LDC    H0209
          STML   CP+OPCD     LOAD ATTRIBUTES OPERATION CODE
          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-- 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-- 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
          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
          RJM    CUB         CHECK UNIT BUSY
          STDL   MALET       SETTING MALET NONZERO PREVENTS STARTING
                              NEW DISK REQUESTS
          NJN    CKCX        IF OUTSTANDING COMMANDS
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          PAUSE  130000      DELAY 130 MILLISECONDS TO ALLOW
                             MAINTENANCE PP TO GET THE CHANNEL
          RJM    SCLOCK      SET CHANNEL LOCK
          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
 CLK10    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    CLK10       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          LDDL   LPN
          SBDL   T4
          ZJN    CLK20       IF LOCK WAS OK
          LDDL   T6
          CWDL   T1          RESTORE THE LOCKWORD
          RJM    HANG        HANG, THE LOCK WAS INCORRECT
 CLK20    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6
          CWDL   T1          CLEAR THE LOCKWORD
          UJK    CLKX
          SPACE  5,20
** 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-- 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-- 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    340B
          ADML   ODN,CSST
          STML   RS+/RS/P.UNIT  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-- 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 TO TRANSFER
          SPACE  2
 CRSX     LJM    **
 CRS      EQU    *-1
          LDDL   WC
          NJK    CRS40       IF NOT ALL DATA TRANSFERRED
          RJM    UBT         UPDATE BYTES TRANSFERRED
          LDN    0
          STDL   T2
          LDML   /SS/P.TOTAL,CSST
          SHN    2
          PJK    CRS40       IF NOT USING MASTER TERMINATE
          SHN    -2
          LPC    777B
          SBN    1
          NJN    CRS40       IF MORE SECTORS TO TRANSFER
          LOADF  /SS/P.REQ,CSST
          STDL   T1
          ADN    3
          CRDL   T4          READ STREAM BIT IN REQUEST
          LDDL   T4
          SHN    2
          MJN    CRS20       IF CONCATENATED REQUEST
          LDN    0#A         MASTER TERMINATE
          UJN    CRS42
 CRS20    BSS
          LDDL   CSST
          ADK    RQ
          STML   CRS30       ADDRESS TO STORE PVA, RMA
          LDN    2
          STDL   T2
          LDDL   T1
          CRML   *,T2        REREAD NEXT PVA AND RMA
 CRS30    EQU    *-1
 CRS40    BSS
          LDN    0           NO MASTER TERMINATE
 CRS42    BSS
          RJM    GES         GET ENDING STATUS
          LDDL   WC
          ZJN    CRS45       IF ALL WORDS TRANSFERRED
          RJM    SRR         SHOULD RESPONSE BE READ
          UJN    CRS60
 CRS45    BSS
          LDDL   STATUS
          SHN    -4
          LPN    3
          STDL   DELAY       SAVE DELAY BITS
          STDL   SECPOS      SECPOS = 0 IF STAYING IN READ
          RJM    UDA         UPDATE DISK ADDRESS
          LDDL   T2
          ZJN    CRS50       IF NOT REQUEST CONCATENATION
          RJM    CSWIT       SWITCH TO NEXT REQUEST
 CRS50    BSS
          LDDL   DELAY
          NJN    CRS60       IF DELAY
          LDDL   SBS
          ZJN    CRS60       IF TIME TO SUSPEND DATA TRANSFER
          LDML   /SS/P.TOTAL,CSST
          LPC    777B
          ZJN    CRS60       IF LAST SECTOR TRANSFERRED
          UJK    CRSX
 CRS60    BSS
          RJM    DCM         DESELECT THE CONTROLLER
          LDN    0
          LJM    CRSX
          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
          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-- CSI
*
** PURPOSE-- CHECK SLAVE IN.  REPORT SLAVE IN DID NOT DROP, ELSE
*            EXIT TO THE CALLING ROUTINE.  ON READS, IF SLAVE IN
*            DROPS, THE CHANNEL WILL NOT BE INACTIVE UNTIL THE
*            BUFFER IS EMPTY.
          SPACE  2
 CSIX     LJM    **
 CSI      EQU    *-1
          LDC    H00E1       FUNCTION FOR READ STATUS REGISTER
          RJM    RDRG        READ REGISTER
          SHN    6
          PJN    CSIX        IF SLAVE IN NOT SET
          LDN    E30         CHANNEL STAYED ACTIVE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          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   T1          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    T1
          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
          LDDL   FNC
          ZJN    CSW10       IF READ, SEND RESPONSE OF COMPLETED REQUEST

*         IF WRITE, DON'T SEND RESPONSES FOR COMPLETED REQUESTS.
*         FOR WRITE ERROR RECOVERY, RESTART ALL REQUESTS.

          AOML   /SS/P.NCOMW,CSST  INCREMENT NUMBER OF COMPLETED WRITE REQUESTS
          UJN    CSW30
 CSW10    BSS
          RJM    RDWTOK      SEND RESPONSE FOR GOOD READ
 CSW30    BSS
          UJK    CSWX
          SPACE  5,20
** NAME-- CT
*
** PURPOSE-- CONFIDENCE TEST.  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.  ENSURE ALL 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
          RJM    ALN         ADD LOGICAL PP NUMBER TO LOCKWORD
          LDM    /SS/P.DT,CSST
          SHN    -4
          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    CT10        IF RUNNING CONFIDENCE TEST TO ISOLATE TO MEDIA ERROR
          LDML   /SS/P.RQTRY,CSST  RETRY COUNT
          LMN    1
          NJN    CT20        IF NOT FIRST ERROR RETRY
 CT10     BSS
          RJM    DPR         DRIVE POWER ON RESET

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

 CT20     BSS
          LDML   DD,DT       DATA DRIVES PER LOGICAL UNIT
          SBN    1
          ZJN    CT30        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    CT30        IF CONTROLLER SUPPORTS PARALLEL DRIVES
          LDC    E142        CONTROLLER DOES NOT SUPPORT PARALLEL
          LJM    CT75

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

 CT30     BSS
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
          RJM    DDT         DETERMINE DRIVE TYPE
          MJK    CT160       IF ERROR
          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    CT37        IF SINGLE DRIVE
          LDML   CP+SLAD
          SCN    0#38
          STML   CP+SLAD     ENSURE STRING BIT CLEAR
 CT37     BSS
          LDK    77
          STDL   T1
 CT38     BSS
          STML   RPB-1,T1    INITIALIZE RESPONSE BUFFER
          SODL   T1
          NJN    CT38        IF MORE WORDS TO INITIALIZE
          LDN    10          COMMAND PACKET LENGTH
          RJM    IDTP        INPUT DATA TO PP
          LDML   TD
          STDL   T1
          LDN    0
          STDL   T2
 CT39     BSS
          LDML   RPB+8+26,T2
          NJN    CT40        IF MODEL NUMBER PRESENT
          SODL   T1
          ZJN    CT50        IF NO MODEL NUMBER
          LDN    12
          RADL   T2
          UJN    CT39
 CT40     LDML   RPB+8+26,T2
          LMML   MN,DT       EXPECTED MODEL NUMBER
          ZJK    CT80        IF CORRECT MODEL NUMBER
 CT50     BSS
          LDN    0
          STDL   T1
 CT60     BSS
          LDML   RPB+8+26    SEARCH FOR ACTUAL MODEL NUMBER
          LMML   MN,T1
          ZJN    CT70        IF ACTUAL MODEL NUMBER FOUND
          AODL   T1
          SBN    22
          MJN    CT60        IF MORE MODELS TO CHECK
          LDC    E141        DRIVE INITIALIZATION REQUIRED
          STML   RS+/RS/P.ADT
          UJN    CT80
 CT70     BSS
          LDDL   T1
          STML   RS+/RS/P.ADT  ACTUAL DRIVE TYPE
          LDC    E140        XXXX CONFIGURED YYYY FOUND
 CT75     BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LJM    EPF8        SEND ABNORMAL RESPONSE
 CT80     BSS
          LDML   /SS/P.FNC,CSST
          SBN    2
          NJN    CT110       IF NOT FORMAT COMMAND
          LDML   HSTF
          ZJN    CT90        IF NOT HEAD SHIFT DETECT
          RJM    HSDT        INVOKE HEAD SHIFT DETECTION TEST
          UJK    CT165
 CT90     RJM    IU          INITIALIZE UNIT
          UJK    CT150
 CT110    BSS
          RJM    COR         CHECK OPERATIONAL AND READY
 CT112    MJK    CT160       IF NOT OPERATIONAL OR NOT READY
          LDML   RS+/RS/P.ADT
          LMC    E141
          ZJN    CT118       IF NOT CLUSTERED OR WRONG MODEL
          LDM    RS+/RS/P.ADT
          SBDL   DT
          NJN    CT118       IF WRONG TYPE
          LDML   /SS/P.UNIT,CSST
          LPN    77B
          STDL   PD          PHYSICAL DRIVE
          RJM    DDT         DETERMINE DRIVE TYPE
          MJK    CT112       IF ERROR
          RJM    IUF         IS UNIT FORMATTED
          ZJN    CT118       IF UNIT FORMATTED CORRECTLY
          STML   RS+/RS/P.ADT  ACTUAL DRIVE TYPE
 CT118    BSS
          LDML   RS+/RS/P.ADT  ACTUAL DRIVE TYPE
          STDL   T1
          SBDL   DT          EXPECTED DRIVE TYPE
          ZJN    CT150       IF CORRECT DRIVE TYPE
          LDDL   T1          ACTUAL DRIVE TYPE
          SBN    17
          PJN    CT120       IF DRIVE TYPE WAS NOT DETERMINED
          LDC    E140        XXXX CONFIGURED - FOUND YYYY
          STDL   T1
 CT120    BSS
          LDDL   T1          ERROR CODE (140 OR 141)
          RJM    EP          ERROR PROCESSING (NO RETURN)
 CT150    BSS
          RJM    COD         CHECK FOR OFF LINE DRIVE
          NJN    CT160       IF DRIVE OFF LINE
          RJM    CDA         CHECK DRIVE ATTRIBUTES
 CT160    BSS
          RJM    CTDT        CONFIDENCE TEST DATA TRANSFER
 CT165    LDML   /SS/P.FNC,CSST
          SBN    2
          NJN    CT170       IF NOT FORMAT COMMAND
          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    CT180
 CT170    BSS
          RJM    SFRR        CLEAR CIP, IF, UPSB
 CT180    BSS
          LDN    1
          STML   /SS/P.CT,CSST  INDICATE TEST COMPLETED SUCCESSFULLY
          LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    CT190       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
 CT190    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
          IFNE   TB,1        SO TRACE BUFFER NOT OVERWRITTEN
          RJM    BCTB        BUILD CONFIDENCE TEST BUFFER
          ENDIF
 CTDT10   BSS                ENTRY IF MEDIA ERROR
          RJM    CSC         COMPUTE SECTOR COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
 CTDT20   EQU    *-1         FOR FORCING ERRORS
 CTDT30   BSS
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    CTDT130     IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
          LDML   BPS,DT
          SHN    -1
          STDL   WC          PP WORDS PER SECTOR
          LDC    H0381       STREAM, WRITE, DMA
          RJM    FUNC
          ACN    DC
          LOADC  CM.CB
          ADML   SPC,DT      SECTORS PER CYLINDER
          SBML   /SS/P.TOTAL,CSST  SECTORS TO TRANSFER
          CMCH   WC,DC       TRANSFER DATA
          LDC    MS50
 CTDT40   BSS
          IJM    CTDT50,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    CTDT40      IF TIMEOUT NOT EXPIRED
          LJM    CTDT140
 CTDT50   BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROLLER
          LDDL   WC
          ZJN    CTDT60      IF ALL WORDS TRANSFERRED
          RJM    SRR         SHOULD RESPONSE BE READ
          UJK    CTDT30      YES, GO LOOK FOR INTERRUPT
 CTDT60   BSS
          RJM    UDA         UPDATE DISK ADDRESS
          NJK    CTDT30      IF MORE SECTORS TO TRANSFER
 CTDT65   BSS
          RJM    IH          INTERRUPT HANDLER
          SBN    0#12
          ZJN    CTDT70      IF COMPLETE AND CONDITIONAL SUCCESS
          SBN    0#18-0#12
          ZJN    CTDT70      IF COMPLETE AND SUCCESSFUL
          SBN    0#42-0#18
          ZJN    CTDT65      IF ASYNCH AND CONDITIONAL SUCCESS
          LJM    CTDT130

*         READ THE CYLINDER

 CTDT70   BSS
          LDN    0
          STDL   FNC         INDICATE READ FUNCTION
          RJM    SSA         SET STARTING ADDRESS
 CTDT80   BSS                ENTRY IF MEDIA ERROR
          RJM    CSC         COMPUTE SECTOR COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
 CTDT90   BSS
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    CTDT130     IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
          LDML   BPS,DT
          SHN    -1
          STDL   WC          PP WORDS PER SECTOR
          LDC    H0A81       STREAM, READ, DMA
          RJM    FUNC
          ACN    DC
          LOADC  CM.CB
          CHCM   WC,DC       TRANSFER DATA
          LDC    MS50
 CTDT100  BSS
          IJM    CTDT110,DC  IF SLAVE IN DROPPED
          SBN    1
          NJN    CTDT100     IF TIMEOUT NOT EXPIRED
          RJM    CSI         CHECK SLAVE IN
 CTDT110  BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROLLER
          LDDL   WC
          ZJN    CTDT120     IF ALL WORDS TRANSFERRED
          RJM    SRR         SHOULD RESPONSE BE READ
          UJK    CTDT90      YES, GO LOOK FOR INTERRUPT

*         VERIFY THE DATA IN ONE SECTOR

 CTDT120  BSS
          IFNE   TB,1        SO TRACE DOES NOT CAUSE MISCOMPARE
          RJM    VCTD        VERIFY CONFIDENCE TEST DATA
          ENDIF
          RJM    UDA         UPDATE DISK ADDRESS
          NJK    CTDT90      IF MORE SECTORS TO TRANSFER
 CTDT125  BSS
          RJM    IH          INTERRUPT HANDLER
          SBN    0#12
          ZJN    CTDT160     IF COMPLETE AND CONDITIONAL SUCCESS
          SBN    0#18-0#12
          ZJN    CTDT160     IF COMPLETE AND SUCCESSFUL
          SBN    0#42-0#18
          ZJN    CTDT125     IF ASYNCH AND CONDITIONAL SUCCESS
 CTDT130  BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          UJN    CTDT150
 CTDT140  BSS
          LDN    E30         CHANNEL STAYED ACTIVE
 CTDT150  BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
 CTDT160  BSS
          LJM    CTDTX
          SPACE  5,20
** NAME-- CTR
*
** PURPOSE-- CONFIDENCE TEST RECOVERY
*
** EXIT   TO CALLING ROUTINE WITH
*            A = 0  IF ERROR LIMIT REACHED
*            A NOT 0  IF NOT MEDIA ERROR
*         TO CTDT ROUTINE IF MEDIA ERROR
          SPACE  2
 CTR100   BSS
          LMN    4           DATA INTEGRITY ERROR
 CTRX     LJM    **
 CTR      EQU    *-1
          LDML   /SS/P.CT,CSST
          NJN    CTR100      IF NOT IN CONFIDENCE TEST
          RJM    CFME        CHECK FOR MEDIA ERROR
          NJN    CTRX        IF NOT A MEDIA ERROR
          LDML   RPB+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    CTDT70      IF WRITE
          LJM    CTDTX
 CTR60    BSS
          RJM    LIR         LOGICAL INTERFACE RESET (TO CLEAR ASYNCHS)
          LDDL   FNC
          NJK    CTDT10      IF WRITE
          LJM    CTDT80      GO TO READ ENTRY POINT
          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-- 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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDML   /SS/P.RQTRY,CSST
          NJK    CUB50       IF IN ERROR PROCESSING FOR THIS UNIT
          UJN    CUB10
          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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDML   RPB+SLAD
          LMML   /SS/P.UNIT,CSST
          NJN    DARH10      IF RESPONSE NOT FOR THIS CONFIGURED UNIT
          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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST
          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
 DCR10    BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    DCR10       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  ADDRESS OF UNIT INTERFACE 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    DCR20       IF INVALID QUEUE COUNT
          LDDL   T1
          CWDL   P1          WRITE QUEUE COUNT
 DCR20    BSS
          LOADR  /SS/P.DP,CSST  DELINK POINTER
          STDL   P2
          ADN    1           POINT TO RMA INSTEAD OF PVA
          CRDL   T1          RMA OF A REQUEST
          LDDL   T3
          LMML   /SS/P.FCOMRQ,CSST
          NJN    DCR30       IF NEXT REQUEST IS NOT COMPLETED REQUEST
          LDDL   T4
          LMML   /SS/P.FCOMRQ+1,CSST
          ZJN    DCR50       IF THIS IS A COMPLETED REQUEST
 DCR30    BSS
          LDDL   T3          UPDATE DELINK POINTER TO NEXT
          STML   /SS/P.DP,CSST  REQUEST IN THE CHAIN
          ADDL   T4
          ZJN    DCR40       IF END OF REQUEST QUEUE
          LDDL   T4
          SHN    -3
          STML   /SS/P.DP+1,CSST
          UJK    DCR20
 DCR40    BSS
          LDML   UNITS+/UN/P.UIT+1,UX  INITIALIZE DELINK POINTER TO
          ADN    /UIT/C.NEXTPV       FIRST RMA
          STML   /SS/P.DP+1,CSST
          LDML   UNITS+/UN/P.UIT,UX
          STML   /SS/P.DP,CSST
          UJK    DCR20

*         DELINK COMPLETED REQUESTS.

 DCR50    BSS
          LDDL   P2          CM ADDRESS OF REQUEST
          CWML   RQT,P6      PVA AND RMA OF NEXT REQUEST IN CHAIN
          LDML   RQT+/RQ/P.NEXT
          ADML   RQT+/RQ/P.NEXT+1
          NJN    DCR52       IF NOT END OF QUEUE
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    DCR52       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
          ADN    /UIT/C.NEXTPV
          STML   /SS/P.DP+1,CSST
 DCR52    BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD

          LDDL   T9
          NJK    DCR58       IF NOT CHECKING REQUEST QUEUE
          LDDL   P4
          ZJK    DCR56       IF QUEUE EMPTY
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          LDML   /SS/P.CT,CSST
          LPN    7
          ZJK    DCR58       IF CONFIDENCE TEST SHOULD BE RUN
          LDML   /SS/P.RQTRY,CSST
          NJK    DCR58       IF IN ERROR RECOVERY
          LDDL   IF
          NJK    DCR58       IF CONFIDENCE TEST SHOULD BE RUN
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJK    DCR60       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    DCR58       IF FORMAT
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    DCRX
 DCR56    BSS
          RJM    RESPIN
 DCR58    BSS
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    DCR60       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    DCR70
 DCR60    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  MOVE SECTOR COUNT
          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
 DCR70    BSS
          SODL   CMNDS       OUTSTANDING COMMANDS
          LJM    DCRX
          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
          MJN    DDT120      IF DRIVE NOT FOUND OR ERROR
          ADC    -E141
          ZJN    DDT110      IF DRIVE NOT CLUSTERED OR NOT 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-- 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
          NJN    DLN10       IF 2ND PP NOT THIS ONE
          STDL   T3
 DLN50    BSS
          LDDL   T6
          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-- 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
          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-- DUBC
*
** PURPOSE-- DECREMENT UNIT BUSY COUNTER
          SPACE  2
 DUBCX    LJM    **
 DUBC     EQU    *-1
          LDML   UNITS,UX
          SHN    -3
          LPN    37B
          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
          LDC    H00F1       READ ERROR REGISTER
          RJM    RDRG
          SHN    2
          PJN    EFP5        IF NOT BUFFER COUNTER PARITY
          LDN    E31
          UJN    EFP40
 EFP5     BSS
          SHN    2
          PJN    EFP10       IF NOT SYNC COUNTER PARITY
          LDN    E32
          UJN    EFP40
 EFP10    BSS
          SHN    1
          PJN    EFP15       IF NOT PERIOD COUNTER PARITY
          LDN    E03
          UJN    EFP40
 EFP15    BSS
          SHN    1
          MJN    EFP20       IF PARITY ERROR ON FUNCTION
          SHN    1
          PJN    EFP25       IF NOT PARITY ERROR ON FUNCTION
 EFP20    BSS
          LDC    H0715       MOST LIKELY FUNCTION THAT TIMED OUT
          STDL   LF
          LDN    E01         FUNCTION TIMEOUT
          UJN    EFP40
 EFP25    BSS
          SHN    3
          PJN    EFP30       IF NOT LOST DATA
          LDN    E33
          UJN    EFP65
 EFP30    BSS
          SHN    1
          MJN    EFP35       IF UPPER ICI PARITY ERROR
          SHN    1
          PJN    EFP45       IF NOT LOWER ICI PARITY ERROR
 EFP35    BSS
          LDN    E04
 EFP40    BSS
          UJN    EFP65
 EFP45    BSS
          SHN    1
          PJN    EFP50       IF NOT IPI SEQUENCE ERROR
          LDN    E24
          UJN    EFP65
 EFP50    BSS
          SHN    1
          MJN    EFP55       IF UPPER IPI CHANNEL PARITY ERROR
          SHN    1
          PJN    EFP60       IF NOT LOWER IPI CHANNEL PARITY ERROR
 EFP55    BSS
          LDN    E25
          UJN    EFP65
 EFP60    BSS
          LDN    E06         IOU ERROR
 EFP65    BSS
          STML   RS+/RS/P.ERRID
          RJM    EP          ERROR PROCESSING (NO RETURN)
          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    EP10        IF NOT FIRST ERROR FOR REQUEST
          STML   /SS/P.RECOV,CSST  INDEX TO FIRST RECOVERY STEP (EPA)
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EP10     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    EP20        IF RESPONSE PACKET NOT APPLICABLE
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    EP20        IF PARAMETER 24 NOT FOUND
          LDML   RPB+6,T3
          SHN    3
          PJN    EP20        IF DRIVE WAS READY
          AOML   /SS/P.SC,CSST  FLAG SAYS WAIT FOR ASYNCH IN DPR
 EP20     BSS
          LDN    0
          STDL   TBC         DO NOT EXPECT 01 ENDING STATUS
          LDML   RS+/RS/P.ERRID
          ZJN    EP40        IF PROBABLY NOT IOU ERROR
          SBN    E20
          PJN    EP40        IF PROBABLY NOT IOU ERROR
          LDML   /SS/P.RQTRY,CSST
          SBN    11
          PJN    EP30        IF RETRY LIMIT REACHED
          RJM    TAC         TERMINATE ALL COMMANDS
          LJM    MAIN10
 EP30     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
 EP40     BSS
          LDML   /SS/P.RECOV,CSST  INDEX TO ERROR PROCESSING PROCEDURE
          STDL   T1
          LDML   EPT,T1
          STML   EP50
          LJM    **          EXECUTE NEXT STEP IN RECOVERY PROCEDURE
 EP50     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    EPD50       REQUEST RETRY ERROR AFTER SLAVE RESET
          CON    EPC70       AFTER READ PERFORMANCE LOG
          SPACE  5,20
*         REQUEST RETRY

 EPA      BSS
          LDML   /SS/P.RQTRY,CSST  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       SEND INTERMEDIATE RESPONSE
 EPA10    BSS
          RJM    CTR         CONFIDENCE TEST RECOVERY
          NJN    EPA30       IF ERROR LIMIT NOT REACHED
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNTER
          UJK    EPC
 EPA30    BSS
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNTER
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDML   UNITS,UX
          SHN    /UN/L.PDCE+2
          MJN    EPA35       IF PARITY DRIVE CORRECTION ENABLED
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+1
          UJN    EPA40
 EPA35    BSS
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+3+1
 EPA40    BSS
          MJN    EPB10       IF NOT RETRY LIMIT
          SPACE  5,20
*         CONFIDENCE TEST

 EPB      BSS
          LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    EPB20       IF CONFIDENCE TEST ALREADY STARTED
          LDML   /SS/P.CT,CSST
          ZJN    EPC         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
 EPB10    BSS
          LJM    MAIN10
 EPB20    BSS
          RJM    CTR         CONFIDENCE TEST RECOVERY
          SPACE  5,20
*         SLAVE RESET

 EPC      BSS
          LDML   RS+/RS/P.ERRID
          SBN    E38
          NJN    EPC3        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
 EPC3     BSS
          LDML   /SS/P.RECOV,CSST
          ZJK    EPC15       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    EPC8        IF NO COMPLETION CODE FOR CONFIDENCE TEST
          LMN    1
          NJK    EPC10       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    EPC4        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
 EPC4     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    EPC5        IF NO PARITY DRIVE OR NO FAILING DRIVE
          LDDL   T2
          SHN    9
          MJN    EPC5        IF RESTORE IN PROGRESS
          LDML   /SS/P.RQTRY,CSST
          SBN    RRL+3+1
          MJN    EPC6        IF RECOVERY HASN'T BEEN TRIED WITH PARITY DRIVE CORRECTION
 EPC5     BSS
          LJM    EPF10
 EPC6     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
 EPC8     BSS
          RJM    SFRR        CLEAR CIP, IF
          LDN    2
          STML   /SS/P.CT,CSST  INDICATE CONFIDENCE TEST FAILED
 EPC10    BSS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EPC15    BSS
          LDML   RS+/RS/P.ERRID
          NJN    EPC18       IF NOT DRIVE ERROR
          LDML   /SS/P.FNC,CSST
          SBN    2
          ZJN    EPC18       IF FORMAT COMMAND
          RJM    IPDE        IS PARITY DRIVE ENABLED
          NJN    EPC18       IF NO PARITY DRIVE OR NO FAILING DRIVE
          LDML   /SS/P.CT,CSST
          ZJN    EPC16       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
 EPC16    BSS
          LJM    EPE
 EPC18    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    EPC19       IF RESET SHOULD BE ISSUED
          NJK    EPF6        IF SKIPPING SLAVE RESET
 EPC19    BSS
          LDN    E50         SLAVE RESET STARTED
          STML   RS+/RS/P.ERRID
          RJM    INTRS       INTERMEDIATE RESPONSE
          LDDL   PTF         PATH TEST FLAG
          ZJN    EPC20       IF INITIALIZATION PATH TEST
          RJM    RCC         RESTART CONTROLLER COMMANDS
          LDC    0#C000      COMMAND IN PROG., 2 COMMANDS IN PROG.
          RJM    SCB         SET COMMAND IN PROGRESS BITS
 EPC20    BSS
          RJM    SRI         SET RESET ISSUED FLAG
          RJM    ISR         ISSUE SLAVE RESET (NO RETURN)
 EPC50    BSS
          LDML   UNITS,UX
          LPC    /UN/K.NCR
          STDL   T5          SAVE NO CONTROLLER RESPONSE FLAG
          LDML   UNITS,UX
          LPC    0#EFFF
          STML   UNITS,UX    CLEAR -NO CONTROLLER RESPONSE- BIT
          LDML   RS+/RS/P.ERRID
          LMC    E72
          NJK    EPC100      IF NOT MACHINE EXCEPTION
          LDN    ID16
          RJM    SFP         SEARCH FOR PARAMETER
          LDML   RPB+6,T3
          LPC    0#FEE0
          LMC    0#6000
          NJK    EPC100      IF SLAVE RESET FAILED
          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 (EPD50)
          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 CABLE PROBLEM
          SBN    E50-E20
          PJN    EPC110      IF PROBABLY NOT CABLE PROBLEM
          RJM    INTRS       REPORT INTERMEDIATE RESPONSE
          UJN    EPD
 EPC110   BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CONTROLLER (NO RETURN)

 EPCT     BSS    8           UX FOR RESET CONTROLLER
          SPACE  5,20
*         PATH TEST (ROUTINE PT WORKED ONCE, SLAVE RESET FAILED, MAY BE
*         DAISY CHAIN PROBLEM.)

 EPD      BSS
          LDML   /SS/P.RECOV,CSST
          LMN    3
          ZJN    EPD55       IF PATH TEST ALREADY STARTED
          AOML   /SS/P.RQTRY,CSST  REQUEST RETRY COUNT
          LDN    3
          STML   /SS/P.RECOV,CSST  INDEX TO THIS RECOVERY STEP (EPD)
          RJM    RAR         SETUP FOR RESTARTING ALL REQUESTS
          LDN    0
          STDL   PTF         FORCE RUNNING PATH TEST
          LJM    MAIN10
 EPD50    BSS                ENTER HERE IF ERROR AFTER SLAVE RESET
          LDDL   PTF
          NJN    EPD60       IF PATH TEST SUCCESSFUL
 EPD55    BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CONTROLLER (NO RETURN)
 EPD60    BSS
          RJM    INTRS       INTERMEDIATE RESPONSE
          RJM    CTR         CONFIDENCE TEST RECOVERY
          SPACE  5,20
*         DRIVE DIAGNOSTICS

 EPE      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
          SPACE  5,20
*         IF FINAL REQUEST RETRY FAILED

 EPF      BSS
          RJM    CTR         CONFIDENCE TEST RECOVERY
          RJM    IPDE        IS PARITY DRIVE ENABLED
          NJK    EPF6        IF NO PARITY DRIVE OR NO FAILING DRIVE
          LDDL   T2
          SHN    9
          PJN    EPF4        IF RESTORE NOT IN PROGRESS
          LDDL   T2
          LMML   RS+/RS/P.UNIT  FAILING DRIVE
          LPN    37B
          NJK    EPF6        IF ERROR NOT ON DRIVE BEING RESTORED
 EPF4     BSS
          LDML   /SS/P.FNC,CSST
          SBN    2
          ZJK    EPF6        IF FORMAT COMMAND
          LDML   T11
          SBN    2           ALLOW 2 RETRIES TO OFF LINE DRIVE
          PJK    EPF6        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    EPG10
 EPF6     BSS
          RJM    CLR         CHECK FOR LABEL READ
          PJN    EPF8        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    EPF20
 EPF8     BSS
          LDN    1
          STDL   CMNDS       SO DCR ROUTINE LEAVES CMNDS EQUAL TO 0
 EPF10    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
 EPF20    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
          SPACE  5,20
*         ENTER HERE IF PREVIOUS LOGICAL INTERFACE RESET WORKS OR FAILS

 EPG      BSS
          LDML   UNITS,UX
          SHN    /UN/L.RIP+2
          MJN    EPG5        IF RESTORE IN PROGRESS
          RJM    UUT         UNLOCK UNIT TABLE
 EPG5     BSS
          RJM    RCC         RESTART CONTROLLER COMMANDS
 EPG10    BSS
          LDN    0
          STDL   IF          CLEAR INITIALIZATION FLAG
          STML   /SS/P.RQTRY,CSST  CLEAR RETRY COUNT
          LJM    MAIN10
 .F       IFEQ   FE,1        FORCE ERROR CODE
          SPACE  5,20
** NAME-- FER
*
** PURPOSE-- FORCE ERROR ROUTINE.  THE ERROR CAN BE FORCED BY CHANGING
*            CENTRAL MEMORY WORD 8.  SOME ROUTINES REQUIRE THE UNIT
*            NUMBER TO BE IN CENTRAL MEMORY WORD 9.
          SPACE  2
 FERX     LJM    **
 FER      EQU    *-1
          LDN    0
          STDL   T1
          LRDL   T1
          LDN    8           READ CENTRAL MEMORY WORD 8
          STDL   P1
          CRDL   P2
          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
          LDDL   P1
          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 FROM BYTE ADDRESS 48(16)
          LDDL   P2
          STDL   FEUN        UNIT TO FORCE ERROR ON
          LDML   FET,P6
          STDL   P2
          LJM    0,P2        JUMP TO FORCE ERROR ROUTINE

*         TABLE OF ERRORS TO FORCE

 FET      BSS
          CON    FERX        NO ERROR
          CON    FERA        LOWER ICI PARITY ERROR ON READ
          CON    FERB        DROP SELECT DURING READ
          CON    FERC        LOWER ICI PARITY ERROR ON WRITE
          CON    FERD        DROP SELECT DURING WRITE
          CON    FERE        READ ONE TOO MANY WORDS (RECOVERABLE)
          CON    FERF        READ ONE TOO FEW WORDS (RECOVERABLE)
          CON    FERG        WRITE ONE TOO MANY WORDS (RECOVERABLE)
          CON    FERH        WRITE ONE TOO FEW WORDS (UNRECOVERABLE)
          CON    FERI        READ DATA IPI P.E. (RECOVERABLE)
          CON    FERJ        WRITE DATA IPI P.E. (RECOVERABLE)
          CON    FERK        SPIN DOWN UNIT
          CON    MAIN5       INITIALIZE, RUN PATH, CONF. TEST
          CON    FERM        COMMAND EXCEPTION FOR READ OR WRITE
          CON    FERN        LOWER ICI PARITY ERROR IN PATH TEST
          CON    FERO        UNABLE TO SELECT ERROR IN PATH TEST
          CON    FERP        COMMAND EXCEPTION ERROR IN PATH TEST
          CON    FERQ        LOWER ICI PARITY ERROR IN CONFIDENCE TEST
          CON    FERR        UNABLE TO SELECT ERROR IN CONFIDENCE TEST
          CON    FERS        COMMAND EXCEPTION ERROR IN CONFIDENCE TEST
          CON    FERT        CHANGE ONE MEMORY LOCATION
 FETND    BSS
          SPACE  5,20
** NAME-- FERA
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON READ
*            EB,40,XX01 YYYY
*            EB,48,CCDD
*                X = SECTORS TO READ BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
*
** NOTE-- IF Y = 0 .. A  RECOVERABLE ERROR
*                B  CHANNEL DOWNED
*         EXPECTED ERROR CODE = 04
*
*         DON'T FORCE THIS WITH A RUNNING SYSTEM.  IT CAUSES NOS/VE TO
*         HANG.
          SPACE  2
 FERA     BSS
          LDC    FERA10
          UJN    FERB5
 FERA10   CON    0
          STDL   T1          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJK    FERB20      IF WRONG DRIVE
          SODL   FEST
          PJN    FERB20      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
*            EB,40,XX02 YYYY
*            EB,48,CCDD
*                X = SECTORS TO READ BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
*
** NOTE-- IF Y = 0 .. 3  RECOVERABLE ERROR
*                4  MEDIA FAILURE
*         EXPECTED ERROR CODE = 1B
          SPACE  2
 FERB     BSS
          LDC    FERB10
 FERB5    BSS
          STML   READ40
          LJM    MAIN10
 FERB10   CON    0
          STDL   T1          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERB20      IF WRONG UNIT
          SODL   FEST
          PJN    FERB20      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
 FERB15   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERB20      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    FUNC
          STML   READ40      RESTORE FUNCTION
 FERB20   BSS
          LDDL   T1
          RJM    FUNC        SEND FUNCTION
          LJM    READ40+1    RETURN TO READ ROUTINE
          SPACE  5,20
** NAME-- FERC
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON WRITE
*            EB,40,XX03 YYYY
*            EB,48,CCDD
*                X = SECTORS TO WRITE BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
*
** NOTE-- IF Y = 0 .. A  RECOVERABLE ERROR
*                B  CHANNEL DOWNED
*         EXPECTED ERROR CODE = 4
*
*         DON'T FORCE THIS ERROR WITH A RUNNING SYSTEM.  IT WILL CAUSE
*         NOS/VE GO HANG.
          SPACE  2
 FERC     BSS
          LDC    FERC10
          UJN    FERD5
 FERC10   CON    0
          STDL   T1
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJK    FERD20      IF WRONG UNIT
          SODL   FEST
          PJN    FERD20      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERD15
          SPACE  5,20
** NAME-- FERD
*
** PURPOSE-- DROP SELECT DURING WRITE
*            EB,40,XX04 YYYY
*            EB,48,CCDD
*                X = SECTORS TO WRITE BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CONTROLLER NUMBER
*                DD = DRIVE NUMBER
*
** NOTE-- IF Y = 0 .. 3  RECOVERABLE ERROR
*                4  MEDIA ERROR
*         EXPECTED ERROR CODE = 1B(16)
          SPACE  2
 FERD     BSS
          LDC    FERD10
 FERD5    BSS
          STML   WRI40
          LJM    MAIN10
 FERD10   CON    0
          STDL   T1          SAVE FUNCTION
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERD20      IF WRONG UNIT
          SODL   FEST        FORCE ERROR START COUNT
          PJN    FERD20      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
 FERD15   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERD20      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    FUNC
          STML   WRI40       RESTORE THE INSTRUCTION
 FERD20   BSS
          LDDL   T1
          RJM    FUNC        SEND FUNCTION
          LJM    WRI40+1     RETURN TO WRITE ROUTINE
          SPACE  5,20
** NAME-- FERE
*
** PURPOSE-- READ ONE TOO MANY WORDS
*            EB,40,0005
*
** NOTE-- THIS SHOULD ALWAYS RECOVER WITH ONE RETRY
*         EXPECTED ERROR CODE = 1D(16)
          SPACE  2
 FERE     BSS
          LDC    FERE10
          UJN    FERF5
 FERE10   CON    0
          AODL   WC
          UJN    FERF15
          SPACE  5,20
** NAME-- FERF
*
** PURPOSE-- READ ONE TOO FEW WORDS
*            EB,40,0006
*
** NOTE-- THIS SHOULD ALWAYS RECOVER WITH ONE RETRY
*         EXPECTED ERROR CODE = 21(16)
          SPACE  2
 FERF     BSS
          LDC    FERF10
 FERF5    BSS
          STML   READ30
          LJM    MAIN10
 FERF10   CON    0
          SODL   WC
 FERF15   BSS
          LDC    BCS         RESTORE INSTRUCTION
          STML   READ30
          LJM    READ30-2
          SPACE  5,20
** NAME-- FERG
*
** PURPOSE-- WRITE ONE TOO MANY WORDS
*            EB,40,0007
*
** NOTE-- THIS SHOULD ALWAYS RECOVER WITH ONE RETRY
*         EXPECTED ERROR CODE = 21(16)
          SPACE  2
 FERG     BSS
          LDC    FERG10
          UJN    FERH5
 FERG10   CON    0
          AODL   WC
          UJN    FERH15
          SPACE  5,20
** NAME-- FERH
*
** PURPOSE-- WRITE ONE TOO FEW WORDS
*            EB,40,0008
*
** NOTE-- THIS SHOULD ALWAYS RECOVER WITH ONE RETRY
*         EXPECTED ERROR CODE = 20(16)
          SPACE  2
 FERH     BSS
          LDC    FERH10
 FERH5    BSS
          STML   WRI30
          LJM    MAIN10
 FERH10   CON    0
          SODL   WC
 FERH15   BSS
          LDC    BCS
          STML   WRI30       RESTORE INSTRUCTION
          LJM    WRI30-2
          SPACE  5,20
** NAME-- FERI
*
** PURPOSE-- FORCE IPI PARITY ERROR ON INPUT DURING READ
*            EB,40,0009
*
** NOTE-- THIS ERROR SHOULD ALWAYS BE RECOVERABLE
*         THE EXPECTED ERROR CODE IS 19(16)
          SPACE  2
 FERI     BSS
          LDC    FERI10
          STML   READ40
          LJM    MAIN10
 FERI10   CON    0
          LDC    FUNC
          STML   READ40      RESTORE MODIFIED INSTRUCTION
          LDC    H0322
          RJM    FUNC        FORCE BUS A INPUT PARITY ERROR
          LJM    READ40-3
          SPACE  5,20
** NAME-- FERJ
*
** PURPOSE-- FORCE IPI PARITY ERROR ON OUTPUT DURING WRITE
*            EB,40,000A
*
** NOTE-- THIS SHOULD ALWAYS RECOVER WITH ONE RETRY
*         EXPECTED ERROR CODE = 19(16)
          SPACE  2
 FERJ     BSS
          LDC    FERJ10
          STML   WRI40
          LJM    MAIN10
 FERJ10   CON    0
          LDC    FUNC
          STML   WRI40       RESTORE MODIFIED INSTRUCTION
          LDC    H0122
          RJM    FUNC        FORCE BUS A OUTPUT PARITY ERROR
          LJM    WRI40-3
          SPACE  5,20
** NAME-- FERK
*
** PURPOSE-- SPIN DOWN UNIT TO FORCE NOT READY ERROR
*            EB,40,000B CCDD
*                C = CONTROLLER NUMBER
*                D = LOGICAL UNIT NUMBER
*            EB,4C,EE00
*                E = DRIVE TO BE SPUN DOWN
*         THIS SHOULD ONLY BE USED WHEN THERE ARE NO OUTSTANDING
*         COMMANDS FOR THE CONTROLLER.
          SPACE  2
 FERK     BSS
          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    UNIT TO SPIN DOWN
          LDN    14
          RJM    ODFP        OUTPUT DATA FROM PP
          LJM    MAIN10
          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-- IF 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
*
** NOTE-- IF Y = 0 .. A  RECOVERABLE ERROR
*                B  CHANNEL DOWNED
*         EXPECTED ERROR CODE = 04
          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
*
** NOTE-- IF Y = 4  CONTROLLER WILL BE DOWNED
*              = 0..3  RECOVERABLE ERROR
*         EXPECTED ERROR CODE = 14(16)
          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-- IF Y = 4  CONTROLLER WILL BE DOWNED
*              = 0..3  RECOVERABLE ERROR
*         EXPECTED ERROR CODE = 49(16)
          SPACE  2
 FERP     BSS
          LDC    FERP10
 FERP5    BSS
          STML   PT40
          LJM    MAIN10
 FERP10   CON    0
          SODL   FEST
 FERP20   BSS
          PJN    FERP40      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+1    ILLEGAL BYTE COUNT
 FERP30   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERP40      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   PT40        RESTORE INSTRUCTION
 FERP40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    PT40+1      RETURN TO PATH TEST
          SPACE  5,20
** NAME-- FERQ
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR IN CONFIDENCE TEST
*            EB,40,XX11 YYYY
*                X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*
** NOTE- IF Y = 0 .. A  RECOVERABLE ERROR
*             = B  UNIT DOWNED
*         EXPECTED ERROR CODE = 4
          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
*
** NOTE- IF Y = 0 .. 4  RECOVERABLE ERROR
*             = 5  UNIT DOWNED
*         EXPECTED ERROR CODE = 14(16)
          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- IF Y = 0 .. 4  RECOVERABLE ERROR
*             = 5  UNIT DOWNED
*         EXPECTED ERROR CODE = 49(16)
          SPACE  2
 FERS     BSS
          LDC    FERS10
 FERS5    BSS
          STML   CTDT20
          LJM    MAIN10
 FERS10   CON    0
          SODL   FEST
 FERS20   BSS
          PJN    FERS40      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+3    ILLEGAL CYLINDER NUMBER
 FERS30   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERS40      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   CTDT20      RESTORE INSTRUCTION
 FERS40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    CTDT20+1    RETURN TO CONFIDENCE TEST
          SPACE  5,20
** NAME-- FERT
*
** PURPOSE-- CHANGE ONE MEMORY LOCATION
*            EB,4C,XXXX YYYY
*              X = ADDRESS (HEX)
*              Y = VALUE (HEX)
*            EB,40,0014
          SPACE  2
 FERT     BSS
          LDDL   P5
          STIL   P4
          LJM    MAIN15
 .F       ENDIF
          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-- 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-- 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
          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      INDICATE MASTER TERMINATE BEING USED
          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      INDICATE MASTER TERMINATE BEING USED
 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-- 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
          LDDL   LUX         UNIT INDEX OF LAST REQUEST FOUND + 1
          STDL   P6
          LDN    0
          AJM    GETU5,DC    IF NO FUNCTION REPLY
          ACN    DC+40B
          EJM    GETU5,DC    IF CHANNEL NOT FULL
          IAN    DC
          LPC    377B
 GETU5    BSS
          STDL   STATUS      SAVE INTERRUPT STATUS
          LDC    H0711
          RJM    FAN         DROP MASTER OUT
 GETU10   BSS
          LDDL   LUX
          STDL   UX
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDN    P.UN
          RADL   LUX         BUMP UNIT ENTRY
          SBDL   UNUML
          MJN    GETU15      IF NOT END OF TABLE
          STDL   LUX
 GETU15   BSS
          LDML   /SS/P.UNIT,CSST
          SHN    -8
          STDL   CMOD        SAVE CONTROLLER NUMBER
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          PJK    GETU50      IF NO COMMAND IN PROGRESS
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          ZJN    GETU20      IF NO INTERRUPT FOR THIS CONTROLLER
          RJM    PI          PROCESS INTERRUPT (NO RETURN)
 GETU20   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    GETU10

*         ONE COMMAND IN PROGRESS

 GETU40   BSS
          LDDL   CMNDS
          SBN    32
          PJK    GETU25      IF 32 SEEKS ISSUED
          STDL   CNUM        INDICATE SECOND COMMAND TO UNIT
          LDDL   IF
          ZJK    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
          RJM    CT          RUN CONFIDENCE TEST
 GETU44   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    37B
          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   T1          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
          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
          LDML   UNITS,UX
          SHN    -3
          LPN    37B
          STDL   P1          INDEX TO UPSB AND UPASB TABLES
          LDDL   T2
          ADDL   T3
          ZJN    GETU60      IF NO ALTERNATE ACCESS
          SBDL   LPN
          ZJN    GETU60      IF NO ALTERNATE ACCESS
          LDDL   T1
          ZJN    GETU58      IF UNIT NOT LOCKED
          LDDL   T4
          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
          NJK    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
          UJN    GETU90
 GETU77   BSS
          RJM    IRD         ISSUE RESTORE DRIVE
          UJN    GETU90
 GETU78   BSS
          RJM    SR          SELECT REQUEST
          NJN    GETU78      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
          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
          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   WD          NUMBER OF CM WORDS TO READ
          LOADF  CM+/CM/P.RMA,CSST  LOAD CM ADDRESS AND REFORMAT
          CRML   *,WD        READ ONE ENTRY FROM THE 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  ENSURE AN EVEN NUMBER OF WORDS
          ADN    7
          SCN    7
          STML   CMLIST+/CM/P.LEN,CSST
          UJK    GLIX
          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
          LDN    0
          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    RAS         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    UPD         UPDATE DRIVE NUMBER
          NJK    HSDT10      IF MORE DRIVES TO TEST
 HSDT35   STML   HSTF        CLEAR HEAD SHIFT TEST FLAG
          UJK    HSDTX
 HSDDR    DATA   0
          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  5,20
 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
          LDML   CP+OPCD
          LMC    0#8400
          NJN    IDTP10      IF NOT READ ERROR LOG
          LDC    H0A81       STREAM, READ TO CM
          RJM    FUNC        RAISE MASTER OUT
          ACN    DC
          LDML   RPB+5+2,T3  BYTE LENGTH OF RESPONSE
          STDL   T5
          ADN    1           IN CASE OF ODD BYTE LENGTH
          SHN    -1
          LPC    0#FFF       ENSURE BUFFER IS NOT OVERFLOWED
          STDL   WC          16-BIT WORDS TO INPUT
          LOADC  CM.CB       ADDRESS TO PUT DATA
          CHCM   WC,DC       TRANSFER DATA TO CM
          UJN    IDTP20
 IDTP10   BSS
          LDDL   MFID        MASK FOR INTERLOCK DATA
          LPN    1
          SHN    9
          LMC    H0281       STREAM, READ
          RJM    FUNC        RAISE MASTER OUT
          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
 IDTP20   BSS
          LDC    MS50
 IDTP30   BSS
          IJM    IDTP40,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    IDTP30      IF TIMEOUT NOT EXPIRED
          RJM    CSI         CHECK SLAVE IN
 IDTP40   BSS
          LDN    0
          RJM    GES         GET ENDING STATUS
          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
 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
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
          RJM    HANG        (NO RETURN)
          SPACE  5,20
** NAME-- INTRS
*
** PURPOSE-- SEND INTERMEDIATE RESPONSE.
          SPACE  2
 INTRSX   LJM    **
 INTRS    EQU    *-1
          LDDL   PTF
          NJN    INTRS20     IF NOT PATH TEST
 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-- 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-- 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--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-- 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
          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-- 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)
          SPACE  5,20
** NAME-- LOCK
*
** PURPOSE-- SET THE LOCKWORD
*
** ENTRY
*         T7 = POINTER RMA
*         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          WRITE INTERMEDIATE VALUE
          LDDL   T1
          ZJN    LOCK30      IF LOCK COULD BE SET
          ADDL   T2
          ADC    -177777B-177777B
          ZJK    LOCK10      IF INTERMEDIATE VALUE
          LDDL   T2
          LPC    77777B
          ADC    100000B
          STDL   T2          SET THE VE BIT
          LDDL   T6
          CWDL   T1          RESTORE THE LOCKWORD WITH 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.
          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
          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-- 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    340B
          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-- PCER
*
** PURPOSE-- PREPARE COMMON ERROR RESPONSE
*
** ENTRY  A = ERROR ID
          SPACE  2
 PCERX    LJM    **
 PCER     EQU    *-1
          STDL   P2
          SBN    E20
          ZJN    PCER10      IF ERROR CODE 20
          SBN    E22-E20
          MJN    PCER20      IF ERROR CODE 0-19, 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 EC 27 OR 28
          ZJN    PCER20      IF EC 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
          LDDL   STATUS      STATUS REGISTER
          STML   RS+/RS/P.STREG
          LDC    H00F1
          RJM    RDRG        READ ERROR REGISTER
          STML   RS+/RS/P.ERREG  SAVE ERROR 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
 .F       IFEQ   FE,1
          LDML   SRRC
          STML   RS+/RS/P.FILL1  NO DATA TRANSFERRED ERROR COUNT
 .F       ENDIF
          UJK    PCERX
          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-- 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
          LPC    0#FF        RIGHT-MOST 8 BITS OF LOGICAL UNIT
          LMC    /RS/K.SHORT  INDICATE ONE-WORD RESPONSE
          STML   RS+/RS/P.SHORT
          UJK    PDRX
          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-- 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-- 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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          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        MICROCODE 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
          ZJN    PI50        IF READ
          RJM    WRITE       IF WRITE (RETURN IS TO IDLE LOOP)
 PI50     BSS
          RJM    READ        READ (RETURN IS TO IDLE LOOP)
 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 ON THE PP QUEUE.
          SPACE  2
 PPRQX    LJM    **
 PPRQ     EQU    *-1
          LCN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDC    0#7FFF
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDCL   T1          CLEAR ACTIVE CHECK BIT, READ PPIT WORD 1
          LDDL   T4
          SHN    /PIT/L.IDLREQ+2
          MJN    PPRQ10      IF IDLE REQUEST
          SHN    /PIT/L.RESREQ-/PIT/L.IDLREQ
          PJN    PPRQX       IF NOT RESUME OR IDLE REQUEST
          RJM    SPLOCK      SET PP TABLE LOCK
          LDDL   T4
          LPC    0#4FFE      CLEAR ACTIVE CHECK BIT, RESUME REQUEST BIT,
          STDL   T4           IDLE STATUS BIT, AND LOCK BIT IN PP
          LDDL   CM.PIT+1     INTERFACE TABLE
          CWDL   T1
          LJM    MAIN5
 PPRQ10   BSS
          AOML   IDLE        NUMBER OF TIMES DRIVER IDLED
          RJM    SPLOCK      SET PP TABLE LOCK
          RJM    RAR         RESTART ALL REQUESTS SET UP
          RJM    DLN         DELETE LOGICAL PP NUMBER FROM LOCKWORD
          LDDL   CLF
          NJN    PPRQ15      IF 2 CONSECUTIVE IDLES AND CHANNEL LOCK
                              ALREADY CLEAR
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 PPRQ15   BSS
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          CRDL   T1
          LDDL   T4          CLEAR ACTIVE CHECK BIT, IDLE REQUEST BIT,
          LPC    0#2FFE       AND SET IDLE STATUS BIT
          LMC    0#1000
          STDL   T4
          LDDL   CM.PIT+1
          CWDL   T1
 PPRQ20   BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PPRQ20
          SPACE  5,20
** NAME-- PT
*
** PURPOSE-- 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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          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    7
          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          READ UNIT DISABLED FLAG
          LDDL   T1+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJN    PT16        IF UNIT DISABLED
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          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    100
          STML   CP+FCP+2    BYTE LENGTH
          RJM    CPT         COMMAND PACKET TRANSFER
 PT40     EQU    *-1         FOR FORCING ERRORS
          RJM    BPTB        BUILD PATH TEST BUFFER
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    PT90        IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAOUT     DATA, TRANSFER OUT
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0381       STREAM, WRITE FROM PP
          RJM    FUNC        RAISE MASTER OUT
          ACN    DC
          LDN    50          WORD COUNT
          OAM    OB,DC       OUTPUT DATA
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
 PT50     BSS
          IJM    PT55,DC     IF SLAVE IN DROPPED
          SBN    1
          NJN    PT50        IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          UJK    PT94
 PT55     BSS
          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
          ACN    DC
          LDN    50          WORD COUNT
          IAM    IB,DC
          STDL   WC          WORDS NOT TRANSFERRED
          LDC    MS50
 PT60     BSS
          IJM    PT65,DC     IF SLAVE IN DROPPED
          SBN    1
          NJN    PT60        IF TIMEOUT NOT EXPIRED
          RJM    CSI         CHECK SLAVE IN
 PT65     BSS
          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
          RJM    VPTD        VERIFY PATH TEST DATA
          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-- RAR
*
** PURPOSE-- RESTART ALL REQUESTS
          SPACE  2
 RARX     BSS
          STDL   CMNDS       NO OUTSTANDING COMMANDS
          LJM    **
 RAR      EQU    *-1
          PAUSE  100000      ALLOW CONTROLLER TIME TO WRITE DATA IN
          LDN    0            ITS BUFFER TO DISK
          STDL   UX          POINTER TO UNITS TABLE
          UJN    RAR20
 RAR10    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 RAR20    BSS
          SBDL   UNUML
          ZJN    RARX        IF END OF CONFIGURED UNITS
          RJM    SFRR        SET UP FOR REQUEST RETRY
          UJN    RAR10
          SPACE  5,20
** NAME-- 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-- 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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          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    7
          LMDL   CMOD
          NJN    RCC10       IF DIFFERENT CONTROLLER
          RJM    SFRR        SETUP FOR REQUEST RETRY
          UJK    RCC10
          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
          LDML   /SS/P.FNC,CSST
          STDL   FNC         SAVE FUNCTION
          LDN    0
          STDL   DELAY       CLEAR DELAY BITS
          STDL   SECPOS      SET SECTOR POSITION = 0
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX  SET CURRENT CLOCK
          LDM    /SS/P.DT,CSST
          SHN    -4
          STDL   DT          DEVICE TYPE
          LDML   SI,DT       SUSPEND INTERVAL
          STDL   SBS         SECTORS TO TRANSFER BEFORE SUSPENDING
          UJK    RDWX
 RDWT80   BSS
          LJM    TERM10      REPORT UNEXPECTED RESPONSE ERROR
          SPACE  5,20
** NAME-- RDWTOK
*
** PURPOSE-- SEND RESPONSE FOR COMPLETED READ REQUEST
          SPACE  2
 RDWTX    LJM    **
 RDWTOK   EQU    *-1
          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-- 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
          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
          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-- RESP
*
** PURPOSE-- WRITE STATUS BUFFER TO CM RESPONSE BUFFER.
          SPACE  2
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  2
 RESPX    LJM    **
 RESP     EQU    *-1

*         CHECK IF RESPONSE SHOULD BE SENT TO CM.

          LDN    0
          STDL   STORS       SET FLAG TO STORE RESPONSE
          LDML   CM+/CM/P.STOR,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
          AODL   STORS       NONZERO MEANS DO NOT STORE RESPONSE
          UJK    RESPX

*         READ IN AND OUT POINTERS OF RESPONSE BUFFER.

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

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

          LDN    0
          STDL   T5          NUMBER OF WORDS IN 2ND BLOCK WRITE
          LDDL   INP
          SBDL   OUTP
          MJN    RESP20      IF IN .LT. OUT
          LDDL   LIM         IN .GE. OUT, SET OUT = OUT + LIMIT
          RADL   OUTP
 RESP20   BSS
          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.

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

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

*         UPDATE THE 'IN' POINTER.

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

*         INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   LPN-3       SET LAST BYTE NONZERO
          LDN    0           SET BANK FOR S0
 INTPRC   PSN    0           INTERRUPT OR PSN (MODIFIED)
          UJK    RESNX
          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-- 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-- 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    7
          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-- SCLOCK
*
** PURPOSE-- SETS THE CHANNEL LOCK.
          SPACE  2
 SCLX     LJM    **
 SCLOCK   EQU    *-1
 SCL30    BSS
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJN    SCL30       IF LOCK WAS NOT SET
          STDL   CLF         CLEAR CHANNEL LOCK FLAG
          UJK    SCLX        EXIT, LOCK WAS SET
          SPACE  5,20
** NAME-- SCP
*
** PURPOSE-- SET UP COMMAND PACKET PARAMETERS FOR A WRITE
*            OR READ
          SPACE  2
 SCPX     LJM    **
 SCP      EQU    *-1
          LDN    RPL
          STML   CP          COMMAND 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
          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
          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
          PJK    SDA53       IF NOT DOING RESTORE
          LDML   RTM,CSST
          NJK    SDA53       IF NOT DOING RESTORE
          LDML   /SS/P.RQTRY,CSST
          SBN    3
          NJN    SDA53       IF NOT TIME TO SKIP MEDIA ERROR
          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-- 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-- 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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE

*         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 COMMANDS 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.NCOMW,CSST  ZERO OUT NUMBER OF COMPLETED WRITE REQUESTS
          SOML   /SS/P.NCOMRQ,CSST  NUMBER OF COMPLETED REQUESTS
          ZJN    SFRR10      IF NO STREAMED READ REQUESTS
          LDML   /SS/P.PRERQ,CSST  SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   /SS/P.CURRQ,CSST
          LDML   /SS/P.PRERQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
          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-- SMD
*
** PURPOSE-- SKIP MEDIA DEFECT
          SPACE  2
 SMDX     LJM    **
 SMD      EQU    *-1
          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
          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.NCOMW,CSST  NUMBER OF COMPLETED WRITE REQUESTS MINUS 1
          ZJN    SNDWX       IF NO COMPLETED STREAMED WRITE REQUESTS
          LDN    2
          STDL   WD
          LOADF  /SS/P.CURRQ,CSST
          CRML   NRQ,WD      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,WD      READ NEXT REQUEST CHAIN POINTERS
          AOML   /SS/P.NCOMRQ,CSST  INCREMENT NUMBER OF COMPLETED REQUESTS
                             (FOR DCR)
          SOML   /SS/P.NCOMW,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-- 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-- 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    377B
          STML   RS+/RS/P.UNIT  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    340B
          LMML   FPD
          STML   RS+/RS/P.UNIT  CONTROLLER, DRIVE NUMBER
 SPA70    BSS
          LJM    SPAX
          SPACE  5,20
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP TABLE LOCK IN THE
*            PP INTERFACE TABLE.
          SPACE  2
 SPLX     LJM    **
 SPLOCK   EQU    *-1
 SPLOCK4  BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDN    1
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDSL   T1          ATTEMPT TO SET PP TABLE LOCK
          LDDL   T4
          LPN    1
          ZJK    SPLX        IF LOCK SET
          UJK    SPLOCK4
          SPACE  5,20
** NAME-- 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  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
          ADN    /UIT/C.NEXTPV
          STML   /SS/P.DP+1,CSST
 SR24     BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDN    0           INDICATE REQUEST FOUND
          UJK    SRX
 SR50     BSS
          LDN    5
          STDL   WD
          LOADF  /SS/P.CURRQ,CSST
          CRML   NRQ,WD      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  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-- 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     LJM    **
 SRI      EQU    *-1
          LDDL   UX
          STML   EPCT,CMOD   SAVE TABLE ISSUING RESET
          LDN    0
          STDL   P1          POINTER TO UNITS TABLE
          UJN    SRI10
 SRI5     BSS
          LDN    P.UN
          RADL   P1          UPDATE POINTER TO UNITS TABLE
 SRI10    BSS
          SBDL   UNUML
          PJN    SRIX        IF END OF CONFIGURED UNITS
          LDML   UNITS,P1
          SHN    -/UN/N.UNIT
          LPN    7
          LMDL   CMOD
          NJN    SRI5        IF DIFFERENT CONTROLLER
          LDML   UNITS+/UN/P.SSPTR,P1
          STDL   P2          POINTER TO SS TABLE
          STML   /SS/P.RESET,P2  INDICATE RESET ISSUED
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,P1  SET CURRENT CLOCK
          UJK    SRI5
          SPACE  5,20
** NAME-- SRR
*
** PURPOSE-- SHOULD RESPONSE BE READ.  CHECK IF RESPONSE PACKET MUST
*            BE READ TO ACCURATELY REPORT THE ERROR AND, IF SO
*            RETURN TO THE CALLING ROUTINE.  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.
*            ALSO HANDLE AN UNANTICIPATED PAUSE.  THIS CAN OCCUR ON A READ FROM
*            A LOGICAL UNIT WITH PARITY IF MORE THAN ONE DRIVE HAS A MEDIA ERROR.
*            THE CONTROLLER WILL RETURN A TRANSFER NOTIFICATION RESPONSE, THEN
*            DROP SLAVE IN WITHOUT SENDING ANY DATA.  THIS IS NOT AN ERROR, PAUSE
*            IS SET AND THE HOST MUST BE ABLE TO WAIT FOR ANOTHER TRANSFER NOTIFICATION
*            RESPONSE AND REREAD THE SAME SECTOR.
          SPACE  2
 SRRX     BSS
          LCN    0
          STML   /SS/P.LISTL,CSST  TO GUARANTEE AN ERROR IS REPORTED
 SRR10    BSS
          AOML   SRRC        ERROR COUNTER
          LJM    **
 SRR      EQU    *-1
          LDDL   STATUS
          LPN    60B
          LMN    20B
          ZJN    SRRX        IF NO MORE DATA
          LDDL   FNC
          NJN    SRRX        IF NOT READ
          LDDL   STATUS
          LPN    60B
          NJN    SRR10       IF UNANTICIPATED PAUSE
          LDN    E29         INCOMPLETE TRANSFER
          RJM    EP          ERROR PROCESSING (NO RETURN)
 SRRC     CON    0           ERROR COUNTER
          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
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        SET INDEX TO SS TABLE
          LDML   /SS/P.UNIT,CSST
          LMML   RPB+SLAD
          ZJK    STIX        IF CORRECT UNIT
          LJM    TERM10
          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        OUTPUT DATA FROM 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-- 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    7
          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
          SPACE  5,20
** NAME-- TERM
*
** PURPOSE-- TERMINATE UNIT REQUEST.
          SPACE  2
 TERM     CON    0           NORMAL TERMINATION
          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
          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    340B
          ADML   ODN,CSST
          STML   RS+/RS/P.UNIT  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 IN RESPONSE BUFFER
          UJK    TERX
          SPACE  5,20
** NAME-- UBT
*
** PURPOSE-- UPDATE BYTES TRANSFERRED
          SPACE  2
 UBT10    BSS
          RJM    UNCMND      GET NEXT COMMAND
 UBTX     LJM    **
 UBT      EQU    *-1
          LDDL   BYTES       BYTES TRANSFERRED
          RAML   /SS/P.XFER+1,CSST  UPDATE BYTES TRANSFERRED
          SHN    -16
          RAML   /SS/P.XFER,CSST
          LDDL   BYTES
          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   BYTES
          STML   CMLIST+/CM/P.LEN,CSST
          NJN    UBTX        IF MORE WORDS LEFT TO TRANSFER TO THIS
                              CM ADDRESS
          SOML   /SS/P.LISTL,CSST  DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJK    UBT10       IF END OF RMA LIST
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
          UJK    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    0#10000
 UC5      BSS
          RADL   CLMCS       UPDATE MICROSECOND PORTION OF CLOCK
          LDDL   CLMCS
          ADC    -30000
          MJN    UCX         IF LESS THAN 30 MILLISECONDS
          STDL   CLMCS
          LDN    30
          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
          SODL   SBS         SECTORS BEFORE SUSPENDING
          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   WD
          LOADF  /SS/P.REQ,CSST  LOAD CM ADDRESS AND REFORMAT
          ADML   /SS/P.LASTC,CSST  ADD OFFSET OF COMMAND
          CRML   *,WD       READ COMMAND FROM CM
 UNC4     EQU    *-1

*         IF INDIRECT ADDRESS, READ CM ADDRESS LIST.

 UNC10    BSS
          LDML   CM+/CM/P.LEN,CSST  ENSURE 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-- 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
          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
          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   WD
          LDDL   CSST        ADDRESS OF SS TABLE
          ADK    RQ          LOCATION OF REQUEST IN SS TABLE
          STML   UREQ8       ADDRESS TO PUT REQUEST
          ADN    8
          STML   UREQ4
          LOADF  /SS/P.REQ,CSST  LOAD CM REQUEST ADDRESS
          ADN    2
          CRML   *,WD        READ CURRENT REQUEST
 UREQ4    EQU    *-1
          SBN    5
          CRML   *,WD
 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
          IFEQ   TB,1
          SPACE  5,20
** NAME-- UT
*
** PURPOSE-- UPDATE TRACE
*            CM.CB      UPPER 16 BITS OF RMA
*            (Z1+1) * 8 LOWER 16 BITS OF RMA
*
*     COMMAND      0000      :   OP CODE    :   DRIVE ADDRESS     : CLOCK
*              --------------:--------------:---------------------:------
*               SECTOR COUNT :  CYLINDER    :   HEAD, SECTOR      : CRN
*                                           :                     :
*     RESPONSE     FFFF      :   OP CODE    :   DRIVE ADDRESS     : CLOCK
*              --------------:--------------:---------------------:------
*               SECTOR CNT   : MAJOR STATUS : SECTORS TRANSFERRED : CRN
*                REMAINING   :              :                     :
          SPACE  2
 UTX      LJM    **
 UT       EQU    *-1
          LRML   CM.CB
          LDDL   Z1+1
          CWDL   Z1+2
          AODL   Z1+1
          AODL   Z1
          LMC    0#200
          NJN    UTX
          STDL   Z1
          LDML   CM.CB+1
          ADC    0#200
          STDL   Z1+1
          UJN    UTX
          ENDIF
          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 REQUEST
          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-- 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   SPC,DT      SECTORS PER CYLINDER
          SBML   /SS/P.TOTAL,CSST  SECTORS TO TRANSFER
          SHN    2
          ADDL   CTPAT       CONFIDENCE TEST PATTERN FIRST WORD MINUS ONE
          STDL   P1          STARTING DATA PATTERN VALUE MINUS ONE
          LDML   BPS,DT      BYTES PER SECTOR
          SHN    -3
          STDL   P6          CM WORDS PER SECTOR
          LDN    0
          STDL   P3
          LOADC  CM.CB       ADDRESS OF PP COMMUNICATIONS BUFFER
          STDL   P2
 VCTD10   BSS
          LDDL   P2
          ADDL   P3
          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   P3          INDEX TO WORD TO READ
          LMDL   P6
          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)
          SPACE  5,20
** NAME-- VPTD
*
** PURPOSE-- VERIFY PATH TEST DATA
          SPACE  2
 VPTDX    LJM    **
 VPTD     EQU    *-1
          LDN    0
          STDL   T1          INDEX TO BUFFER
 VPTD4    BSS
          LDML   IB,T1       WORD FROM INPUT BUFFER
          LMML   OB,T1       WORD FROM OUTPUT BUFFER
          NJN    VPTD10      IF ERROR
          AODL   T1
          SBN    50
          ZJN    VPTDX       IF VERIFY OK
          UJN    VPTD4       MORE WORDS TO CHECK
 VPTD10   BSS
          LDK    E110        PP-CONTROLLER DATA INTEGRITY
          RJM    EP          ERROR PROCESSING (NO RETURN)
          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
          IFEQ   TB,1
          LDN    0
          STDL   Z1+2        INDICATE COMMAND
          LDML   CP+OPCD
          STDL   Z1+3        OP CODE
          LDML   CP+SLAD
          STDL   Z1+4        ADDRESS
          LDDL   CLSEC
          STDL   Z1+5        CLOCK
          RJM    UT          UPDATE TRACE
          LDML   CP+FCP+2
          STDL   Z1+2        SECTOR COUNT
          LDML   CP+FCP+3
          STDL   Z1+3        CYLINDER
          LDML   CP+FCP+4
          STDL   Z1+4        TRACK, SECTOR
          LDML   CP+CRN
          STDL   Z1+5        COMMAND REFERENCE NUMBER
          RJM    UT          UPDATE TRACE
          ENDIF
          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)
          SPACE  5,15
** NAME-- DCM
*
** PURPOSE-- DESELECT THE CONTROLLER
          SPACE  2
 DCMX     LJM    **
 DCM      EQU    *-1
          LDC    H0071
          RJM    FUNC        DROP SELECT OUT
          ACN    DC
          LDN    77B
 DCM4     FJM    DCMX,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,15
** NAME-- DTM
*
** PURPOSE-- DETERMINE TRANSFER MODE
*
** ENTRY
*         MFID - MASK FOR INTERLOCK DATA
*
** EXIT
*         STATUS - TRANSFER SETTINGS, BIT 4 = 1 IF DATA STREAMING
*         CTM - USED TO CHANGE TRANSFER MODE WHEN SELECTING
          SPACE  2
 DTMX     LJM    **
 DTM      EQU    *-1
          LDDL   CMOD        CONTROLLER NUMBER
          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    DTMX,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 CONFIGURED UNITS
          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
          STML   FBUF,FI     SAVE HISTORY OF FUNCTIONS ISSUED
          AODL   FI          INCREMENT FUNCTION BUFFER INDEX
          ADC    -FBUFL
          NJN    FUN4        IF NOT END OF BUFFER
          STDL   FI          INITIALIZE INDEX
 FUN4     BSS
          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    1280
 GES5     BSS
          FJM    GES10,DC    IF SLAVE IN SET
          SBN    1
          NJN    GES5        IF TIMEOUT NOT EXPIRED
          LDN    E27         SLAVE IN NOT SET
          UJN    GES12
 GES10    BSS
          IAN    DC
          STDL   STATUS      SAVE ENDING STATUS
          SFM    GES55,DC    IF ERROR FLAG SET
          SHN    17-7
          MJN    GESX        IF SUCCESSFUL
          LDDL   STATUS
          SHN    11
          PJN    GES15       IF NOT BUS PARITY
          LDK    E34
 GES12    BSS
          UJN    GES22
 GES15    BSS
          LDDL   STATUS
          LPN    17B
          ZJN    GES16       IF REPORTING -ENDING STATUS WRONG-
          SBN    1
          NJN    GES20       IF NOT BUS CONTROL REJECTED
          LDDL   TBC
 GES16    ZJK    GES40       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    GES17       IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GES17    BSS
          SBN    CMT         COMMAND TIMEOUT
          PJN    GES38       IF TIMEOUT
          LJM    MAIN15      TRANSFER NOTIFICATION OCCURRED BEFORE
                              THE COMPLETION RESPONSE, WAIT FOR
                              THE COMPLETION RESPONSE
 GES20    BSS
          SBN    8
          NJN    GES25       IF NOT -SYNC OUTS NOT EQUAL SYNC INS-
          LDK    E36
 GES22    BSS
          UJN    GES50
 GES25    BSS
          PJN    GES35       IF NOT COMMAND REJECT
          ADN    6
          NJN    GES27       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
 GES27    BSS
          LDK    E35
 GES30    BSS
          UJN    GES50
 GES35    BSS
          SBN    2
          NJN    GES40       IF NOT LRC ERROR
          LDK    E70
          UJN    GES50
 GES38    BSS
          LDN    E38         NO CONTROLLER RESPONSE
          UJN    GES50
 GES40    BSS
          LDN    E39         ENDING STATUS WRONG
 GES50    BSS
          RJM    EP          ERROR PROCESSING (NO RETURN)
 GES55    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          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
          LDDL   CMOD        CONTROLLER NUMBER
          SHN    12
          ADDL   P2
          RJM    FUNC        SET MASTER OUT
          PAUSE  20
          LDDL   LF          LAST FUNCTION ISSUED
          LMN    2
          RJM    FUNC        SET SYNC OUT
          PAUSE  10
          LDDL   LF
          LMN    2
          RJM    FUNC        DROP SYNC OUT
          LDDL   LF
          LMN    4
          RJM    FUNC        DROP MASTER OUT
          UJK    IRX
          SPACE  5,20
** NAME-- MCC
*
** PURPOSE-- MASTER CLEAR CHANNEL
          SPACE  2
 MCCX     LJM    **
 MCC      EQU    *-1
          MCLR   DC          MASTER CLEAR CHANNEL
          PAUSE  100         ALLOW CONTROLLER TIME TO DROP LINES
          MCLR   DC          IN CASE SEQUENCE ERROR OCCURRED
          PAUSE  1
          LDC    H7E42
          RJM    FUNC        SET IPI CHANNEL TRANSFER RATE
          UJN    MCCX
          SPACE  5,20
** NAME-- MR
*
** PURPOSE-- MASTER RESET ALL SLAVES ON THE CHANNEL
          SPACE  2
 MRX      LJM    **
 MR       EQU    *-1
          RJM    MCC         MASTER CLEAR CHANNEL
          LDC    H9213
          RJM    FUNC        BUS A, SET SYNC OUT
          PAUSE  10          MUST DELAY 10 MICROSECONDS MINIMUM
          LDC    H9211
          RJM    FUNC        DROP SYNC OUT
          UJK    MRX
          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-- 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
          IFEQ   TB,1
          LCN    0
          STDL   Z1+2        INDICATE RESPONSE
          LDML   RPB+OPCD
          STDL   Z1+3        OP CODE
          LDML   RPB+SLAD
          STDL   Z1+4        ADDRESS
          LDDL   CLSEC
          STDL   Z1+5        CLOCK
          RJM    UT          UPDATE TRACE
          LDML   /SS/P.TOTAL,CSST
          STDL   Z1+2        SECTORS LEFT TO TRANSFER
          LDML   RPB+MAJST
          STDL   Z1+3        MAJOR STATUS
          LDML   /SS/P.XFER,CSST
          SHN    4
          STDL   Z1+4
          LDML   /SS/P.XFER+1,CSST
          SHN    -12
          RADL   Z1+4        SECTORS TRANSFERRED
          LDML   RPB+CRN
          STDL   Z1+5        COMMAND REFERENCE NUMBER
          RJM    UT          UPDATE TRACE
          ENDIF
          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
          NJK    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
          RJM    CSI         CHECK SLAVE IN
          LJM    RPT30
          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
          LDDL   CMOD
          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
          DATA   16,32,64,128
          SPACE  2,6
 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE
          TITLE  INITIALIZATION
** NAME-- IT
*
** PURPOSE-- INITIALIZE TABLES
*
** ENTRY  CM.PIT = CM BYTE ADDRESS OF THE PP INTERFACE TABLE.
          SPACE  2
 ITX      LJM    **
 IT       EQU    *-1
          LDK    EOM-CP      LENGTH OF BUFFERS
          STDL   T1
 IT10     BSS
          LDN    0
          STML   CP-1,T1     ZERO OUT BUFFERS
          SODL   T1
          NJN    IT10
          STDL   UX          INITIALIZE DIRECT CELLS
          STDL   LUX
          STDL   MALET
          STDL   P4
          STDL   P5
          STDL   P6
          STDL   T7
          STDL   CMOD
          STDL   PTF         PATH TEST FLAG
          LDN    C.PIT
          STDL   WD
          LOADC  CM.PIT      LOAD CM ADDRESS OF PP INTERFACE TABLE
          CRML   IPIT,WD     READ PP INTERFACE TABLE
          LDML   IPIT+/PIT/P.PPNO  GET LOGICAL 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+1     DISPLACEMENT TO READ/WRITE BUFFER
          IFEQ   TB,1
          ADC    0#200
          STDL   Z1+1
          ENDIF
          LDML   IPIT+/PIT/P.CBUFL  GET LENGTH OF COMMUNICATION BUFFER
          ADC    -P.CB*2
          PJN    IT20        IF COMMUNICATIONS 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   WD
          LOADC  CM.PIT
          ADN    C.PIT
          ADDL   P6          INDEX TO UNIT DESCRIPTORS
          CRML   IBUF,WD     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
          LPN    7
          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   WD
          LOADF  IBUF+/UD/P.UQT  REFORMAT RMA OF UNIT INTERFACE TABLE
                                 AND SAVE IN UNITS TABLE
          STML   UNITS+/UN/P.UIT+1,UX
          CRML   UBUF,WD     READ UNIT INTERFACE TABLE
          LDML   IBUF+/UD/P.UQT
          STML   UNITS+/UN/P.UIT,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    17
          MJN    IT60        IF VALID UNIT TYPE
 IT50     BSS
          LDC    E306        INVALID UNIT TYPE
          RJM    INTERR      REPORT ERROR (NO RETURN)
 IT60     BSS
          ADN    17
          SHN    4
          STML   SS+/SS/P.DT,P4  DEVICE TYPE
          LDML   IBUF+/UD/P.CHAN  GET CHANNEL FROM UNIT DESCRIPTOR
          SHN    -8
          STDL   CHAN        CHANNEL NUMBER
          LDDL   CMOD
          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 CONTROLLER, UNIT NUMBER IN UNITS TABLE
          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN SS TABLE
          STML   SS+/SS/P.LU,P4
          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
          AODL   P5          NUMBER OF CONFIGURED UNITS
          LDN    P.UN
          RADL   UX          BUMP CONFIGURED UNIT INDEX
          UJN    IT80
 IT70     BSS
          LDN    C.UD
          RADL   P6          NEXT UNIT DESCRIPTOR ENTRY
          SBDL   T8
          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    8
          MJK    IT30        IF LEGAL CONTROLLER NUMBER
 IT90     BSS
          LDDL   UX
          STDL   UNUML       END OF ACTIVE UNIT TABLE
          RJM    CHGCH       SET CHANNEL INSTRUCTIONS
          LJM    ITX
          SPACE  5,20
 CP       BSS    0           COMMAND PACKET FOR CONTROLLER
 CPL      EQU    48          MAXIMUM COMMAND PACKET LENGTH

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

 PSB      EQU    CP+CPL      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  CONTROLLER 0  STRING 0
                                      1             0         1
                                      2             0         2
                                      3             0         3
                                      4             1         0
                                      5             1         1
                                      .             .         .
                                      .             .         .
                                      .             .         .
                                     31             7         3
 UPSBL    EQU    32          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    32          UPASB TABLE LENGTH

 FBUF     EQU    UPASB+UPASBL  FUNCTION HISTORY BUFFER
 FBUFL    EQU    16          LENGTH OF FUNCTION BUFFER

 UNUM     EQU    64          SUPPORT 64 UNITS
 UNITS    EQU    FBUF+FBUFL  START OF UNITS TABLE
 UNITSL   EQU    UNUM*P.UN   LENGTH OF UNITS TABLE
 SS       EQU    UNITS+UNITSL  INFORMATION SAVED IN UNIT COMMUNICATION BUFFER
 NSS      EQU    RS-SS
 NSST     EQU    NSS/P.SS    NUMBER OF SS TABLES
          ERRMI  NSST-64     IF NO ROOM FOR SS TABLES

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

          END
/EOR
