          IDENT  DSKI
          CIPPU
          MEMSEL 16
          TITLE  DSKI - NOS/VE CM3/9836/9853 DISK DRIVER FOR S0
*
*         WORD 6 OF THE FOLLOWING COMMENT MUST BE A REVISION NUMBER
*         FOR CTI.
*
          COMMENT *SMD* LVL=04
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
*
*         THIS IS THE PP DRIVER FOR THE IPI CHANNEL THAT SUPPORTS THE CM3,
*         THE 9836 DRIVE, AND THE 9853 DRIVE ON A CYBER 930 (S0) SYSTEM.
*         THE PROGRAM NAME IS DSKI AND THE DECK NAME IS IOM$DSKI.  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 BEGINS.
*
          LIST   -$
*COPYC IODMAC1
*COPYC IODMAC2
*COPYC 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
*
 UNIX     EQU    1           = 1, TO ENABLE ONE-WORD RESPONSE AND NEW METHOD OF
                                  RESPONDING TO IDLE AND RESUME REQUESTS, ALSO
                                  RELY TOTALLY ON CONFIDENCE TEST FOR ISOLATION
                                  OF MEDIA ERRORS. (=0 FOR UNIX)
 FE       EQU    0           = 1, TO ENABLE FORCE ERROR CODE
 KH       EQU    0           = 1, TO KEEP HISTORY OF REQUESTS AND RESPONSES
 ERRD     EQU    0           = 1, TO READ UNCORRECTED DATA
 DC       EQU    22B         DISK CHANNEL
 MS50     EQU    53475       50 MILLISECOND TIMEOUT FOR CERTAIN LOOPS
 RRL      EQU    3           REQUEST RETRY LIMIT
 SRT      EQU    120         SLAVE RESET TIMEOUT (SECONDS)
 DST      EQU    480         DRIVE SPINUP TIMEOUT (SECONDS)
 FDT      EQU    9000        FORMAT DRIVE TIMEOUT (SECONDS)
 RLIE     EQU    49*8        RESPONSE LENGTH IF ERROR
 NSBS     EQU    3           NUMBER OF SECTORS TO TRANSFER BEFORE
                              SUSPENDING
 C.CHCNT  EQU    37          NUMBER OF REQUESTS TO PROCESS BEFORE
                              CHANNEL LOCK
 RBPL     EQU    0#14        READ BUFFER PACKET LENGTH
 RPL      EQU    0#10        READ, WRITE COMMAND PACKET LENGTH
 H0200    EQU    0#0200      READ ATTRIBUTES OPERATION CODE
 H0209    EQU    0#0209      LOAD ATTRIBUTES OPERATION CODE
 H020A    EQU    0#020A      SAVE ATTRIBUTES OPERATION CODE
 H0400    EQU    0#0400      RESERVE DRIVE
 H0700    EQU    0#0700      SET OPERATING MODE
 H0800    EQU    0#0800      ABORT OPERATION CODE
 H1005    EQU    0#1005      READ OPERATION CODE
 H1107    EQU    0#1107      READ RAW DATA 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
 H8400    EQU    0#8400      READ PERFORMANCE LOG OP CODE
 H0931    EQU    0#0931      COMMAND EXTENT PARAMETER
 BPS      EQU    2048        BYTES PER SECTOR
 WPS      EQU    BPS/8       WORDS PER SECTOR
 ID13     EQU    0#13        MESSAGE/MICROCODE EXCEPTION
 ID14     EQU    0#14        INTERVENTION REQUIRED FOR CONTROLLER
 ID15     EQU    0#15        ALTERNATE PORT EXCEPTION
 ID16     EQU    0#16        MACHINE EXCEPTION FOR CONTROLLER
 ID17     EQU    0#17        COMMAND EXCEPTION FOR CONTROLLER
 ID19     EQU    0#19        CONTROLLER CONDITIONAL SUCCESS
 ID23     EQU    0#23        DRIVE MESSAGE EXCEPTION
 ID24     EQU    0#24        INTERVENTION REQUIRED STATUS
 ID26     EQU    0#26        MACHINE EXCEPTION FOR DRIVE
 ID29     EQU    0#29        DRIVE CONDITIONAL SUCCESS
 ID32     EQU    0#32        FAILING ADDRESS
 ID50     EQU    0#50        HAS MICROCODE REVISION
 ID51     EQU    0#51        HAS SECTOR SIZE

* COMMAND/RESPONSE PACKET EQUATES

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

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

 UN       RECORD PACKED

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

 SS       RECORD PACKED

* WORD 1

 MREV     SUBRANGE 0,377B    CM3 MICROCODE REVISION
 FILL1    SUBRANGE 0,3
 DT       SUBRANGE 0,3       DEVICE TYPE, O = 9836, 1 = 9853 2 = EMD5
 CRN      SUBRANGE 0,17B     USED TO MAKE COMMAND REFERENCE NUMBER UNIQUE
*
 CMOD     SUBRANGE 0,377B    CONTROL MODULE NUMBER
 UNIT     SUBRANGE 0,377B    UNIT NUMBER
*
 LU       PPWORD             LOGICAL UNIT
*
 FNC      PPWORD             FUNCTION CODE  READ = 0
                                            WRITE = 1
 REQ      STRUCT 4           CURRENT REQUEST (UNFORMATTED RMA)
 PVA      STRUCT 6           PVA OF CURRENT REQUEST

 LASTC    PPWORD             OFFSET OF COMMAND IN REQUEST
 FRST     PPWORD             = 0, IF FIRST TIME THROUGH UNCMND
 NUMCM    PPWORD             NUMBER OF COMMANDS LEFT TO PROCESS IN
                             THIS REQUEST
 LISTL    PPWORD             NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST.
                             (INCLUDES THE NUMBER OF WORDS WHICH HAVENT
                             BEEN READ FROM CM.)
 TOTAL    STRUCT 4           TOTAL CM WORDS LEFT TO TRANSFER
 MT       EQU    /SS/P.TOTAL MASTER TERMINATE FLAG
                              8XXX IF MASTER TERMINATE BEING USED
                              XXX IS NONZERO IF TRANSFER HAS BEEN TERMINATED
 FCOMRQ   STRUCT 4           FIRST COMPLETED REQUEST (RMA)
 CURRQ    STRUCT 4           CURRENT REQUEST (RMA)
 PRERQ    STRUCT 4           PREVIOUS REQUEST (RMA)
 NCOMRQ   PPWORD             NUMBER OF COMPLETED REQUESTS
 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 4           TOTAL CM WORDS TO TRANSFER FOR 2ND COMMAND
 MT2      EQU    /SS/P.TW2   MASTER TERMINATE FLAG FOR 2ND COMMAND
 RQTRY    PPWORD             REQUEST RETRY COUNT
 RESET    PPWORD             RESET ISSUED
                              1 SLAVE ASYNCH EXPECTED
                              2 DRIVE ASYNCH EXPECTED AFTER SLAVE RESET
                              3 BOTH 1 AND 2
 CT       PPWORD             NONZERO WHEN CONFIDENCE TEST IS COMPLETE
                              1 IF NO ERROR
                              2 IF ERROR
                              4 IF DATA INTEGRITY ERROR
 RECOV    PPWORD             NONZERO IF IN RECOVERY
 DP       STRUCT 4           DELINK POINTER (REFORMATTED RMA)

 RQ       STRUCT 40          REQUEST

 CMLIST   STRUCT 8           CURRENT DATA ADDRESS OR CURRENT COMMAND

 SS       RECEND

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

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

 PIT      RECEND
          SPACE  6
* UNIT DESCRIPTORS.

 UD       RECORD PACKED

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

 UD       RECEND
          SPACE  6
* UNIT INTERFACE TABLE

 UIT      RECORD PACKED

 LU       PPWORD             LOGICAL UNIT
 DSABLE   BOOLEAN            UNIT IS ENABLED/DISABLED. (SET = DISABLED)
          ALIGN  32,64
 UTYPE    PPWORD             UNIT TYPE
                               = 400B, 844-4X
                               = 401B, 885-1X
                               = 402B, 885-42
 QCNT     PPWORD             QUEUE COUNT
*
 SHARE    BOOLEAN            NONZERO IF THIS UNIT IS BEING SHARED WITH MALET OR DFT
 RONLY    BOOLEAN            NONZERO IF THIS UNIT IS A READ-ONLY DEVICE
          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  RONLY
 K.RONLY  EQU    MSK

 UIT      RECEND
          SPACE  6
* PP REQUESTS.

 RQ       RECORD PACKED

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


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

 RQ       RECEND
          SPACE  6
* PP COMMAND.

 CM       RECORD PACKED

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

 RS       RECORD PACKED

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

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

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

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

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

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

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

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

 RS       RECEND


 CM       RECEND
          SPACE  6
* COMMAND CODES.

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

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

 CB       RECORD PACKED

          ALIGN  31,64
 SLAVE    BOOLEAN            NONZERO IF SLAVE PP
 PARTNR   RMA                PARTNERS COMMUNICATION BUFER (RMA)

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

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

* DIRECT CELLS

 CM.PIT   BSSZ   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

 CHAN     BSSZ   1           CHANNEL NUMBER
 STATUS   BSSZ   1           IPI CHANNEL STATUS
 CMNDS    BSSZ   1           NUMBER OF OUTSTANDING COMMANDS
 CMOD     BSSZ   1           CONTROL MODULE 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, 1 IF 2 COMMANDS ISSUED TO
                              THE CONTROL MODULE
 WDS      BSSZ   1           NUMBER OF CM WORDS TO TRANSFER FROM CURRENT SECTOR.
 SBS      BSSZ   1           SECTORS TO TRANSFER BEFORE SUSPENDING
 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   2           TOTAL BYTES TO TRANSFER
 UNUML    BSSZ   1           LENGTH OF CONFIGURED UNIT ENTRIES
 .U       IFNE   UNIX,1
 IDLE     BSSZ   1           NONZERO IF IDLE COMMAND RECEIVED,
                              RESUME COMMAND RESETS IT TO 0
 .U       ENDIF
 MALET    BSSZ   1           NONZERO IF MAINTENANCE SOFTWARE WANTS
                              THE CHANNEL
 TBC      BSSZ   1           NONZERO IF TRANSFER RESPONSE RECEIVED BEFORE
                              COMPLETION RESPONSE
 CLF      DATA   1           CHANNEL LOCK FLAG, 0 IF LOCK 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           DEVICE TYPE, O = 9836, 1 = 9853 2 = EMD5
 RONLY    BSSZ   1           NONZERO IF A READ-ONLY DEVICE
 .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
 .K       IFEQ   KH,1
 HBP      DATA   0           HISTORY BUFFER POINTER
 .K       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)
 PPNO     CON    1           LOGICAL PP NUMBER
 PTF      BSSZ   1           IF 0 EXECUTE PATH TEST
 IF       BSSZ   1           INITIALIZATION FLAG
          BSS    100B-*
          LJM    MAIN
          DATA   7           IPI/930 DISK DRIVER (FOR ANAD PROC)
 HANG     CON    0           AN EASY WAY TO SEE CERTAIN HANGS
          UJN    *
          SPACE  2
* THE FOLLOWING CM ADDRESSES ARE SET DURING INITIALIZATION
                              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
*
*         LOCATION DT IS THE INDEX TO THIS DRIVE TABLE
*
 CTC      DATA   701         CONFIDENCE TEST CYLINDER, 9836
          DATA   1410        CONFIDENCE TEST CYLINDER, 9853
          DATA   1625        CONFIDENCE TEST CYLINDER, EMD5
 TPC      DATA   24          TRACKS PER CYLINDER, 9836
          DATA   19          TRACKS PER CYLINDER, 9853
          DATA   15          TRACKS PER CYLINDER, EMD5
 SPT      DATA   12          SECTORS PER TRACK, 9836
          DATA   21          SECTORS PER TRACK, 9853
          DATA   21          SECTORS PER TRACK, EMD5
 SPC      CON    24*12       SECTORS PER CYLINDER, 9836
          CON    19*21       SECTORS PER CYLINDER, 9853
          CON    15*21       SECTORS PER CYLINDER, EMD5
 MN       DATA   0#4653      FIRST 2 CHARACTERS OF MODEL NAME -FS -
          DATA   0#584D      FIRST 2 CHARACTERS OF MODEL NAME -XM -
          DATA   0#454D      FIRST 2 CHARACTERS OF MODEL NAME -EM -

 FIP      DATA   0           FORMAT IN PROGRESS FLAG
 .F       IFEQ   FE,1
          BSS    60          FOR PATCHES DURING CHECKOUT
 .F       ENDIF
          TITLE  MAIN LOOP
** NAME-- MAIN
*
** PURPOSE-- MAIN IDLE LOOP.  LOOK FOR REQUESTS FROM CENTRAL MEMORY
*            AND LOOK FOR INTERRUPTS FROM THE CONTROLLERS.
*
** ENTRY
*         MAIN - AFTER DRIVER IS LOADED
*         MAIN5 - WHEN THE PP IS RESUMED
*         MAIN10 - TO RUN DIAGNOSTICS DURING ERROR RECOVERY
*         MAIN15 - AFTER SEEK, WRITE, OR READ COMMAND STARTED
*         MAIN20 - WHEN A WRITE OR READ COMMMAND COMPLETES
          SPACE  2
 MAIN     BSS
          REFAD  DSRTP,CM.PIT REFORMAT ADDRESS OF PP INTERFACE TABLE
                               AND SAVE IN CM.PIT
 MAIN5    BSS
          RJM    INIT        INITIALIZATION
 MAIN10   BSS
          RJM    PT          PATH TEST
 MAIN15   BSS
 .F       IFEQ   FE,1        FORCE ERROR IN RUNNING PP DRIVER
          RJM    FER         FORCE ERROR ROUTINE
 .F       ENDIF
          RJM    EI          ENABLE INTERRUPTS
          RJM    PPRQ        CHECK FOR ANY PP REQUESTS
          RJM    GETUD       SELECT UNIT REQUESTS, SEEK,
                             AND PROCESS INTERRUPTS
          LDDL   CMNDS
          NJK    MAIN15      IF OUTSTANDING COMMANDS
 MAIN20   BSS
          SOML   CHLCNT
          NJN    MAIN15      IF PP DOESN'T HAVE TO GIVE UP CHANNEL
          LDML   FIP
          NJN    MAIN15      IF FORMAT IN PROGRESS
          RJM    CKC         CHECK IF CHANNEL MUST BE GIVEN UP
          UJK    MAIN15
          SPACE  5,12
 UCMD     BSS                COMMANDS FROM CENTRAL MEMORY
          CON    C.READ
          CON    C.WRITE
          CON    C.IDLE
          CON    C.RESUME
          CON    C.FORMAT
 UCMDL    EQU    *-UCMD
          TITLE  COMMANDS
** NAME-- READ
*
** PURPOSE-- PROCESS READ DATA COMMAND.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST  = LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                    CM DATA AREA.
          SPACE  2
 READX    LJM    **
 READ     EQU    *-1
 READ20   BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES LEFT TO TRANSFER
          SHN    -3
          STDL   WDS         CM WORDS LEFT TO TRANSFER
          ADC    -WPS        CM WORDS PER SECTOR
          ADDL   SECPOS      WORDS PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    READ30      IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          LDC    WPS         COMPUTE NUMBER OF CM WORDS TO TRANSFER THIS LOOP
          SBDL   SECPOS
          STDL   WDS         NUMBER OF CM WORDS TO TRANSFER TO CURRENT SECTOR
 READ30   BSS
          LDDL   WDS
          SHN    2
          STDL   WC          PP WORDS TO TRANSFER
          LDDL   SECPOS
          NJN    READ36      IF BUS CONTROL ALREADY DONE
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
 READ32   EQU    *-1         FOR FORCING ERRORS
          LDC    H0A81       STREAM, READ, DMA
          RJM    FUNC        RAISE MASTER OUT
 READ34   EQU    *-1         FOR FORCING ERRORS
          ACN    DC
 READ36   BSS
          LOADF  CMLIST+/CM/P.RMA,CSST CM ADDRESS OF DATA AREA
          CHCM   WC,DC       TRANSFER DATA
          LDDL   WC
          NJN    READ55      IF NOT ALL WORDS TRANSFERRED
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          ADC    -WPS        CHECK FOR END OF SECTOR
          ZJN    READ55      IF END OF SECTOR
          LDML   /SS/P.LISTL,CSST CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          NJK    READ120     IF MORE CM DATA TO TRANSFER
          LDC    WPS         CM WORDS PER SECTOR
          SBDL   SECPOS
          SHN    2
          STDL   WC          PP WORDS TO TRANSFER
          LOADC  CM.CB
          CHCM   WC,DC       MUST TRANSFER A FULL SECTOR
 READ55   BSS
          LDC    MS50
 READ60   BSS
          IJM    READ64,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    READ60      IF TIMEOUT NOT EXPIRED
          RJM    CSI         CHECK SLAVE IN
 READ64   BSS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJK    READ20      IF MORE TO TRANSFER
          LJM    READX
 READ120  BSS
          RJM    RNL         READ NEXT LIST
          LJM    READ20
          EJECT
** NAME-- WRITE
*
** PURPOSE-- PROCESS THE WRITE DATA COMMAND.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST = LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                   CM DATA AREA.
          SPACE  2
 WRIX     LJM    **
 WRITE    EQU    *-1
 WRI20    BSS
          LDML   CMLIST+/CM/P.LEN,CSST NUMBER OF BYTES LEFT TO TRANSFER
          SHN    -3
          STDL   WDS         CM WORDS LEFT TO TRANSFER
          ADC    -WPS        CM WORDS PER SECTOR
          ADDL   SECPOS      WORDS PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    WRI30       IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          LDC    WPS         COMPUTE NUMBER OF CM WORDS TO TRANSFER THIS LOOP
          SBDL   SECPOS
          STDL   WDS         NUMBER OF CM WORDS TO TRANSFER TO CURRENT SECTOR
 WRI30    BSS
          LDDL   WDS
          SHN    2
          STDL   WC          PP WORDS TO TRANSFER
          LDDL   SECPOS
          NJN    WRI36       IF BUS CONTROL ALREADY DONE
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
 WRI32    EQU    *-1         FOR FORCING ERRORS
          LDC    H0381       STREAM, WRITE, DMA
          RJM    FUNC        RAISE MASTER OUT
 WRI34    EQU    *-1         FOR FORCING ERRORS
          ACN    DC
 WRI36    BSS
          LOADF  CMLIST+/CM/P.RMA,CSST CM ADDRESS OF DATA AREA
          CMCH   WC,DC       TRANSFER DATA
          LDDL   WC
          NJN    WRI55       IF NOT ALL WORDS TRANSFERRED
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          ADC    -WPS        CHECK FOR END OF SECTOR
          ZJN    WRI55       IF END OF SECTOR
          LDML   /SS/P.LISTL,CSST CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          NJK    WRI120      IF MORE CM DATA TO TRANSFER
          LDC    WPS         CM WORDS PER SECTOR
          SBDL   SECPOS
          SHN    2
          STDL   WC          PP WORDS TO TRANSFER
          LOADC  CM.CB
          CMCH   WC,DC       MUST TRANSFER A FULL SECTOR
 WRI55    BSS
          LDC    MS50
 WRI60    BSS
          IJM    WRI64,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    WRI60       IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 WRI64    BSS
          RJM    CRS         CHECK FOR REQUEST SWITCH
          NJK    WRI20       IF MORE TO TRANSFER
          LJM    MAIN15
 WRI120   BSS
          RJM    RNL         READ NEXT LIST
          LJM    WRI20
          TITLE  COMMAND SUBROUTINES
** 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
 BPTB4    BSS
          LCN    0           PATTERN IS FFFF, 0000, AAAA, 5555,
          STML   OB,T1        FEFD REPEATED 10 TIMES
          LDN    0
          STML   OB+1,T1
          LDC    0#AAAA
          STML   OB+2,T1
          SHN    -1
          STML   OB+3,T1
          LDC    0#FEFD
          STML   OB+4,T1
          LDN    5
          RADL   T1
          SODL   T2
          ZJN    BPTBX       IF DONE
          UJN    BPTB4
          SPACE  5,20
** NAME-- CBC
*
** PURPOSE-- COMPUTE BYTE COUNT TO TRANSFER
          SPACE  2
 CBCX     BSS
          LDML   SPT,DT      SECTORS PER TRACK
          SBML   /SS/P.CURSEC,CSST
          RADL   TOTAL+1
          STML   STT,CSST    SECTORS TO TRANSFER
          SHN    -5
          STDL   TOTAL       UPPER 16 BITS OF BYTE COUNT
          LDDL   TOTAL+1
          LPN    37B
          SHN    11
          STDL   TOTAL+1     LOWER 16 BITS OF BYTE COUNT
          LJM    **
 CBC      EQU    *-1
          LDML   /SS/P.CURTRK,CSST
          STDL   T1          TRACK
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          STML   CP+FCP+4    TRACK, SECTOR FOR COMMAND PACKET
          LDML   CTC,DT      CONFIDENCE TEST CYLINDER
          STML   CP+FCP+3    CYLINDER FOR COMMAND PACKET
          LDN    0
          STDL   TOTAL+1
          STML   CP+FCP+1    UPPER WORD OF SECTOR COUNT
          STML   /SS/MT,CSST NO MASTER TERMINATE
 CBC10    BSS
          AODL   T1
          LMML   TPC,DT      TRACKS PER CYLINDER
          ZJK    CBCX        IF LAST TRACK
          LDML   SPT,DT      SECTORS PER TRACK
          RADL   TOTAL+1
          UJN    CBC10
          SPACE  5,20
** NAME-- CCLOCK
*
** PURPOSE-- CLEARS CHANNEL LOCK.
          SPACE  2
 CCLX     LJM    **
 CCLOCK   EQU    *-1
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          STDL   CLF         CHANNEL LOCK FLAG
          LDDL   CHAN        CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD
          UJK    CCLX
          SPACE  5,20
** NAME-- CDT
*
** PURPOSE-- CHECK DRIVE TYPE
          SPACE  2
 CDTX     LJM    **
 CDT      EQU    *-1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#200
          STML   CP+OPCD     ATTRIBUTE COMMAND
          LDC    0#36C
          STML   CP+FCP      PARAMETER TO READ DRIVE TYPE
          LDC    0#4050
          STML   CP+FCP+1    RETURN DRIVE TYPE IN RESPONSE
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    CDT10       IF NOT SUCCESSFUL
          LDC    ID50
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    CDT10       IF ID 50 NOT FOUND
          LDML   RPB+30,T3
          LMML   MN,DT
          ZJK    CDTX        IF CORRECT DRIVE TYPE
          LDK    E121        WRONG DRIVE TYPE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ENDIF
          RJM    HANG        (NO RETURN)
 CDT10    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- CD
*
** PURPOSE-- CHECK DRIVE.  IF COMMAND IS FORMAT GO TO FORMAT ROUTINE
*            ELSE ASSUME THAT CONFIDENCE IS TO BE RUN. ENSURE THAT DRIVE
*            IS FORMATTED BEFORE STARTING THE CONFIDENCE TEST. IF DRIVE
*            IS NOT FORMATTED CHECK IF REQUEST IS A READ OF THE LABEL
*            AREA AND IF SO RETURN WITHOUT DOWNING THE DRIVE. THIS CHECK IS
*            NEEDED BECAUSE NOS/VE ALWAYS ATTEMPTS TO READ THE LABEL EVEN
*            WHEN ATTEMPTING TO FORMAT THE DRIVE.
*
** ENTRY-- FROM GETU IF A REQUEST IS PRESENT AND THE CONFIDENCE TEST
*          HAS NOT BEEN RUN FOR A UNIT AFTER THE PP WAS LOADED OR WHEN A
*          FORMAT COMMAND HAS BEEN ISSUED TO THE UNIT.
*
          SPACE  2
 CDX      LJM    **
 CD       EQU    *-1
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    CD05        IF NOT FORMAT COMMAND
          LDML   UNITS,UX
          LPC    0#1FFF
          STML   UNITS,UX    CLEAR COMMAND IN PROGRESS BITS
          LDN    1
          STML   /SS/P.CT,CSST  DISABLE RUNNING CONFIDENCE TEST

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

 CD05     LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    CD10        IF RUNNING CONFIDENCE TEST TO ISOLATE TO MEDIA ERROR
          LDML   /SS/P.RQTRY,CSST  RETRY COUNT
          LMN    1
          NJN    CD20        IF NOT FIRST ERROR RETRY
 CD10     BSS
          RJM    DPR         DRIVE POWER ON RESET
 CD20     LDML   /SS/P.DT,CSST
          SHN    -4
          LPN    3
          STDL   DT          DEVICE TYPE
          RJM    RMR         READ MICROCODE REVISION
          RJM    DUSC        DISABLE USAGE STATISTIC COUNTING
          RJM    RD          RESERVE DRIVE
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    CD25        IF NOT FORMAT COMMAND
          STDL   IF          CLEAR INITIALIZATION FLAG
          RJM    IU          INITIALIZE UNIT
          LDN    1           ENABLE CT BYPASS
          UJN    CD27
 CD25     RJM    IUF         IS UNIT FORMATTED
          NJN    CD30        UNIT IS NOT FORMATTED
 CD27     UJK    CDX
 CD30     BSS
          LDML   /SS/P.FNC,CSST
          NJN    CD50        IF NOT READ COMMAND
          LDML   RQ+/RQ/P.CYL,CSST
          NJN    CD50        IF NOT CYLINDER WITH LABEL
          LDML   RQ+/RQ/P.TRACK,CSST
          SBN    2
          PJN    CD50        IF NOT TRACK WITH LABEL
          LDN    1
          STDL   CMNDS       SO DCR ROUTINE LEAVES CMNDS EQUAL TO 0
          LDC    E141        ERROR CODE (141)
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LJM    EPF10       SEND ABNORMAL RESPONSE (NO RETURN)
 CD50     BSS
          LDC    E141        ERROR CODE (141)
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- CFME
*
** PURPOSE-- CHECK FOR MEDIA ERROR
*
** EXIT--  A = 0 IF MEDIA ERROR AND FAILING ADDRESS IS PRESENT
          SPACE  2
 CFME20   BSS
          LDN    1           INDICATE MEDIA ERROR NOT FOUND
 CFMEX    LJM    **
 CFME     EQU    *-1
          LDML   RS+/RS/P.ERRID
          NJN    CFMEX       IF NOT MEDIA ERROR
          LDK    ID26        DRIVE MACHINE EXCEPTION
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    CFMEX       IF ID26 NOT FOUND
          LDML   RPB+5,T3
          SHN    -8
          SBN    11
          MJN    CFME20      IF NO EXTENDED SUBSTATUS
          LDML   RPB+10,T3   COMMAND ENDING STATUS
          STDL   T5
          LPN    77B
          SBN    0#11
          ZJN    CFME10      IF ECC ERROR
          SBN    2
          ZJN    CFME10      IF MISSING SYNC
          SBN    6
          NJN    CFMEX       IF NOT SECTOR NOT FOUND
 CFME10   BSS
          LDK    ID32        RESPONSE EXTENT PARAMETER
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    CFMEX       IF PARAMETER 32 NOT FOUND
          LDN    0           INDICATE MEDIA ERROR FOUND
          UJN    CFMEX
          SPACE  5,20
** NAME-- CHGCH
*
** PURPOSE-- SET CHANNEL NUMBER IN CHANNEL INSTRUCTIONS
*
** INPUT-- CHAN = CHANNEL NUMBER
          SPACE  2
 CHGX     LJM    **
 CHGCH    EQU    *-1
          LDN    0
          STDL   T1          CHANGE DISK CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGX        END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   CHAN        CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CHG10
          SPACE  5,20
** NAME-- CKC
*
** PURPOSE-- CHECK IF MAINTENANCE PP WANTS THE CHANNEL.
          SPACE  2
 CKC100   BSS
          STDL   PTF         ENABLE RUNNING PATH TEST
          RJM    PT          PATH TEST
 CKCX     LJM    **
 CKC      EQU    *-1
          LDN    C.CHCNT     NUMBER OF REQUESTS TO PROCESS BEFORE
          STML   CHLCNT       GIVING UP THE CHANNEL
          LOADC  CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          ADDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          CRDL   T1          READ CHANNEL LOCKWORD
          LDDL   T2
          LPN    1
          ZJK    CKCX        IF MAINTENANCE PP DOES NOT WANT THE CHANNEL
          LDDL   UNUML
          ZJK    CKCX        IF NO UNITS
          RJM    CUB         CHECK UNIT BUSY
          STDL   MALET       SETTING MALET NONZERO PREVENTS STARTING
                              NEW DISK REQUESTS
          NJN    CKCX        IF OUTSTANDING COMMANDS
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          PAUSE  130000      DELAY 130 MILLISECONDS TO ALLOW
                             MAINTENANCE PP TO GET THE CHANNEL
          RJM    SCLOCK      SET CHANNEL LOCK
          LDN    0
          STDL   UX
          UJN    CKC20
 CKC10    BSS
          LDN    P.UN
          RADL   UX          UPDATE TO NEXT UNIT TABLE
 CKC20    BSS
          SBDL   UNUML
          ZJK    CKC100      IF ALL RESERVE BITS CLEARED
          LDML   UNITS,UX
          LPC    0#07FF
          STML   UNITS,UX
          UJN    CKC10
 CHLCNT   CON    C.CHCNT     NUMBER OF REQUESTS TO PROCESS BEFORE
                              GIVING UP THE CHANNEL
          SPACE  5,20
** NAME-- CLOCK
*
** PURPOSE-- CLEAR LOCKWORD
*
*  ENTRY
*         T7 = POINTER RMA
*         T5 = OFFSET TO LOCKWORD FROM RMA
          SPACE  2
 CLKX     LJM    **
 CLOCK    EQU    *-1
 CLK14    BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        RMA OF TABLE
          ADDL   T5          ADD LOCKWORD OFFSET
          STDL   T6
          RDSL   T1          WRITE INTERMEDIATE VALUE
          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          ZJN    CLK14       IF ANOTHER INTERLOCK OPERATION IS IN PROGRESS
          LDDL   PPNO
          SBDL   T4
          ZJN    CLK30       IF LOCK WAS OK
          LDDL   T6
          CWDL   T1          RESTORE THE LOCKWORD
          RJM    HANG        HANG, THE LOCK WAS INCORRECT
 CLK30    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6
          CWDL   T1          CLEAR THE LOCKWORD
          UJK    CLKX
 .U       IFNE   UNIX,1
          SPACE  5,20
** NAME-- CPLOCK
*
** PURPOSE-- CLEARS THE PP QUEUE LOCK IN THE PP INTERFACE TABLE
          SPACE  2
 CPLX     LJM    **
 CPLOCK   EQU    *-1
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CPLX
 .U       ENDIF
          SPACE  5,20
** NAME-- CQLOCK
*
** PURPOSE-- CLEARS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
          SPACE  2
 CQLX     LJM    **
 CQLOCK   EQU    *-1
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.QLOCK OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CQLX
          SPACE  5,20
** NAME-- CRS
*
** PURPOSE-- CHECK FOR REQUEST SWITCH
*
** EXIT-- A NOT EQUAL 0 IF MORE TO TRANSFER
          SPACE  2
 CRSX     LJM    **
 CRS      EQU    *-1
          RJM    UBT         UPDATE BYTES TRANSFERRED
          NJK    CRS80       IF NOT END OF REQUEST
          LDML   /SS/MT,CSST
          SHN    2
          PJK    CRS50       IF NOT USING MASTER TERMINATE
          LOADF  /SS/P.REQ,CSST
          STDL   T1
          ADN    3
          CRDL   T4          READ STREAM BIT IN REQUEST
          LDDL   T4
          SHN    2
          MJN    CRS15       IF CONCATENATED REQUEST
          AOML   /SS/MT,CSST INDICATE COMMAND IS TERMINATED
          LDN    1
          STDL   SBS         FORCE DESELECT
          LDN    0#A         MASTER TERMINATE
          UJK    CRS81
 CRS15    BSS
          LDDL   CSST
          ADK    RQ
          STML   CRS20       ADDRESS TO STORE PVA, RMA
          LDN    2
          STDL   T2
          LDDL   T1
          CRML   *,T2        REREAD NEXT PVA AND RMA
 CRS20    EQU    *-1
 CRS50    BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          LDDL   WC
          NJN    CRS82       IF ERROR
          LDDL   STATUS
          SHN    -4
          LPN    3
          STDL   DELAY       SAVE DELAY BITS
          STDL   SECPOS      SECPOS = 0 IF STAYING IN READ
          RJM    UDA         UPDATE DISK ADDRESS
          LDML   /SS/P.TOTAL,CSST TOTAL CM WORDS LEFT TO TRANSFER
          ADML   /SS/P.TOTAL+1,CSST
          ZJN    CRS100      IF END OF TRANSFER
          RJM    CSWIT       SWITCH TO NEXT REQUEST
          UJN    CRS90
 CRS80    BSS
          LDN    0           NO MASTER TERMINATE
 CRS81    BSS
          RJM    GES         GET ENDING STATUS
          LDDL   WC
          ZJN    CRS85       IF ALL WORDS TRANSFERRED
 CRS82    BSS
          RJM    SRR         SHOULD RESPONSE BE READ
          UJN    CRS100      YES, EXIT AND LOOK FOR RESPONSE
 CRS85    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
 CRS90    BSS
          LDDL   DELAY
          NJN    CRS100      IF DELAY
          LDDL   SBS
          ZJN    CRS100      IF TIME TO SUSPEND DATA TRANSFER
          UJK    CRSX        IF MORE TO TRANSFER
 CRS100   BSS
          RJM    DCM         DESECLECT THE CONTROL MODULE
          LDN    0
          LJM    CRSX
          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    PCER        PREPARE COMMON ERROR RESPONSE
          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.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.  RESERVE THE DRIVE, WRITE, READ, AND
*            VERIFY DATA ON A RESERVED CYLINDER.
*
** ENTRY
*         1)  AT INITIALIZATION AFTER PP LOADED
*         2)  DURING REQUEST RECOVERY WITH /SS/P.RECOV = 1
*         3)  WHEN PP RESUMED
          SPACE  2
 CTX      LJM    **
 CT       EQU    *-1
*
*         THIS TEST PREVENTS RERUNNING THE CONFIDENCE TEST ON
*         A UNIT THAT IS DISABLED.  DURING INITIALIZATON THE PP DOES
*         NOT LOOK FOR AN IDLE COMMAND UNITL THE CONFIDENCE TEST HAS
*         BEEN RUN ON ALL UNITS.
*
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T1
          LDDL   T1+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJK    MAIN15      IF UNIT DISABLED
 .U       IFEQ   UNIX,1
          RJM    PPRQ        CHECK FOR IDLE REQUEST
 .U       ENDIF
          LDN    0
          STML   /SS/P.CURTRK,CSST STARTING TRACK
          STML   /SS/P.CURSEC,CSST STARTING SECTOR
          RJM    SFT         SET FACILITY TIMEOUT
          RJM    CDT         CHECK DRIVE TYPE
          RJM    CTDT        CONFIDENCE TEST DATA TRANSFER
          RJM    SFRR        CLEAR CIP AND TCIP
          LDN    1
          STML   /SS/P.CT,CSST INDICATE TEST COMPLETED SUCCESSFULLY
          LDML   /SS/P.RECOV,CSST
          LMN    1
          ZJN    CT50        IF CONFIDENCE TEST IS PART OF RECOVERY
          LDN    0
          STML   /SS/P.RECOV,CSST
          STML   /SS/P.RQTRY,CSST CLEAR REQUEST RETRY COUNTER
 CT50     BSS
          UJK    CTX
          SPACE  5,20
** NAME-- CTDT
*
** PURPOSE-- CONFIDENCE TEST DATA TRANSFER
          SPACE  2
 CTDTX    LJM    **
 CTDT     EQU    *-1

* GET THE READ-ONLY DEVICE FLAG.

          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ADK    /UIT/C.RONLY
          CRDL   T1
          LDDL   T1
          LPK    /UIT/K.RONLY
          STDL   RONLY       NONZERO IF READ-ONLY DEVICE

* WRITE THE CYLINDER

          LCN    0
          STML   CTME,CSST   MAKE MEDIA ERROR TABLE LOOK EMPTY
          STML   CTME+1,CSST
          STML   CTME+2,CSST
          LDN    1
          STDL   FNC         INDICATE WRITE OPERATION
          RJM    BCTB        BUILD CONFIDENCE TEST BUFFER
 CTDT5    BSS                ENTRY IF MEDIA ERROR
          LDDL   RONLY
          NJK    CTDT40      IF READ-ONLY DEVICE
          RJM    CBC         COMPUTE BYTE COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
 CTDT7    EQU    *-1         FOR FORCING ERRORS
 CTDT10   BSS
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    CTDT100     IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAOUT     DATA, INFORMATION OUT
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    WPS*4
          STDL   WC          WORDS PER SECTOR
          LDC    H0381       STREAM, WRITE, DMA
          RJM    FUNC
          ACN    DC
          LOADC  CM.CB
          ADML   SPC,DT      SECTORS PER CYLINDER
          SBML   STT,CSST    SECTORS TO TRANSFER
          CMCH   WC,DC       TRANSFER DATA
          LDC    MS50
 CTDT20   BSS
          IJM    CTDT30,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    CTDT20      IF TIMEOUT NOT EXPIRED
          LJM    CTDT110
 CTDT30   BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDDL   WC
          ZJN    CTDT35      IF ALL WORDS TRANSFERRED
          RJM    SRR         SHOULD RESPONSE BE READ
          UJK    CTDT10      YES, GO LOOK FOR INTERRUPT
 CTDT35   BSS
          RJM    UDA         UPDATE DISK ADDRESS
          SOML   STT,CSST
          NJK    CTDT10      IF MORE SECTORS TO TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          ZJK    CTDT100     IF NOT SUCCESSFUL

* READ THE CYLINDER

 CTDT40   BSS
          LDN    0
          STML   /SS/P.CURTRK,CSST STARTING TRACK
          STML   /SS/P.CURSEC,CSST STARTING SECTOR
          STDL   FNC         INDICATE READ FUNCTION
 CTDT50   BSS                ENTRY IF MEDIA ERROR
          RJM    CBC         COMPUTE BYTE COUNT TO TRANSFER
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          RJM    CPT         COMMAND PACKET TRANSFER
 CTDT60   BSS
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJK    CTDT100     IF NOT TRANSFER NOTIFICATION
          RJM    SEL         SELECT THE CONTROLLER
          LDN    DATAIN      DATA, INFORMATION IN
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    WPS*4
          STDL   WC          WORDS PER SECTOR
          LDC    H0A81       STREAM, READ, DMA
          RJM    FUNC
          ACN    DC
          LOADC  CM.CB
          CHCM   WC,DC       TRANSFER DATA
          LDC    MS50
 CTDT70   BSS
          IJM    CTDT80,DC   IF SLAVE IN DROPPED
          SBN    1
          NJN    CTDT70      IF TIMEOUT NOT EXPIRED
          RJM    CSI         CHECK SLAVE IN
 CTDT80   BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDDL   WC
          ZJN    CTDT90      IF ALL WORDS TRANSFERRED
          RJM    SRR         SHOULD RESPONSE BE READ
          UJK    CTDT60      YES, GO LOOK FOR INTERRUPT

* VERIFY THE DATA IN ONE SECTOR

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

          LOADR  UNITS+/UN/P.UIT,UX  LOAD CM ADDRESS OF UNIT INT. TABLE
          STDL   T1
          CRDL   P1          READ QUEUE COUNT
          ERRNZ  /UIT/C.QCNT
          LDDL   P1+/UIT/P.QCNT  DECREMENT QUEUE COUNT
          SBML   /SS/P.NCOMRQ,CSST NUMBER OF COMPLETED REQUESTS
          STDL   P1+/UIT/P.QCNT
          MJN    DCR10       IF INVALID QUEUE COUNT
          LDDL   T1
          CWDL   P1          WRITE QUEUE COUNT
 DCR10    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    DCR15       IF NEXT REQUEST IS NOT COMPLETED REQUEST
          LDDL   T4
          LMML   /SS/P.FCOMRQ+1,CSST
          ZJN    DCR30       IF THIS IS A COMPLETED REQUEST
 DCR15    BSS
          LDDL   T3          UPDATE DELINK POINTER TO NEXT
          STML   /SS/P.DP,CSST  REQUEST IN THE CHAIN
          ADDL   T4
          ZJN    DCR20       IF END OF REQUEST QUEUE
          LDDL   T4
          SHN    -3
          STML   /SS/P.DP+1,CSST
          UJK    DCR10
 DCR20    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    DCR10

* DELINK COMPLETED REQUESTS.

 DCR30    BSS
          LDDL   P2          CM ADDRESS OF REQUEST
          CWML   RQT,P6      PVA AND RMA OF NEXT REQUEST IN CHAIN
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    DCR35      IF NOT FORMAT COMMAND
          SODL   CMNDS      CMNDS IS SET TO 2 FOR FORMAT
          LDML   UNITS,UX
          UJK    DCR37
 DCR35    LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    DCR44       IF 2 COMMANDS ISSUED TO CONTROLLER
          SHN    -/UN/L.TCIP-2
 DCR37    LPC    0#FFF
          STML   UNITS,UX    CLEAR CIP AND DTIP
          LDML   RQT+/RQ/P.NEXT
          STML   /SS/P.REQ,CSST
          LDML   RQT+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,CSST POSSIBLE NEXT RMA
          ADML   /SS/P.REQ,CSST
          ZJN    DCR40       IF END OF QUEUE
          LDML   RQT+/RQ/P.NEXTPV
          STML   /SS/P.PVA,CSST
          LDML   RQT+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA+1,CSST
          LDML   RQT+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA+2,CSST
 DCR40    BSS
          LJM    DCR50
 DCR44    BSS
          LDML   UNITS,UX
          LPC    0#9FFF
          STML   UNITS,UX    CLEAR TCIP, DTIP

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

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

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

          LDDL   T1
          SBN    8
          MJN    DUSC30      IF MICROCODE REVISION BEFORE 8A
          LDC    0#100       ENABLE REPORTING
          UJN    DUSC40
 DUSC30   BSS
          LDN    0           DISABLE REPORTING
 DUSC40   BSS
          STML   CP+FCP+2
          STML   CP+FCP+4
          STML   CP+FCP+6
          LDC    0#2D2       ALLOW MASTER TERMINATE
          STML   CP+FCP+3
          LDC    0#2D3       SPEED UP MASTER TERMINATE
          STML   CP+FCP+5
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    DUSCX       IF SUCCESSFUL
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EFP
*
** PURPOSE-- ERROR FLAG PROCESSING
          SPACE  2
 EFP      CON    0
          LDC    H00F1       READ ERROR REGISTER
          RJM    RDRG
          SHN    2
          PJN    EFP5        IF NOT BUFFER COUNTER PARITY
          LDN    E31
          UJN    EFP35
 EFP5     BSS
          SHN    2
          PJN    EFP10       IF NOT SYNC COUNTER PARITY
          LDN    E32
          UJN    EFP35
 EFP10    BSS
          SHN    1
          PJN    EFP15       IF NOT PERIOD COUNTER PARITY
          LDN    E03
          UJN    EFP35
 EFP15    BSS
          SHN    1
          MJN    EFP18       IF PARITY ERROR ON FUNCTION
          SHN    1
          PJN    EFP20       IF NOT PARITY ERROR ON FUNCTION
 EFP18    BSS
          LDC    H0715       MOST LIKELY FUNCTION THAT TIMED OUT
          STDL   LF
          LDN    E01         FUNCTION TIMEOUT
          UJN    EFP35
 EFP20    BSS
          SHN    3
          PJN    EFP25       IF NOT LOST DATA
          LDN    E33
          UJN    EFP110
 EFP25    BSS
          SHN    1
          PJN    EFP30       IF NOT UPPER ICI PARITY
          LDN    E04
          UJN    EFP110
 EFP30    BSS
          SHN    1
          PJN    EFP40       IF NOT LOWER ICI PARITY
          LDN    E05
 EFP35    BSS
          UJN    EFP110
 EFP40    BSS
          SHN    1
          PJN    EFP45       IF NOT IPI SEQUENCE ERROR
          LDN    E24
          UJN    EFP110
 EFP45    BSS
          SHN    1
          PJN    EFP50       IF NOT UPPER IPI CHANNEL PARITY
          LDN    E25
          UJN    EFP110
 EFP50    BSS
          SHN    1
          PJN    EFP55       IF NOT LOWER IPI CHANNEL PARITY
          LDN    E26
          UJN    EFP110
 EFP55    BSS
          LDN    E06         IOU ERROR
 EFP110   BSS
          STML   RS+/RS/P.ERRID
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EP
*
** PURPOSE-- ERROR PROCESSING
          SPACE  2
 EP       CON    0
          LDML   /SS/P.RQTRY,CSST
          NJN    EP5         IF NOT FIRST ERROR FOR REQUEST
          STML   /SS/P.RECOV,CSST
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 EP5      BSS
 .U       IFEQ   UNIX,1
          RJM    PPRQ        CHECK FOR IDLE REQEST
 .U       ENDIF
          LDN    0
          STML   /SS/P.RQ,CSST  DO NOT WAIT FOR ASYNCH IN DPR
          LDML   RS+/RS/P.ERRID
          NJN    EP7         IF RESPONSE PACKET NOT APPLICABLE
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    EP7         IF PARAMETER 24 NOT FOUND
          LDML   RPB+6,T3
          SHN    3
          PJN    EP7         IF DRIVE WAS READY
          AOML   /SS/P.RQ,CSST  FLAG SAYS WAIT FOR ASYNCH IN DPR
 EP7      BSS
          LDN    0
          STDL   TBC         DO NOT EXPECT 01 ENDING STATUS
          LDML   RS+/RS/P.ERRID
          ZJN    EP20        IF PROBABLY NOT IOU ERROR
          SBN    E20
          PJN    EP20        IF PROBABLY NOT IOU ERROR
          LDML   /SS/P.RQTRY,CSST
          SBN    11
          PJN    EP10        IF RETRY LIMIT REACHED
          RJM    TAC         TERMINATE ALL COMMANDS
          RJM    RAR         RESTART ALL REQUESTS
          LJM    MAIN10
 EP10     BSS
          LDK    /RS/K.CHDN  CHANNEL DOWN
          STML   RS+/RS/P.ID
 .U       IFEQ   UNIX,1
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          RJM    OFFCH       TURN OFF ALL UNITS ON CHANNEL
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ELSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          LJM    MAIN15
 EP20     BSS
          LDML   /SS/P.RECOV,CSST INDEX TO ERROR PROCESSING PROCEDURE
          STDL   T1
          LDML   EPT,T1
          STML   EP30
          LJM    **          EXECUTE NEXT STEP IN RECOVERY PROCEDURE
 EP30     EQU    *-1

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

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

          LDC    1000
          STDL   T6          PAUSE 5 SECONDS
 EPC60    BSS
          PAUSE  5000
          RJM    PPRQ        CHECK FOR IDLE REQUEST
          SODL   T6
          NJN    EPC60       IF PAUSE NOT COMPLETE
          LDDL   T5
          ZJN    EPC70       IF CONTROLLER WAS NOT HUNG
          LDN    8           GO TO EPC70 IF ERROR
          STML   /SS/P.RECOV,CSST
          RJM    REL         READ ERROR LOG
          LDK    E52         SLAVE RESET PASSED, ERROR CODE PRESENT
          UJN    EPC80
 EPC70    BSS
          LDN    E51         SLAVE RESET PASSED
 EPC80    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    INTRS       INTERMEDIATE RESPONSE
          LDML   /SS/P.CT,CSST
          LMN    4
          ZJK    EPE40       IF CONFIDENCE TEST DETECTED A DATA
                              INTEGRITY PROBLEM
          LDN    7           INDEX TO NEXT STEP OF RECOVERY (EPD50)
          STML   /SS/P.RECOV,CSST
          RJM    DUSC        DISABLE USAGE STATISTIC COUNTING
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNT
          LJM    MAIN10
 EPC100   BSS
          LDDL   PTF
          ZJN    EPC110      IF IN PATH TEST
          LDML   RS+/RS/P.ERRID
          SBN    E20
          MJN    EPC110      IF PROBABLY NOT 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 CM3 (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
          LDDL   PTF
          NJN    EPD10       IF NOT IN INITIALIZATION CONFIDENCE TEST
          RJM    CTR         CONFIDENCE TEST RECOVERY
          LDN    2
          STML   /SS/P.CT,CSST INDICATE CONFIDENCE TEST FAILED
          UJK    EPC110
 EPD10    BSS
          LDML   /SS/P.RECOV,CSST
          LMN    3
          ZJN    EPD55       IF PATH TEST ALREADY STARTED
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNT
          LDN    3
          STML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          RJM    RAR         SETUP FOR RESTARTING ALL REQUESTS
          LDN    0
          STDL   PTF         FORCE RUNNING PATH TEST
          LJM    MAIN10
 EPD50    BSS                ENTER HERE IF ERROR AFTER SLAVE RESET
          LDDL   PTF
          NJN    EPD60       IF PATH TEST SUCCESSFUL
 EPD55    BSS
          RJM    OFFCM       TURN OFF ALL UNITS ON CM3 (NO RETURN)
 EPD60    BSS
          RJM    INTRS       INTERMEDIATE RESPONSE
          SPACE  5,20
*
* DRIVE DIAGNOSTICS
*
 EPE      BSS
          LDML   /SS/P.RECOV,CSST
          LMN    4
          ZJN    EPE50       IF DIAGNOSTIC COMMAND ALREADY ISSUED
          LDN    4           INDEX TO THIS RECOVERY PROCEDURE
          STML   /SS/P.RECOV,CSST
          AOML   /SS/P.RQTRY,CSST REQUEST RETRY COUNT
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMAND
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    PDD         PERFORM DRIVE DIAGNOSTICS
          LDML   /SS/P.CT,CSST
          LMN    4
          ZJN    EPE40       IF DATA INTEGRITY ERROR
          LDN    5
          STML   /SS/P.RECOV,CSST INDEX TO RECOVERY PROCEDURE
          LJM    MAIN10
 EPE40    BSS
          LDK    E111        CM-DRIVE DATA INTEGRITY
          STML   RS+/RS/P.ERRID RESET ERROR IDENTIFIER
 EPE50    BSS
          UJN    EPF5
          SPACE  5,20
*
* IF FINAL REQUEST RETRY FAILED
*
 EPF      BSS
          LDML   /SS/P.CT,CSST
          LMN    1
          ZJN    EPF10       IF CONFIDENCE TEST PASSED
 EPF5     BSS
          LDK    /RS/K.UDN   UNIT DOWN
          STML   RS+/RS/P.ID
 .U       IFEQ   UNIX,1
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          RJM    OFFUN       TURN OFF UNIT
 .U       IFNE   UNIX,1
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          UJN    EPF20
 EPF10    BSS
          LDC    R.ABN*0#4000 ABNORMAL TERMINATION
          STML   RS+/RS/P.RC RESPONSE CODE
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    DCR         DELINK REQUEST
 .U       IFEQ   UNIX,1
 EPF20    BSS
 .U       ENDIF
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
 .U       IFNE   UNIX,1
 EPF20    BSS
 .U       ENDIF
          LDN    6
          STML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          RJM    LIR         LOGICAL INTERFACE RESET
          SPACE  5,20
*
* ENTER HERE IF PREVIOUS LOGICAL INTERFACE RESET WORKS OR FAILS
*
 EPG      BSS
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMANDS
          LDN    0
          STDL   IF          CLEAR INITIALIZATION FLAG
          STML   /SS/P.RQTRY,CSST CLEAR RETRY COUNT
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    EPG10       IF NOT FORMAT COMMAND
          STML   FIP         CLEAR FORMAT IN PROGRESS FLAG
 EPG10    LJM    MAIN10
 .F       IFEQ   FE,1        FORCE ERROR CODE
          SPACE  5,20
** NAME-- FER
*
** PURPOSE-- FORCE ERROR ROUTINE.  THE ERROR CAN BE FORCED BY CHANGING
*            CENTRAL MEMORY WORD 8.  SOME ROUTINES REQUIRE THE UNIT
*            NUMBER TO BE IN CENTRAL MEMORY WORD 9.
          SPACE  2
 FERX     LJM    **
 FER      EQU    *-1
          LDN    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
          LDDL   P1
          ADN    1
          CRDL   P2
          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
*            8 = XX01 YYYY
*            9 = CCDD
*                X = SECTORS TO READ BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERA     BSS
          LDC    FERA10
          UJN    FERB5
 FERA10   CON    0
          STDL   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
*            8 = XX02 YYYY
*            9 = CCDD
*                X = SECTORS TO READ BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERB     BSS
          LDC    FERB10
 FERB5    BSS
          STML   READ34
          LJM    MAIN10
 FERB10   CON    0
          STDL   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   READ34      RESTORE FUNCTION
 FERB20   BSS
          LDDL   T1
          RJM    FUNC        SEND FUNCTION
          LJM    READ34+1    RETURN TO READ ROUTINE
          SPACE  5,20
** NAME-- FERC
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR ON WRITE
*            8 = XX03 YYYY
*            9 = CCDD
*                X = SECTORS TO WRITE BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERC     BSS
          LDC    FERC10
          UJN    FERD5
 FERC10   CON    0
          STDL   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
*            8 = XX04 YYYY
*            9 = CCDD
*                X = SECTORS TO WRITE BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERD     BSS
          LDC    FERD10
 FERD5    BSS
          STML   WRI34
          LJM    MAIN10
 FERD10   CON    0
          STDL   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   WRI34       RESTORE THE INSTRUCTION
 FERD20   BSS
          LDDL   T1
          RJM    FUNC        SEND FUNCTION
          LJM    WRI34+1     RETURN TO WRITE ROUTINE
          SPACE  5,20
** NAME-- FERE
*
** PURPOSE-- READ ONE TOO MANY WORDS
*            8 = 0005
          SPACE  2
 FERE     BSS
          LDC    FERE10
          UJN    FERF5
 FERE10   CON    0
          AODL   WC
          UJN    FERF15
          SPACE  5,20
** NAME-- FERF
*
** PURPOSE-- READ ONE TOO FEW WORDS
*            8 = 0006
          SPACE  2
 FERF     BSS
          LDC    FERF10
 FERF5    BSS
          STML   READ32
          LJM    MAIN10
 FERF10   CON    0
          SODL   WC
 FERF15   BSS
          LDC    BCS         RESTORE INSTRUCTION
          STML   READ32
          LJM    READ32-2
          SPACE  5,20
** NAME-- FERG
*
** PURPOSE-- WRITE ONE TOO MANY WORDS
*            8 = 0007
          SPACE  2
 FERG     BSS
          LDC    FERG10
          UJN    FERH5
 FERG10   CON    0
          AODL   WC
          AODL   WC          *TEMP UNTIL ADAPTER FIXED
          UJN    FERH15
          SPACE  5,20
** NAME-- FERH
*
** PURPOSE-- WRITE ONE TOO FEW WORDS
*            8 = 0008
          SPACE  2
 FERH     BSS
          LDC    FERH10
 FERH5    BSS
          STML   WRI32
          LJM    MAIN10
 FERH10   CON    0
          SODL   WC
 FERH15   BSS
          LDC    BCS
          STML   WRI32       RESTORE INSTRUCTION
          LJM    WRI32-2
          SPACE  5,20
** NAME-- FERI
*
** PURPOSE-- FORCE IPI PARITY ERROR ON INPUT DURING READ
*            8 = 0009
          SPACE  2
 FERI     BSS
          LDC    FERI10
          STML   READ34
          LJM    MAIN10
 FERI10   CON    0
          LDC    FUNC
          STML   READ34      RESTORE MODIFIED INSTRUCTION
          LDC    H0322
          RJM    FUNC        FORCE BUS A INPUT PARITY ERROR
          LJM    READ34-3
          SPACE  5,20
** NAME-- FERJ
*
** PURPOSE-- FORCE IPI PARITY ERROR ON OUTPUT DURING WRITE
*            8 = 000A
          SPACE  2
 FERJ     BSS
          LDC    FERJ10
          STML   WRI34
          LJM    MAIN10
 FERJ10   CON    0
          LDC    FUNC
          STML   WRI34       RESTORE MODIFIED INSTRUCTION
          LDC    H0122
          RJM    FUNC        FORCE BUS A OUTPUT PARITY ERROR
          LJM    WRI34-3
          SPACE  5,20
** NAME-- FERK
*
** PURPOSE-- SPIN DOWN UNIT TO FORCE NOT READY ERROR
*            8 = 000B CCDD
*                C = CONTROLLER NUMBER
*                D = DRIVE NUMBER
*         THIS SHOULD ONLY BE USED WHEN THERE ARE NO OUTSTANDING
*         COMMANDS FOR THE CM3.
          SPACE  2
 FERK     BSS
          LDN    0#A
          STML   CP          PACKET LENGTH
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDC    H0700       SET OPERATING MODE COMMAND
          STML   CP+OPCD     OPERATION
          LDDL   FEND
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          STML   RPB+SLAD
          SHN    -8
          STDL   CMOD        CONTROLLER NUMBER
          LDC    0#351       DISC MODES
          STML   CP+FCP
          LDC    0#4000
          STML   CP+FCP+1    SPIN DOWN UNIT
          RJM    DARH        THIS FINDS UX AND CSST
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    MAIN10      IF SUCCESSFUL
          LDN    E00
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSOR (NO RETURN)
          SPACE  5,20
** NAME-- FERM
*
** PURPOSE-- CHANGE CYLINDER NUMBER TO ILLEGAL VALUE
*            TO FORCE AN ERROR ON WRITE OR READ
*            8 = XX0D YYYY
*            9 = CCDD
*                X = COMMANDS TO SEND BEFORE FORCING FIRST ERROR
*                Y + 1 = TIMES TO FORCE THE ERROR
*                CC = CM3 NUMBER
*                DD = DRIVE NUMBER
          SPACE  2
 FERM     BSS
          LDC    FERM10
          STML   SEEK20
          LJM    MAIN10
 FERM10   CON
          LDDL   FEUN
          LMML   /SS/P.UNIT,CSST
          NJN    FERM20      IF WRONG DRIVE
          SODL   FEST
          PJN    FERM20      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+3    ILLEGAL CYLINDER NUMBER
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERM20      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   SEEK20      RESTORE INSTRUCTION
 FERM20   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    SEEK20+1    RETURN TO SEEK ROUTINE
          SPACE  5,20
** NAME-- FERN
*
** PURPOSE-- FORCE LOWER ICI PARITY ERROR IN PATH TEST
*            8 = XX0E YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERN     BSS
          LDC    FERN10
          UJN    FERP5
 FERN10   CON    0
          SODL   FEST
          PJN    FERP20      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERP30
          SPACE  5,20
** NAME-- FERO
*
** PURPOSE-- DISABLE THE CONTROLLERS RECEIVERS TO PREVENT SELECTING
*            DURING THE PATH TEST
*            8 = XX0F YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERO     BSS
          LDC    FERO10
          UJN    FERP5
 FERO10   CON    0
          SODL   FEST
          PJN    FERP20      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
          UJN    FERP30
          SPACE  5,20
** NAME--FERP
*
** PURPOSE-- FORCE COMMAND EXCEPTION DURING THE PATH TEST
*            BY SENDING AN ILLEGAL BYTE COUNT
*            8 = XX10 YYYY
*                X = TIMES TO RUN PATH TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERP     BSS
          LDC    FERP10
 FERP5    BSS
          STML   PT40
          LJM    MAIN10
 FERP10   CON    0
          SODL   FEST
 FERP20   BSS
          PJN    FERP40      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+1    ILLEGAL 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
*            8 = XX11 YYYY
*                X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERQ     BSS
          LDC    FERQ10
          UJN    FERS5
 FERQ10   CON    0
          SODL   FEST
          PJN    FERS20      IF NOT TIME TO FORCE ERROR
          LDC    H0C22       FORCE LOWER ICI PARITY ERROR
          RJM    FUNC        SEND THE FUNCTION
          UJN    FERS30
          SPACE  5,20
** NAME-- FERR
*
** PURPOSE-- DISABLE THE CONTROLLERS RECEIVERS TO PREVENT SELECTING
*            DURING THE CONFIDENCE TEST
*            8 = XX12 YYYY
*                X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*                Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERR     BSS
          LDC    FERR10
          UJN    FERS5
 FERR10   CON    0
          SODL   FEST
          PJN    FERS20      IF NOT TIME TO FORCE ERROR
          RJM    MR          MASTER RESET
          UJN    FERS30
          SPACE  5,20
** NAME--FERS
*
** PURPOSE-- FORCE COMMAND EXCEPTION DURING THE CONFIDENCE TEST
*            BY SENDING AN ILLEGAL CYLINDER NUMBER
*            8 = XX13 YYYY
*              X = TIMES TO RUN CONFIDENCE TEST BEFORE FORCING FIRST ERROR
*              Y + 1 = NUMBER OF TIMES TO FORCE THE ERROR
          SPACE  2
 FERS     BSS
          LDC    FERS10
 FERS5    BSS
          STML   CTDT7
          LJM    MAIN10
 FERS10   CON    0
          SODL   FEST
 FERS20   BSS
          PJN    FERS40      IF NOT TIME TO FORCE ERROR
          LCN    0
          STML   CP+FCP+3    ILLEGAL CYLINDER NUMBER
 FERS30   BSS
          LDN    0
          STDL   FEST        TO CONTINUE FORCING ERROR
          SODL   FEND
          PJN    FERS40      IF NOT TIME TO RESTORE INSTRUCTION
          LDC    CPT
          STML   CTDT7       RESTORE INSTRUCTION
 FERS40   BSS
          RJM    CPT         COMMAND PACKET TRANSFER
          LJM    CTDT7+1     RETURN TO CONFIDENCE TEST
          SPACE  5,20
** NAME-- FERT
*
** PURPOSE-- CHANGE ONE MEMORY LOCATION
*            8 = 0014
*            9 = 0000 0000 XXXX YYYY
*              X = ADDRESS
*              Y = VALUE
          SPACE  2
 FERT     BSS
          LDDL   P5
          STIL   P4
          LJM    MAIN20
 .F       ENDIF
          SPACE  5,20
** NAME-- FU
*
** PURPOSE-- FORMAT UNIT
          SPACE  2
 FUX      LJM    **
 FU       EQU    *-1
          LDN    E57         FORMATTING DRIVE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   /SS/P.UNIT,CSST
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          LDN    0
          STML   RS+/RS/P.SCYL  STARTING CYLINDER
          STML   RS+/RS/P.FTRK  SO TRACK, SECTOR WILL BE 0 IN CRITICAL WINDOW
          STML   RS+/RS/P.FSEC
          RJM    INTRS       SEND INTERMEDIATE RESPONSE

*         FORMAT THE UNIT

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

 GETR30   BSS
          LDDL   P6
          STDL   CSST        RESTORE POINTER TO SS TABLE
          LDDL   CNUM
          ZJN    GETR40      IF FIRST COMMAND FOR UNIT
          LDDL   TOTAL+1
          SHN    -3
          STML   /SS/P.TW2+1,CSST TOTAL CM WORDS TO TRANSFER
          LDDL   TOTAL
          LPN    7
          SHN    13
          RAML   /SS/P.TW2+1,CSST
          LDDL   TOTAL
          SHN    -3
          STML   /SS/P.TW2,CSST
          UJN    GETR50
 GETR40   BSS
          LDDL   TOTAL+1
          SHN    -3
          STML   /SS/P.TOTAL+1,CSST TOTAL CM WORDS TO TRANSFER
          LDDL   TOTAL
          LPN    7
          SHN    13
          RAML   /SS/P.TOTAL+1,CSST
          LDDL   TOTAL
          SHN    -3
          STML   /SS/P.TOTAL,CSST
 GETR45   BSS
          RJM    UREQ        READ UNIT REQUEST FROM CM
          RJM    SRESP       SET UP STATUS FOR RESPONSE BUFFER
          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    UNCMND      GET FIRST COMMAND
 GETR50   BSS
          UJK    GETRX
          SPACE  5,20
** NAME-- GETUD
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL, ISSUE ALL
*            SEEKS, AND PROCESS INTERRUPTS FROM THE CM3
          SPACE  2
 GETUDX   LJM    **
 GETUD    EQU    *-1
          LDDL   UNUML
          ZJN    GETUDX      IF NO UNITS
          RJM    UC          UPDATE CLOCK
          PAUSE  6           ALLOW CM3 TIME TO PUT ITS ADDRESS
                             ON THE BUS IF IT HAS AN INTERRUPT
          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
          LDDL   LUX         UNIT INDEX OF LAST REQUEST FOUND + 1
          STDL   P6
 GETU10   BSS
          LDDL   LUX
          STDL   UX
          LDN    P.UN
          RADL   LUX         BUMP UNIT ENTRY
          SBDL   UNUML
          MJN    GETU20      IF NOT END OF TABLE
          STDL   LUX
 GETU20   BSS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    7
          STDL   CMOD        SAVE CONTROL MODULE NUMBER
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          PJK    GETU38      IF NO COMMAND IN PROGRESS
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO CURRENT SS TABLE
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          ZJN    GETU22      IF NO INTERRUPT FOR THIS CONTROL MODULE
          RJM    PI          PROCESS INTERRUPT (NO RETURN)
 GETU22   LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    GETU24      IF TWO COMMANDS IN PROGRESS
          SHN    /UN/L.DTIP-/UN/L.TCIP
          MJK    GETU34      IF SECOND COMMAND CAN BE ISSUED
          ERRMI  /UN/L.DTIP-/UN/L.TCIP-1 IF PREVIOUS SHIFT INCORRECT
          LDDL   IF
          NJK    GETU34      ISSUE SECOND COMMAND IF INITIALIZATION
 GETU24   BSS
          LDML   /SS/P.FNC,CSST
          SBN    4
          ZJN    GETU27      IF FORMAT COMMAND
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU25      IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU25   SBN    32          30 TO 31 SECOND TIMEOUT
          PJK    GETU100     IF TIMEOUT
          UJK    GETU30
 GETU27   LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU28      IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU28   ADC    -FDT        9000 SECOND TIMEOUT VALUE
          PJK    GETU100     IF TIMEOUT

* GO TO NEXT UNIT ENTRY.

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

* DETERIMINE IF DRIVE TESTING REQUIRED

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

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

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

* PROCESS COMMAND FOR UNIT

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

* TIMEOUT PROCESSING

 GETU100  BSS
          LDML   /SS/P.RESET,CSST
          ZJN    GETU120     IF RESET NOT ISSUED
          LPN    1
          ZJN    GETU104     IF ASYNCH FOR DRIVE EXPECTED
          LDML   EPCT,CMOD
          STDL   UX          UNIT ISSUING RESET
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDC    SRT         SLAVE RESET TIMEOUT
          UJN    GETU108
 GETU104  BSS
          LDC    DST         DRIVE SPINUP TIMEOUT
 GETU108  BSS
          STDL   T1
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GETU110     IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GETU110  BSS
          SBDL   T1
          PJN    GETU120     IF TIMEOUT
          LJM    GETU30
 GETU120  BSS
          LDN    E38         NO CM3 INTERRUPT
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- GLIST
*
** PURPOSE-- READ ONE ENTRY FROM THE CM ADDRESS LIST PORTION OF A COMMAND.
*
** INPUT-- LISTL
*
** OUTPUT-- CMLIST, CM+/CM/P.RMA
          SPACE  2
 GLIX     LJM    **
 GLIST    EQU    *-1
          LDDL   CSST        ADDRESS OF SS TABLE
          ADK    CMLIST
          STML   GLIST4      ADDRESS TO STORE CM LIST
          LDN    1
          STDL   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-- IH
*
** PURPOSE-- INTERRUPT HANDLER.  INPUT THE RESPONSE PACKET.  THROW AWAY
*            ASYNCHRONOUS RESPONSES FOR UNITS NOT CONFIGURED.  REPORT
*            ASYNCHRONOUS DRIVE ERROR RESPONSES FOR CONFIGURED UNITS.
*
** EXIT
*         A = MAJOR STATUS
*         THE DRIVE IS DESELECTED
          SPACE  2
 IHX      LJM    **
 IH       EQU    *-1
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX SAVE CLOCK IN TABLE
          LDML   CP+OPCD
          NJN    IH1         IF NOT LOGICAL INTERFACE RESET
          LDN    3           2 TO 4 SECOND TIMEOUT
          UJN    IH6
 IH1      BSS
          LMC    H0800
          ZJN    IH5         IF DRIVE POWER ON RESET (NEEDS 45 SECONDS)
          LDML   CP+OPCD
          LMC    8400
          ZJN    IH2         IF READ PERFORMANCE LOG
          LDML   /SS/P.RESET,CSST
          NJN    IH4         IF RESET ISSUED
 IH2      BSS
          LDN    32          APPROXIMATELY 31 SECOND TIMEOUT
          UJN    IH6
 IH4      BSS
          SHN    17
          MJN    IH5         IF SLAVE RESET
          LDC    DST         DRIVE SPINUP TIMEOUT
          UJN    IH6
 IH5      BSS
          LDC    SRT         SLAVE RESET TIMEOUT
 IH6      BSS
          STDL   T7          SAVE TIMEOUT VALUE
 IH10     BSS
          RJM    RI          REQUEST INTERRUPTS
          LDML   SELT,CMOD   MASK VALUE
          LPDL   STATUS      INTERRUPT STATUS
          NJN    IH15        IF INTERRUPT PRESENT
          RJM    UC          UPDATE CLOCK
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    IH12        IF CLOCK HAS NOT WRAPPED
          ADC    0#10000
 IH12     BSS
          SBDL   T7
          MJN    IH10        IF TIMEOUT NOT EXPIRED
          LDK    E38         NO CM3 INTERRUPT
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 IH15     BSS
          RJM    DTM         DETERMINE TRANSFER MODE
          RJM    SEL         SELECT THE CONTROLLER
          STDL   CTM         CLEAR CHANNEL TRANSFER MODE FLAG
          RJM    RPT         RESPONSE PACKET TRANSFER
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDML   RPB+MAJST   MAJOR STATUS
          SHN    -4
          LPN    0#F
          LMN    AR
          NJN    IH20        IF NOT ASYNCHRONOUS RESPONSE
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJN    IH30        IF ASYNCHRONOUS RESPONSE FOR CONTROLLER
          RJM    DARH        DRIVE ASYNCHRONOUS RESPONSE HANDLER
          LDDL   T8
          STDL   UX          RESTORE UX
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO CURRENT SS TABLE
          UJN    IH40        GO LOOK FOR ANOTHER INTERRUPT
 IH20     BSS
          LDML   RPB+MAJST   MAJOR STATUS
          LJM    IHX
 IH30     BSS
          LDK    ID16
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    IH20        IF ID 16 NOT FOUND
          LDML   RPB+6,T3
          SHN    8
          PJN    IH20        IF NOT CONTROLLER OVER TEMPERATURE
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 IH40     BSS
          LJM    IH10
          SPACE  5,20
** NAME-- INTERR
*
** PURPOSE-- REPORT AN INTERFACE ERROR
          SPACE  2
 INTERR   CON    0
          STML   RS+/RS/P.IEC INTERFACE ERROR CODE
          LDK    /RS/K.INTERR  INTERFACE ERROR
          STML   RS+/RS/P.INTERR  ABNORMAL STATUS CODE
          LDK    E120        SOFTWARE FAILURE
          STML   RS+/RS/P.ERRID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ENDIF
          RJM    HANG        (NO RETURN)
          SPACE  5,20
** NAME-- INTRS
*
** PURPOSE-- SEND INTERMEDIATE RESPONSE.
          SPACE  2
 INTRSX   LJM    **
 INTRS    EQU    *-1
          LDDL   PTF
          NJN    INTRS10     IF REQUEST EXISTS
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ENDIF
          UJK    INTRSX

 INTRS10  BSS
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT   INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          LDN    R.INT       INTERMEDIATE RESPONSE
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC RESPONSE CODE
          RJM    TERMP       SEND RESPONSE TO CM
          UJK    INTRSX
          SPACE  5,20
** NAME--ISR
*
** PURPOSE-- ISSUE SLAVE RESET
          SPACE  2
 ISR      CON    0
          LDC    H8415       SLAVE RESET
          STML   CP+OPCD     SO TIMEOUT WILL BE LONG IN IH
          RJM    IR          ISSUE RESET
          LDML   /SS/P.CT,CSST
          ZJN    ISR10       IF IN SUBSYSTEM CONFIDENCE TEST
          LJM    MAIN15
 ISR10    BSS
          RJM    IH          INTERRUPT HANDLER
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETRUN)
          SPACE  5,20
** NAME-- IU
*
** PURPOSE-- INITIALIZE UNIT. CALLED DURING FORMAT OPERATION.
 IUX      LJM    **
 IU       EQU    *-1
          LOADF  CMLIST+/CM/P.RMA,CSST  ADDRESS OF LIST WITH FORMAT PARAMTER
          CRDL   P1          READ WORD WITH PARAMETER
          LDDL   P3
          NJK    IU10        IF UNCONDITIONAL FORMAT
          RJM    IUF         IS UNIT FORMATTED
          NJK    IU10        IF UNIT IS NOT FORMATTED
          LDN    2           CMNDS WILL GET DECREMENTED TWICE
          STDL   CMNDS
          LDN    0
          LJM    TERM20      TERMINATE REQUEST
 IU10     BSS
          LDML   UNITS,UX
          LPC    0#3FFF
          LMC    0#C000      INDICATE TWO COMMANDS ISSUED
          STML   UNITS,UX
          RJM    FU          FORMAT UNIT
          UJK    IUX
          SPACE  5,20
** NAME-- IUF
*
** PURPOSE-- IS UNIT FORMATTED.
*
** EXIT-- A=0 IF UNIT FORMATTED AT CORRECT SECTOR SIZE
          SPACE  2
 IUFX     LJM    **
 IUF      EQU    *-1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#200
          STML   CP+OPCD     ATTRIBUTE COMMAND
          LDC    0#36C
          STML   CP+FCP      PARAMETER TO READ REV NUMBER
          LDC    0#4051
          STML   CP+FCP+1    RETURN REV NUMBER IN RESPONSE
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJN    IUF05       IF SUCCESSFUL
          LPC    IVR         INTERVENTION REQUIRED
          ZJN    IUF10       IF UNEXPECTED STATUS
          LDK    ID24
          RJM    SFP         SEARCH FOR PARAMETER
          LDML   RPB+8,T3
          SHN    2
          MJK    IUFX        IF DRIVE NOT FORMATTED
          UJN    IUF10       UNEXPECTED STATUS
 IUF05    LDC    ID51
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    IUF10       IF ID 51 NOT FOUND
          LDML   RPB+7,T3    SECTOR SIZE IN BYTES
          ADC    -2048       EXPECTED SECTOR SIZE
          LJM    IUFX
 IUF10    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- LIR
*
** PURPOSE-- LOGICAL INTERFACE RESET
          SPACE  2
 LIRX     LJM    **
 LIR      EQU    *-1
          LDN    0
          STML   CP+OPCD     SO TIMEOUT WILL BE SHORT IN IH
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDC    H8215       LOGICAL INTERFACE RESET
          RJM    IR          ISSUE RESET
          RJM    IH          INTERRUPT HANDLER
          SHN    -4
          LPN    0#F
          LMN    AR
          NJN    LIR20       IF NOT ASYNCHRONOUS RESPONSE
          LDN    ID16
          RJM    SFP         CHECK FOR MACHINE EXCEPTION
          MJN    LIR20       IF MACHINE EXCEPTION ID NOT FOUND
          LDML   RPB+6,T3
          LPC    0#FEE0
          LMC    0#6000
          NJN    LIR20       IF ERROR
          UJK    LIRX
 LIR20    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- LOCK
*
** PURPOSE-- SET THE LOCKWORD
*
** ENTRY
*         T7 = POINTER RMA
*         T5 = OFFSET TO LOCKWORD FROM RMA
*
** EXIT
*         A = 0 IF LOCK SUCCESSFULLY SET
          SPACE  2
 LOCKX    LJM    **
 LOCK     EQU    *-1
 LOCK1    BSS
          LCN    0
          STDL   T1
          STDL   T2
          LDN    0
          STDL   T3
          STDL   T4
          LOADR  0,T7        UNIT/PP INTERFACE TABLE ADDRESS
          ADDL   T5          ADD LOCKWORD OFFSET, SAVE CM ADDRESS
          STDL   T6          SAVE CM ADDRESS
          RDSL   T1          WRITE INTERMEDIATE VALUE
          LDDL   T1
          ZJN    LOCK5       IF LOCK COULD BE SET
          ADDL   T2
          ADC    -177777B-177777B
          ZJK    LOCK1       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   PPNO        CHECK IF LOCK ALREADY SET
          NJN    LOCK3       IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 LOCK3    UJK    LOCKX       IF LOCK WAS ALREADY SET, EXIT A = 0
                             IF LOCK COULD NOT BE SET, EXIT A .NE. 0
 LOCK5    BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   PPNO
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    LOCKX
          SPACE  5,20
** NAME-- OFFCH
*
** PURPOSE-- TURN OFF ALL UNITS ON A CHANNEL
          SPACE  2
 OFCX     LJM    **
 OFFCH    EQU    *-1
          LDN    0
          STDL   UX          UNITS TABLE INDEX
 OFC10    BSS
          RJM    OFFUN       SET UNIT DISABLE FLAG
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    OFC10       IF NOT END OF TABLE
          UJK    OFCX
          SPACE  5,20
** NAME-- OFFCM
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROL MODULE.
          SPACE  2
 OFFCM    CON    0
 .U       IFEQ   UNIX,1
          LDK    /RS/K.CMDN  CONTROLLER DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          LDDL   UX
          STDL   P5          POINTER TO CURRENT UNITS TABLE
          LDN    0
          STDL   UX          UNITS TABLE INDEX
 OFFCM10  BSS
          LDML   UNITS,P5    COMPARE IF SAME CONTROL MODULE
          LMML   UNITS,UX
          LPN    70B
          NJN    OFFCM20     IF NOT THE SAME CONTROL MODULE
          RJM    OFFUN       SET UNIT DISBLE FLAG
 OFFCM20  BSS
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    OFFCM10     IF NOT END OF TABLE
 .U       IFEQ   UNIX,1
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 .U       ELSE
          LDK    /RS/K.CMDN  CONTROLLER DOWN
          STML   RS+/RS/P.ID
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
 .U       ENDIF
          LJM    MAIN10
          SPACE  5,20
** NAME-- OFFUN
*
** PURPOSE-- SET THE DISABLE FLAG IN THE UNIT INTERFACE TABLE.
*
** OUTPUT-- P5 IS UNCHANGED
          SPACE  2
 OFUX     LJM    **
 OFFUN    EQU    *-1
          LDK    /UIT/K.DSABLE  SET UNIT DISABLE FLAG
          STDL   T3
          LDN    0
          STDL   T2
          STDL   T4
          STDL   T5
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          RDSL   T2          -LOGICAL OR- THE UNIT DISABLE FLAG

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

          RJM    SFRR        SETUP FOR REQUEST RETRY (MAKE CMNDS ACCURATE)
          UJK    OFUX
          SPACE  5,20
** NAME-- PCER
*
** PURPOSE-- PREPARE COMMON ERROR RESPONSE
*
** INPUT  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
 .U       IFEQ   UNIX,1
          LDML   /SS/P.XFER,CSST BYTES TRANSFERRED
          STML   RS+/RS/P.XFER
          LDML   /SS/P.XFER+1,CSST
          STML   RS+/RS/P.XFER+1
          LDML   /SS/P.LU,CSST PUT LOGICAL UNIT IN RESPONSE
          STML   RS+/RS/P.LU
 .U       ENDIF
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
          LDDL   P2
          LMN    E38
          NJN    PCER26      IF NOT -NO CONTROLLER RESPONSE-
          LDML   /SS/P.RESET,CSST
          SHN    17
          MJN    PCER26      IF NO ASYNCH AFTER SLAVE RESET
          SHN    17
          PJN    PCER26      IF ERROR ALREADY ISOLATED
          LDK    E95         NO DRIVE OPERATIONAL RESPONSE
          UJN    PCER32
 PCER26   BSS
          LDDL   P2
          NJN    PCER32      IF ERROR ALREADY ISOLATED
          LDN    ID14
          RJM    SFP         SEARCH FOR ID 14
          MJN    PCER30      IF NOT CM3 INTERVENTION REQUIRED
          LDK    E71
          UJN    PCER32
 PCER30   BSS
          LDN    ID16
          RJM    SFP         SEARCH FOR ID 16
          MJN    PCER35      IF NOT CM3 MACHINE EXCEPTION
          LDML   RPB+6,T3
          SHN    8
          PJN    PCER31      IF NOT CONTROLLER OVER TEMPERATURE
          LDK    E78
          UJN    PCER32
 PCER31   BSS
          LDK    E72
 PCER32   BSS
          UJN    PCER45
 PCER35   BSS
          LDN    ID17
          RJM    SFP         SEARCH FOR ID 17
          MJN    PCER40      IF NOT CM3 COMMAND EXCEPTION
          LDML   RPB+5,T3
          SHN    -8
          SBN    6
          MJN    PCER38      IF BYTE 5 NOT PRESENT
          LDML   RPB+8,T3
          SHN    6
          PJN    PCER38      IF NOT RESERVED TO OTHER PORT
          LDK    E77         DRIVE RESERVED TO OTHER CM3 PORT
          UJN    PCER45
 PCER38   BSS
          LDK    E73
          UJN    PCER45
 PCER40   BSS
          LDN    ID13
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER55      IF NOT ID13
          LDML   RPB+6,T3    FIRST WORD AFTER ID13
          SHN    5
          PJN    PCER50      IF NOT MESSAGE FROM CONTROLLER
          LDK    E60         CONTROLLER ERROR
 PCER45   BSS
          UJN    PCER70
 PCER50   BSS
          LDK    E74         MICROCODE EXECUTION ERROR
          UJN    PCER70
 PCER55   BSS
          LDN    ID15
          RJM    SFP         SEARCH FOR ID 15
          MJN    PCER60      IF NOT ALTERNATE PORT EXCEPTION
          LDK    E75
          UJN    PCER70
 PCER60   BSS
          LDK    ID23
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    PCER65      IF NOT ID23
          LDML   RPB+6,T3    FIRST WORD AFTER ID23
          SHN    5
          PJN    PCER65      IF NOT MESSAGE FROM DRIVE DIAGNOSTICS
          LDK    E61         DRIVE ERROR
          UJN    PCER70
 PCER65   BSS
          LDN    E00         CP MUST ISOLATE THE ERROR
 PCER70   BSS
          STML   RS+/RS/P.ERRID
          LDDL   WC          WORDS NOT TRANSFERRED
          STML   RS+/RS/P.WC
          LDDL   LF
          STML   RS+/RS/P.FUNTO FAILING FUNCTION IF E01
          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
          SHN    -8
          STML   RS+/RS/P.MREV CM3 MICROCODE REVISION
          RJM    SDA         SAVE DISK ADDRESS
          LDDL   CHAN
          STML   RS+/RS/P.CHAN CHANNEL NUMBER
          LDML   UNITS,UX
          LPN    77B
          STML   RS+/RS/P.UNIT CONTROLLER, UNIT NUMBER
          LDN    0
          STML   RS+/RS/P.ID
          LDML   /SS/P.RQTRY,CSST
          STML   RS+/RS/P.RTRY REQUEST RETRY COUNT
 .F       IFEQ   FE,1
          LDML   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
          LDN    6           COMMAND PACKET LENGTH
          STML   CP
          LDC    H8100       PERFORM DRIVE DIAGNOSTIC OP CODE
          STML   CP+OPCD
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    PDDX        IF SUCCESSFUL
          LDN    E00         CP MUST DETERMINE THE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- PDR
*
** PURPOSE-- PREPARE NORMAL DISK RESPONSE
          SPACE  2
 PDRX     LJM    **
 PDR      EQU    *-1
 .U       IFNE   UNIX,1
          LDML   /SS/P.XFER,CSST  BYTES TRANSFERRED
          STML   RS+/RS/P.XFER
          LDML   /SS/P.XFER+1,CSST
          STML   RS+/RS/P.XFER+1
 .U       ENDIF
          LDML   /SS/P.FPVA,CSST PVA OF REQUEST
          STML   RS+/RS/P.PVA
          LDML   /SS/P.FPVA+1,CSST
          STML   RS+/RS/P.PVA+1
          LDML   /SS/P.FPVA+2,CSST
          STML   RS+/RS/P.PVA+2
 .U       IFEQ   UNIX,1
          LDN    8
 .U       ELSE
          LDML   /SS/P.LU,CSST  PUT LOGICAL UNIT IN RESPONSE
          STML   RS+/RS/P.LU
          LDK    /RS/C.LASTC*8+8
 .U       ENDIF
          STML   RS+/RS/P.RESPL NORMAL RESPONSE LENGTH
          LDN    0
          STML   RS+/RS/P.DATERR ABNORMAL STATUS WORD
          STML   RS+/RS/P.IEC INTERFACE ERROR CODE WORD
 .U       IFEQ   UNIX,1
          LDML   /SS/P.LU,CSST
          LPC    0#FF        RIGHT-MOST 8 BITS OF LOGICAL UNIT
          LMC    /RS/K.SHORT  INDICATE ONE-WORD RESPONSE
          STML   RS+/RS/P.SHORT
 .U       ELSE
          LDN    R.NRM
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC  NORMAL RESPONSE CODE
 .U       ENDIF
          UJK    PDRX
          SPACE  5,20
** NAME-- PI
*
** PURPOSE-- PROCESS INTERRUPT
          SPACE  2
 PI       CON    0
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          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 CONTROL MODULE
          RJM    STI         SET TABLE INDEXES
          LDDL   T6
          SHN    SC
          MJK    PI25        IF SUCCESSFUL
          SHN    CS-SC
          PJK    PI100       IF NOT CONDITIONAL SUCCESS
          LDML   /SS/MT,CSST
          SHN    2
          PJN    PI20        IF NOT USING MASTER TERMINATE
          LDML   RPB+5
          LPC    0#FF
          LMC    ID19
          NJN    PI20        IF RESPONSE NOT DUE TO MASTER TERMINATE
          LDML   RPB
          SBN    15
          PJN    PI20        IF RESPONSE TOO LONG
          LDML   RPB+7
          SHN    9
          MJK    PI30        IF MASTER TERMINATE
 PI20     BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          LDC    0#5000
          STML   RS+/RS/P.RC RECOVERED, INTERMEDIATE RESPONSE
          RJM    TERMP       SEND RESPONSE TO CM
 .U       IFNE   UNIX,1
          LDN    0                CLEAR BYTES TRANSFERRED
          STML   /SS/P.XFER,CSST
          STML   /SS/P.XFER+1,CSST
 .U       ENDIF
          UJN    PI30
 PI25     BSS
          LDML   RPB+OPCD
          LMC    H0400
          NJN    PI30        IF NOT DRIVE RESERVE
          LDML   UNITS,UX
          LPC    0#17FF
          LMC    /UN/K.RD
          STML   UNITS,UX    SET DRIVE RESERVED BIT
          SODL   CMNDS       OUTSTANDING COMMANDS
          LJM    MAIN15
 PI30     BSS
          RJM    TERM        COMMAND COMPLETED WITHOUT ERROR (NO RETURN)
 PI40     BSS
          SBN    TN-CC
          NJN    PI60        IF NOT TRANSFER NOTIFICATION
          RJM    STI         SET TABLE INDEXES
          RJM    RDWT        READ WRITE SETUP
          NJN    PI45        IF EXPECTED RESPONSE
          AODL   TBC         INDICATE COMPLETION RESPONSE SHOULD BE PRESENT
          LJM    PI10
 PI45     BSS
          LDML   /SS/P.FNC,CSST
          ZJN    PI50        IF READ
          RJM    WRITE       IF WRITE (RETURN IS TO IDLE LOOP)
 PI50     BSS
          RJM    READ        READ
          LJM    MAIN15
 PI60     BSS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDML   RPB+SLAD
          LPC    0#FF
          LMC    0#FF
          ZJN    PI100       IF ASYNCH FOR CONTROLLER
          RJM    DARH        DRIVE ASYNCHRONOUS RESPONSE HANDLER
          LJM    MAIN20
 PI100    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 .U       IFEQ   UNIX,1
          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
          RJM    SPLOCK      SET PP TABLE LOCK
          RJM    RAR         RESTART ALL REQUESTS SET UP
          LDDL   CLF
          NJN    PPRQ15      IF 2 CONSECUTIVE RESUMES AND CHANNEL LOCK
                              ALREADY CLEAR
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 PPRQ15   BSS
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          CRDL   T1
          LDDL   T4          CLEAR ACTIVE CHECK BIT, IDLE REQUEST BIT,
          LPC    0#2FFE       AND SET IDLE STATUS BIT
          LMC    0#1000
          STDL   T4
          LDDL   CM.PIT+1
          CWDL   T1
 PPRQ20   BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PPRQ20
 .U       ELSE
          SPACE  5,20
** NAME-- PPRQ
*
** PURPOSE-- CHECK FOR ANY PP REQUESTS ON THE PP QUEUE.
          SPACE  2
 PPRQX    LJM    **
 PPRQ     EQU    *-1

*         A ONE WORD READ WITH THE CRDL INSTRUCTION AT THE SAME TIME
*         THE PP IS DEADSTARTED COULD CAUSE AN UNCORRECTED CM ERROR ON
*         AN S0 WITH A 60 NANOSECOND CLOCK.  TO AVOID THIS HARDWARE
*         PROBLEM THE CRML INSTRUCTION IS USED.

          LDN    1           NUMBER OF WORDS TO READ
          STDL   WD
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          ADN    /PIT/C.PPQ  CM ADDRESS OF PP REQUEST QUEUE POINTER
          CRML   T1,WD       READ PP REQUEST QUEUE POINTER
          LDDL   T3          RMA OF NEXT QUEUED PP REQUEST
          ADDL   T4
          ZJN    PPRQX       IF NO PP REQUESTS
          LDC    SSNR
          STDL   CSST        USE SPARE SS TABLE
          RJM    SPLOCK      SET PP QUEUE LOCKWORD
          NJN    PPRQX       IF LOCK WAS NOT SET
          STML   /SS/P.XFER,CSST CLEAR BYTES TRANSFERRED
          STML   /SS/P.XFER+1,CSST
          STML   /SS/P.LU,CSST CLEAR LOGICAL UNIT
          LDN    2
          STDL   P1
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA
          CRML   T1,P1       READ PVA AND RMA OF FIRST REQUEST IN CHAIN
          LDDL   T2          SAVE PVA OF REQUEST
          STML   /SS/P.FPVA,CSST
          LDDL   T3
          STML   /SS/P.FPVA+1,CSST
          LDDL   T4
          STML   /SS/P.FPVA+2,CSST
          LDDL   T7          PUT RMA OF REQUEST IN SS TABLE
          STML   /SS/P.REQ,CSST
          LDDL   T8
          STML   /SS/P.REQ+1,CSST
          RJM    UREQ        READ PP REQUEST
          RJM    PDR         PREPARE RESPONSE
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          LDDL   FNC
          SBN    3
          STDL   IDLE
          ZJN    PPRQ10      IF RESUME COMMAND
          ADN    1
          ZJN    PPRQ5       IF IDLE COMMAND
          LDC    E501        INVALID COMMAND
          RJM    INTERR      REPORT ERROR (NO RETURN)
 PPRQ5    BSS
          RJM    CUB         CHECK UNIT BUSY
          NJN    PPRQ20      EXIT IF COMMANDS IN PROGRESS
          LDDL   CLF
          NJN    PPRQ10      IF LOCK ALREADY CLEAR
          RJM    CCLOCK      CLEAR CHANNEL LOCK
 PPRQ10   BSS
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA  CM ADDRESS OF PP QUEUE POINTER
          CWML   SSNR+RQ,P1  WRITE PVA AND RMA POINTERS OF NEXT REQUEST
          RJM    TERMP       SEND TERMINATION RESPONSE
          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD
          LDDL   FNC
          SBN    3
          ZJN    PPRQ18      IF RESUME COMMAND
 PPRQ13   BSS
          RJM    PPRQ        WAIT FOR RESUME
          UJN    PPRQ13
 PPRQ18   BSS
          LJM    MAIN5
 PPRQ20   BSS
          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD
          UJK    PPRQX
 .U       ENDIF
          SPACE  5,20
** NAME-- PT
*
** PURPOSE-- TEST THE PATH BETWEEN THE PP AND THE CONTROLLER.
*            IF A PATH TO A CONTROLLER STILL FAILS AFTER AT LEAST
*            ONE RETRY WITH SLAVE RESET, ALL UNITS ON THE FAILING
*            CONTROLLER WILL BE DISABLED.
*
** ENTRY
*         1)  AT INITIALIZATION AFTER PP LOADED
*         2)  AFTER MAINTENANCE HAS USED THE CHANNEL
*         3)  AFTER THE PP HAS RECEIVED A RESUME
*         4)  DURING REQUEST RETRY IF SLAVE RESET FAILS
          SPACE  2
 PT100    BSS
          AODL   PTF         INDICATE PATH TEST COMPLETE
 PTX      LJM    **
 PT       EQU    *-1
          LDDL   UNUML
          ZJN    PT100       IF NO UNITS
          RJM    SCLOCK      SET CHANNEL LOCK
          LDDL   PTF
          NJN    PTX         IF NOT EXECUTING PATH TEST
          STDL   CMOD        CONTROL MODULE NUMBER
          STDL   UX
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          RJM    MR          MASTER RESET
          UJN    PT12
 PT8      BSS
          AODL   CMOD
          SBN    8
          PJN    PT100       IF ALL PATHS TESTED
 PT12     BSS
          LDN    0
          STDL   UX
          UJN    PT20
 PT16     BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 PT20     BSS
          SBDL   UNUML
          PJN    PT8         IF END OF CONFIGURED UNITS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    7
          LMDL   CMOD
          NJN    PT16        IF DIFFERENT CONTROLLER
          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
          RJM    LIR         LOGICAL INTERFACE RESET

* WRITE BUFFER

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

* READ BUFFER

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

* CHECK IF RESPONSE SHOULD BE SENT TO CM.

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

* READ IN AND OUT POINTERS OF RESPONSE BUFFER.

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

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

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

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

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

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

* CHECK IF RESPONSE SHOULD BE SENT TO CM.

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

* UPDATE THE 'IN' POINTER.

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

* INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   PPNO-3      SET LAST BYTE NONZERO
          LDN    0           SET BANK FOR S0
 INTPRC   PSN    0           INTERRUPT OR PSN (MODIFIED)
          UJK    RESNX
          SPACE  5,20
** NAME-- RMR
*
** PURPOSE-- READ CM3 MICROCODE REVISION
          SPACE  2
 RMRX     LJM    **
 RMR      EQU    *-1
          LDN    10
          STML   CP          COMMAND PACKET LENGTH
          LDC    0#200
          STML   CP+OPCD     ATTRIBUTE COMMAND
          LDC    0#36C
          STML   CP+FCP      PARAMETER TO READ REV NUMBER
          LDC    0#4050
          STML   CP+FCP+1    RETURN REV NUMBER IN RESPONSE
          LDML   /SS/P.UNIT,CSST
          SHN    -8
          STDL   CMOD        CONTROLLER NUMBER
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     SLAVE ADDRESS
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          NJN    RMR10       IF NOT SUCCESSFUL
          LDC    ID50
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    RMR10       IF ID 50 NOT FOUND
          LDML   /SS/P.MREV,CSST
          LPC    0#FF
          STML   /SS/P.MREV,CSST
          LDML   RPB+19,T3
          LPC    377B        MASK MICROCODE REVISION NUMBER
          SHN    8
          RAML   /SS/P.MREV,CSST SAVE CM3 MICROCODE REVISION NUMBER
          LJM    RMRX
 RMR10    BSS
          LDN    E00         CP MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RNL
*
** PURPOSE-- READ NEXT LIST
          SPACE  2
 RNLX     LJM    **
 RNL      EQU    *-1
          RJM    UBT         UPDATE BYTES TRANSFERRED
          NJN    RNLX        IF NO ERROR
          LDC    E505        CM HAS CHANGED
          RJM    INTERR      REPORT ERROR (NO RETURN)
 .E       IFEQ   ERRD,1      TO READ UNCORRECTABLE DATA
          SPACE  5,20
** NAME-- RRD
*
** PURPOSE-- READ RAW DATA IF DATA FIELD ECC ERROR.
*            IF THE ERROR CODE IS 62 AND THE OP CODE IN THE
*            RESPONSE IS 1107, THE SECTOR WITH THE UNRECOVERED
*            MEDIA ERROR HAS BEEN TRANSFERRED TO CM.
          SPACE  2
 RRDX     LJM    **
 RRD      EQU    *-1
          LDDL   T5          ENDING STATUS FROM ID26
          LPC    0#FF
          LMC    0#D1
          NJN    RRDX        IF NOT DATA FIELD ECC ERROR
          LDN    5
          STML   /SS/P.RECOV,CSST INDEX TO NEXT RECOVERY STEP
          LDML   RPB+8,T3
          STML   CP+FCP+3    CYLINDER
          LDML   RPB+9,T3
          STML   CP+FCP+4    HEAD, SECTOR
          RJM    LIR         LOGICAL INTERFACE RESET
          RJM    RCC         SETUP FOR RESTART CONTROLLER COMMANDS
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          LDC    H1107
          STML   CP+OPCD     OPERATION CODE
          LDN    1
          STML   CP+FCP+2    SECTOR COUNT
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMC    TN*16
          NJN    RRD20       IF NOT TRANSFER NOTIFICATION
          STDL   SECPOS      CLEAR SECTOR POSITION
          LDN    1
          STDL   SBS         SECTORS TO TRANSFER
          RJM    SEL         SELECT THE CONTROLLER
          RJM    READ        READ ONE SECTOR
          RJM    IH          INTERRUPT HANDLER
          LPN    0#A
          NJK    RRDX        IF SUCCESSFUL OR CONDITIONAL SUCCESS
 RRD20    BSS
          LDN    E00         CP MUST ISOLATE THE ERROR
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 .E       ENDIF
          SPACE  5,20
** NAME-- SCB
*
** PURPOSE-- SET COMMAND IN PROGRESS BITS IN (UNITS,UX) FOR ONE
*            CONTROLLER
*
** ENTRY  A = BITS TO SET
*         CMOD = CONTROLLER TO SEARCH FOR UNITS
          SPACE  2
 SCBX     LJM    **
 SCB      EQU    *-1
          STDL   P1
          LDN    0
          STDL   T1
          UJN    SCB20
 SCB10    BSS
          LDN    P.UN
          RADL   T1          UPDATE POINTER TO UNITS TABLE
 SCB20    BSS
          SBDL   UNUML
          PJN    SCBX        IF END OF CONFIGURED UNITS
          LDML   UNITS,T1
          SHN    -3
          LPN    7
          LMDL   CMOD
          NJN    SCB10       IF DIFFERENT CONTROLLER
          LDML   UNITS,T1
          LPC    0#1FFF
          LMDL   P1
          STML   UNITS,T1    SET -2 COMMANDS IN PROGRESS-
          UJN    SCB10
          SPACE  5,20
** NAME-- SCLOCK
*
** PURPOSE-- SETS THE CHANNEL LOCK.
          SPACE  2
 SCLX     LJM    **
 SCLOCK   EQU    *-1
 SCL30    BSS
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJN    SCL30       IF LOCK WAS NOT SET
          STDL   CLF         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          PACKET LENGTH
          AOML   /SS/P.CRN,CSST
          LPC    0#FFF1
          STML   /SS/P.CRN,CSST CLEAR CARRY BIT
          LPN    1
          SHN    14
          ADDL   UX
          STML   CP+CRN      COMMAND REFERENCE NUMBER
          LDDL   FNC
          ZJN    SCP8        IF READ
          SBN    1
          ZJN    SCP4        IF WRITE
          LDC    E501        INVALID COMMAND
          RJM    INTERR      REPORT ERROR (NO RETURN)
 SCP4     BSS
          LDC    H2005
          UJN    SCP12
 SCP8     BSS
          LDC    H1005
 SCP12    BSS
          STML   CP+OPCD     OPERATION
          LDML   /SS/P.UNIT,CSST
          STML   CP+SLAD     CONTROLLER, UNIT NUMBER
          LDC    H0931
          STML   CP+FCP      COMMAND EXTENT PARAMETER
          LDML   UNITS,UX
          SHN    /UN/L.TCIP+2
          MJN    SCP15       IF SECOND COMMAND
          LDML   /SS/MT,CSST
          UJN    SCP18
 SCP15    BSS
          LDML   /SS/MT2,CSST
 SCP18    BSS
          SHN    2
          PJN    SCP30       IF NOT USING MASTER TERMINATE
          LDML   /SS/P.DT,CSST
          SHN    -4
          LPN    3
          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
 SCP20    BSS
          RADL   T3          COMPUTE SECTORS
          AODL   T2
          SBML   TPC,DT      TRACKS PER CYLINDER
          ZJN    SCP40       IF CALCULATION COMPLETE
          LDML   SPT,DT
          UJN    SCP20
 SCP30    BSS
          LDDL   TOTAL+1
          ADC    BPS-1
          STDL   T1          ENSURE SECTOR BOUNDARY
          SHN    -16
          ADDL   TOTAL
          SHN    5
          STDL   T2
          LDDL   T1
          SHN    -11
          ADDL   T2
          UJN    SCP45
 SCP40    BSS
          LDDL   T3
 SCP45    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
          LDML   /SS/P.CT,CSST
          NJN    SDA20       IF NOT CONFIDENCE TEST FAILURE
 SDA10    BSS
          STML   RS+/RS/P.STRK STARTING TRACK
          STML   RS+/RS/P.SSEC STARTING SECTOR
          LDML   /SS/P.DT,CSST
          SHN    -4
          LPN    3
          STDL   DT          DEVICE TYPE
          LDML   CTC,DT      CONFIDENCE TEST CYLINDER
          STML   RS+/RS/P.SCYL STARTING CYLINDER
          UJN    SDA30
 SDA20    BSS
          LDN    1
          STDL   T1
          LOADF  /SS/P.CURRQ,CSST RMA OF CURRENT REQUEST
          ADN    3
          CRML   RS+/RS/P.CHAN,T1 SAVE CYLINDER, TRACK, SECTOR IN RESPONSE
 SDA30    BSS
          LDML   RS+/RS/P.ERRID
          ZJN    SDA50       IF RESPONSE PACKET PRESENT
          ADC    -E60
          MJN    SDA40       IF RESPONSE PACKET NOT PRESENT
          ADC    -E110+E60
          MJN    SDA50       IF RESPONSE PACKET PRESENT
 SDA40    BSS
          LDML   /SS/P.CURTRK,CSST
          STML   RS+/RS/P.FTRK FAILING TRACK
          LDML   /SS/P.CURSEC,CSST
          UJN    SDA70
 SDA50    BSS
          LDN    ID29        DRIVE CONDITIONAL SUCCESS
          RJM    SFP         SEARCH FOR PARAMETER
          PJN    SDA60       IF ID 29 FOUND
          LDN    ID32        RESPONSE EXTENT
          RJM    SFP         SEARCH FOR PARAMETER
          MJN    SDA40       IF ID32 NOT FOUND
 SDA60    BSS
          LDML   RPB+9,T3
          SHN    -8
          STML   RS+/RS/P.FTRK FAILING TRACK
          LDML   RPB+9,T3
          LPC    0#FF
 SDA70    BSS
          STML   RS+/RS/P.FSEC FAILING SECTOR
          LJM    SDAX
          SPACE  5,20
** NAME-- SEEK
*
** PURPOSE-- ISSUE INITIAL SEEK.
          SPACE  2
 SEEKX    LJM    **
 SEEK     EQU    *-1
          LDML   UNITS,UX
          SHN    /UN/L.CIP+2
          MJN    SEEK4       IF ONE COMMAND ISSUED
          SHN    -/UN/L.CIP-2
          LPC    0#1FFF
          LMC    0#8000      INDICATE ONE COMMAND ISSUED
          UJN    SEEK8
 SEEK4    SHN    -/UN/L.CIP-2
          LPC    0#3FFF
          LMC    0#C000      INDICATE TWO COMMANDS ISSUED
 SEEK8    STML   UNITS,UX
          RJM    SCP         SETUP COMMAND PACKET PARAMETERS
          LDML   UNITS,UX
          SHN    6
          MJN    SEEK12      IF DRIVE ALREADY RESERVED
          LDN    6           COMMAND PACKET LENGTH
          STML   CP
          LDC    H0400       RESERVE DRIVE COMMAND
          STML   CP+OPCD
 SEEK12   BSS
          AODL   CMNDS       COMMAND ISSUED COUNTER
          RJM    CPT         COMMAND PACKET TRANSFER
 SEEK20   EQU    *-1         FOR FORCING ERRORS
          UJK    SEEKX
          SPACE  5,20
** NAME-- SETRQ
*
** PURPOSE-- SET UP FOR FIRST REQUEST.
          SPACE  2
 SETRQX   LJM    **
 SETRQ    EQU    *-1
          LDML   /SS/P.REQ,CSST SAVE RMA OF REQUEST
          STML   /SS/P.FCOMRQ,CSST FIRST COMPLETED REQUEST (RMA)
          STML   /SS/P.CURRQ,CSST CURRENT REQUEST (RMA)
          LDML   /SS/P.REQ+1,CSST
          STML   /SS/P.FCOMRQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
          LDN    1
          STML   /SS/P.NCOMRQ,CSST NUMBER OF COMPLETED REQUESTS
          LDML   RQ+/RQ/P.TRACK,CSST
          STML   /SS/P.CURTRK,CSST CURRENT TRACK
          LDML   RQ+/RQ/P.SECTOR,CSST
          STML   /SS/P.CURSEC,CSST CURRENT SECTOR
          LDML   RQ+/RQ/P.INT,CSST CHECK IF INTERRUPT WAS SELECTED
          SHN    /RQ/L.INT+2
          MJN    SETR10      IF INTERRUPT SELECTED
          LDC    2400B       PSN INSTRUCTION
          UJN    SETR20
 SETR10   BSS
          LDML   RQ+/RQ/P.PORT,CSST GET PROCESSOR PORT NUMBER TO INTERRUPT
          SHN    -16+/RQ/L.PORT+/RQ/N.PORT
          LPN    /RQ/M.PORT
          ADC    102600B     INPN INSTRUCTION
 SETR20   BSS
          STML   INTPRC
          UJK    SETRQX
          SPACE  5,20
** NAME-- SFP
*
** PURPOSE-- SEARCH FOR PARAMETER IDENTIFICATION IN RESPONSE PACKET
*
** INPUT
*         A = ID TO SEARCH FOR
** OUTPUT
*         A = POSITIVE IF ID FOUND
*         T3 = POINTER TO ID IF IT IS FOUND (RPB+5,T3)
          SPACE  2
 SFPX     LJM    **
 SFP      EQU    *-1
          STDL   T1          PARAMETER TO SEARCH FOR
          LDN    0
          STDL   T3          POINTER TO ID BEING SEARCHED FOR
          LDML   RPB
          ADN    1
          SHN    -1
          SBN    5           LENGTH OF MINIMUM RESPONSE PACKET
 SFP4     BSS
          STDL   T2          POINTER TO END OF PARAMETERS
          MJN    SFPX        EXIT, NO ID FOUND
          LDML   RPB+5,T3
          LMDL   T1
          LPC    0#FF
          ZJN    SFPX        IF ID FOUND
          LDML   RPB+5,T3
          SHN    -9
          ADN    1           ADJUST FOR ODD BYTE
          STDL   T4          WORD LENGTH OF PARAMETER
          RADL   T3          UPDATE POINTER TO ID BEING SEARCHED FOR
          LDDL   T2
          SBDL   T4
          UJN    SFP4
          SPACE  5,20
** NAME-- SFRR
*
** PURPOSE-- SETUP FOR REQUEST RETRY FOR ONE UNIT
*
** OUTPUT-- P5, T8 ARE UNCHANGED
          SPACE  2
 SFRRX    BSS
          LDN    0
          STDL   IF
          STML   /SS/P.RESET,CSST CLEAR RESET ISSUED FLAG
          LDML   UNITS,UX
          LPC    0#1FFF
          STML   UNITS,UX    CLEAR COMMAND IN PROGRESS BITS
          LJM    **
 SFRR     EQU    *-1
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDML   /SS/P.CT,CSST
          ZJN    SFRRX       IF CONFIDENCE TEST JUST RUN
          LDML   /SS/P.RESET,CSST
          NJN    SFRRX       IF SLAVE RESET IN PROGRESS
          LDML   UNITS,UX
          SHN    2
          PJN    SFRRX       IF NO COMMANDS IN PROGRESS
          LDML   /SS/P.CURRQ,CSST RESTORE RMA OF CURRENT REQUEST
          STML   /SS/P.REQ,CSST
          LDML   /SS/P.CURRQ+1,CSST
          STML   /SS/P.REQ+1,CSST
          LDML   /SS/P.FPVA,CSST RESTORE PVA OF CURRENT REQUEST
          STML   /SS/P.PVA,CSST
          LDML   /SS/P.FPVA+1,CSST
          STML   /SS/P.PVA+1,CSST
          LDML   /SS/P.FPVA+2,CSST
          STML   /SS/P.PVA+2,CSST
          LDML   UNITS,UX
          SHN    2+/UN/L.TCIP
          PJN    SFRR5       IF NOT -2 COMMANDS IN PROGRESS-
          SODL   CMNDS       OUTSTANDING COMMANDS
          LDML   UNITS,UX
          LPC    0#9FFF
          STML   UNITS,UX    CLEAR -2 COMMANDS IN PROGRESS-
 SFRR5    BSS
          LDN    0
          STML   /SS/P.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
          RJM    DCR         DELETE COMPLETED REQUESTS FROM QUEUE
          UJN    SFRR15
 SFRR10   BSS
          SODL   CMNDS       OUTSTANDING COMMANDS
 SFRR15   BSS
          LJM    SFRRX
          SPACE  5,20
** NAME-- SFT
*
** PURPOSE-- SET FACILITY TIMEOUT TO 1/2 SECOND IF 8A OR LATER
*            MICROCODE.  THIS IS THE AMOUNT OF TIME THE CM3 WILL
*            WAIT FOR THE DRIVE TO GO NOT BUSY BEFORE REPORTING
*            AN ERROR.  WITH A TIMEOUT OF ONE HALF SECOND AND
*            VERSION 7 OR EARLIER MICROCODE,  DATA INTEGRITY
*            PROBLEMS OCCURRED.
          SPACE  2
 SFTX     LJM    **
 SFT      EQU    *-1
          RJM    RA6F        READ ATTRIBUTE 6F
          LDML   /SS/P.MREV,CSST
          SHN    -12
          SBN    8
          PJN    SFT2        IF 8A OR LATER MICROCODE
          LDML   RPB+21
          LMC    0#FFFF
          ZJK    SFTX        IF TIMEOUT ALREADY INFINITE
          LCN    0           SET TIMEOUT TO INFINITE
          STML   RPB+21
          LMN    1
          UJN    SFT5
 SFT2     BSS
          LDML   RPB+21
          LMN    7
          ZJK    SFTX        IF TIMEOUT ALREADY 1/2 SECOND
          LDN    7           SET TIMEOUT TO 1/2 SECOND
          STML   RPB+21
          LDC    0#A120
 SFT5     BSS
          STML   RPB+22
          RJM    WA6F        WRITE ATTRIBUTE 6F
          LDN    6
          STML   CP          COMMAND PACKET LENGTH
          LDC    H020A
          STML   CP+OPCD     SAVE OPERATING MODE IN EEPROM
          LDDL   CMOD
          LPN    7
          SHN    8
          LMC    0#FF
          STML   CP+SLAD     SLAVE ADDRESS
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJK    SFTX        IF SUCCESSFUL
          LDN    E00         CPU MUST DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- SNDRSP
*
** PURPOSE-- SEND THE RESPONSE TO CM.
*            USED WHEN SWITCHING TO THE NEXT REQUEST.
          SPACE  2
 SNDX     LJM    **
 SNDRSP   EQU    *-1
          RJM    RESP        SEND RESPONSE TO CM
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
          RJM    SRESP       SET UP RESPONSE BUFFER
          UJK    SNDX
          SPACE  5,20
** NAME-- SNDWRS
*
** PURPOSE-- SEND WRITE RESPONSES FOR WRITE REQUESTS THAT HAVE
*            BEEN SUCCESSFULLY STREAMED.
          SPACE  2
 SNDWX    LJM    **
 SNDWRS   EQU    *-1
          LDML   /SS/P.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
 .U       IFNE   UNIX,1
          LDML   /SS/P.REQ,CSST  SET CURRQ TO END OF CHAIN SO DCR WILL
                                  DELINK ALL REQUESTS
          STML   /SS/P.CURRQ,CSST
          LDML   /SS/P.REQ+1,CSST
          STML   /SS/P.CURRQ+1,CSST
 .U       ENDIF
 SNDW10   BSS
          RJM    RESP        SEND RESPONSE TO CM
          RJM    RESPIN      UPDATE -IN- POINTER IN RESPONSE BUFFER
 .U       IFNE   UNIX,1
          LDN    0
          STML   RS+/RS/P.XFER  SET TRANSFER COUNT = 0 FOR ALL OTHER RESPONSES
          STML   RS+/RS/P.XFER+1
 .U       ENDIF
          LDML   NRQ+/RQ/P.NEXTPV  PUT PVA OF NEXT RESPONSE IN RESPONSE BUFFER
          STML   RS+/RS/P.PVA
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   RS+/RS/P.PVA+1
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   RS+/RS/P.PVA+2
 .U       IFEQ   UNIX,1
          LDML   /SS/P.CURRQ,CSST  SAVE RMA OF LAST RESPONSE RETURNED
          STML   /SS/P.PRERQ,CSST
          LDML   /SS/P.CURRQ+1,CSST
          STML   /SS/P.PRERQ+1,CSST
          LDML   NRQ+/RQ/P.NEXT  REQUESTS ARE DELINKED THROUGH CURRQ
          STML   /SS/P.CURRQ,CSST
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.CURRQ+1,CSST
 .U       ENDIF
          LOADF  NRQ+/RQ/P.NEXT  CM ADDRESS OF NEXT REQUEST
          CRML   NRQ,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
 .U       IFEQ   UNIX,1
          LDN    0
          STML   RS+/RS/P.SHORT  INDICATE ERROR RESPONSE
 .U       ENDIF
          LDC    RLIE
          STML   RS+/RS/P.RESPL BYTE LENGTH OF RESPONSE
          LDN    R.UNS       UNSOLICITED MESSAGE
          STML   RS+/RS/P.RC RESPONSE CODE
 .U       IFEQ   UNIX,1
          RJM    RESP        SEND RESPONSE TO CM
 .U       ELSE
          RJM    TERMP       SEND RESPONSE TO CM
 .U       ENDIF
          UJK    SNMSGX
          SPACE  5,20
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP TABLE LOCK IN THE
*            PP INTERFACE TABLE.
          SPACE  2
 SPLX     LJM    **
 SPLOCK   EQU    *-1
 .U       IFEQ   UNIX,1
 SPLOCK4  BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDN    1
          STDL   T4
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          RDSL   T1          ATTEMPT TO SET PP TABLE LOCK
          LDDL   T4
          LPN    1
          ZJK    SPLX        IF LOCK SET
          UJK    SPLOCK4
 .U       ELSE
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET THE LOCKWORD
          UJK    SPLX
 .U       ENDIF
          SPACE  5,20
** NAME-- SQLOCK
*
** PURPOSE-- SETS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
          SPACE  2
 SQLX     LJM    **
 SQLOCK   EQU    *-1
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          UJK    SQLX
          SPACE  5,20
** NAME-- 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    -3
          LPN    7
          LMDL   CMOD
          NJN    SRI5        IF DIFFERENT CONTROLLER
          LDML   UNITS,P1
          LPC    0#F7FF
          STML   UNITS,P1    CLEAR DRIVE RESERVE BIT
          LDML   UNITS+/UN/P.SSPTR,P1
          STDL   P2          POINTER TO SS TABLE
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,P1 SET CURRENT CLOCK
          LDN    3
          STML   /SS/P.RESET,P2 INDICATE RESET ISSUED
          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.
*            AFTER THE CM3 HAS PAUSED A TRANSFER, IT MAY SEND TRANSFER
*            NOTIFICATION, THEN DROP SLAVE IN IMMEDIATELY AND RETURN 90
*            HEX AS ENDING STATUS.  THIS INDICATES COMMAND COMPLETE.
*            THE RESPONSE PACKET SHOULD REPORT AN ERROR.  WITH THE 10 MB
*            CHANNEL SLAVE IN DROPS BEFORE THE PP TRANSFERS A WORD, SO
*            THE ERROR FLAG DOES NOT SET.  WITH THE 25 MB CHANNEL, THE
*            ERROR FLAG MAY SET BECAUSE THE TIME BETWEEN RAISING MASTER
*            OUT AND BEING ABLE TO SEND DATA IS MUCH FASTER.
          SPACE  2
 SRRX     BSS
          LCN    0
          STML   /SS/P.LISTL,CSST TO GUARANTEE AN ERROR IS REPORTED
          AOML   SRRC        ERROR COUNTER
          LJM    **
 SRR      EQU    *-1
          LDDL   STATUS
          LPN    60B
          LMN    20B
          ZJN    SRRX        IF NO MORE DATA
          LDN    E29         INCOMPLETE TRANSFER
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 SRRC     CON    0           ERROR COUNTER
          SPACE  5,20
** NAME-- SR
*
** PURPOSE-- SELECT REQUEST FROM UNIT QUEUE
*
** EXIT
*         A = 0 IF REQUEST FOUND
          SPACE  2
 SRX      LJM    **
 SR       EQU    *-1
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    SRX         IF LOCK NOT SET
          LDN    2
          STDL   P5
          LDDL   CNUM
          NJK    SR50        IF ONE COMMAND ALREADY ISSUED
          LDML   /SS/P.REQ,CSST
          ADML   /SS/P.REQ+1,CSST
          NJK    SR24        IF REQUEST PRESENT
          LOADR  UNITS+/UN/P.UIT,UX LOAD CM ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV
          CRML   NRQ,P5      READ FIRST PVA AND RMA
          LDML   NRQ+/RQ/P.NEXT
          STML   /SS/P.REQ,CSST
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.REQ+1,CSST
          ADML   /SS/P.REQ,CSST
          NJN    SR20        IF REQUEST ON QUEUE
 SR16     BSS
          RJM    CQLOCK CLEAR QUEUE LOCKWORD
          LDN    1           NO REQUEST FOUND
          UJK    SRX
 SR20     BSS
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA,CSST
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA+2,CSST
 SR24     BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDN    0           INDICATE REQUEST FOUND
          UJK    SRX
 SR50     BSS
          LDN    5
          STDL   WD
          LOADF  /SS/P.CURRQ,CSST
 SR54     BSS
          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 LOAD CM ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.NEXTPV
          CRML   NRQ,P5      READ FIRST PVA AND RMA
          LDML   NRQ+/RQ/P.NEXT
          STML   /SS/P.RMA2,CSST
          LMML   /SS/P.FCOMRQ,CSST
          NJN    SR75        IF REQUEST FOUND
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.RMA2+1,CSST
          LMML   /SS/P.FCOMRQ+1,CSST
          ZJK    SR16        IF NO REQUEST FOUND
 SR75     BSS
          LDML   NRQ+/RQ/P.NEXT+1
          STML   /SS/P.RMA2+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA2,CSST
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA2+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA2+2,CSST
          UJK    SR24
 SR80     BSS
          LDML   NRQ+/RQ/P.NEXTPV
          STML   /SS/P.PVA2,CSST
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   /SS/P.PVA2+1,CSST
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   /SS/P.PVA2+2,CSST
          LDML   NRQ+/RQ/P.SWIT
          SHN    /RQ/L.SWIT+2
          PJK    SR24        IF SWITCH FLAG NOT SET
          UJK    SR16
          SPACE  5,20
** NAME-- SRESP
*
** PURPOSE-- SET UP STATUS FOR RESPONSE BUFFER.
          SPACE  2
 SREX     LJM    **
 SRESP    EQU    *-1
          LDML   /SS/P.PVA,CSST SAVE PVA OF REQUEST
          STML   /SS/P.FPVA,CSST
          LDML   /SS/P.PVA+1,CSST
          STML   /SS/P.FPVA+1,CSST
          LDML   /SS/P.PVA+2,CSST
          STML   /SS/P.FPVA+2,CSST
*
          LDN    0
          STML   /SS/P.XFER,CSST TRANSFER COUNT
          STML   /SS/P.XFER+1,CSST
          UJK    SREX
          SPACE  5,20
** NAME-- STI
*
** PURPOSE-- SET TABLE INDEXES (UX AND CSST).  ALSO VERIFY THIS
*            IS THE CORRECT UNIT.
          SPACE  2
 STIX     LJM    **
 STI      EQU    *-1
          LDML   RPB+CRN
          LPC    777B
          STDL   UX          SET INDEX TO UNITS TABLE
          STDL   T8
          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
          LDDL   T8
          STDL   UX          SET INDEX TO UNITS TABLE
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        SET POINTER TO SS TABLE
          LJM    TERM10
          SPACE  5,20
** NAME-- TAC
*
** PURPOSE-- TERMINATE ALL COMMANDS ISSUED
          SPACE  2
 TACX     LJM    **
 TAC      EQU    *-1
          PAUSE  170000      DELAY 170 MILLISECONDS TO ALLOW MAX.
                              DATA IN BUFFER TO BE WRITTEN TO DISK
          AOML   /SS/P.RQTRY,CSST
          LDN    0
          STDL   CMOD        CONTROL MODULE NUMBER
          UJN    TAC15
 TAC10    BSS
          AODL   CMOD
          SBN    8
          ZJN    TACX        IF ALL COMMANDS TERMINATED
 TAC15    BSS
          LDN    0
          STDL   P5          RESET NOT ISSUED
          STDL   UX          POINTER TO UNITS TABLE
          UJN    TAC25
 TAC20    BSS
          LDN    P.UN
          RADL   UX          UPDATE POINTER TO UNITS TABLE
 TAC25    BSS
          SBDL   UNUML
          PJN    TAC10       IF END OF CONFIGURED UNITS
          LDML   UNITS,UX
          SHN    -/UN/N.UNIT
          LPN    7
          LMDL   CMOD
          NJN    TAC20       IF DIFFERENT CONTROL MODULE
          LOADR  UNITS+/UN/P.UIT,UX ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T1
          LDDL   T1+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2
          MJN    TAC20       IF UNIT DISABLED
          LDML   UNITS,UX
          SHN    2+/UN/L.CIP
          MJN    TAC40       IF COMMAND IN PROGRESS
          LDDL   PTF
          ZJN    TAC40       IF IN PATH TEST
          LDML   UNITS+/UN/P.SSPTR,UX
          STDL   CSST        POINTER TO SS TABLE
          LDML   /SS/P.CT,CSST
          NJN    TAC20       IF NOT IN CONFIDENCE TEST
 TAC40    BSS
          LDDL   P5
          NJN    TAC20       IF RESET ALREADY DONE
          RJM    LIR         LOGICAL INTERFACE RESET
          AODL   P5          RESET DONE FOR THIS CONTROLLER
          UJK    TAC20
          SPACE  5,20
** NAME-- TERM
*
** PURPOSE-- TERMINATE UNIT REQUEST.
          SPACE  2
 TERM     CON    0           NORMAL TERMINATION
          LDML   /SS/P.FNC,CSST
          SBN    4
          NJN    TERM2       IF NOT FORMAT COMMAND
          LDN    E58         FORMAT COMPLETE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDML   UNITS,UX
          SHN    -3
          LPN    17B
          STML   RS+/RS/P.UNIT  PORT, CONTROLLER, DRIVE ADDRESS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    0
          STML   FIP         CLEAR FORMAT IN PROGRESS FLAG
          STML   /SS/P.CT,CSST ENABLE STARTING CONFIDENCE TEST
          UJK    TERM20
 TERM2    LDML   /SS/MT,CSST MAKE SURE ALL BYTES WERE TRANSFERRED
          SHN    2
          PJN    TERM3       IF NOT USING MASTER TERMINATE
          LDML   /SS/P.LISTL,CSST
          UJN    TERM6
 TERM3    BSS
          SHN    -2
          ADML   /SS/P.TOTAL+1,CSST
          ADML   /SS/P.LISTL,CSST
 TERM6    BSS
          ADML   /SS/P.NUMCM,CSST
          ZJN    TERM20      IF TERMINATION IS OK
 TERM10   BSS
          LDK    E76         UNEXPECTED RESPONSE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 TERM20   BSS
          STML   /SS/P.RQTRY,CSST CLEAR RETRY COUNT
          RJM    PDR         PREPARE NORMAL DISK RESPONSE
          RJM    SNDWRS      SEND WRITE RESPONSES
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    DCR         DELETE COMPLETED REQUEST FROM QUEUE
          RJM    RESPIN      UPDATE 'IN' POINTER FOR RESPONSE BUFFER
          LJM    MAIN20
          SPACE  5,20
** NAME-- TERMP
*
** PURPOSE-- TERMINATE PP REQUEST.
          SPACE  2
 TERX     LJM    **
 TERMP    EQU    *-1
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          UJK    TERX
          SPACE  5,20
** NAME-- UBT
*
** PURPOSE-- UPDATE BYTES TRANSFERRED
*
** EXIT
*         A = 0 IF END OF REQUEST
          SPACE  2
 UBT10    BSS
          RJM    UNCMND      GET NEXT COMMAND
 UBTX     LJM    **
 UBT      EQU    *-1
          LDML   /SS/MT,CSST
          SHN    2
          MJN    UBT5        IF USING MASTER TERMINATE
          LDML   /SS/P.TOTAL+1,CSST
          SBDL   WDS         NUMBER OF CM WORDS TRANSFERRED THIS LOOP
          STML   /SS/P.TOTAL+1,CSST
          PJN    UBT5        IF NOT NECESSARY TO ADJUST SECOND WORD
          ADC    200000B     ADD CARRY BIT
          STML   /SS/P.TOTAL+1,CSST
          SOML   /SS/P.TOTAL,CSST SUBTRACT CARRY BIT FROM FIRST WORD
          PJN    UBT5        IF MORE TO TRANSFER
          LDC    E505        CM HAS CHANGED
          RJM    INTERR      REPORT ERROR (NO RETURN)
 UBT5     BSS
          LDDL   WDS         CM WORDS TRANSFERRED
          SHN    3
          STDL   T1          BYTES TRANSFERRED
          RAML   /SS/P.XFER+1,CSST UPDATE BYTES TRANSFERRED
          SHN    -16
          RAML   /SS/P.XFER,CSST
          LDDL   T1
          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   T1
          STML   CMLIST+/CM/P.LEN,CSST
          NJN    UBT8        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
          LDN    1
 UBT8     BSS
          UJK    UBTX
          SPACE  5,20
** NAME-- UC
*
** PURPOSE-- UPDATE CLOCK.  THE CLOCK IS USED TO TIMEOUT COMMANDS
*            ISSUED TO THE CONTROL MODULE.
          SPACE  2
 UCX      LJM    **
 UC       EQU    *-1
          LDDL   CLCUR
          STDL   P6          SAVE CURRENT CLOCK
          IAN    14B
          STDL   CLCUR
          SBDL   P6
          PJN    UC5         IF CLOCK HASNT WRAPPED
          ADC    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     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-- 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 GETRQ DOES NOT LOCK THE
*            QUEUE FOR PERFORMANCE REASONS, SO THE CP AND PP COULD
*            BE CHANGING THE QUEUE AT THE SAME TIME.
*
* INPUT--
*         CSST = POINTER TO SS TABLE
*
** OUTPUT-- RQ  CONTAINS CURRENT REQUEST.
*           FRST = 0
*           NUMCM = NUMBER OF COMMANDS.
          SPACE  2
 UREQX    LJM    **
 UREQ     EQU    *-1
          LDN    0
          STML   /SS/P.FRST,CSST SET FLAG WHEN REQUEST IS READ
          LDN    3           NUMBER OF WORDS TO READ
          STDL   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
          SPACE  5,20
** NAME-- VCTD
*
** PURPOSE-- VERIFY CONFIDENCE TEST DATA
          SPACE  2
 VCTDX    LJM    **
 VCTD     EQU    *-1
          LDN    0
          STDL   P1
          LDML   /SS/P.CURTRK,CSST
          SHN    8
          ADML   /SS/P.CURSEC,CSST
          STDL   P2          PUT CURRENT TRACK, SECTOR IN ONE WORD
          LDDL   CSST
          STDL   P3
 VCTD5    BSS
          LDML   CTME,P3     ADDRESS IN TABLE
          LMDL   P2          CURRENT ADDRESS
          ZJK    VCTDX       IF SECTOR NOT WRITTEN
          AODL   P3
          AODL   P1
          LMN    3
          NJN    VCTD5       IF MORE TABLE LOCATIONS TO CHECK
          LDML   SPC,DT      SECTORS PER CYLINDER
          SBML   STT,CSST    SECTOR NUMBER
          SHN    2
          ADDL   CTPAT       CONFIDENCE TEST PATTERN FIRST WORD MINUS ONE
          STDL   P1          STARTING DATA PATTERN VALUE MINUS ONE
          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
          LMC    WPS
          NJN    VCTD10      IF MORE WORDS TO VERIFY
          LJM    VCTDX
 VCTD20   BSS
          LDK    E111        CM-DRIVE DATA INTEGRITY
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          LDN    4
          STML   /SS/P.CT,CSST INDICATE DATA INTEGRITY ERROR
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- VPTD
*
** PURPOSE-- VERIFY PATH TEST DATA
          SPACE  2
 VPTDX    LJM    **
 VPTD     EQU    *-1
          LDN    0
          STDL   T1          INDEX TO BUFFER
 VPTD4    BSS
          LDML   IB,T1       WORD FROM INPUT BUFFER
          LMML   OB,T1       WORD FROM OUTPUT BUFFER
          NJN    VPTD10      IF ERROR
          AODL   T1
          SBN    50
          ZJN    VPTDX       IF VERIFY OK
          UJN    VPTD4       MORE WORDS TO CHECK
 VPTD10   BSS
          LDK    E110        PP-CM3 DATA INTEGRITY
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- WA6F
*
** PURPOSE-- WRITE ATTRIBUTE PARAMETER 6F
*
** ENTRY  CP+SLAD MUST BE SET
*
** EXIT   TO CALLING PROGRAM IF NO ERROR
          SPACE  2
 WA6FX    LJM    **
 WA6F     EQU    *-1
          LDN    0#2E
          STML   CP          COMMAND PACKET LENGTH
          LDC    H0209
          STML   CP+OPCD     LOAD OPERATING MODE COMMAND
 WA6F10   BSS
          LDML   RPB+5,T1    MOVE COMMAND PACKET
          STML   CP+4,T1
          AODL   T1
          LMN    20
          NJN    WA6F10
          RJM    CPT         COMMAND PACKET TRANSFER
          RJM    IH          INTERRUPT HANDLER
          LMN    CCS
          ZJN    WA6FX       IF NO ERROR
          LDN    E00         CP MUST DETERMINE THE ERROR COD
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          TITLE  IPI CHANNEL SUBROUTINES
** NAME-- BCS
*
** PURPOSE-- PERFORM BUS CONTROL SEQUENCE
*
** INPUT
*         A = BUS A BITS 7,6 IN BITS 1,0 OF ACCUMULATOR
*             BIT 7 = 1 IF DATA ELSE RESPONSE OR COMMAND
*             BIT 6 = 1 IF INFORMATION IN
          SPACE  2
 BCSX     LJM    **
 BCS      EQU    *-1
          SHN    14
          ADC    H005B
          RJM    FUNC        SET SYNC OUT
          ACN    DC
          LDN    77B
 BCS4     FJM    BCS8,DC     IF SYNC IN
          SBN    1
          NJN    BCS4        IF TIMEOUT NOT EXPIRED
          LDN    E22         NO SYNC IN
          UJN    BCS20
 BCS8     IAN    DC
          STDL   STATUS      SAVE BUS ACKNOWLEDGE STATUS
          SFM    BCS25,DC    IF ERROR FLAG SET
          LPC    0#FF
          NJN    BCS16       IF BUS ACKNOWLEDGE IS WRONG
          LDDL   LF          LAST FUNCTION
          LMN    0#32
          RJM    FUNC        DROP SYNC OUT
          ACN    DC
          LDN    77B
 BCS12    FJM    BCSX,DC     IF SYNC IN DROPPED
          SBN    1
          NJN    BCS12       IF TIMEOUT NOT EXPIRED
          LDN    E23         SYNC IN DID NOT DROP
          UJN    BCS20
 BCS16    BSS
          LDN    E37         BUS ACKNOWLEDGE WRONG
 BCS20    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 BCS25    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,15
** NAME-- CPT
*
** PURPOSE-- COMMAND PACKET TRANSFER
*
** INPUT
*         CP - STARTING ADDRESS OF COMMAND PACKET
          SPACE  2
 CPT30    BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
          RJM    DCM         DESELECT THE CONTROL MODULE
          LDDL   WC
          ZJN    CPTX        IF ALL WORDS TRANSFERRED
          LDN    E29         INCOMPLETE TRANSFER
          UJK    CPT10
 CPTX     LJM    **
 CPT      EQU    *-1
 .K       IFEQ   KH,1        COMMAND HISTORY
 HB       EQU    20000B
          LCN    0           INDICATE COMMAND
          STML   HB,HBP
          LDML   CP+1        COMMAND REFERENCE NUMBER
          STML   HB+1,HBP
          LDML   CP+OPCD     COMMAND
          STML   HB+2,HBP
          LDML   CP+3        UNIT
          STML   HB+3,HBP
          LDML   CP+6        SECTOR COUNT
          STML   HB+4,HBP
          LDML   CP+7        CYLINDER
          STML   HB+5,HBP
          LDML   CP+8        HEAD, SECTOR
          STML   HB+6,HBP
          LDN    8
          RAD    HBP         UPDATE HISTORY BUFFER POINTER
 .K       ENDIF
          RJM    SEL         SELECT THE CONTROLLER
          LDN    CMDOUT      BUS A FOR COMMAND
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0381       STREAM, WRITE
          RJM    FUNC        RAISE MASTER OUT
          ACN    DC
          LDML   CP
          ADN    3
          SHN    -1          CONVERT BYTE COUNT TO WORD COUNT
          OAM    CP,DC       SEND COMMAND PACKET
          STDL   WC          WORDS NOT TRANSFERRED
          LDDL   CLSEC
          STML   UNITS+/UN/P.CLK,UX SET CURRENT CLOCK
          LDC    MS50
 CPT4     IJM    CPT30,DC    IF SLAVE IN DROPPED
          SBN    1
          NJN    CPT4        IF TIMEOUT NOT EXPIRED
          LDN    E30         CHANNEL STAYED ACTIVE
 CPT10    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,15
** NAME-- DCM
*
** PURPOSE-- DESELECT THE CONTROL MODULE
          SPACE  2
 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    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,15
** NAME-- DTM
*
** PURPOSE-- DETERMINE TRANSFER MODE
*
** OUTPUT
*         STATUS - TRANSFER SETTINGS, BIT 4 = 1 IF DATA STREAMING
*         CTM - USED TO CHANGE TRANSFER MODE WHEN SELECTING
          SPACE  2
 DTMX     LJM    **
 DTM      EQU    *-1
          LDDL   CMOD        CONTROL MODULE 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     IAN    DC
          STDL   STATUS      SAVE TRANSFER SETTING
          SFM    DTM20,DC    IF ERROR FLAG SET
          LPN    0#10
          LMN    0#10
          SHN    7
          STDL   CTM         CHANGE TRANSFER MODE BIT
          LDDL   LF          LAST FUNCTION ISSUED
          LMC    0#54        CODE 7, DROP MASTER OUT
          RJM    FUNC        DROP MASTER OUT
          ACN    DC
          LDN    77B
 DTM12    FJM    DTMX,DC     IF SLAVE IN DROPPED
          SBN    1
          NJN    DTM12       IF TIMEOUT NOT EXPIRED
          LDN    E28         SLAVE IN DID NOT DROP
 DTM16    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 DTM20    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- EI
*
** PURPOSE-- ENABLE INTERRUPT FROM CM3.  SINCE IT TAKES UP TO
*            20 MICROSECONDS FOR THE CM3 TO PUT ITS INTERRUPT
*            ON THE BUS, THE ENABLE IS DONE HERE AND THE READ
*            IS DONE IN GETUD
          SPACE  2
 EIX      LJM    **
 EI       EQU    *-1
          LDDL   UNUML
          ZJN    EIX         IF NO 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, BUT DONT
*            PUT THE FUNCTION IN THE FUNCTION HISTORY TABLE
          SPACE  2
 FANX     LJM    **
 FAN      EQU    *-1
          DCN    DC+40B      ENSURE THE CHANNEL IS INACTIVE
                              THE CHANNEL MAY HAVE BEEN LEFT ACTIVE
                              BY A MASTER CLEAR, A ROUTINE SUCH AS
                              DCM, OR AFTER A REPORTED ERROR.
          FAN    DC          SEND THE FUNCTION
          UJN    FANX
          SPACE  5,20
** NAME-- FUNC
*
** PURPOSE-- ISSUE FUNCTION TO IPI CHANNEL
*
** INPUT-- A REGISTER = FUNCTION CODE.
          SPACE  2
 FUNX     LJM    **
 FUNC     EQU    *-1
          DCN    DC+40B      ENSURE CHANNEL IS INACTIVE
                              THE CHANNEL MAY HAVE BEEN LEFT ACTIVE
                              BY A MASTER CLEAR, A ROUTINE SUCH AS
                              DCM, OR AFTER A REPORTED ERROR.
          FAN    DC          ISSUE THE FUNCTION
          STDL   LF          SAVE FUNCTION CODE
          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    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- GES
*
** PURPOSE-- GET ENDING STATUS
*
** ENTRY
*         A = 0000  DO ENDING STATUS WITHOUT MASTER TERMINATE
*             000A  DO ENDING STATUS WITH MASTER TERMINATE
** OUTPUT
*         RETURNS TO CALLING PROGRAM IF STATUS IS READ WITHOUT ERROR
*         AND SUCCESSFUL IS SET IN STATUS
          SPACE  2
 GESX     LJM    **
 GES      EQU    *-1
          SHN    8
          ADC    H8039       INDICATE SUCCESSFUL IN BUS A
          RJM    FUNC        DROP MASTER OUT
          ACN    DC
          LDC    1280
 GES4     FJM    GES8,DC     IF SLAVE IN SET
          SBN    1
          NJN    GES4        IF TIMEOUT NOT EXPIRED
          LDN    E27         SLAVE IN NOT SET
          UJK    GES30
 GES8     IAN    DC
          STDL   STATUS      SAVE ENDING STATUS
          SFM    GES40,DC    IF ERROR FLAG SET
          SHN    17-7
          MJN    GESX        IF SUCCESSFUL
          LDDL   STATUS
          SHN    11
          PJN    GES15       IF NOT BUS PARITY
          LDK    E34
          UJK    GES30
 GES15    BSS
          LDDL   STATUS
          LPN    17B
          ZJK    GES25       IF REPORTING -ENDING STATUS WRONG-
          SBN    1
          NJN    GES18       IF NOT BUS CONTROL REJECTED
          LDDL   TBC
          ZJK    GES25       IF REPORTING -ENDING STATUS WRONG-
          LDN    0
          STDL   TBC         INDICATE NOT EXPECTING 01 STATUS
          RJM    DCM         DESELECT CONTROL MODULE
          LDDL   CLSEC
          SBML   UNITS+/UN/P.CLK,UX
          PJN    GES16       IF CLOCK HASNT WRAPPED
          ADC    0#10000
 GES16    BSS
          SBN    32          COMMAND TIMEOUT OF APPROXIMATELY 32 SECONDS
          PJN    GES24       IF TIMEOUT
          LJM    MAIN15      TRANSFER NOTIFICATION OCCURRED BEFORE
                              THE COMPLETION RESPONSE, WAIT FOR
                              THE COMPLETION RESPONSE
 GES18    BSS
          SBN    8
          NJN    GES20       IF NOT -SYNC OUTS NOT EQUAL SYNC INS-
          LDK    E36
          UJN    GES30
 GES20    BSS
          PJN    GES23       IF NOT COMMAND REJECT
          ADN    6
          NJN    GES21       IF NOT CLASS 3 RESPONSE PRESENT
          RJM    RPT         READ RESPONSE PACKET
*         LDN    E00         RESPONSE MUST BE EVALUATED TO DETERMINE ERROR CODE
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          RJM    RESPIN      UPDATE IN POINTER FOR RESPONSE BUFFER
 GES21    BSS
          LDK    E35
          UJN    GES30
 GES23    BSS
          SBN    2
          NJN    GES25       IF NOT INTERNAL CONTROLLER ERROR
          LDK    E70
          UJN    GES30
 GES24    BSS
          LDN    E38         NO CONTROLLER RESPONSE
          UJN    GES30
 GES25    BSS
          LDN    E39         ENDING STATUS WRONG
 GES30    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 GES40    BSS
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- IR
*
** PURPOSE-- ISSUE INTERFACE RESET TO CM3
*
** ENTRY
*         A = 8215  FOR LOGICAL INTERFACE RESET
*             8415  FOR SLAVE RESET
*         CMOD = CONTROL MODULE NUMBER
          SPACE  2
 IRX      LJM    **
 IR       EQU    *-1
          STDL   P2
          RJM    MCC         MASTER CLEAR CHANNEL
          LDDL   CMOD        CONTROL MODULE 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-- RI
*
** PURPOSE-- REQUEST INTERRUPTS FROM THE CM3
*
** OUTPUT
*         STATUS - CONTAINS BIT SIGNIFICANT ADDRESS OF CM3 WITH INTERRUPT
          SPACE  2
 RIX      LJM    **
 RI       EQU    *-1
 .U       IFEQ   UNIX,1
          RJM    PPRQ        CHECK FOR IDLE REQUEST
 .U       ENDIF
          LDC    H0715       REQUEST CLASS 1, 2, OR 3 INTERRUPT
          RJM    FUNC        BUS A, MASTER OUT
          PAUSE  20          DELAY
          ACN    DC
          EJM    RI5,DC      IF ERROR
          IAN    DC
          STDL   STATUS      SAVE BIT SIGNIFICANT ADDRESS
          LDC    H0711
          RJM    FUNC        DROP MASTER OUT
          CFM    RIX,DC      IF ERROR FLAG NOT SET
          RJM    EFP         ERROR FLAG PROCESSING (NO RETURN)
 RI5      BSS
          LDN    E02         CHANNEL EMPTY WHEN ACTIVATED
          RJM    PCER        PREPARE COMMAND ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
          SPACE  5,20
** NAME-- RPT
*
** PURPOSE-- RESPONSE PACKET TRANSFER
*
** OUTPUT
*         RPB - STARTING LOCATION OF RESPONSE PACKET
*         (A) = 0
          SPACE  2
 RPT20    BSS
          STDL   WC          SAVE WORDS NOT TRANSFERRED
 RPT30    BSS
          LDN    0           NO MASTER TERMINATE
          RJM    GES         GET ENDING STATUS
 .K       IFEQ   KH,1        RESPONSE HISTORY
          LCN    77B         INDICATE RESPONSE
          STML   HB,HBP
          LDML   RPB+1       COMMAND REFERENCE NUMBER
          STML   HB+1,HBP
          LDML   RPB+2       COMMAND
          STML   HB+2,HBP
          LDML   RPB+3       UNIT
          STML   HB+3,HBP
          LDML   RPB+4       MAJOR STATUS
          STML   HB+4,HBP
          LDN    8
          RAD    HBP         UPDATE HISTORY BUFFER POINTER
 .K       ENDIF
          LDDL   WC
          ZJN    RPTX        IF ALL WORDS TRANSFERRED
          LDN    E29         INCOMPLETE TRANSFER
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
 RPTX     LJM    **
 RPT      EQU    *-1
          LDN    RSPIN       BUS A FOR RESPONSE
          RJM    BCS         BUS CONTROL SEQUENCE
          LDC    H0281       STREAM, READ
          RJM    FUNC        SET MASTER OUT
          ACN    DC
          LDN    5
          IAM    RPB,DC      INPUT REQUIRED WORDS
 RPT2     BSS
          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
          LPC    377B        PROTECT AGAINST ILLEGAL 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 CONTROL MODULE AND VERIFY THE BIT SIGNIFICANT
*            RESPONSE
*
** INPUT
*         CMOD - CONTROL MODULE NUMBER
*         CTM - CHANGE TRANSFER MODE IF BIT 3 SET
*
** OUTPUT-- A = 0 IF NO ERROR
          SPACE  2
 SELX     LJM    **
 SEL      EQU    *-1
          LDDL   CMOD
          SHN    12
          ADDL   CTM         CHANGE TRANSFR MODE MODIFIER
          ADN    H0029
          RJM    FUNC        SET SELECT OUT
          ACN    DC
          LDN    77B
 SEL4     FJM    SEL8,DC     IF SLAVE IN
          SBN    1
          NJN    SEL4        IF TIMEOUT NOT EXPIRED
          LDN    E20         CANT SELECT CM3
          UJN    SEL15
 SEL8     IAN    DC
          STDL   STATUS      SAVE BIT SIGNIFICANT RESPONSE
          LPC    377B
          LMML   SELT,CMOD
          ZJK    SELX        IF BIT SIGNIFICANT RESPONSE CORRECT
          LDN    E21         BIT SIGNIFICANT RESPONSE WRONG
 SEL15    BSS
          RJM    PCER        PREPARE COMMON ERROR RESPONSE
          RJM    EP          ERROR PROCESSING (NO RETURN)
*
 SELT     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-- INIT
*
** PURPOSE-- INITIALIZE THE DRIVER
*
** INPUT-- CM.PIT = CM BYTE-ADDRESS OF THE PP INTERFACE TABLE.
          SPACE  2
 INITX    LJM    **
 INIT     EQU    *-1
          LDK    EOM-CP      LENGTH OF BUFFERS
          STDL   T1
 INIT4    BSS
          LDN    0
          STML   CP-1,T1     ZERO OUT BUFFERS
          SODL   T1
          NJN    INIT4
          STDL   UX          INITIALIZE DIRECT CELLS
          STDL   LUX
          STML   FIP
          STDL   MALET
          STDL   P4
          STDL   P5
          STDL   P6
          STDL   PTF         PATH TEST 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 PP NUMBER
          STDL   PPNO
          REFAD  IPIT+/PIT/P.RSBUF,CM.RS  REFORMAT CM ADDRESS OF RESPONSE
                                          BUFFER AND SAVE IN CM.RS
          LDML   IPIT+/PIT/P.LIMIT  GET LIMIT OF RESPONSE BUFFER
          STDL   LIM
          REFAD  IPIT+/PIT/P.INT,CM.INT  REFORMAT CM ADDRESS OF INTERRUPT
                                         WORD AND SAVE IN CM.INT
          REFAD  IPIT+/PIT/P.CHAN,CM.CHAN  REFORMAT CM ADDRESS OF
                                           CHANNEL TABLE AND SAVE IN CM.CHAN
          REFAD  IPIT+/PIT/P.CBUF,CM.CB  REFORMAT ADDRESS OF COMMUNICATION
                                         BUFFER AND SAVE IN CM.CB
          LDN    /CB/C.BUF
          RAML   CM.CB+1     DISPLACEMENT TO READ/WRITE BUFFER
          LDML   IPIT+/PIT/P.CBUFL  GET LENGTH OF COMMUNICATION BUFFER
          ADC    -P.CB*2
          PJN    INIT8       IF COMMUNICATIONS BUFFER LONG ENOUGH
          LDC    E20B
          RJM    INTERR      REPORT ERROR (NO RETURN)

* INITIALIZE UNITS AND SS TABLES

 INIT8    BSS
          LDML   IPIT+/PIT/P.UNITC NUMBER OF UNIT DESCRIPTIORS
          SHN    1
          STDL   T8          LENGTH OF UNIT DESCRIPTOR (CM WORDS)
          ZJK    INIT30      IF NO UNIT DESCRIPTORS
 INIT10   BSS
          LDN    C.UD        READ 2 CM WORDS
          STDL   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    INIT25      IF NULL ENTRY

          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    INIT25      IF UNIT DISABLED
          LDML   UNITS+/UN/P.UIT+1,UX INITIALIZE DELINK POINTER TO FIRST
          ADN    /UIT/C.NEXTPV       REQUEST IN QUEUE
          STML   SS+/SS/P.DP+1,P4
          LDML   UNITS+/UN/P.UIT,UX
          STML   SS+/SS/P.DP,P4
          LDML   UBUF+/UIT/P.UTYPE  CHECK DEVICE TYPE
          LPN    77B
          SBN    7
          MJN    INIT15      IF INVALID UNIT TYPE
          SBN    3
          MJN    INIT20      IF VALID UNIT TYPE
 INIT15   BSS
          LDC    E306        INVALID UNIT TYPE
          RJM    INTERR      REPORT ERROR (NO RETURN)
 INIT20   BSS
          ADN    3
          SHN    4
          STML   SS+/SS/P.DT,P4 DEVICE TYPE, 0=9836 1=9853, 2=EMD5
          LDML   IBUF+/UD/P.CHAN  GET CHANNEL FROM UNIT DESCRIPTOR
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    77B
          STDL   CHAN        CHANNEL NUMBER

          LDML   IBUF+/UD/P.UNIT
          LPN    7
          RAML   SS+/SS/P.UNIT,P4
          STML   UNITS,UX
          LDML   IBUF+/UD/P.CNTRLR
          LPN    7
          STDL   T1
          SHN    8
          RAML   SS+/SS/P.UNIT,P4  PUT UNIT IN SS TABLE
          LDDL   T1
          SHN    /UN/N.UNIT
          RAML   UNITS,UX    PUT UNIT IN UNITS TABLE
          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN SS TABLE
          STML   SS+/SS/P.LU,P4
          LDC    SS
          ADDL   P4
          STML   UNITS+1,UX  POINTER FROM UNITS TABLE TO SS TABLE
          LDC    P.SS
          RADL   P4          INCREMENT TO NEXT RESIDENT SS TABLE

* BUMP TO NEXT ENTRY.

          AODL   P5          NUMBER OF CONFIGURED UNITS
          LDN    P.UN
          RADL   UX          BUMP CONFIGURED UNIT INDEX
 INIT25   BSS
          LDN    C.UD
          RADL   P6          BUMP TO NEXT UNIT DESCRIPTOR ENTRY
          SBDL   T8          CHECK FOR END OF UNIT DESCRIPTORS
          ZJN    INIT30      IF NO MORE UNIT DESCRIPTORS
          LDDL   P5
          ADC    -UNUM
          NJK    INIT10      IF 64 OR LESS UNITS
          LDC    E208        TOO MANY CONFIGURED UNITS
          RJM    INTERR      REPORT ERROR (NO RETURN)
 INIT30   LDDL   UX
          STDL   UNUML       END OF ACTIVE UNIT TABLE
          RJM    CHGCH       SET CHANNEL INSTRUCTIONS
          LJM    INITX
          SPACE  5,20
 CP       BSS    24          COMMAND PACKET FOR CM3
 STORS    BSS    1           STORE RESPONSE FLAG (USED BY RESPIN)
                               = 0, IF A RESPONSE IS SENT TO CM
                               = NONZERO, IF NO RESPONSE WAS SENT TO CM
 FBUF     BSS    16          FUNCTION HISTORY BUFFER
 FBUFL    EQU    *-FBUF      LENGTH OF FUNCTION BUFFER
          SPACE  2
 UNUM     EQU    64          SUPPORT 64 UNITS
 UNITS    BSS    UNUM*P.UN   RMA OF UNIT INTERFACE TABLE
 SS       BSS    P.SS        INFORMATION SAVED IN UNIT COMMUNICATION BUFFER
 NSS      EQU    RS-SS
 NSST     EQU    NSS/P.SS    NUMBER OF SS TABLES
 RSST     EQU    NSST-1      SS TABLES FOR UNITS
 RSSTL    EQU    RSST*P.SS
 SSNR     EQU    SS+RSSTL    CHANGEABLE SS TABLE
          ERRMI  NSST-65     IF NO ROOM FOR SS TABLES
          END
/EOR
