*copyc IODMAC1 "{RECORD DEFINITION MACROS}
*copyc IODMAC2 "{LOAD/STORE MACROS}
*copyc IODMAC3 "{GENERAL MACROS}
*copyc IODMAC4 "{GENERAL MACROS}
*copyc IODMAC5 "{OVERLAY MACROS}
          EJECT
* DEFINE HARDW EQU 1, TO RUN ON THE HARDWARE.  .NE. 1, FOR SIMULATOR.

 HARDW    EQU    1           TO RUN ON THE HARDWARE
 SHARED   EQU    1           = 1, TO SHARE THE CONTROLLER
 MULT     EQU    0           = 1, IF MULTIPLE CONTROLLERS ON 1 PP
 ICHK     EQU    0           =1, TO CHECK HARDWARE DURING INITIALIZATION
 OFFU     EQU    0           =1, TO SUPPORT OFF UNIT, ON UNIT, COMMANDS
 RAM      EQU    0           =1, TO DETERMINE IF RAM PARITY ERROR
 LARGE    EQU    0           =1, TO INITIALIZE A UNIT WITH LARGE SECTORS
 SMALL    EQU    0           =1, TO INITIALIZE AN 844 WITH SMALL SECTORS
 IN844    EQU    0           =1, TO INITIALIZE AN 844 UNIT
                             .NE. 1, TO INITIALIZE AN 885 UNIT
 DUMP     EQU    0           =1, TO DUMP CONTROLWARE ON FUNCTION TIMEOUT
 PAT      EQU    0           =1, TO PATCH THE PP
 VER      EQU    2           READ FLAW SIMULATOR VERSION
 ERRTST   EQU    0           = 1, TO TEST ERROR HANDLING CODE
 ATST     EQU    0           = 1, TO TEST AUTOMATIC ERROR HANDLING CODE
 ETST     EQU    0           TEMPORARY


* EQUATES

 DC       EQU    22B         DISK CHANNEL
 SBYTE7   EQU    1376        NUMBER OF 12-BIT BYTES PER SECTOR
 SBYTE8   EQU    1032        NUMBER OF 16-BIT BYTES PER SECTOR
 CTLN     EQU    1           NUMBER OF CONTROLWARE WORDS TO READ INTO BUFFER
 STRY     EQU    40          NUMBER OF ATTEMPTS TO RECOVER A SEEK ERROR
 CNTRY    EQU    3           NUMBER OF ATTEMPTS TO LOAD CONTROLWARE
 CTRY     EQU    3           NUMBER OF ATTEMPTS TO RECOVER A CHANNEL ERROR
 RVTRY    EQU    10          LIMIT OF RECOVERED ERRORS PER REQUEST
 SCTRY    EQU    3           NUMBER OF ATTEMPTS TO RETRY A SECTOR
 UTRY     EQU    3           NUMBER OF ATTEMPTS TO CLEAR UNIT RESERVE
                               ON OPPOSITE ACCESS

* DISK FUNCTIONS

 F.MC     EQU    100000B     MASTER CLEAR THE 170 CIO CHANNEL ADAPTOR
 F.CONECT EQU    0           CONNECT
 F.SEEK   EQU    1           SEEK
 K.CPRES  EQU    4000B       CLEAR PHYSICAL RESERVE ON UNIT
 K.CLRES  EQU    400B        CLEAR LOGICAL RESERVE ON UNIT
 F.READ   EQU    4           READ
 F.WRITE  EQU    5           WRITE
 F.WRITEV EQU    6           WRITE VERIFY
 F.OPCMP  EQU    10B         OPERATION COMPLETE
 F.GS     EQU    12B         GENERAL STATUS
 F.DS     EQU    13B         7ETAILED STATUS
 F.CONT   EQU    14B         CONTINUE
 F.DRPSK  EQU    15B         DROP SEEKS
 F.RSEC   EQU    17B         RETURN SECTOR ADDRESS
 F.RCYL   EQU    21B         RETURN CYLINDER ADDRESS
 F.EDS    EQU    23B         EXTENDED DETAILED STATUS
 F.READFD EQU    30B         READ FACTORY DATA
 F.READUM EQU    31B         READ UTILITY MAP
 F.READPS EQU    34B         READ PROTECTED SECTOR
 F.WRITEL EQU    35B         WRITE LAST SECTOR
 F.WRITVL EQU    36B         WRITE VERITY LAST SECTOR
 F.CLEAR  EQU    42B         CLEAR CONNECTED ACCESS
 F.WRBUF  EQU    46B         WRITE BUFFER TO DISK
 F.CHST   EQU    52B         INPUT PROCESSOR CHANNEL STATUS
 F.AUTDP  EQU    61B         AUTODUMP
 F.ERROR  EQU    66B         FORCE ERROR
 F.AUTOD  EQU    100B        AUTOLOAD FROM DISK
 F.AUTOP  EQU    414B        AUTOLOAD FROM PP

* DETAILED STATUS FROM DISK.

 P.WRDAD  EQU    13          PP WORD ADDRESS OF CORRECTABLE READ ERROR
 P.VECT1  EQU    14          FIRST WORD OF 2-WORD CORRECTION VECTOR
 P.VECT2  EQU    15          2ND WORD OF 2-WORD CORRECTION VECTOR
          SPACE  6
* INTERNAL DEVICE CODES
 DT844    EQU    0           844-4X DEVICE TYPE
 DT885.1  EQU    1           885-1X DEVICE TYPE
          EJECT
* INTERFACE ERROR CODES.
          SPACE  6
 E101     EQU    401B        PP REQUEST QUEUE LOCKWORD TIMEOUT
 E102     EQU    402B        UNIT REQUEST QUEUE LOCKWORD TIMEOUT
 E103     EQU    403B        UNIT LOCKWORD TIMEOUT
 E104     EQU    404B        CHANNEL LOCKWORD TIMEOUT
 E105     EQU    405B        BUFFER POOL LOCKWORD TIMEOUT
 E106     EQU    406B        UNIT HARDWARE RESERVE TIMEOUT
 E107     EQU    407B        CONTROLLER HARDWARE RESERVE TIMEOUT
 E201     EQU    1001B       RMA OF CHANNEL RESERVATION TABLE NOT
                             A WORD BOUNDARY
 E202     EQU    1002B       RMA OF UNIT ACTIVITY MASK NOT A
                             WORD BOUNDARY
 E203     EQU    1003B       RMA OF PP COMMUNICATION BUFFER NOT A
                             WORD BOUNDARY
 E204     EQU    1004B       RESERVED FIELD OF THE PP COMMUNICATION
                             BUFFER DESCRIPTOR IS NOT ZERO
 E205     EQU    1005B       RESERVED FIELD OF THE PP REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
 E206     EQU    1006B       RMA OF NEXT PP NOT A WORD BOUNDARY
 E207     EQU    1007B       RESERVED FIELD OF THE PP RESPONSE
                             BUFFER DESCRIPTOR IS NOT ZERO
 E208     EQU    1010B       LOGICAL UNIT OF UNIT DESCRIPTOR NOT
                             IN SEQUENCE OR NOT IN RANGE
 E209     EQU    1011B       RMA OF UNIT INTERFACE TABLE NOT A
                             WORD BOUNDARY
 E20A     EQU    1012B       INVALID CHANNEL NUMBER SPECIFIED
                             IN UNIT DESCRIPTOR
 E20B     EQU    1013B       COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF WORDS OR NOT LONG ENOUGH
 E20C     EQU    1014B       RESERVED FIELD AFTER NUMBER OF
                             UNITS IS NOT ZERO
 E20D     EQU    1015B       RESERVED FIELD OF IN POINTER
                             IS NOT ZERO
 E20E     EQU    1016B       RESERVED FIELD OF OUT POINTER
                             IS NOT ZERO
 E20F     EQU    1017B       RESERVED FIELD OF LIMIT POINTER
                             IS NOT ZERO
 E210     EQU    1020B       INVALID PHYSICAL UNIT NUMBER
 E211     EQU    1021B       RMA OF INTERRUPT WORD NOT A WORD
                             BOUNDARY
 E212     EQU    1022B       RMA OF CHANNEL TABLE NOT A WORD
                             BOUNDARY
 E213     EQU    1023B       CONTROLWARE IS NOT PRESENT IN THE
                             PP COMMUNICATION BUFFER
 E301     EQU    1401B       LOGICAL UNIT NUMBER NOT EQUAL TO LOGICAL
                             UNIT OF UNIT DESCRIPTOR
 E302     EQU    1402B       RMA OF UNIT COMMUNICATION BUFFER
                             NOT A WORD BOUNDARY
 E303     EQU    1403B       A RESERVED FIELD OF THE UNIT COMMUNICATION BUFFER
                             DESCRIPTOR IS NOT ZERO
 E304     EQU    1404B       RMA OF NEXT UNIT REQUEST
                             NOT A WORD BOUNDARY
 E305     EQU    1405B       RESERVED FIELD OF UNIT REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
 E306     EQU    1406B       INVALID UNIT TYPE
 E307     EQU    1407B       UNIT COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF CM WORDS
 E308     EQU    1410B       UNIT COMMUNICATION BUFFER IS TOO SMALL
 E401     EQU    2001B       RMA OF NEXT REQUEST NOT A WORD BOUNDARY
 E402     EQU    2002B       REQUEST LENGTH NOT A MULTIPLE
                             OF EIGHT BYTES
 E403     EQU    2003B       REQUEST LENGTH IS LESS THAN FORTY BYTES
 E404     EQU    2004B       LOGICAL UNIT NUMBER NOT EQUAL TO LOGICAL
                             UNIT IN UNIT INTERFACE TABLE
 E405     EQU    2005B       RESERVED LINKAGE FIELD IS NOT ZERO
 E406     EQU    2006B       INVALID RECOVERY/INTERRUPT SELECTIONS
 E407     EQU    2007B       INVALID PRIORITY SELECTION
 E408     EQU    2010B       INVALID SECONDARY ADDRESS
 E501     EQU    2401B       INVALID COMMAND CODE
 E502     EQU    2402B       INVALID FLAG SELECTION
 E503     EQU    2403B       INVALID FUNCTION
 E504     EQU    2404B       FUNCTION NOT SUPPORTED BY HARDWARE
 E505     EQU    2405B       INVALID LENGTH SPECIFICATION
                             IN COMMAND
 E506     EQU    2406B       INVALID ADDRESS SPECIFICATION
                             IN COMMAND
 E507     EQU    2407B       INVALID LENGTH SPECIFICATION IN
                             INDIRECT LIST
 E508     EQU    2410B       INVALID ADDRESS SPECIFICATION
                             IN INDIRECT LIST
 E509     EQU    2411B       PP COMMAND NOT ALLOWED IN REQUEST
                             TO A UNIT
 E50A     EQU    2412B       INVALID SEQUENCE OF COMMANDS
 E50B     EQU    2413B       INVALID PARAMETER SPECIFICATION
                             (POOL READ OR COMPARE SWAP COMMANDS)
          EJECT
* CONFIGURED UNITS.

 UN       RECORD PACKED

* WORD 1.

 UIT      STRUCT 6           RMA OF UNIT INTERFACE TABLE (REFORMATTED)

* WORD 4.

 FILL1    SUBRANGE 0,77777B
 CTST     BOOLEAN            NONZERO IF THE CONFIDENCE TEST WAS RUN


          MASKP  CTST
 K.CTST   EQU    MSK

 UN       RECEND
          EJECT
* SELECTION SET (SS)

 SS       RECORD PACKED

* WORD 1.

 CHAN     SUBRANGE 0,77B     CHANNEL NUMBER
 FILL     SUBRANGE 0,7B
 INIT     BOOLEAN            NONZERO IF SS ENTRY HAS BEEN INITIALIZED
 ENTRY    BOOLEAN            ENTRY PRESENT
 SEEK     BOOLEAN            SEEK ISSUED
 WRITE    BOOLEAN            WRITE REQUEST
 CUR      BOOLEAN            CURRENT REQUEST HAS BEEN SELECTED (IF SET)
 DV       SUBRANGE 0,3       DEVICE TYPE

 FILL1    SUBRANGE 0,77B
 LS       BOOLEAN            LARGE SECTOR FLAG IN SEEK COMMAND
 FILL2    SUBRANGE 0,7
 UNIT     SUBRANGE 0,77B     UNIT NUMBER

 CYL      PPWORD             CYLINDER ADDRESS
 TRACK    PPWORD             TRACK ADDRESS

* WORD 2.

 SECTOR   PPWORD             SECTOR ADDRESS
 LU       PPWORD             LOGICAL UNIT
 FILL3    SUBRANGE 0,77777B
 CONF     BOOLEAN            NONZERO IF RUNNING THE CONFIDENCE TEST
 REQ      STRUCT 4           CURRENT REQUEST (UNFORMATTED RMA)
 PVA      STRUCT 6           PVA OF CURRENT REQUEST
 QSTRT    STRUCT 4           START OF QUEUE ( UIT + 4)
 QP       STRUCT 4           CURRENT QUEUE POINTER
 COM      STRUCT 6           COMMUNICATION BUFFER (RMA, REFORMATTED)
 UQT      STRUCT 6           UNIT Q TABLE (RMA, REFORMATTED)
          MGEN   N.ENTRY
 M.ENTRY  EQU    MASK$
          MGEN   N.WRITE
 M.WRITE  EQU    MASK$
          MGEN   N.CUR
 M.CUR    EQU    MASK$
          MASKP  INIT
 K.INIT   EQU    MSK
          MASKP  ENTRY
 K.ENTRY  EQU    MSK
          MASKP  WRITE
 K.WRITE  EQU    MSK
          MASKP  SEEK
 K.SEEK   EQU    MSK
          MASKP  CUR
 K.CUR    EQU    MSK
          MGEN   N.CHAN
 M.CHAN   EQU    MASK$
          MGEN   N.DV
 M.DV     EQU    MASK$
          MGEN   N.LS
 M.LS     EQU    MASK$
          MGEN   N.UNIT
 M.UNIT   EQU    MASK$
          MASKP  CONF
 K.CONF   EQU    MSK

 SS       RECEND
          SPACE  6
* PP TABLE.

 PT       RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 PART     PPWORD             PARTNER PP NUMBER
 PIT      RMA                PP INTERFACE TABLE ADDRESS (RMA)
 PITPVA   STRUCT 24          PP INTERFACE TABLE ADDRESS (PVA)

 PT       RECEND
          SPACE  6
* PP INTERFACE TABLE
 PIT      RECORD PACKED

 PPNO     PPWORD             PP NUMBER
 FLU      PPWORD             FIRST LOGICAL UNIT
 UNITC    PPWORD             NUMBER OF UNITS
 ACTIVE   BOOLEAN            ACTIVE_CHECK FLAG.  WHEN SET, THE PP
                             MUST CLEAR IT.
 IDLE     BOOLEAN            IDLE REQUEST
 RESUME   BOOLEAN            RESUME REQUEST
 IDSTAT   BOOLEAN            IDLE_STATUS. IF SET, THE PP IS SOFTWARE IDLED.
 FILL1    SUBRANGE 0,3777B
 LOCKF    BOOLEAN            THIS LOCK FLAG MUST BE SET BEFORE CHANGING ANYTHING
                             IN THIS CM WORD.
          ALIGN  0,64
 INT      RMA                INTERRUPT WORD (RMA)
 CHAN     RMA                CHANNEL TABLE (RMA)
          ALIGN  16,64
 CBUFL    PPWORD             COMMUNICATION BUFFER LENGTH
 CBUF     RMA                COMMUNICATION BUFFER (RMA)
 LOCK     BOOLEAN            PP REQUEST QUEUE LOCK
          ALIGN  48,64
 LOCKPP   PPWORD             PP REQUEST QUEUE LOCK OWNER
          ALIGN  16,64
 PPQPVA   STRUCT 6           NEXT QUEUED PP REQUEST (PVA)
          ALIGN  32,64
 PPQ      RMA                NEXT QUEUED PP REQUEST (RMA)
          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




          MASKP  ACTIVE
 K.ACTIVE EQU    MSK
          MASKP  IDLE
 K.IDLE   EQU    MSK
          MASKP  RESUME
 K.RESUME EQU    MSK
          MASKP  IDSTAT
 K.IDSTAT EQU    MSK
          MASKP  LOCKF
 K.LOCKF  EQU    MSK
 K.ACTION EQU    K.ACTIVE+K.IDLE+K.RESUME

 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
 QCNT     PPWORD             QUEUE COUNT
*
 SHARE    BOOLEAN            NONZERO IF THIS UNIT IS BEING SHARED WITH MALET OR DFT
          ALIGN  16,64
 UBUFL    PPWORD             UNIT COMMUNICATION BUFFER LENGTH
 UBUF     RMA                UNIT COMMUNICATION BUFFER (RMA)
 ULOCK    BOOLEAN            UNIT IS RESERVED FOR EXCLUSIVE USE
          ALIGN  48,64
 ULOCKP   PPWORD             UNIT LOCK OWNER
 QLOCK    BOOLEAN            UNIT QUEUE LOCK
          ALIGN  48,64
 QLOCKP   PPWORD             UNIT QUEUE LOCK OWNER
          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)

          MASKP  DSABLE
 K.DSABLE EQU    MSK

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

 CM       RECEND
          SPACE  6
* COMMAND CODES.

 C.ACK    EQU    0           ACKNOWLEDGE
 C.STOP   EQU    1           STOP UNIT
 C.SELU   EQU    2           SELECT UNIT
 C.SELC   EQU    3           SELECT CONTROLLER
 C.IDLE   EQU    4           IDLE
 C.RESUME EQU    5           RESUME
 C.OLAY   EQU    6           EXECUTE OVERLAY
 C.READY  EQU    7           START READY SCAN
 C.SREADY EQU    10B         STOP READY SCAN
 C.PPAD   EQU    11B         SELECT PP MEMORY ADDRESS
 C.PPMEM  EQU    12B         COPY PP MEMORY
 C.LDCON  EQU    14B         LOAD CONTROLWARE
 C.ONUN   EQU    20B         ENABLE UNIT
 C.OFFUN  EQU    21B         DISABLE UNIT
 C.FUNC   EQU    40B         OUTPUT FUNCTION
 C.OUTP   EQU    41B         OUTPUT 8-BIT PARAMETERS
 C.OUTD   EQU    43B         OUTPUT 8-BIT DATA
 C.IND    EQU    45B         INPUT 8-BIT DATA/PARAMETERS
 C.READ   EQU    100B        READ BYTES
 C.WRITE  EQU    120B        WRITE BYTES
 C.STATUS EQU    140B        READ STATUS
 C.COUNT  EQU    141B        STORE TRANSFER COUNT
 C.SWAP   EQU    160B        COMPARE AND SWAP
 C.WRITEI EQU    162B        WRITE INITIALIZE
 C.RFLAW  EQU    163B        READ FLAW MAPS
 C.WRITEV EQU    200B        WRITE VERIFY
          SPACE  6
* PP RESPONSE.

 RS       RECORD PACKED

* WORD 1.
 FILL1    BOOLEAN
 SHORT    BOOLEAN            IF SET, IT IS A ONE-WORD NORMAL RESPONSE
          ALIGN  8,64
 LUN      SUBRANGE 0,377B    LOGICAL UNIT
 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
 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.  EX: UNIT NOT READY,
                             UNIT NOT CONNECTED.  (NOT USED)
 FTO      BOOLEAN            FUNCTION TIMEOUT
 CHERO    BOOLEAN            CHANNEL OUTPUT PARITY ERROR
          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)

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

 DET      PPWORD             =1, IF DETAILED STATUS PRESENT
 K.CSP    EQU    1           CONTROLLER STATUS PRESENT
 K.DSP    EQU    2           DEVICE STATUS PRESENT
 K.ERIP   EQU    4           ERROR REGISTER IMAGE PRESENT
 K.ELP    EQU    10B         ERROR LOG PRESENT
 K.ICS    EQU    20B         INCORRECT CONTROLLER WAS SELECTED
 K.CSC    EQU    40B         CANNOT SELECT THE CONTROLLER
                             SELECT ACTIVE NEVER GETS SET
 K.TIP    EQU    100B        TIMEOUT - TRANSFER IN PROGRESS
                             DIDN'T CLEAR
 K.TOP    EQU    200B        TIMEOUT - PAUSE DIDN'T CLEAR
 K.ICA    EQU    400B        ERROR IN INITIALIZING CHANNEL ADAPTER
 K.HIE    EQU    1000B       HOST I/F INTEGRITY ERROR
 K.DIE    EQU    2000B       DRIVE I/F INTEGRITY ERROR
 K.MC     EQU    4000B       MASTER CLEAR DID NOT WORK
 K.CT     EQU    10000B      RUNNING THE CONFIDENCE TEST
 K.CFLAW  EQU    20000B      ALL SECTORS / TRACKS ARE FLAWED ON THE CONFIDENCE
                             CYLINDER
 K.HOST   EQU    40000B      NOT THE SAME HOST ID
 K.SEC    EQU    100000B     SECTOR SIZE NOT 4096


 ID       PPWORD             ERROR IDENTIFIER
 K.CMLD   EQU    1           RELOAD OF CONTROL MODULE WAS ATTEMPTED
 K.CMLDS  EQU    2           CONTROL MODULE RELOADED SUCCESSFULLY
 K.XD     EQU    4           EXECUTING LEVEL II DIAGNOSTICS
 K.XDP    EQU    10B         LEVEL II DIAGNOSTICS PASSED
 K.PU     EQU    20B         POWERING UP SPINDLE
 K.PUC    EQU    40B         SPINDLE POWERED UP
 K.PTO    EQU    100B        PP TIMED OUT A COMMAND
 K.UDN    EQU    20000B      UNIT DOWN
 K.CMDN   EQU    40000B      CONTROL MODULE DOWN
 K.CHDN   EQU    100000B     CHANNEL DOWN
 FILL2    PPWORD
 STRY     PPWORD             SECTOR RETRY COUNT

* WORD 9.

 GENST1   PPWORD             GENERAL STATUS OF THE FIRST TIME ERROR
                               WAS ENCOUNTERED
 GENST2   PPWORD             GENERAL STATUS OF THE LAST TIME ERROR
 FUNTO    PPWORD             FUNCTION CODE IF FUNCTION TIMEOUT ERROR
 ERRID    PPWORD             ERROR IDENTIFIER
 K.IST    EQU    1           INCOMPLETE SECTOR TRANSFER
 K.CRES   EQU    2           CLEAR UNIT RESERVE ON OPPOSITE ACCESS
 K.RAM    EQU    4           RAM PARITY ERROR
 K.CLOAD  EQU    10B         CONTROLWARE LOAD WAS ATTEMPTED
 K.AFT    EQU    20B         AUTOLOAD FUNCTION TIMEOUT
 K.CEMPT  EQU    40B         CHANNEL DOESNT GO EMPTY AFTER SENDING
                             PARAMETERS / DATA
 K.CINAC  EQU    100B        CHANNEL NOT INACTIVE AFTER
                             RECEIVING PARAMETERS / DATA
 K.MEDIA  EQU    200B        MEDIA FAILURE, REREAD SECTOR
 K.UNMED  EQU    400B        UNRECOVERED MEDIA ERROR
 K.RERR   EQU    1000B       READ ERROR.  STATUS BEFORE SUSPEND/TERMINATE .NE.
                             4XXXB.
 K.CF     EQU    2000B       POLL STATUS NONZERO AFTER SENDING CONTROLWARE
 K.DE     EQU    4000B       POLL STATUS NONZERO AFTER LOADING ATTENTION DELAY
 K.NR     EQU    10000B      NOT READY
 K.URS    EQU    20000B      UNIT RESERVED
 K.CRS    EQU    40000B      CONTROLLER RESERVED
 K.ADPT   EQU    100000B     ADAPTER CONTROLWARE ERROR

* WORD 10.

          ALIGN  0,64
 DETAIL   STRUCT 40          DETAILED STATUS OF THE FIRST TIME ERROR
                             WAS ENCOUNTERED
 DET2     STRUCT 40          DETAILED STATUS OF THE LAST TIME ERROR
                             WAS ENCOUNTERED.


          MASKP  SHORT
 K.SHORT  EQU    MSK
          MGEN   N.LUN
 M.LUN    EQU    MASK$
          MASKP  INT
 K.INT    EQU    MSK
          MGEN   N.PORT
 M.PORT   EQU    MASK$
          MASKP  INTERR
 K.INTERR EQU    MSK
          MASKP  DATOV
 K.DATOV  EQU    MSK
          MASKP  DATERR
 K.DATERR EQU    MSK
          MASKP  HDWR
 K.HDWR   EQU    MSK
          MASKP  CHERR
 K.CHERR  EQU    MSK
          MASKP  CHERO
 K.CHERO  EQU    MSK
          MASKP  NRDY
 K.NRDY   EQU    MSK
          MASKP  FTO
 K.FTO    EQU    MSK

 RS       RECEND
          SPACE  6
* 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 BUFFER (RMA)

 CONTRL   STRUCT 8           LOAD CONTROLWARE COMMAND
 CMCTRL   STRUCT 8           LOAD CONTROL MODULE CONTROLWARE
          STRUCT 24
          STRUCT 24

 MSGIN    PPWORD             MESSAGE TO MASTER FROM SLAVE

          ALIGN  0,64
 MSGOUT   PPWORD             MESSAGE TO SLAVE FROM MASTER

          ALIGN  0,64
 ZERO     STRUCT 272         CONTAINS ALL ZEROES

          ALIGN  0,64
 SS       STRUCT 40          SS ENTRY

 REQ      STRUCT 40          REQUEST

          ALIGN  0,64
 UNITS    STRUCT 320         UNIT INTERFACE TABLE POINTERS FOR 40 UNITS

          ALIGN  0,64
 OVR      STRUCT 1944        PP OVERLAY



          MASKP  SLAVE
K.SLAVE   EQU    MSK


 CB       RECEND
          SPACE  6
* COMMANDS BETWEEN PPS.

 C.GO     EQU    1           DONE WITH THE DISK FOR THIS SECTOR
 C.REQ    EQU    2           START A DISK REQUEST
 C.ABT    EQU    3           ABORT THE REQUEST
 C.SWIT   EQU    4           SWITCH TO THE NEXT REQUEST
 C.END    EQU    5           END OF THE DISK REQUEST
          EJECT
          CON    INIT-1


* DIRECT CELLS

 T1       BSSZ   1
 T2       BSSZ   1
 T3       BSSZ   1
 T4       BSSZ   1
 T5       BSSZ   1
 T6       BSSZ   1
 T7       BSSZ   1
 T8       BSSZ   1

 TRKEND   BSSZ   1           END OF TRACK FLAG
 SEKI     BSSZ   1           INDEX TO SEKS TABLE
 CM.PIT   BSSZ   3           CM ADDRESS OF PP INTERFACE TABLE (REFORMATED)
 MAPC     BSSZ   1           INDEX TO VARIOUS READ FUNCTIONS TO
                               READ THE FLAW MAPS

* KEEP GNSTAT AND P1 ADJACENT.
 GNSTAT   BSSZ   1           GENERAL STATUS
 P1       BSSZ   1
 P2       BSSZ   1
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
 WC       BSSZ   1           WORD COUNT TO READ/WRITE CM WORDS

 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 DEVICE   BSSZ   1           DEVICE TYPE
 DEV      BSSZ   1           USED FOR SMALL OR LARGE SECTOR DISTINCTION
 ERRCNT   BSSZ   1           ERROR COUNTER
 CHAN     BSSZ   1           CHANNEL NUMBER
 NUMCM    BSSZ   1           NUMBER OF COMMANDS LEFT TO PROCESS IN THIS REQUEST
 SELECT   BSSZ   1           SS INDEX TO SELECTED REQUEST
 SELIN    BSSZ   1           SELECTION SET INDEX USED DURING THE SELECTION
                             PROCESS
 SEKCNT   CON    0           SEEK COUNT. NUMBER OF UNITS TO WHICH A SEEK WAS
                             ISSUED
 DATADD   BSSZ   3           CM ADDRESS OF DATA AREA
 CMADR    BSSZ   3           CM ADDRESS
 CMLISTL  BSSZ   1           NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST.
                             (INCLUDES THE NUMBER OF WORDS WHICH HAVENT
                             BEEN READ FROM CM.)
 CML      BSSZ   1           INDEX TO CMLIST
 WDS      BSSZ   1           NUMBER OF CM WORDS TO TRANSFER FROM CURRENT SECTOR.
 WDSS     BSSZ   1           USED TO UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
 TWDS     BSSZ   1           TOTAL NUMBER OF CM WORDS TO TRANSFER TO THE
                             CM ADDRESS.
 SECWDS   BSSZ   1           NUMBER OF DATA WORDS IN SECTOR
 SECPOS   BSSZ   1           SECTOR BUFFER TRANSFER POSITION (TO CM)
 RESPC    BSSZ   1           RESPONSE CODE
 SMSEC    BSSZ   1           SMALL SECTOR COUNTER
 SIO      BSSZ   1           NONZERO IF I/0 HAS BEEN STARTED ON A REQUEST
 PPNO     CON    1           LOGICAL PP NUMBER
 SWFLG    BSSZ   1           NONZERO IF A STREAMING REQUEST SWITCH WAS MADE
 NCOMRQ   BSSZ   1           NUMBER OF COMPLETED REQUESTS
                             MUST BE INITIALLY = 0
 CUNITS   BSSZ   1           NUMBER OF CONFIGURED UNITS
 LDC      BSSZ   1           RETRY COUNTER FOR LOADING CONTROLWARE
 NORQ     BSSZ   1           NONZERO IF NO REQUEST IS BEING PROCESSED,
                             (FOR ERROR RECOVERY)
          SPACE  3
          ORG    72B

 DSRTP    CON    0           HCS REAL MEMORY WORD-ADDRESS
          CON    1
 FUNCD    EQU    DSRTP       FUNCTION CODE
 INPNT    EQU    DSRTP+1     IN POINTER FOR RESPONSE BUFFER
 FRST     BSSZ   1           = 0, IF FIRST TIME THROUGH UNCMND
 LIM      BSSZ   1           LIMIT OF RESPONSE BUFFER (IN 8-BIT BYTES)
          ORG    76B
          CON    5           TEMPORARY, PP TYPE USED BY DEADSTART
 FNERR    EQU    76B         FUNCTION TIMEOUT IF NONZERO
 RLAST    BSSZ   1           USED TO DETERMINE IF AN ERROR OCCURED ON
                             WRITE LAST SECTOR
          EJECT
          ORG    100B
          LJM    INIT
          CON    CONTYP      USED FOR DUMP IDENTIFICATION
          SPACE  6
 HALT     CON    0           HALT THE PP
          UJN    *
          SPACE  6

* NUMBER BY WHICH THE SECTOR ADDRESS IS INCREMENTED
* FOR EACH SECTOR.

 SECSC    CON    1           844
          CON    4           885-1

* NUMBER OF SECTORS PER TRACK FOR EACH DEVICE.

 DVSEC    CON    24          844
          CON    32          885-1

* NUMBER OF TRACKS PER CYLINDER FOR EACH DEVICE.

 DVTRK    CON    19          844
          CON    40          885-1

* NUMBER OF CM WORDS TO TRANSFER FOR EACH SECTOR.
* (EXCEPT EVERY 5TH SECTOR.)

 CMWDS    CON    60          844
          CON    256         885-1

* NUMBER OF CM WORDS TO TRANSFER FOR EACH 5TH SECTOR.

 CMWDS5   CON    16          844
          CON    256         885-1

* NUMBER OF CHANNEL WORDS PER SECTOR.

 CHWDS    CON    322         844
          CON    SBYTE7      885-1


 LUD      BSSZ   1           INDEX OF LAST UNIT DESCRIPTOR REQUEST FOUND

 CM.RS    BSSZ   3           CM ADDRESS OF RESPONSE BUFFER (REFORMATTED)

 CM.CB    BSSZ   3           CM ADDRESS OF PP COMMUNICATION BUFFER (REFORMATTED)
 CM.INT   BSSZ   3           CM ADDRESS OF INTERRUPT WORD
 CM.CHAN  BSSZ   3           CM ADDRESS OF CHANNEL INTERLOCK TABLE
 DH       BSSZ   3           CM ADDRESS OF OVERLAY DIRECTORY
          SPACE  6


* WHEN PROCESSING THE FUNCTION C.FLAW, READ FLAW MAPS, UP TO FOUR
* DIFFERENT READ-TYPE FUNCTIONS ARE TRIED.

 MAPFN    BSS
          CON    F.READPS    READ PROTECTED SECTOR
          CON    F.READ      READ
          CON    F.READFD    READ FACTORY DATA
          CON    F.READUM    READ UTILITY MAP
 MAPLN    EQU    *-MAPFN
          SPACE 2
 CURCH    CON    DC          CURRENT CHANNEL NUMBER
          SPACE  2
          EJECT
          QUAL   RES
*COPYC IODMAC6
          EJECT
 SCLX     LJM    **
 SCLOCK   EQU    *-1
          LDML   CHLOCK
          ZJN    SCL1        IF CHANNEL LOCK IS NOT SET
          LDN    0           EXIT A REGISTER = 0
          UJK    SCLX

 SCL1     BSS
          LOADOVL RECSO
          LJM    SCL10

 SELRQX   LJM    **
 SELRQ    EQU    *-1
          LDML   OVAD1
          SBN    SELRQOO
          ZJN    SELRQ2      IF OVERLAY IS ALREADY LOADED
          LOADOVL SELRQO
 SELRQ2   BSS
          LJM    SELRQ1

 RDEX     LJM    **
 RDERR    EQU    *-1
          LDML   OVAD1
          SBN    RDERROO
          ZJN    RDERR2      IF OVERLAY IS ALREADY LOADED
          LOADOVL RDERRO
 RDERR2   BSS
          LJM    RDERR1

 RECS     CON    0
          LOADOVL RECSO
          LJM    RECS1

 ATERM    CON    0
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE
          LOADOVL RECSO
          LJM    ATERM1

 HTERM    CON    0
          LOADOVL RECSO
          LJM    HTERM1

 UTERM    CON    0
          LOADOVL DOWNO
          LJM    UTERM1

 OTERM    CON    0
          LOADOVL DOWNO
          LJM    OTERM1

 LTERM    CON    0
          LOADOVL DOWNO
          LJM    LTERM1

 TSKX     LJM    **
 TERMSK   EQU    *-1
          LOADOVL RECSO
          LJM    TERMSK1

 PPRQX    LJM    **
 PPREQ    EQU    *-1
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          ERRNZ  /PIT/C.ACTIVE
          CRDL   T1          READ PP REQUEST FLAGS
 PPRQ5    BSS
          LDDL   T4
          LPK    /PIT/K.ACTION  PP REQUEST FLAGS
          ZJK    PPRQX       IF NO PP REQUESTS
          SHN    /PIT/L.ACTIVE+2
          PJN    PPRQ6       IF THE ACTIVE CHECK FLAG IS NOT SET

* THE ACTIVE CHECK FLAG IS SET.
* SET THE LOCK, AND CLEAR THE ACTIVE CHECK FLAG.

          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDK    /PIT/K.LOCKF
          STDL   T4
          LOADC  CM.PIT
          ERRNZ  /PIT/C.ACTIVE
          RDSL   T1          TRY TO SET THE LOCK
          LDDL   T4
          LPK    /PIT/K.LOCKF
          NJK    PPRQX       IF SOMEONE ELSE HAS THE LOCK
          LDDL   T4          CLEAR THE ACTIVE CHECK FLAG
          LPC    -/PIT/K.ACTIVE-/PIT/K.LOCKF
          STDL   T4
          LOADC  CM.PIT
          ERRNZ  /PIT/C.LOCKF
          CWDL   T1
          UJK    PPRQ5

 PPRQ6    BSS                PROCESS IDLE OR RESUME REQUEST
          LOADOVL PPREQO
          LJM    PPR1


 LDCNX    LJM    **
 LDCN     EQU    *-1
          LOADOVL RECSO
          LJM    LDCN1

 ACNX     LJM    **
 ACN      EQU    *-1
          ACN    DC          ACTIVATE THE CHANNEL
          UJK    ACNX

 IAX      LJM    **
 IAPMBF   EQU    *-1
          IAPM   BUFF,DC     READ A SECTOR OF DATA FROM DISK
          UJK    IAX

 OAX      LJM    **
 OAPMBF   EQU    *-1
          OAPM   BUFF,DC     WRITE A SECTOR OF DATA TO DISK
          UJK    OAX

 CFMX     LJM    **
 CFM      EQU    *-1
          CFM    CFMX,DC     CHECK AND CLEAR CHANNEL ERROR
          AOML   CFM         CHANNEL ERROR, EXIT * + 1
          UJK    CFMX

 OAMCTX   LJM    **
 OAMCT    EQU    *-1
          OAM    CTBUF,DC    SEND DATA TO CONTROLLER
          UJK    OAMCTX

 DCNX     LJM    **
 DCN      EQU    *-1
          FJM    *,DC        WAIT FOR CHANNEL TO BECOME EMPTY
          PSN
          PSN
          DCN    40B+DC
          UJK    DCNX



 RSAX     LJM    **
 RSA      EQU    *-1
 RSA10    BSS
          LDN    F.RSEC      ISSUE RETURN SECTOR ADDRESS FUNCTION
          RJM    FUNC
          ACN    DC
          LDN    3
          IAM    GNSTAT,DC   INPUT STATUSES
          CFM    RSA20,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
          UJK    RSA10       RETRY

 RSA20    BSS
          UJK    RSAX

 RSTX     LJM    **
          EJECT
 DISK     BSS
          LOADOVL PPREQO
          RJM    ICOM        INITIALIZE UNIT TABLES
          LOADOVL SELRQO     INITIALIZE THIS OVERLAY AREA

 MAINA    BSS
          IFEQ   PAT,1
          RJM    PATCH       PATCH THE PP
          ENDIF
 Q13      IFEQ   ERRTST,1
          LOADOVL TESTO
          RJM    TEST        CHECK FOR FUNCTION TIMEOUT TEST
 Q13      ENDIF

          RJM    PPREQ       CHECK FOR ANY PP REQUESTS

          LDDL   CUNITS
          ZJN    MAINB       IF NO UNITS
          LDML   IDLE
          ZJN    MAIN10      IF NOT SOFTWARE IDLED
 MAINB    BSS
          SOML   CHLCNT
          NJK    MAINA       IF PP DOESN'T HAVE TO GIVE UP CHANNEL
          RJM    CKCHAN      CHECK IF CHANNEL MUST BE GIVEN UP
          UJK    MAINA

 MAIN10   BSS
          LDML   IALF
          NJN    MAIN50      IF CONFIDENCE TEST HAS BEEN RUN ON ALL UNITS
          LDML   OVAD2
          SBN    CONFOO
          ZJN    MAIN2       IF OVERLAY IS ALREADY LOADED
          LOADOVL CONFO
 MAIN2    BSS
          RJM    CTEST       RUN CONFIDENCE TEST ON ALL UNITS

 MAIN50   BSS
          LDML   OVAD2
          SBN    READOO
          ZJN    MAIN55      IF OVERLAY IS ALREADY LOADED
          LOADOVL READO
 MAIN55   BSS
          RJM    SELSEK      SELECT UNIT REQUESTS AND SEEK
          RJM    RECRS       CHECK FOR RECOVERED ERRORS
          LDDL   SEKCNT
          ZJK    MAINB       IF NO SEEKS WERE ISSUED
          RJM    UREQ        READ UNIT REQUEST FROM CM

          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    SRESP       SET UP RESPONSE BUFFER
          AODL   SIO         SET -START I/O- FLAG
 MAIN60   RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          ZJN    MAIN70      IF NO MORE COMMANDS
 MAINC    BSS
          LDML   OVAD2
          SBN    READOO
          ZJN    MAIN63      IF OVERLAY IS ALREADY LOADED
          LOADOVL READO
 MAIN63   BSS
          LDML   UCMDPR,FNC  GET COMMAND PROCESSOR
          STML   MAIN65
          RJM    **          PROCESS COMMAND
 MAIN65   EQU    *-1
          LDDL   RESPC       CHECK FOR ABNORMAL RESPONSE CODE
          SBN    R.ABN
          NJK    MAIN60      IF NO ERROR, LOOK FOR ANOTHER COMMAND

* TERMINATE REQUEST.

 MAIN70   BSS
          LJM    TERM        SEND TERMINATION RESPONSE

          SPACE  6
* UNIT COMMANDS
 UCMD     BSS
          CON    C.READ
          CON    C.WRITE
          CON    C.RFLAW

* PP COMMANDS.

 F31      IFEQ   OFFU,1
          CON    C.OFFUN
          CON    C.ONUN
 F31      ENDIF
 UCMDL    EQU    *-UCMD

* UNIT COMMAND PROCESSORS
 UCMDPR   BSS
          CON    READ        READ BYTES
          CON    WRITE       WRITE BYTES
          IFEQ   HARDW,1
          CON    READ        READ FLAW MAP
          ELSE
          CON    RFLAW
          ENDIF

* PP COMMAND PROCESSORS.

 F32      IFEQ   OFFU,1
          CON    STOP        SET UNIT DISABLE
          CON    ONUN        CLEAR UNIT DISABLE FLAG
 F32      ENDIF
          EJECT
** NAME-- SEEKI.
*
** PURPOSE-- DETERMINE IF A SEEK SHOULD BE ISSUED, AND, IF SO,
*            ISSUE THE SEEK.
*
** INPUT-- SELIN, SEKCNT.
*
** OUTPUT-- SEKS,SEKCNT
*           SEKCNT
*           /SS/P.SEEK
          SPACE  6
 SEKIX    LJM    **
 SEEKI    EQU    *-1

* CHECK FOR VALID SECTOR ADDRESS.

          LDML   SS+/SS/P.DV,SELIN  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPK    /SS/M.DV
          STDL   T1          DEVICE TYPE
          LDML   SS+/SS/P.SECTOR,SELIN  SECTOR ADDRESS
          LPN    3
          ZJN    SEKI6       IF EVENLY DIVISIBLE BY 4
          LDML   SECSC,T1    SECTOR ADDRESS MUST BE INCREMENTED BY 1
          SBN    1
          PJN    SEKI6       IF NO ERROR IN SEEK ADDRESS

* ERROR IN  SEEK ADDRESS.

          LDC    E408
          RJM    ATERM       ABNORMAL TERMINATION (NO RETURN)
*         (NO RETURN FROM ATERM)

* CHANGE CHANNEL NUMBERS IN I/O INSTRUCTIONS, IF NECESSARY.

 SEKI6    BSS
 X2       IFEQ   MULT,1
          LDML   SS+/SS/P.CHAN,SELIN  GET CHANNEL NUMBER
          SHN    -16+/SS/L.CHAN+/SS/N.CHAN
          LPK    /SS/M.CHAN
          STDL   CHAN        CHANNEL NUMBER
          RJM    CHGCH       CHANGE CHANNEL NUMBERS IF NECESSARY
 X2       ENDIF

* ISSUE SEEK.

          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED' FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK,SELIN
          RJM    SEEKCK      ISSUE INITIAL SEEK AND RECOVER ERRORS

* SEEK WAS SUCCESSFUL.

          LDK    /SS/K.SEEK  SET 'SEEK ISSUED' FLAG
          RAML   SS+/SS/P.SEEK,SELIN
          LDDL   SELIN       SAVE INDEX OF SEEK ISSUED
          STML   SEKS,SEKCNT
          AODL   SEKCNT      INCREMENT 'SEEK ISSUED' COUNTER

 E101     IFEQ   ATST,1
          AOML   AUTOT       NUMBER OF SEEKS ISSUED
 E101     ENDIF
          UJK    SEKIX
          EJECT
** NAME-- SEEKCK.
*
** PURPOSE-- ISSUE A SEEK AND RECOVER ANY SEEK ERRORS.
          SPACE  6
 SEEX     LJM    **
 SEEKCK   EQU    *-1
          RJM    GENSTAT     RESERVE THE CONTROLLER
          SHN    17-10
          MJN    SCK30       IF MULTI-ACCESS COUPLER NOT CONNECTED

* LOAD CONTROLWARE BEFORE THE FIRST REQUEST WHEN THE DRIVER IS LOADED.

          LDML   ILOAD
          ADML   RECOV       DONT LOAD CONTROLWARE IF IN RECOVERY
          NJN    SCK10       IF CONTROLWARE HAS BEEN LOADED
          RJM    LDCN        LOAD CONTROLWARE
          AOML   ILOAD       SET FLAG FOR INITIAL CONTROLWARE LOAD

* GET UNIT RESERVE.

 SCK10    BSS
          LDN    5           SET TIMEOUT FOR UNIT RESERVE
          STML   CRSV2
 SCK20    BSS
          SOML   CRSV2       DECREMENT UNIT RESERVE TIMEOUT COUNTERS
          ZJN    SCK30       IF TIMED OUT
          RJM    SEEK        ISSUE SEEK
          RJM    GENSTAT     READ GENERAL STATUS
          SHN    17-3
          MJN    SCK20       IF UNIT RESERVED
          RJM    CKSTAT      PROCESS GENERAL STATUS ERRORS
          MJK    SCK20       IF ERROR, RETRY THE SEEK
          RJM    RECRS       SEND ANY RECOVERED ERROR RESPONSES
          UJK    SEEX        IF NO ERROR


* CALL SEEKERR TO RECOVER SEEK ERRORS.

 SCK30    BSS
          LOADOVL RECSO
          LJM    SEEKERR1
          EJECT
** NAME-- SEEKON
*
** PURPOSE-- ISSUE SEEK, CHECK FOR ERRORS, WAIT FOR ON-CYLINDER.
          SPACE  6
 SEKOX    LJM    **
 SEEKON   EQU    *-1
 SEKO10   BSS
          RJM    SEEKCK      ISSUE SEEK AND RECOVER SEEK ERRORS
          LDDL   GNSTAT      GENERAL STATUS
          NJN    SEKO10      IF NOT ON CYLINDER
          UJN    SEKOX
          EJECT
** NAME-- SEEK
*
** PURPOSE-- ISSUES  SEEKS TO DISK UNITS ACCORDING TO UNIT NUMBER,
*            AND DISK ADDRESS CONTAINED IN THE CURRENT SS ENTRY.
*
** INPUT-- SELIN = CURRENT SS ENTRY OFFSET.
*
** OUTPUT-- DISK CHANNEL IS INACTIVE.
*           GENERAL STATUS IS IN GNSTAT.
*
          SPACE  6
 SEEKX    LJM    **
 SEEK     EQU    *-1
 Z1       IFNE   CONTYP,2

* USE SMALL SECTOR SEEK FOR READ FLAW MAPS.

          LDC    7777B
          STML   SEEK14
          LDDL   FNC         GET FUNCTION CODE
          SBN    2
          NJN    SEEK10      IF NOT READ FLAW MAPS
 Z2       IFEQ   HARDW,1
          LDC    6777B
 Z2       ELSE
          LDC    7777B
 Z2       ENDIF
          STML   SEEK14
 SEEK10   BSS

* ASSURE THAT THE SUBSYSTEM COUPLER IS DEDICATED TO THIS PPU.

          LDC    SS+/SS/P.UNIT+1  BASE ADDRESS OF SS + SEEK COMMAND
          ADDL   SELIN       ADD ENTRY OFFSET
          STML   SEEK20      STORE DATA ADDRESS INTO OAM INSTRUCTION
 SEEK12   BSS
          LDN    F.SEEK
          RJM    FUNC        ISSUE THE SEEK
          ACN    DC
          LDML   SS+/SS/P.UNIT,SELIN  ADJUST FIRST PARAMETER OF SEEK COMMAND
          LPC    **
 SEEK14   EQU    *-1
          OAN    DC          SEND LARGE/SMALL SECTOR SEEK PARAMETER
          LDN    3
          ELSE
          LDC    SS+/SS/P.UNIT  BASE ADDRESS OF SS + SEEK COMMAND
          ADDL   SELIN       ADD ENTRY OFFSET
          STML   SEEK20      STORE DATA ADDRESS INTO OAM INSTRUCTION
 SEEK12   BSS
          LDN    F.SEEK
          RJM    FUNC        ISSUE THE SEEK
          ACN    DC
          LDN    4
 Z1       ENDIF
          OAM    **,DC       SEND SEEK FUNCTION PARAMETERS
 SEEK20   EQU    *-1
          FJM    *,DC        WAIT FOR CHANNEL TO BECOME EMPTY
          PSN
          PSN
          DCN    40B+DC      DISCONNECT THE CHANNEL
          CFM    SEEKX,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHERO       RECORD CHANNEL ERROR ON OUTPUT
          UJK    SEEK12      RETRY
          EJECT
** NAME-- UREQ
*
** PURPOSE-- READ A UNIT REQUEST FROM CM.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT QUEUE.
*
** OUTPUT-- RQ  CONTAINS CURRENT REQUEST.
*           FRST = 0
*           NUMCM = NUMBER OF COMMANDS.
*           DEVICE = DEVICE TYPE.
*
          SPACE  6
 UREQX    LJM    **
 UREQ     EQU    *-1
          LDN    0
          STDL   FRST        SET FLAG WHEN REQUEST IS READ
          LDN    3           NUMBER OF WORDS TO READ
          STDL   WC
          LOADF  SS+/SS/P.REQ,SELIN  LOAD CM ADDRESS AND REFORMAT
          ADN    2
          CRML   RQ+2*4,WC   READ CURRENT REQUEST
                             READ SWITCH FLAG BEFORE READING LINKAGE POINTERS
          SBN    5
          CRML   RQ,WC
          LDML   RQ+/RQ/P.LEN  DETERMINE NUMBER OF COMMANDS
          SHN    -3
          SBN    /RQ/C.CMND
          STDL   NUMCM       NUMBER OF COMMANDS

* GET DEVICE TYPE.

          LDML   SS+/SS/P.DV,SELIN  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE

* PUT REQUEST IN PP COMMUNICATION BUFFER.

          UJK    UREQX
          EJECT
** NAME-- SRESP
*
** PURPOSE-- SET UP STATUS RESPONSE BUFFER.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE REQUEST.
*          RQ HAS THE CURRENT REQUEST.
          SPACE  6
 SREX     LJM    **
 SRESP    EQU    *-1
          LDML   SS+/SS/P.PVA,SELIN  PUT PVA OF REQUEST IN RESPONSE BUFFER
          STML   RS+/RS/P.PVA
          LDML   SS+/SS/P.PVA+1,SELIN
          STML   RS+/RS/P.PVA+1
          LDML   SS+/SS/P.PVA+2,SELIN
          STML   RS+/RS/P.PVA+2
*
          LDML   SS+/SS/P.REQ+1,SELIN
          ADN    /RQ/C.CMND*8  DETERMINE RMA OF COMMAND
          STML   RS+/RS/P.LASTC+1  PUT RMA OF COMMAND IN RESPONSE BUFFER
          SHN    -16
          ADML   SS+/SS/P.REQ,SELIN
          STML   RS+/RS/P.LASTC
          LDN    0
          STML   RS+/RS/P.XFER  TRANSFER COUNT
          STML   RS+/RS/P.XFER+1
          UJK    SREX
          EJECT
** NAME-- FAILAD
*
** PURPOSE-- SET FAILING DISK ADDRESS IN RESPONSE.
          SPACE  6
 FAILX    LJM    **
 FAILAD   EQU    *-1
          LDML   SS+/SS/P.TRACK,SELIN  FAILING TRACK ADDRESS
          STML   RS+/RS/P.FTRK
          LDML   SS+/SS/P.SECTOR,SELIN  FAILING SECTOR
          STML   RS+/RS/P.FSEC
          LDK    C.RS*8
          STML   RS+/RS/P.RESPL  RESPONSE LENGTH
          UJK    FAILX
          EJECT
** NAME-- UNCMND
*
** PURPOSE-- GET NEXT COMMAND.
*
** INPUT-- NUMCM, FRST, RS+/RS/P.LASTC
*
** OUTPUT-- CMLIST, FNC, RQ+/RQ/P.CMND
*           CMLISTL.
*
** EXIT-- A REGISTER = 0, IF NO MORE COMMANDS.
*         A REGISTER .NE. 0, IF NEXT COMMAND PRESENT.
          SPACE  6
 UNCX     LJM    **
 UNCMND   EQU    *-1
          LDDL   NUMCM
          ZJN    UNCX        IF NO MORE COMMANDS, EXIT, A REGISTER = 0
          SODL   NUMCM       DECREMENT COMMAND COUNT
          LDDL   FRST        HAS FIRST COMMAND BEEN PROCESSED
          ZJN    UNC10       IF FIRST COMMAND HASN'T BEEN PROCESSED

*         READ NEXT COMMAND FROM CM.

          LDN    8
          RAML   RS+/RS/P.LASTC+1  INCREMENT RMA ADDRESS OF LAST COMMAND
          SHN    -16
          RAML   RS+/RS/P.LASTC
          LDN    C.CM
          STDL   WC
          LOADF  RS+/RS/P.LASTC  LOAD CM ADDRESS AND REFORMAT
          CRML   CM,WC       READ COMMAND FROM CM
 UNC10    AODL   FRST        SET NONZERO

*         IF INDIRECT ADDRESS, READ CM ADDRESS LIST.

          LDN    0
          STDL   CML         CLEAR INDEX TO CMLIST
          LDN    1
          STDL   CMLISTL     IF NOT INDIRECT, ONLY 1 COMMAND.
          LDML   CM+/CM/P.INDIR
          SHN    /CM/L.INDIR+2
          PJN    UNC20       IF NOT INDIRECT ADDRESS

          LDML   CM+/CM/P.LEN
          SHN    -3
          STDL   CMLISTL     LENGTH OF CM ADDRESS AREA  (CM WORDS)
          RJM    GLIST       GET CM ADDRESS LIST OF DATA AREA

* IF SWITCH FLAG IS SET, EXIT.

 UNC20    BSS

*         SET UP INTERNAL FUNCTION CODE, FNC.

          LDN    0
          STDL   FNC         SET UP INTERNAL FUNCTION CODE
 UNC30    LDML   CM+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ERRNZ  /CM/L.CODE
          SBML   UCMD,FNC    COMPARE COMMAND CODE
          ZJN    UNC40       IF COMMAND FOUND
          AODL   FNC
          SBN    UCMDL
          MJN    UNC30       IF MORE COMMANDS TO CHECK
          LDC    E501        ERROR IN COMMAND CODE
          RJM    ATERM       ABNORMAL TERMINATION (NO RETURN)
*         (NO RETURN FROM ATERM)

 UNC40    LDN    1           SET A REGISTER NONZERO FOR EXIT
          UJK    UNCX
          EJECT
** NAME-- GLIST
*
** PURPOSE-- READ THE CM ADDRESS LIST PORTION OF A COMMAND.
*
** INPUT-- CMLISTL
*
** OUTPUT-- CMLIST, CM+/CM/P.RMA
          SPACE  6
 GLIX     LJM    **
 GLIST    EQU    *-1
          LDDL   CMLISTL     NO OF CM WORDS IN ADDRESS-LENGTH-PAIR LIST
          ZJN    GLIX        IF NO WORDS TO READ
          STDL   WC
          LDN    CMLN-4      CHECK IF WORDS LEFT TO READ IS LARGER THAN BUFFER
          SHN    -2          (CM WORDS)
          SBDL   WC
          PJN    GLI10       IF BUFFER CAN CONTAIN ALL THE WORDS
          RADL   WC          READ PARTIAL ADDRESS AREA TO FILL CMLIST BUFFER
 GLI10    LOADF  CM+/CM/P.RMA  LOAD CM ADDRESS AND REFORMAT
          CRML   CMLIST+P.CM,WC
          LDN    P.CM
          STDL   CML         SET INDEX TO CMLIST
          LDDL   WC
          SHN    3           BYTE COUNT
          RAML   CM+/CM/P.RMA+1  UPDATE RMA ADDRESS FOR NEXT READ
          SHN    -16
          RAML   CM+/CM/P.RMA
          UJK    GLIX
          EJECT
** NAME-- FUNC
*
** PURPOSE-- ISSUE FUNCTION TO DISK CONTROLLER.
*
** INPUT-- A REGISTER = FUNCTION CODE.
*
** OUTPUT-- CHANNEL IS INACTIVE.
          SPACE  6
 FUNX     LJM    **
 FUNC     EQU    *-1
 FUN2     BSS
          STDL   FUNCD       SAVE FUNCTION CODE
          AJM    FUN30,DC    IF CHANNEL ACTIVE
          FAN    DC          ISSUE THE FUNCTION
          IFEQ   HARDW,1
          LDK    8           TIMEOUT 1 SECOND ON ALL FUNCTIONS
          STDL   T1
          ELSE
          LDN    1
          STDL   T1
          ENDIF
 FUN8     BSS
          LDC    377777B
 FUN10    IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE

          SBN    1
          NJN    FUN10
          IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE
          SODL   T1          DECREMENT TIMEOUT COUNTER
          NJN    FUN8

*
* DISK CHANNEL ERROR.
*

 FUN30    BSS
 FDCN     DCN    40B+DC      FORCE THE DISCONNECT
          LDML   IGNORE
          NJK    FUNX        IGNORE ERRORS
          RJM    PPREQ       CHECK FOR PP REQUESTS
          LOADOVL RECSO
          LJM    FUNERR      PROCESS FUNCTION TIMEOUT ERROR
          EJECT
** NAME-- GENSTAT
*
** PURPOSE-- READ GENERAL STATUS FROM CONTROLLER.
*
** OUTPUT-- A REGISTER = GENERAL STATUS.
*           GNSTAT = GENERAL STATUS.
*
          SPACE  6
 GENSX    LJM    **
 GENSTAT  EQU    *-1
 E7       IFEQ   ERRTST,1
          LDML   GSTEST
          ZJN    GENS2       IF NOT A DEBUG TEST
          RJM    TESTREC     TEST FOR A RECOVERED DEBUG TEST
          UJN    GENS8
 E7       ENDIF
 GENS2    BSS
          LDN    F.GS        GENERAL STATUS FUNCTION CODE
          RJM    FUNC        ISSUE FUNCTION CODE
          ACN    DC
          LDN    1
          IAM    GNSTAT,DC   INPUT GENERAL STATUS
          NJK    GENS40      IF INPUT DID NOT COMPLETE
          CFM    GENS8,DC    CHECK AND CLEAR CHANNEL ERROR
 GENS5    BSS
          RJM    CHNERR      RECORD CHANNEL ERROR
          UJK    GENS2       RETRY

 GENS8    BSS
          LDDL   GNSTAT      SAVE GENERAL STATUS
          ZJN    GENS10      IF NO ERRORS
          SBN    2           CHECK 'NOT ON CYLINDER'
          NJN    GENS20      IF ERRORS
 GENS10   BSS
          LDML   FUNTO       CHECK IF CALLED FROM FUNC
          NJN    GENS20      IF FUNCTION TIMEOUT, READ DETAILED STATUS
 GENS15   BSS
          LDDL   GNSTAT      A REGISTER = GENERAL STATUS
          UJK    GENSX

 GENS18   BSS
          LDDL   T1
          STML   RS+/RS/P.RESPL  SET TO PREVIOUS RESPONSE LENGTH
          UJK    GENS15

* CHECK STATUS.

 GENS20   BSS
          LDML   RS+/RS/P.RESPL  RESPONSE LENGTH
          STDL   T1
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE

* READ EXTENDED DETAILED STATUS.

          LDML   RS+/RS/P.DET  CHECK IF FIRST TIME FOR DETAILED STATUS
          LPK    /RS/K.CSP
          NJN    GENS30      IF NOT THE FIRST TIME FOR THIS ERROR
          LDK    /RS/K.CSP
          RAML   RS+/RS/P.DET  SET FLAG FOR DETAILED STATUS PRESENT
          LDDL   GNSTAT      PUT GENERAL STATUS IN RESPONSE BUFFER
          STML   RS+/RS/P.GENST1
          LPC    2010B       IF MULTI-ACCESS COUPLER CONNECTED
                             OR IF DSU RESERVED
 GENS25   NJK    GENS18      IF MULTI-ACCESS COUPLER CONNECTED
          LDN    F.EDS       READ EXTENDED DETAILED STATUS
          RJM    FUNC
          LDN    20
          ACN    DC
          IAM    RS+/RS/P.DETAIL,DC  READ EXTENDED DETAILED STATUS
          NJN    GENS40      INPUT DID NOT COMPLETE
          SFM    GENS5,DC     CHECK AND CLEAR CHANNEL ERROR

* IN CASE THIS IS THE LAST TIME THE ERROR IS ENCOUNTERED BEFORE
* IT IS RECOVERED, READ DETAILED STATUS.

 GENS30   BSS
          LDDL   GNSTAT      PUT LAST GENERAL STATUS IN RESPONSE BUFFER
          STML   RS+/RS/P.GENST2
          LPC    2010B       IF MULTI-ACCESS COUPLER CONNECTED
                             OR IF DSU RESERVED
          NJK    GENS25      IF MULTI-ACCESS COUPLER CONNECTED
          LDN    F.EDS       READ EXTENDED DETAILED STATUS
          RJM    FUNC
          LDN    20
          ACN    DC
          IAM    RS+/RS/P.DET2,DC  READ LAST EXTENDED DETAILED STATUS
          NJN    GENS40      IF INPUT DID NOT COMPLETE
          SFM    GENS5,DC    CHECK AND CLEAR CHANNEL ERROR
          UJK    GENS15      IF NOT CHANNEL ERROR

 GENS40   BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF PP WORDS NOT RECEIVED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
          RJM    SERRID      ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    RECS        ABNORMAL TERMINATION
*         (NO RETURN FROM RECS.)
          EJECT
** NAME-- CKSTAT
*
** PURPOSE-- CHECK FOR GENERAL STATUS ERRORS.
*
** INPUT-- GNSTAT.
*        SELIN = INDEX TO SS TABLE.
*
** EXIT-- GNSTAT MUST = 0 OR 2 FOR NO ERROR.
*         A REGISTER = 0, IF NO ERROR, OR NOT ON CYLINDER
*         A REGISTER .LT. 0, IF ERROR RECOVERY SHOULD BE ATTEMPTED.
          SPACE  6
 CKSX     LJM    **
 CKSTAT   EQU    *-1
          LDDL   GNSTAT      GENERAL STATUS
          ZJK    CKSX        IF NO ERRORS, EXIT A REGISTER = 0
          SBN    2
          ZJK    CKSX        IF NOT ON CYLINDER, EXIT A REGISTER = 0

          AODL   ERRCNT      INCREMENT ERROR COUNTER
          SBN    STRY        CHECK IF MAXIMUM TRIES TO RECOVER ERROR
          PJN    CKS30       IF UNRECOVERED ERROR
          AOML   RS+/RS/P.STRY  INCREMENT SECTOR RETRY COUNT
          LCN    1           EXIT, A REGISTER .LT. 0, IF ERROR RECOVERY
                             SHOULD BE ATTEMPTED
          UJK    CKSX

* ERROR.

 CKS30    BSS
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)
          EJECT
** NAME-- TERM.
*
** PURPOSE-- TERMINATE UNIT REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE.
          SPACE  6
 TERM     BSS
          LDDL   SIO         CHECK IF DATA TRANSFER HAS BEEN STARTED
          NJN    TERM8       IF I/O HAS BEEN STARTED ON THIS REQUEST

* UNRECOVERED ERROR DURING SEEK PROCESS.

          RJM    TERMSK      SET UP FOR TERMINATION

* DATA TRANSFER WAS STARTED ON THIS REQUEST.

 TERM8    BSS
          LDDL   FNERR       CHECK FOR FUNCTION TIMEOUT
          NJN    TERM40      IF FUNCTION TIMEOUT ERROR, DO NOT ISSUE
                               ANOTHER FUNCTION
          LDML   CHLOCK
          ZJN    TERM40      IF CHANNEL LOCK IS NOT SET
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC

 TERM40   BSS
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          LDML   NODEL
          NJN    TERM50      IF NO DELINK OF REQUEST
          RJM    DELRQ       DELETE COMPLETED REQUEST FROM QUEUE
                             AND SELECT NEW REQUEST.
 TERM50   BSS
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          RJM    CFLGS       CLEAR FLAGS
          LDN    0
          STDL   SEKCNT      CLEAR OUTSTANDING SEEK COUNT

* ISSUE NEXT SEEK ON THIS UNIT.

          LDML   SS+/SS/P.CUR,SELIN
          SHN    /SS/L.CUR+2
          PJN    TERM60      IF CURRENT REQUEST HAS NOT BEEN SELECTED
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          RJM    SEEKI       ISSUE INITIAL SEEK
          UJK    MAINB       IF SEEK WAS ISSUED

 TERM60   BSS
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR FLAGS
          LPC    -/SS/K.SEEK-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN

          RJM    CLRLOCK     CLEAR LOCK ON UNIT

 TERMB    BSS
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    MAINB
          EJECT
** NAME--  CFLGS
*
** PURPOSE-- CLEAR FLAGS WHEN TERMINATING A REQUEST OR
*            PROCESSING AN IDLE COMMAND.
          SPACE  6
 CFLGX    LJM    **
 CFLGS    EQU    *-1

 E12      IFEQ   ERRTST,1
          LDML   RECOV
          ZJN    CFL10       IF NO RECOVERY WAS DONE
          RJM    TESTEND     TERMINATE THE TEST
 CFL10    BSS
 E12      ENDIF

          LDN    0
          STML   RVCNT       ZERO OUT RECOVERED ERRORS COUNTER
          STML   RQTRY       ZERO OUT REQUEST RETRY COUNTER
          STDL   SIO         START I/O FLAG
          STDL   LDC         LOAD CONTROLWARE COUNTER
          STML   RECOV       INDEX TO RECOVERY PROCEDURE
          STDL   NORQ        NO REQUEST FLAG
          STML   SS+/SS/P.CONF,SELIN  CLEAR FLAG FOR CONFIDENCE TEST
          UJK    CFLGX
          EJECT
** NAME-- PUTRC
*
** PURPOSE-- PUT RESPONSE CODES IN RESPONSE
          SPACE  6
 PUTRCX   LJM    **
 PUTRC    EQU    *-1
          LDDL   RESPC       RESPONSE CODE
          SHN    /RS/L.RCON-/RS/L.RC+/RS/N.RCON-/RS/N.RC
          ADML   RCON        RESPONSE CONDITION
          SHN    /RS/L.URC-/RS/L.RCON+/RS/N.URC-/RS/N.RCON
          ERRNZ  /RS/P.URC-/RS/P.RCON
          ERRNZ  /RS/P.RC-/RS/P.URC
          STML   RS+/RS/P.URC
          UJK    PUTRCX
          EJECT
** 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  6
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  6
 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  CHECK IF CALLER WANTS RESPONSE
          SHN    /CM/L.STOR+2
          MJN    RESP10      IF STORE RESPONSE FLAG IS SET
          LDDL   RESPC       CHECK FOR NORMAL RESPONSE
          SBN    R.NRM
          NJN    RESP10      IF NOT NORMAL RESPONSE, STORE RESPONSE
          AOML   STORS       NONZERO MEANS DO NOT STORE RESPONSE
 RESP5    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 A SHORT RESPONSE SHOULD BE SENT.

          LDML   RS+/RS/P.RESPL  CONVERT RESPONSE LENGTH TO WORDS
          ZJK    RESP5       IF RESPONSE LENGTH = 0
          SHN    -3
          STDL   T4          RESPONSE LENGTH IN WORDS
          SBN    1
          ZJN    RESP15      IF A SHORT RESPONSE
          LDN    0           CLEAR FLAG IF NOT SHORT RESPONSE
          UJN    RESP17

 RESP15   BSS
          LDML   RS+/RS/P.LU  PUT LOGICAL UNIT IN SHORT RESPONSE
          LPK    /RS/M.LUN
          ERRNZ  16-/RS/L.LUN-/RS/N.LUN
          ADK    /RS/K.SHORT  SET FLAG FOR SHORT RESPONSE
 RESP17   BSS
          STML   RS+/RS/P.SHORT

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

          LDDL   INP
          SBDL   OUTP
          MJN    RESP20      IF IN .LT. OUT
          LDDL   LIM         IN .GE. OUT, SET OUT = OUT + LIMIT
          RADL   OUTP
 RESP20   LDML   RS+/RS/P.RESPL  GET RESPONSE LENGTH
          ADDL   INP
          STDL   INPNT       IN + RESPONSE LENGTH
          SBDL   OUTP        CHECK IF ENOUGH ROOM IN BUFFER FOR RESPONSE
          MJN    RESP30      IF ENOUGH ROOM IN BUFFER
          RJM    PPREQ       CHECK IDLE AND ACTIVE FLAGS
          UJK    RESP10

 RESP30   BSS
          LDN    0
          STDL   T5          NUMBER OF WORDS IN 2ND BLOCK WRITE
          LDDL   INP
          SHN    -3
          STDL   T3          'IN' POINTER IN WORDS
          LDDL   INPNT
          SBDL   LIM
          MJN    RESP50      IF IN + RESPONSE LENGTH .LT. LIMIT
                             ONLY 1 BLOCK WRITE
          STDL   INPNT       IN + RESPONSE LENGTH - LIMIT = NEW 'IN' POINTER
          SHN    -3
          STDL   T5          NUMBER OF WORDS IN 2ND BLOCK WRITE

* WRITE RESPONSE TO CM.

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

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

* CHECK IF RESPONSE SHOULD BE SENT TO CM.

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

* UPDATE THE 'IN' POINTER.

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

* INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   PPNO-3      SET LAST BYTE NONZERO
 INTPRC   INPN   1           INTERRUPT OR PSN
          CRDL   T1          THIS INSTRUCTION IS BECAUSE OF AN 810/830 PROBLEM
          UJK    RESNX
          EJECT
** NAME-- RECRS
*
** PURPOSE-- IF AN ERROR HAS BEEN RECOVERED, SEND AN INTERMEDIATE
*            RESPONSE TO CM.
*
** EXIT-- A REGISTER = 0,    IF RECOVERED ERROR LIMIT HAS NOT BEEN REACHED.
*         A REGISTER .GT. 0, IF RECOVERED ERROR LIMIT HAS BEEN REACHED.
          SPACE  6
 RECRSX   LJM    **
 RECRS    EQU    *-1
          LDDL   ERRCNT      ERROR COUNTER
          ADDL   FNERR       FUNCTION TIMEOUT COUNTER
          ADML   CHERR       CHANNEL ERROR COUNTER
          ZJN    RECRSX      IF NO ERRORS

          LOADOVL RECSO
          LJM    RECRS1
          EJECT
** NAME-- CHNERR
*
** PURPOSE-- RECORD CHANNEL ERROR. ABORT REQUEST IF MAXIMUM RETRIES
**           HAVE BEEN MADE.
          SPACE  6
 CHNRX    LJM    **
 CHNERR   EQU    *-1
          LDK    /RS/K.CHERR  CHANNEL ERROR
          RJM    CHER        RECORD CHANNEL ERROR
          UJK    CHNRX
          EJECT
** NAME-- CHERO
*
** PURPOSE-- RECORD OUTPUT CHANNEL ERROR.
*            ABORT REQUEST IF MAXIMUM RETRIES HAVE BEEN MADE.
          SPACE  6
 CHEROX   LJM    **
 CHERO    EQU    *-1
          LDK    /RS/K.CHERO  OUTPUT CHANNEL ERROR
          RJM    CHER        RECORD CHANNEL ERROR
          UJK    CHEROX
          EJECT
** NAME-- CHER
          SPACE  6
 CHERX    LJM    **
 CHER     EQU    *-1
          RJM    SERR        ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
 E3       IFEQ   ERRTST,1
          RJM    TESTREC     TERMINATE RECOVERED ERROR TEST
 E3       ENDIF
          AOML   CHERR       INCREMENT CHANNEL ERROR RETRY COUNTER
          SBN    CTRY        HAVE MAXIMUM TRIES BEEN ATTEMPTED
          PJN    CHER10      IF MAXIMUM TRIES HAVE BEEN ATTEMPTED
          AOML   RS+/RS/P.STRY  INCREMENT RETRY COUNT
          UJK    CHERX

 CHER10   BSS
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)
          EJECT
 SERRX    LJM    **
 SERR     EQU    *-1         SAVE ERROR ID
          STDL   T1
          LMC    -0
          STDL   T2
          LDML   RS+/RS/P.CHERR  ERROR ID
          LPDL   T2
          ADDL   T1          ADD ERROR FLAG
          STML   RS+/RS/P.CHERR
          UJK    SERRX
          EJECT
 SERRIX   LJM    **
 SERRID   EQU    *-1         SAVE ERROR ID
          STDL   T1
          LMC    -0
          STDL   T2
          LDML   RS+/RS/P.ERRID  ERROR ID
          LPDL   T2
          ADDL   T1          ADD ERROR FLAG
          STML   RS+/RS/P.ERRID
          UJK    SERRIX
          EJECT
 SIDX     LJM    **
 SID      EQU    *-1         SAVE ERROR ID
          STDL   T1
          LMC    -0
          STDL   T2
          LDML   RS+/RS/P.ID  ERROR ID
          LPDL   T2
          ADDL   T1          ADD ERROR FLAG
          STML   RS+/RS/P.ID
          UJK    SIDX
          EJECT
** NAME-- ZRESP
*
** PURPOSE-- ZERO OUT PART OF THE RESPONSE BUFFER.
*
** NOTE-- THIS ROUTINE IS ALSO CALLED FOR RECOVERED ERROR RESPONSES.
          SPACE  6
 ZREX     LJM    **
 ZRESP    EQU    *-1
          LDN    0
          STDL   ERRCNT      ZERO OUT ERROR COUNTER
          STDL   FNERR       ZERO OUT FUNCTION TIMEOUT COUNTER
          STML   RCON        RESPONSE CONDITION
          STML   CHERR       CHANNEL ERROR COUNTER
          STML   SECTRY      SECTOR RETRY COUNTER
          STML   NODEL       DON'T DELINK REQUEST FLAG
          STML   RS+/RS/P.HDWR  ABNORMAL STATUS
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE

          LDK    C.RS-/RS/C.FTRK
          STDL   WC
          LOADC  CM.CB       ADDRESS OF COMMUNICATION BUFFER
          ADK    /CB/C.ZERO
          CRML   RS+/RS/P.FTRK,WC  ZERO OUT PART OF RESPONSE BUFFER

          LDN    8           SET RESPONSE LENGTH FOR NORMAL RESPONSE
          STML   RS+/RS/P.RESPL
          LDN    R.NRM       SET RESPONSE CODE = NORMAL
          STDL   RESPC
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC  PUT REPONSE CODE IN RESPONSE
          UJK    ZREX
          EJECT
** NAME-- SETRQ
*
** PURPOSE-- SET UP FOR FIRST REQUEST.
          SPACE  6
 SETRQX   LJM    **
 SETRQ    EQU    *-1
          LDML   SS+/SS/P.REQ,SELIN  SAVE RMA OF REQUEST
          STML   FCOMRQ      FIRST COMPLETED REQUEST (RMA)
          STML   CURRQ       CURRENT REQUEST (RMA)
          LDML   SS+/SS/P.REQ+1,SELIN
          STML   FCOMRQ+1
          STML   CURRQ+1
          LDN    1
          STDL   NCOMRQ      NUMBER OF COMPLETED REQUESTS
          RJM    SETADD      PUT STARTING ADDRESS IN RESPONSE BUFFER

* SET UP INTERRUPT PROCESSOR INSTRUCTION IF INTERRUPT IS SELECTED.

          LDML   RQ+/RQ/P.INT  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  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
          EJECT
** NAME-- SETADD
*
** PURPOSE-- SET STARTING DISK ADDRESS IN RESPONSE BUFFER.
          SPACE  6
 SETADDX  LJM    **
 SETADD   EQU    *-1
          LDML   SS+/SS/P.LU,SELIN  PUT LOGICAL UNIT IN RESPONSE
          STML   RS+/RS/P.LU
*
          LDDL   CHAN        CHANNEL NUMBER
          STML   RS+/RS/P.CHAN
          LDML   SS+/SS/P.UNIT,SELIN  UNIT NUMBER
          LPN    /SS/M.UNIT
          STML   RS+/RS/P.UNIT

* PUT STARTING ADDRESS IN RESPONSE BUFFER.

          LDML   SS+/SS/P.CYL,SELIN  STARTING CYLINDER ADDRESS
          STML   RS+/RS/P.SCYL
          LDML   SS+/SS/P.TRACK,SELIN  TRACK
          STML   RS+/RS/P.STRK
          LDML   SS+/SS/P.SECTOR,SELIN  SECTOR
          STML   RS+/RS/P.SSEC

* PUT REQUEST RETRY COUNT IN RESPONSE BUFFER.

          LDML   RQTRY       REQUEST RETRY COUNT
          STML   RS+/RS/P.RTRY
          UJK    SETADDX
          EJECT
** NAME-- DELRQ.
*
** PURPOSE-- DELETE COMPLETED REQUEST FROM THE UNIT QUEUE.
*            SELECT A NEW CURRENT REQUEST BASED UPON CYLINDER ADDRESS.
*
** INPUTS-- SS+P.UQT,SELIN = POINTER TO UNIT QUEUE TABLE
*           RQ = COMPLETED REQUEST.
*
** OUTPUTS-- RQ = SELECTED REQUEST
*            SS+/SS/P.REQ
*            SS+/SS/P.CYL
*            SS+/SS/P.TRACK
*            SS+/SS/P.SECTOR
*            SS+/SS/M.CUR
*            SS+/SS/M.WRITE
*            /UIT/NEXT
*            /UIT/NEXTPV
*            /RQ/NEXT
*            /RQ/NEXTPV
*
** NOTE-- ASSUMES UNIT QUEUE LOCK HAS BEEN SET.
          SPACE  6
 DELX     LJM    **
 DELRQ    EQU    *-1

 DEL10    BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    DEL10       IF LOCK COULD NOT BE SET

* DECREMENT QUEUE COUNTER.

          LOADR  SS+/SS/P.UQT,SELIN  LOAD CM ADDRESS OF UNIT QUEUE TABLE
          STDL   T1
          CRDL   P1          READ QUEUE COUNT
          ERRNZ  /UIT/C.QCNT
          LDDL   P1+/UIT/P.QCNT  DECREMENT QUEUE COUNT
          SBDL   NCOMRQ      NUMBER OF COMPLETED REQUESTS
          STDL   P1+/UIT/P.QCNT
          MJN    DEL20       IF INVALID QUEUE COUNT
          LDDL   T1
          LMC    400000B
          CWDL   P1          WRITE QUEUE COUNT

* RE-READ RMA CHAIN POINTERS OF CURRENT REQUEST.

 DEL20    BSS
          LDN    2
          STDL   P3
          LOADF  CURRQ       RMA OF CURRENT REQUEST
          CRML   RQ,P3       READ RMA CHAIN OF CURRENT REQUEST

* DELINK REQUEST.
* (P3 = 2.)

 DEL30    BSS
          LOADF  SS+/SS/P.QP,SELIN  CM ADDRESS OF LAST LINK ON QUEUE
          STDL   P2          SAVE CM ADDRESS
          ADN    1
          CRDL   T1          READ NEXT REQUEST POINTER
          ERRNZ  /RQ/C.NEXTPV
          ERRNZ  /RQ/C.NEXT-1
          ERRNZ  /UIT/C.NEXT-/UIT/C.NEXTPV-1

* CHECK IF NEXT REQUEST IN CHAIN = COMPLETED REQUEST.

          LDDL   T4
          SBML   FCOMRQ+1    IS NEXT REQUEST IN CHAIN = COMPLETED REQUEST
          NJN    DEL40       IF NEXT REQUEST IN CHAIN IS NOT COMPLETED REQUEST
          LDDL   T3
          SBML   FCOMRQ
          ZJN    DEL50       IF LINK FOUND TO COMPLETED REQUEST
 DEL40    BSS
          LDDL   T3          UPDATE CURRENT QUEUE POINTER
          STML   SS+/SS/P.QP,SELIN
          LDDL   T4
          STML   SS+/SS/P.QP+1,SELIN
          UJK    DEL30

* DELINK COMPLETED REQUESTS.
* (P3 = 2.)

 DEL50    BSS
          LDDL   P2          CM ADDRESS OF REQUEST
          ERRNZ  /RQ/C.NEXTPV
          LMC    400000B
          CWML   RQ,P3       PVA AND RMA OF NEXT REQUEST IN CHAIN

* CLEAR FLAGS IN SS ENTRY.

          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED',
                             'WRITE REQUEST', 'CURRENT REQUEST'
          LPC    -/SS/K.SEEK-/SS/K.WRITE-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/L.SEEK-11
          ERRNZ  /SS/L.WRITE-12
          ERRNZ  /SS/L.CUR-13
          LDN    0
          STDL   NCOMRQ      CLEAR COMPLETED REQUEST COUNT

* SELECT NEXT REQUEST ON QUEUE.

          LDML   RQ+/RQ/P.NEXT  CHECK IF END OF QUEUE
          ADML   RQ+/RQ/P.NEXT+1
          NJN    DEL60       IF NEXT REQUEST EXISTS
          LDDL   P4          QUEUE COUNT
          ZJN    DEL60       IF QUEUE EMPTY
          RJM    SELRQ       SELECT FIRST REQUEST IN QUEUE
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          UJK    DELX

 DEL60    BSS
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDML   RQ+/RQ/P.NEXTPV  SAVE PVA OF NEXT REQUEST
          STML   SS+/SS/P.PVA,SELIN
          LDML   RQ+/RQ/P.NEXTPV+1
          STML   SS+/SS/P.PVA+1,SELIN
          LDML   RQ+/RQ/P.NEXTPV+2
          STML   SS+/SS/P.PVA+2,SELIN
          LDML   RQ+/RQ/P.NEXT
          STML   SS+/SS/P.REQ,SELIN  SAVE RMA ADDRESS OF NEXT REQUEST
          LDML   RQ+/RQ/P.NEXT+1
          STML   SS+/SS/P.REQ+1,SELIN
          ADML   SS+/SS/P.REQ,SELIN
          ZJN    DEL70       IF QUEUE EMPTY

* SET CURRENT REQUEST IN SS TO SELECTED REQUEST.

          RJM    UREQ        READ SELECTED REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL
          STML   SS+/SS/P.CYL,SELIN CYLINDER ADDRESS OF CURRENT REQUEST
          LDML   RQ+/RQ/P.TRACK
          STML   SS+/SS/P.TRACK,SELIN  TRACK ADDRESS
          LDML   RQ+/RQ/P.SECTOR
          STML   SS+/SS/P.SECTOR,SELIN  SECTOR ADDRESS

* SET /SS/M.WRITE FOR ALL WRITE OPERATIONS.

          LDML   CM+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ERRNZ  /CM/L.CODE
          ADC    -C.WRITE
          NJN    DEL65       IF COMMAND CODE .NE. WRITE
          LDK    /SS/K.WRITE+/SS/K.CUR  SET 'WRITE' FLAG
                             AND 'CURRENT REQUEST' FLAG
          UJN    DEL67

 DEL65    BSS
          LDK    /SS/K.CUR   SET 'CURRENT REQUEST' FLAG
 DEL67    RAML   SS+/SS/P.CUR,SELIN
 DEL70    BSS
          UJK    DELX
          EJECT
** NAME-- GETSS
*
** PURPOSE-- READ SS ENTRY FROM UNIT COMMUNICATION BUFFER IN
*            CM UNIT INTERFACE TABLE.
*
** INPUT-- SELIN, /SS/P.COM.
*
          SPACE  6
 GETSSX   LJM    **
 GETSS    EQU    *-1
          LDC    SS+/SS/P.ENTRY  ADDRESS OF SS ENTRY
          ADDL   SELIN
          STML   GETSS10
          LDN    C.SS        NUMBER OF WORDS TO READ
          STDL   WC
          LOADR  SS+/SS/P.COM,SELIN  ADDRESS OF COMMUNICATION BUFFER
          CRML   **,WC       READ SS ENTRY
 GETSS10  EQU    *-1
          UJK    GETSSX
          EJECT
** NAME-- SETLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE TABLE.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SETLX    LJM    **
 SETLOCK  EQU    *-1
          LDC    SS+/SS/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADDL   SELIN
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          LDML   SS+/SS/P.ENTRY,SELIN  CLEAR 'ENTRY PRESENT' FLAG
          LPC    -/SS/K.ENTRY
          ADK    /SS/K.ENTRY
          STML   SS+/SS/P.ENTRY,SELIN
          RJM    SCLOCK      SET CHANNEL LOCK
          ZJK    SETLX       IF CHANNEL LOCK WAS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
          LDN    1           LOCK COULD NOT BE SET
          UJK    SETLX
          EJECT
** NAME-- SQLOCK
*
** PURPOSE-- SETS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SQLX     LJM    **
 SQLOCK   EQU    *-1
          LDC    SS+/SS/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADDL   SELIN
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          UJK    SQLX
          EJECT
** NAME-- LOCK
*
** PURPOSE-- SET A LOCKWORD IN CENTRAL MEMORY.
*
** ENTRY--
*         T7 = THE ADDRESS OF THE 3 DIRECT CELLS WHICH CONTAIN
*              THE REFORMATED ADDRESS OF THE CENTRAL MEMORY
*              INTERFACE TABLE.
*         T5 = THE CENTRAL MEMORY WORD OFFSET WITHIN THE
*              INTERFACE TABLE OF THE LOCKWORD.
*
** EXIT--
*         A REGISTER = 0, IF THE LOCK WAS SET.
*         A REGISTER .NE. O, IF THE LOCK COULD NOT BE SET.
*
** ALGORITHM
*         1. WRITE THE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000,
*            USING A RDSL INSTRUCTION.
*            (SET T1 - T4 = FFFF FFFF 0000 0000,
*            RDSL   T1)
*
*         2. AFTER EXECUTION OF 'RDSL T1',
*            IF T1 - T2 = FFFF FFFF,
*            THEN GO BACK AND EXECUTE STEP 1,
*            ELSE GO TO STEP 3.
*
*         3. IF T1 = 0, WRITE THE PP LOCKWORD TO CENTRAL MEMORY,
*            AS DESCRIBED IN THIS STEP.  ELSE IF T1 .NE. 0, GO TO
*            STEP 4.
*            TO WRITE THE PP LOCKWORD ID:
*            SET T1 - T4 = 8000 0000 0000 PPNO, WHERE PPNO IS THE
*            LOGICAL PP NUMBER OF THIS PP.
*            CWDL   T1.
*            SET THE A REGISTER = 0, AND EXIT.
*
*         4. IF T1 = 8000 AND T4 = PPNO, THIS LOCKWORD WAS ALREADY
*            RESERVED TO THIS PP.
*            RESTORE THE CENTRAL MEMORY LOCATION  (CWDL   T1).
*            SET THE A REGISTER = 0, AND EXIT.
*
*         5. IF T4 .NE. PPNO, THEN THIS LOCKWORD IS RESERVED TO
*            A DIFFERENT PROCESSOR.
*            SET BIT 16 OF THE LOCKWORD THAT WAS READ WITH THE
*            RDSL INSTRUCTION, AND WRITE THE CONTENTS BACK TO
*            CENTRAL MEMORY.
*            THE PURPOSE OF SETTING BIT 16 IS TO REQUEST THE
*            OTHER PROCESSOR TO GIVE UP THE LOCKWORD.
*            LDDL   T2
*            LPC    77777B
*            ADC    100000B
*            STDL   T2
*            CWDL   T1.
*            SET THE A REGISTER .NE. 0, AND EXIT.
          SPACE  6
 LOCKX    LJM    **
 LOCK     EQU    *-1

* WRITE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000.

 LOCK10   BSS
          LCN    0           SET INTERMEDIATE VALUE
          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

* CHECK IF RDSL INSTRUCTION WAS SUCCESSFUL.

          LDDL   T1
          ADDL   T4
          ZJN    LOCK40      IF LOCK CAN BE SET

* CHECK FOR LOCKWORD = FFFF FFFF XXXX XXXX(16).

          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          ZJK    LOCK10      IF SOMEONE ELSE WAS FIRST TO WRITE
                             THE INTERMEDIATE VALUE

* SET BIT 16 IN THE ORIGINAL CONTENTS OF CENTRAL MEMORY AND
* WRITE IT BACK TO CENTRAL MEMORY.

          LDDL   T2          SET THE 'REQUEST LOCKWORD' FLAG
          LPC    77777B
          ADC    100000B
          STDL   T2

 LOCK20   BSS
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          RESTORE THE LOCKWORD

          LDDL   T4
          SBDL   PPNO        CHECK IF LOCK ALREADY SET
          NJN    LOCK30      IF LOCK COULD NOT BE SET, EXIT A .NE. 0
          LDDL   T1
          ADC    -100000B
 LOCK30   UJK    LOCKX       IF LOCK WAS ALREADY SET, EXIT A = 0
                             IF LOCK COULD NOT BE SET, EXIT A .NE. 0

* SET THE LOCKWORD.

 LOCK40   BSS
          LDC    100000B
          STDL   T1
          LDN    0
          STDL   T2
          STDL   T3
          LDDL   PPNO
          STDL   T4
          UJK    LOCK20



          EJECT
** NAME-- CLRLOCK
*
** PURPOSE-- CLEARS UNIT LOCK IN UNIT INTERFACE TABLE.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
*          /SS/P.COM, /SS/P.UQT.
          SPACE  6
 CLRLX    LJM    **
 CLRLOCK  EQU    *-1
          LDML   SS+/SS/P.ENTRY,SELIN  CLEAR 'ENTRY PRESENT' FLAG
          LPC    -/SS/K.ENTRY
          STML   SS+/SS/P.ENTRY,SELIN
          RJM    SAVSS       WRITE SS ENTRY TO COMMUNICATION BUFFER
                               IN UNIT INTERFACE TABLE
          LDC    SS+/SS/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADDL   SELIN
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR UNIT LOCKWORD
          UJK    CLRLX
          EJECT
** NAME-- SAVSS
*
** PURPOSE-- WRITE THE SS ENTRY TO THE COMMUNICATION BUFFER
*            IN THE UNIT INTERFACE TABLE.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
          SPACE  6
 SAVX     LJM    **
 SAVSS    EQU    *-1

* WRITE SS ENTRY TO COMMUNICATION BUFFER IN UNIT INTERFACE TABLE.

          LDC    SS+/SS/P.ENTRY  ADDRESS OF SS ENTRY
          ADDL   SELIN
          STML   SAV10
          LDN    C.SS        NUMBER OF WORDS TO WRITE
          STDL   WC
          LOADR  SS+/SS/P.COM,SELIN  ADDRESS OF COMMUNICATION BUFFER
          CWML   **,WC       WRITE SS ENTRY
 SAV10    EQU    *-1
          UJK    SAVX
          EJECT
** NAME-- CQLOCK
*
** PURPOSE-- CLEARS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
*          /SS/P.COM, /SS/P.UQT.
          SPACE  6
 CQLX     LJM    **
 CQLOCK   EQU    *-1
          LDC    SS+/SS/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADDL   SELIN
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CQLX
          EJECT
** NAME-- CLOCK
*
** PURPOSE-- CLEAR A LOCKWORD IN CENTRAL MEMORY.
*
** ENTRY--
*         T7 = THE ADDRESS OF THE 3 DIRECT CELLS WHICH CONTAIN
*              THE REFORMATED ADDRESS OF THE CENTRAL MEMORY
*              INTERFACE TABLE.
*         T5 = THE CENTRAL MEMORY WORD OFFSET WITHIN THE
*              INTERFACE TABLE OF THE LOCKWORD.
*
** EXIT--
*         A REGISTER = 0, IF THE LOCK WAS CLEARED.
*         A REGISTER .NE. O, IF THE LOCK WAS NOT CLEARED.
*
** ALGORITHM
*         1. WRITE THE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000,
*            USING A RDSL INSTRUCTION.
*            (SET T1 - T4 = FFFF FFFF 0000 0000,
*            RDSL   T1)
*
*         2. AFTER EXECUTION OF 'RDSL T1',
*            IF T1 - T2 = FFFF FFFF,
*            THEN GO BACK AND EXECUTE STEP 1,
*            ELSE GO TO STEP 3.
*
*         3. IF T4 .NE. PPNO, THIS LOCKWORD IS RESERVED TO A
*            DIFFERENT PROCESSOR.
*            RESTORE THE CONTENTS OF THIS CENTRAL MEMORY LOCATION
*            AS IT EXISTED BEFORE THE VALUE FFFF FFFF XXXX XXXX
*            WAS WRITTEN.
*            CWDL   T1.
*            SET THE A REGISTER .NE. 0, AND EXIT.
*
*         4. IF T4 = PPNO, THEN CLEAR THE LOCKWORD IN CENTRAL MEMORY.
*            SET T1 - T4 = 0000 0000 0000 0000.
*            CWDL   T1.
*            SET THE A REGISTER = 0, AND EXIT.
          SPACE  6
 CLKX     LJM    **
 CLOCK    EQU    *-1

* WRITE INTERMEDIATE VALUE OF FFFF FFFF 0000 0000.

 CLK10    BSS
          LCN    0           SET INTERMEDIATE VALUE
          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

* CHECK IF RDSL INSTRUCTION WAS SUCCESSFUL.
* CHECK FOR LOCKWORD = FFFF FFFF XXXX XXXX(16).

          LDDL   T1
          ADDL   T2
          ADC    -177777B-177777B
          ZJK    CLK10       IF SOMEONE ELSE WAS FIRST TO WRITE
                             THE INTERMEDIATE VALUE

          LDDL   T4          CHECK PP NUMBER
          SBDL   PPNO
          NJN    CLK20       IF THIS PP DOES NOT HAVE THE LOCK SET,
                             RESTORE THE ORIGINAL CONTENTS.

* CLEAR THE LOCKWORD.

          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4

* WRITE THE LOCKWORD.

 CLK20    BSS
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          RESTORE THE ORIGINAL CONTENTS
          LDDL   T1
          UJK    CLKX        EXIT, A REGISTER NONZERO IF THE LOCK IS NOT CLEAR.
                             A REGISTER = 0 IF THE LOCK WAS CLEARED OR WAS
                             ALREADY CLEAR WHEN THIS ROUTINE WAS ENTERED.
          EJECT
** NAME-- CKCHAN
*
** PURPOSE-- CHECK IF MAINTENANCE PP WANTS THE CHANNEL.
          SPACE  6
 CKCX     LJM    **
 CKCHAN   EQU    *-1
          LDN    C.CHCNT     NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP THE CHANNEL
          STML   CHLCNT
          LDML   CHLOCK
          ZJK    CKCX        IF CHANNEL LOCK IS NOT SET
          LOADC  CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          ADDL   CHAN        CHANNEL NUMBER IS OFFSET IN TABLE
          CRDL   T1          READ CHANNEL LOCKWORD
          LDDL   T2
          SHN    17-0
          PJK    CKCX        IF MAINTENANCE PP DOES NOT WANT THE CHANNEL
          LOADOVL PPREQO
          LJM    CKC10
          EJECT
** NAME-- DROPS
*
** PURPOSE-- ISSUE DROP SEEKS COMMAND.
*
** INPUT-- SELECT = INDEX TO SELECTED SS ENTRY.
          SPACE  6
 DROX     LJM    **
 DROPS    EQU    *-1

* ISSUE DROP SEEKS COMMAND TO THE CONTROLLER.

          LDML   CHLOCK
          ZJN    DROX        IF CHANNEL LOCK IS NOT SET,
                             THEN THERE CANNOT BE ANY UNITS LOCKED
          LDDL   SEKCNT
          STDL   P6
          ZJN    DROX        IF NO OUTSTANDING SEEKS
          LDN    F.DRPSK     ISSUE DROP SEEKS FUNCTION
          RJM    FUNC

* FIND ALL UNITS IN WHICH A SEEK WAS ISSUED.
* SAVE SS ENTRY AND CLEAR LOCK.

 DRO10    BSS
          LDML   SEKS-1,P6   INDEX OF SEEKS ISSUED
          STDL   SELIN
          SBDL   SELECT
          ZJN    DRO20       IF SELECTED UNIT
          LDML   SS+/SS/P.ENTRY,SELIN
          SHN    /SS/L.ENTRY+2
          PJN    DRO20       IF ENTRY IS NOT PRESENT
          RJM    CLRLOCK     CLEAR UNIT LOCK
          SODL   SEKCNT
 DRO20    BSS
          SODL   P6          DECREMENT INDEX
          NJK    DRO10       IF NOT END OF TABLE
          LDDL   SELECT      PUT SELECTED UNIT AS FIRST ENTRY IN SEKS
          STML   SEKS
          UJK    DROX
          EJECT
** NAME-- FORMA
*
** PURPOSE-- FORMAT A CM REAL MEMORY ADDRESS.
*
** CALLING SEQUENCE-- LDC    ADDRESS
*                     RJM    FORMA
*
** INPUT-- - A REGISTER- IS THE ADDRESS OF A 2-WORD CM BYTE ADDRESS.
*
** OUTPUT-- -CMADR- IS THE ADDRESS OF THE RESULTING 3-WORD REFORMATED
*                CM ADDRESS.  THE FORMAT CAN BE USED BY THE LOADC MACRO.
*           -ADDRESS-, WORD 0, BITS 0-13 AND
*                      WORD 1, BITS 3-15, ARE REFORMATTED TO-
*           -CMADR-,   WORD 0, BITS 0-9,
*                      WORD 1, BITS 0-11,
*                      WORD 2, BITS 0-5.
*
          SPACE  6
 FORX     LJM    **
 FORMA    EQU    *-1
          STDL   T1

* REFORMAT CM ADDRESS.

          LDML   1,T1
          LPN    7
          ZJN    FOR10       IF VALID RMA ADDRESS
          RJM    HALT        INVALID RMA ADDRESS
*         (NO RETURN FROM HALT.)

 FOR10    BSS
          LDIL   T1
          LPN    37B
          SHN    16
          LMML   1,T1
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STDL   CMADR+2
          LDIL   T1
          SHN    -5
          STD    CMADR
          LRD    CMADR
          LDDL   CMADR+2
          LMC    400000B
          UJK    FORX
          EJECT
** NAME-- PAUS
*
** PURPOSE-- DELAY PROGRAM EXECUTION FOR A SPECIFIED NUMBER OF
*            MICROSECONDS.
*
** INPUT-- A REGISTER (BITS 00-06) SPECIFIES NUMBER OF MICROSECONDS
*          TO BE DELAYED.
*
** NOTE-- THIS IS SET UP FOR 2X PP TIMING ON AN S1.
          SPACE  6
 PAUSX    LJM    **
 PAUS     EQU    *-1
          IFEQ   HARDW,1
 PAUS10   SBN    1           EACH ITERATION OF THIS SBN-NJN LOOP
          NJN    PAUS10      UTILIZES 1 MICROSECOND
          ENDIF
          UJK    PAUSX
          EJECT
          IFEQ   DUMP,1
 DUMPC    BSS
 DMP10    BSS
          LDN    61B         AUTODUMP FUNCTION
          IJM    DMP20,DC
 DMP15    DCN    40B+DC
          PSN
          UJK    DMP10

 DMP20    BSS
          FAN    DC
          LDC    177777B
 DMP30    IJM    DMP40,DC
          SBN    1
          NJN    DMP30
          UJK    DMP15

DMP40     BSS
          ACN    DC
          LDC    7765B
          LJM    RCDUMP
          ENDIF
          EJECT
          IFEQ   PAT,1
 PATX     LJM    **
 PATCH    EQU    *-1
          LDN    1
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.UAM
          CRML   PCM,WC
          LDML   PCM+2
          ADML   PCM+3
          ZJN    PATX
          LOADF  PCM+2
          CRDL   P1
          LDN    0
          STDL   P5
          LJM    PAT29

 PAT20    LDML   P1,P5
          ADC    -177777B    END OF PATCHES
          NJN    PAT28
          LDN    0
          STML   PCM+2
          STML   PCM+3
          LDN    1
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.UAM
          CWML   PCM,WC
          UJK    PATX

 PAT28    BSS
          ADC    -170000B+177777B  END OF CONTENTS
          NJN    PAT30
 PAT27    BSS
          RJM    PBUMP
 PAT29    BSS
          LDML   P1,P5
          STDL   PAD
          ADC    -170000B
          ZJN    PAT27
          RJM    PBUMP
          UJK    PAT20

 PAT30    LDML   P1,P5
          STIL   PAD
          AODL   PAD
          RJM    PBUMP
          UJK    PAT20

 PBUX     LJM    **
 PBUMP    EQU    *-1
          AODL   P5
          SBN    4
          MJN    PBUX
          LDN    8
          RAML   PCM+3
          SHN    -16
          RAML   PCM+2
          LOADF  PCM+2
          CRDL   P1
          LDN    0
          STDL   P5
          UJK    PBUX

 PCM      BSSZ   4
 PAD      EQU    P6          PP ADDRESS TO PATCH
          ENDIF
          EJECT
          QUAL   *
 Q113     IFEQ   ATST,1
 AUTOT    BSSZ   1           INCREMENTED FOR EACH SEEK ISSUED
 Q113     ENDIF
 GSTEST   BSSZ   1           GENERAL STATUS TEST
 ICSTEST  BSSZ   1           INCOMPLETE SECTOR TEST
 TESTPAR  BSSZ   1           TEST PARAMETER
 CHTEST   BSSZ   1           CHANNEL PARITY TEST
 CTPAR    BSSZ   1           CONFIDENCE TEST CODES
 CITEST   BSSZ   1           CONFIDENCE TEST INCOMPLETE SECTOR
          QUAL   RES
          SPACE  10
 FORCX    LJM    **
 FORC     EQU    *-1
          LDN    F.ERROR     FORCE ERROR FUNCTION
          RJM    FUNC
          ACN    DC
          LDDL   P1          PARAMETER
          OAN    DC
          FJM    *,DC
          LDI    P5          TIME DELAY
          DCN    40B+DC
          RJM    GENSTAT
          UJK    FORCX
          SPACE  10
 TESTEX   LJM    **          TERMINATE THE TEST
 TESTEND  EQU    *-1
          LDN    0
          STML   GSTEST
          STML   ICSTEST
          STML   CHTEST
          STML   CTPAR
          UJK    TESTEX
          SPACE  10
 TESTRX   LJM    **          END THE RECOVERED ERROR TESTS
 TESTREC  EQU    *-1
          LDML   TESTPAR
          SBN    5
          ZJN    TESTR10     IF RECOVERED CONTROLLER RESERVED TEST
          SBN    7-5
          ZJN    TESTR10     IF RECOVERED UNIT RESERVED TEST
          SBN    9-7
          ZJN    TESTR10     IF RECOVERED INCOMPLETE SECTOR TRANSFER
          SBN    12-9
          NJK    TESTRX
 TESTR10  BSS
          RJM    TESTEND     TERMINATE THE TEST
          UJK    TESTRX
 Q11      ENDIF
          EJECT

 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE
          QUAL   *
          EJECT
          IFNE   CHANTYP,1
 BUFF     EQU    7777B-SBYTE8  SECTOR DATA BUFFER
          ELSE
 BUFF     EQU    17777B-SBYTE8  SECTOR DATA BUFFER
          ENDIF
 CBUF     EQU    BUFF        START OF CM DATA IN SECTOR BUFFER
          SPACE  6
 IDLE     BSSZ   1           NONZERO IF IDLE COMMAND RECEIVED,
                               RESUME COMMAND RESETS IT TO 0
 IALF     BSSZ   1           BIT 0 = 1, IF THE CONFIDENCE TEST HAS BEEN STARTED
                             ON ALL UNITS
 CTESTU   BSSZ   1           UNIT INDEX FOR THE CONFIDENCE TEST
 CKDATA   BSSZ   1           CONFIDENCE TEST COMPARE DATA FLAG
 SAVE     BSSZ   1           SAVE THE SELIN VALUE
 DEBUG1   BSSZ   1           DEBUG PURPOSES ONLY
 NSEC     BSSZ   1           NUMBER OF SECTORS TO TRANSFER
 NTRANS   BSSZ   1           NUMBER OF SECTORS TRANSFERRED
 SNTRANS  BSSZ   1           STARTING VALUE OF NTRANS
 STV      BSSZ   1           INDEX TO TABLE OF DATA PATTERNS FOR THE
                             CONFIDENCE TEST
 NMED     BSSZ   1           NUMBER OF MEDIA ERRORS IN CONFIDENCE TEST
 NMEDL    EQU    3           NUMBER OF ACCEPTED MEDIA ERRORS IN CONFIDENCE CYLINDER
 MEDERR   BSSZ   NMEDL+1     NTRANS VALUES OF MEDIA ERRORS
 CPERR    BSSZ   1           NONZERO IF THERE WAS A COMPARE ERROR IN
                             THE CONFIDENCE TEST
 NCPERR   BSSZ   1           NUMBER OF SECTORS SUCCESSFULLY COMPARED
 STORS    BSSZ   1           STORE RESPONSE FLAG (USED BY RESPIN)
                               = 0, IF A RESPONSE IS SENT TO CM
                               = NONZERO, IF NO RESPONSE WAS SENT TO CM
 RVCNT    BSSZ   1           COUNT OF RECOVERED ERRORS PER REQUEST
 RQTRY    BSSZ   1           COUNT OF RETRIES OF REQUEST
 FCOMRQ   BSSZ   2           FIRST COMPLETED REQUEST (RMA)
 CURRQ    BSSZ   2           RMA OF CURRENT REQUEST
 PRERQ    BSSZ   2           RMA OF PREVIOUS REQUEST
 RCON     BSSZ   1           ADDITIONAL RESPONSE CONDITION
 CHERR    BSSZ   1           CHANNEL ERROR COUNTER
          IFEQ   ICHK,1
 INITL    BSSZ   1           SET NONZERO DURING INITIALIZATION
          ENDIF
 SECTRY   BSSZ   1           SECTOR RETRY COUNTER
 NODEL    BSSZ   1           DON'T DELINK REQUEST FLAG
 CHLOCK   BSSZ   1           SET NONZERO IF CHANNEL LOCK IS SET
 CHLCNT   BSSZ   1           NUMBER OF REQUESTS TO PROCESS BEFORE
                             CLEARING CHANNEL LOCK
 C.CHCNT  EQU    37          NUMBER OF REQUESTS TO PROCESS BEFORE
                             CLEARING CHANNEL LOCK
 SHARECH  BSSZ   1           NONZERO IF THE CHANNEL WAS GIVEN UP TO MALET OR DFT
 ILOAD    BSSZ   1           NONZERO AFTER INITIAL CONTROLWARE LOAD
 RECOV    BSSZ   1           INDEX TO NEXT RECOVERY PROCEDURE
 CRSV1    BSSZ   1           TIMEOUT COUNTER FOR CONTROLLER RESERVE
 CRSV2    BSSZ   1           TIMEOUT COUNTER FOR CONTROLLER RESERVE
 AREG     BSSZ   1
 FUNTO    BSSZ   1           SET WHILE FUNC IS READING DETAILED STATUS
 IGNORE   BSSZ   1           NONZERO, IF ERRORS ARE TO BE IGNORED
          SPACE  6

 D19      IFEQ   CONTYP,2
 SELIL    EQU    6           NUMBER OF ENTRIES IN SELECTION SET
 D19      ELSE
 SELIL    EQU    8           NUMBER OF ENTRIES IN SELECTION SET
 D19      ENDIF

 SEKS     BSSZ   SELIL       UNITS TO WHICH SEEKS HAVE BEEN ISSUED
 SS       BSSZ   SELIL*C.SS*4  SELECTION SET
 SSL      EQU    *-SS        LENGTH OF SELECTION SET TABLE
          SPACE  6
 RQ       BSSZ   C.RQ*4      REQUEST BEING PROCESSED
 CM       EQU    RQ+/RQ/P.CMND  COMMAND PORTION OF REQUEST
 CMLIST   EQU    CM
          BSSZ   P.CM*2+4    LIST OF CM ADDRESS AND LENGTH PAIRS POINTING TO
                              CM DATA.
 CMLN     EQU    *-CMLIST    LENGTH OF CMLIST BUFFER
          SPACE  6
 RS       BSSZ   C.RS*4      RESPONSE BUFFER
          BSSZ   3           MUST FOLLOW RS, FOR ZEROING OUT RS

 CTBUF    BSSZ   8           BUFFER FOR LOADING CONTROLWARE
          SPACE  6
 UDL      BSSZ   1           LENGTH OF UNIT DESCRIPTORS (CM WORDS)
          SPACE  6
 R        ERRPL  *-OVAD2     IF > 0, RESIDENT PORTION IS TOO LARGE
          EJECT
          QUAL   RES
 RUD      EQU    BUFF        NONZERO IF UNIT POINTERS HAVE BEEN READ
 UDBUF    EQU    BUFF+1      ACTIVE UNITS BUFFER
 UDBUFL   EQU    40*4        LENGTH OF ACTIVE UNITS BUFFER

          IFNE   CHANTYP,1
 END      EQU    7761B       END OF MEMORY
          ELSE
 END      EQU    17761B      END OF MEMORY
          ENDIF

 R3       ERRPL  UDBUF+UDBUFL-END
          EJECT
          QUAL   *

 END      EQU    /RES/END
 LNO      EQU    /RES/LNO
 RECS     EQU    /RES/RECS
 ATERM    EQU    /RES/ATERM
 HTERM    EQU    /RES/HTERM
 OTERM    EQU    /RES/OTERM
 LTERM    EQU    /RES/LTERM
 UTERM    EQU    /RES/UTERM
 ACN      EQU    /RES/ACN
 IAPMBF   EQU    /RES/IAPMBF
 OAPMBF   EQU    /RES/OAPMBF
 CFM      EQU    /RES/CFM
 OAMCT    EQU    /RES/OAMCT
 DCN      EQU    /RES/DCN
 RSA      EQU    /RES/RSA
 DISK     EQU    /RES/DISK
 MAINA    EQU    /RES/MAINA
 MAINB    EQU    /RES/MAINB
 MAINC    EQU    /RES/MAINC
 SEEK     EQU    /RES/SEEK
 SQLOCK   EQU    /RES/SQLOCK
 LOCK     EQU    /RES/LOCK
 CLRLOCK  EQU    /RES/CLRLOCK
 CQLOCK   EQU    /RES/CQLOCK
 SAVSS    EQU    /RES/SAVSS
 CLOCK    EQU    /RES/CLOCK
 GETSS    EQU    /RES/GETSS
 UREQ     EQU    /RES/UREQ
 ZRESP    EQU    /RES/ZRESP
 SETRQ    EQU    /RES/SETRQ
 SETADD   EQU    /RES/SETADD
 FAILAD   EQU    /RES/FAILAD
 SRESP    EQU    /RES/SRESP
 UNCMND   EQU    /RES/UNCMND
 GLIST    EQU    /RES/GLIST
 CFLGS    EQU    /RES/CFLGS
 PUTRC    EQU    /RES/PUTRC
 CHNERR   EQU    /RES/CHNERR
 CHERO    EQU    /RES/CHERO
 CHER     EQU    /RES/CHER
 SERR     EQU    /RES/SERR
 SERRID   EQU    /RES/SERRID
 SID      EQU    /RES/SID
 RESP     EQU    /RES/RESP
 RESPIN   EQU    /RES/RESPIN
 FUNC     EQU    /RES/FUNC
 GENSTAT  EQU    /RES/GENSTAT
 CKSTAT   EQU    /RES/CKSTAT
 FORMA    EQU    /RES/FORMA
 PAUS     EQU    /RES/PAUS
 DELRQ    EQU    /RES/DELRQ
 SELRQ    EQU    /RES/SELRQ
 UDBUFL   EQU    /RES/UDBUFL
 UCMDPR   EQU    /RES/UCMDPR
 FDCN     EQU    /RES/FDCN
 CONCH    EQU    /RES/CONCH
 TERMB    EQU    /RES/TERMB
 DROPS    EQU    /RES/DROPS
 E100     IFEQ   ERRTST,1
 TESTREC  EQU    /RES/TESTREC
 TESTEND  EQU    /RES/TESTEND
 E100     ENDIF
          EJECT
          QUAL   IN
 IPIT     BSSZ   C.PIT*4     PP INTERFACE TABLE
          EJECT
** NAME-- INIT
*
** PURPOSE-- INITIALIZE THE DRIVER AFTER DEADSTART.
*
** INPUT-- DSRTP = CM BYTE-ADDRESS OF THE PP INTERFACE TABLE.
          SPACE  6
          QUAL   *
 INIT     BSS
          QUAL   IN
          IFEQ   ICHK,1
          AOML   INITL       SET INITIALIZATION FLAG
          ENDIF

* GET POINTER TO SP-ADDRS-ARRAY.

          REFAD  DSRTP,CM.PIT   REFORMAT ADDRESS OF PP INTERFACE TABLE
                               AND SAVE.


* REFORMAT ADDRESS OF COMMUNICATION BUFFER.
* INITIALIZE CM.CB, COML.

          LOADC  CM.PIT      ADDRESS OF PP INTERFACE TABLE
          RJM    SETCB       SAVE ADDRESS OF COMMUNICATION BUFFER

* PUT ZEROES IN THE ZERO BUFFER.

          LDK    C.RS-/RS/C.FTRK
          STDL   WC
          LDDL   CMADR+2     CM ADDRESS OF COMMUNICATION BUFFER
          LMC    400000B
          ADK    /CB/C.ZERO
          CWML   RS+/RS/P.FTRK,WC  STORE ZEROES

* REFORMAT ADDRESS OF OVERLAY DIRECTORY.

          LOADC  CM.CB       POINTER TO PP COMMUNICATION BUFFER
          ADN    3
          CRDL   T1          READ WORD CONTAINING RMA OF DIRECTORY
          REFAD  T3,DH       REFORMAT DIRECTORY RMA


          RJM    ZRESP       ZERO OUT RESPONSE BUFFER

* READ PP_INTERFACE_TABLE.

          LDN    C.PIT
          STDL   WC
          LOADC  CM.PIT      LOAD CM ADDRESS OF PP INTERFACE TABLE
          CRML   IPIT,WC     READ PP INTERFACE TABLE
          IFEQ   LARGE,SMALL
          RJM    CHKRS       CHECK FOR VALIDITY OF PP RESPONSE BUFFER
          ENDIF
          LDML   IPIT+/PIT/P.PPNO  GET PP NUMBER
          STDL   PPNO

* INITIALIZE UDL, LUDL.

          LDML   IPIT+/PIT/P.UNITC  NUMBER OF UNIT DESCRIPTORS
          SHN    1
          STML   UDL         LENGTH OF UNIT DESCRIPTORS (CM WORDS)

* REFORMAT ADDRESS OF RESPONSE BUFFER.
* INITIALIZE CM.RS, LIM.

          REFAD  IPIT+/PIT/P.RSBUF,CM.RS  REFORMAT CM ADDRESS OF RESPONSE
                             BUFFER
          LDML   IPIT+/PIT/P.LIMIT  GET LIMIT OF RESPONSE BUFFER
          STDL   LIM
          IFEQ   LARGE,SMALL
          RJM    CHKPIT      CHECK FOR VALIDITY OF PP INTERFACE TABLE
          ENDIF

* REFORMAT ADDRESS OF INTERRUPT WORD.

          REFAD  IPIT+/PIT/P.INT,CM.INT  REFORMAT CM ADDRESS OF
                             INTERRUPT WORD

* REFORMAT ADDRESS OF CHANNEL TABLE.

          REFAD  IPIT+/PIT/P.CHAN,CM.CHAN  REFORMAT CM ADDRESS OF
                             CHANNEL TABLE

*
          IFEQ   LARGE,1
          RJM    WTDSK       INITIALIZE UNIT WITH LARGE SECTORS
          ELSE
 S1       IFEQ   SMALL,1
          RJM    WTDSK
S1        ENDIF
          ENDIF
*

 INIT110  BSS
          IFEQ   ICHK,1
          LDN    0
          STML   INITL       CLEAR INITIALIZATION FLAG
          ENDIF
          LJM    DISK
          EJECT
 SETCBX   LJM    **
 SETCB    EQU    *-1
          ADN    /PIT/C.CBUF  OFFSET OF PP COMMUNICATION BUFFER ADDRESS
          CRDL   P1          READ ADDRESS OF PP COMMUNICATION BUFFER
          LOADF  P3          REFORMAT CM ADDRESS OF PP COMMUNICATION BUFFER
          STML   CM.CB+2
          LDDL   CMADR
          STML   CM.CB
          LDDL   CMADR+1
          STML   CM.CB+1
          LDDL   P2          GET LENGTH OF PP COMMUNICATION BUFFER
          SHN    -3
          ADC    -C.CB
          MJN    *           IF NOT ENOUGH ROOM IN COMMUNICATION BUFFER
          UJK    SETCBX
          EJECT
 SAVAX    LJM    **
 SAVAD    EQU    *-1
          STML   2,T2
          LDDL   CMADR
          STI    T2
          LDDL   CMADR+1
          STML   1,T2
          UJK    SAVAX
          EJECT
* CHECK IF CONTROLLER IS RESERVED TO ANOTHER ACCESS.
          SPACE  6
          IFEQ   ICHK,1
 CONRX    LJM    *-1
 CONRSV   EQU    *-1
          RJM    CHGCH2      CHANGE CHANNEL NUMBERS IN I/O INSTRUCTIONS
          RJM    CFM         CLEAR CHANNEL FLAG AND IGNORE IF SET
          UJN    CONR5       IF NO CHANNEL ERROR

 CONR5    BSS
          LDC    187         WAIT 10 SECONDS
          STML   CONR110
 CONR10   BSS
          RJM    GENSTAT      GET GENERAL STATUS
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-10
          PJN    CONRX       IF MULTI-ACCESS COUPLER NOT CONNECTED
          SOML   CONR100
          NJN    CONR10
          SOML   CONR110
          NJN    CONR10      IF NOT 10 SECONDS
          LDK    /RS/K.CRS   CONTROLLER RESERVED
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          UJK    CONR5
          SPACE  6
 CONR100  BSSZ   1           TIMEOUT COUNTER
 CONR110  BSSZ   1           TIMEOUT COUNTER
          ENDIF
          EJECT
 RFUNTO   BSS                RECOVERED FUNCTION TIMEOUT
          IFEQ   ICHK,1
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE
          LDK    /RS/K.HDWR  HARDWARE ERROR
          STML   RS+/RS/P.HDWR  ABNORMAL STATUS
          RJM    TERMP       SEND UNSOLICITED MESSAGE TO CM
          LDDL   FUNCD       FUNCTION CODE
          LJM    FUN2        RETRY FUNCTION
          ENDIF
          EJECT
 UNREC    BSS                UNRECOVERED ERROR DURING INITIALIZATION
          IFEQ   ICHK,1
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          RJM    TERMP       SEND UNSOLICITED MESSAGE TO CM
          RJM    HALT        ERROR
*         (NO RETURN FROM HALT.)

          ENDIF
          EJECT
* CHECK FOR VALID PP RESPONSE BUFFER.
          SPACE  6
 D2       IFEQ   LARGE,SMALL
 CHKRX    LJM    **
 CHKRS    EQU    *-1
 F2       IFEQ   ERRTST,0
 D1       IFEQ   HARDW,1
          LDML   IPIT+/PIT/P.RSBUF-2  RESERVED WORD OF RESPONSE
                             BUFFER DESCRIPTOR
          ADML   IPIT+/PIT/P.RSBUF-1
          ADML   IPIT+/PIT/P.RSPVA-1
          NJN    CHKR100     IF RESERVED FIELD NOT XERO

          LDML   IPIT+/PIT/P.IN-3  RESERVED FIELD OF IN POINTER
          ADML   IPIT+/PIT/P.IN-2
          ADML   IPIT+/PIT/P.IN-1
          NJN    CHKR100     IF RESERVED FIELD NOT ZERO

          LDML   IPIT+/PIT/P.OUT-3  RESERVED FIELD OF OUT POINTER
          ADML   IPIT+/PIT/P.OUT-2
          ADML   IPIT+/PIT/P.OUT-1
          NJN    CHKR100     IF RESERVED FIELD NOT ZERO

          LDML   IPIT+/PIT/P.LIMIT-2
          ADML   IPIT+/PIT/P.LIMIT-1
          ZJK    CHKRX

 CHKR100  BSS
          RJM    HALT        INVALID RESPONSE BUFFER
*         (NO RETURN FROM HALT.)

 D1       ELSE
          UJK    CHKRX
 D1       ENDIF
 F2       ELSE
          UJN    CHKRX
 F2       ENDIF
 D2       ENDIF
          EJECT
* CHECK FOR VALID PP-INTERFACE-TABLE.
          SPACE  6
          IFEQ   LARGE,SMALL
 CHKPX    LJM    **
 CHKPIT   EQU    *-1
 F3       IFEQ   ERRTST,0
 D8       IFNE   CONTYP,2
          LDN    0
          STDL   T1
          LDML   IPIT+/PIT/P.CBUFL  COMMUNICATION BUFFER LENGTH
          LPN    7
          NJN    CHKP100     IF LENGTH NOT A MULTIPLE OF WORDS

          AODL   T1
          LDML   IPIT+/PIT/P.CBUFL-1  RESERVED WORD OF PP COMMUNICATION
                             BUFFER DESCRIPTOR
          NJN    CHKP100     IF RESERVED WORD NOT ZERO

          AODL   T1
          LDML   IPIT+/PIT/P.CBUF+1  COMMUNICATION BUFFER (RMA)
          LPN    7
          NJN    CHKP100     IF PP COMMUNICATION BUFFER NOT A WORD BOUNDARY

          AODL   T1
          LDML   IPIT+/PIT/P.PPQPVA-1  RESERVED FIELD OF PP REQUEST
                             QUEUE DESCRIPTOR
          ADML   IPIT+/PIT/P.PPQ-1
          NJN    CHKP100     IF RESERVED FIELD NOT ZERO

          AODL   T1
          LDML   IPIT+/PIT/P.INT+1  INTERRUPT WORD (RMA)
          LPN    7
          NJN    CHKP100     IF INTERRUPT WORD NOT A WORD BOUNDARY
          AODL   T1
          LDML   IPIT+/PIT/P.CHAN+1  CHANNEL TABLE (RMA)
          LPN    7
          ZJK    CHKPX

 CHKP100  BSS
          LDML   CHKP110,T1  INTERFACE ERROR CODE
          RJM    INTERR      SEND ERROR TO CM
*         (NO RETURN FROM INTERR)

 CHKP110  BSS
          CON    E20B        COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF WORDS
          CON    E204        RESERVED WORD OF PP COMMUNICATION
                             BUFFER DESCRIPTOR NOT ZERO
          CON    E203        PP COMMUNICATION BUFFER NOT A WORD BOUNDARY
          CON    E205        RESERVED FIELD OF PP REQUEST QUEUE
                             DESCRIPTOR NOT ZERO
          CON    E211        RMA OF INTERRUPT WORD NOT A WORD BOUNDARY
          CON    E212        RMA OF CHANNEL TABLE NOT A WORD BOUNDARY
 D8       ELSE
          UJN    CHKPX
 D8       ENDIF
 F3       ELSE
          UJN    CHKPX
 F3       ENDIF
          ENDIF
          EJECT
* INTERFACE ERROR.
          SPACE  6
 INTERR   CON    0
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          LDK    /RS/K.INTERR  INTERFACE ERROR
          STML   RS+/RS/P.INTERR  ABNORMAL STATUS CODE
          RJM    TERMP       SEND RESPONSE TO CM
          RJM    HALT        ERROR
*         (NO RETURN FROM HALT.)

          EJECT
** NAME-- TERMP
*
** PURPOSE-- TERMINATE PP REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE
          SPACE  6
 TERX     LJM    **
 TERMP    EQU    *-1
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
 R5       ERRPL  *-END       INITIALIZE CODE
          QUAL   *


 PRGNAM   MICRO  1,4,*DISK*

*         OVERLAY STRUCTURE -
*
*         START              RESIDENT
*         OVAD2              SELSEK, READ, WRITE          CONFIDENCE TEST
*         OVAD3                (SELSEK EXTENDS)           CRC, CREAD, CWRITE
*         OVAD1              SELRQ,       RDERR
*         BUFF               DATA,   RECS,   DOWN UNIT,   PPREQ


          IFEQ   CONTYP,2
 OVAD1    EQU    BUFF-51B*4
 OVAD2    EQU    OVAD1-311B*4
          ELSE
 OVAD1    EQU    BUFF-22B*4
 OVAD2    EQU    OVAD1-325B*4
          ENDIF
 OVAD3    EQU    OVAD1-56B*4
          EJECT

          OVERLAY (READ WRITE),OVAD2
          ROUTINE READO
          CON    READOO

          QUAL   RD
          EJECT
** NAME--SELSEK
*
** PURPOSE--THIS ROUTINE SELECTS UNITS FOR THE SELECTION SET AND
*           ISSUES THE INITIAL SEEK.
*
          SPACE  6
 SELSX    LJM    **
          QUAL   *
 SELSEK   EQU    *-1
          QUAL   RD
          LDDL   CUNITS
          ZJK    SELSX       IF NO UNITS
          LDN    0
          STDL   FNC         ZERO OUT FUNCTION CODE

* SEARCH FOR NEW UNIT REQUESTS.

 SELS10   BSS
          RJM    GETUD       GET NEW UNIT REQUESTS
          LDDL   SEKCNT
          ZJK    SELSX       IF NO SEEKS WERE ISSUED

* POLL UNITS FOR ON SECTOR.

          RJM    POLLON      POLL FOR ON-SECTOR
          PJN    SELS50      IF UNIT ON-SECTOR OR ON-CYLINDER, SELECT IT

* DROP CONTROLLER RESERVE.
* REPOLL UNITS.

 P3       IFEQ   SHARED,1
 P4       IFEQ   HARDW,1
          AODL   NORQ        SET NO REQUEST FLAG IS CASE OF ERROR
          LDN    F.CLEAR     CLEAR CONTROLLER ACCESS
          RJM    FUNC        CLEAR THE COUPLER ACCESS
          LDN    0
          STDL   NORQ        CLEAR NO REQUEST FLAG

* DELAY 50 MICROSECONDS.

          PAUSE  50          DELAY 50 MICROSECONDS
 P4       ENDIF
 P3       ENDIF
          UJK    SELS10      REPOLL UNITS

* SELECT UNIT FROM LAST POLL.
* DROP SEEKS ON OTHER UNITS.

 SELS50   BSS
          RJM    DROPS       DROP SEEKS ON OTHER UNITS
          LDDL   SELECT      INDEX TO SELECTED UNIT
          STDL   SELIN
          UJK    SELSX
          EJECT
** NAME-- GETUD
*
** PURPOSE-- GET A UNIT REQUEST FROM CM.
*
** INPUT-- SELIN = INDEX TO SS TABLE.
*
** OUTPUT-- AN ENTRY IN THE SS TABLE IS FILLED WITH THE NEW UNIT REQUEST.
*
          SPACE  6
 GETUX    LJM    **
 GETUD    EQU    *-1
          LDML   LUD         INDEX OF LAST UNIT DESCRIPTOR REQUEST FOUND + 1
          STDL   P6
          LDN    0
          STDL   SELIN
          STML   /RES/RUD    READ UNIT POINTERS
 GETU5    BSS
          LDML   SS+/SS/P.ENTRY,SELIN
          SHN    /SS/L.ENTRY+2
          PJN    GETU10      IF ENTRY NOT PRESENT
          LDN    C.SS*4
          RADL   SELIN       INCREMENT SELECTION SET INDEX
          ADK    -SSL        CHECK FOR END OF TABLE
          PJK    GETUX       IF END OF TABLE
          UJK    GETU5


* FIND THE NEXT VACANT SS ENTRY.

 GETU7    BSS
          LDN    C.SS*4
          RADL   SELIN       INCREMENT SELECTION SET INDEX
          ADK    -SSL        CHECK FOR END OF TABLE
          PJK    GETUX       IF END OF TABLE
          LDML   SS+/SS/P.ENTRY,SELIN
          SHN    /SS/L.ENTRY+2
          MJN    GETU7       IF ENTRY IS TAKEN

* CHECK IF ALL UNITS HAVE BEEN SEARCHED.

 GETU8    BSS
          LDML   LUD         HAVE ALL ENTRIES BEEN CHECKED
          SBDL   P6
          ZJK    GETUX       IF NO MORE ENTRIES TO CHECK

 GETU10   BSS
          LDML   LUD
          STDL   P2
          LDN    4
          RAML   LUD         BUMP UNIT POINTER INDEX
          SHN    -2
          SBDL   CUNITS
          NJN    GETU16      IF NOT END OF TABLE
          STML   LUD


* CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.

 GETU16   BSS
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR SEEK FLAG IN SS
          LPC    -/SS/K.SEEK-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN
          LDML   /RES/RUD    CHECK IF UNIT POINTERS HAVE BEEN
          SBN    77B         CLOBBERED BY AN OVERLAY
          ZJN    GETU15      IF UNIT POINTERS HAVE BEEN READ INTO PP BUFFER
          RJM    READUD      READ POINTERS TO UNIT INTERFACE TABLES
 GETU15   BSS
          LOADR  /RES/UDBUF+/UN/P.UIT,P2  LOAD ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          CRDL   T1          READ UNIT DISABLED FLAG
          ADN    /UIT/C.NEXT
          CRDL   T5          READ RMA OF NEXT REQUEST FROM UNIT QUEUE
          SBN    /UIT/C.NEXT-/UIT/C.UBUF  ADDRESS OF UNIT COMMUNICATION BUFFER
          CRDL   P2          READ ADDRESS OF UNIT COMMUNICATION BUFFER
          ADN    /UIT/C.ULOCK-/UIT/C.UBUF
          CRDL   T3          READ UNIT LOCKWORD
          LDDL   T3
          NJN    GETU18      IF LOCK IS SET
          LDDL   T7
          ADDL   T8
          ZJN    GETU18      IF NO REQUESTS ON THIS QUEUE
          LDDL   T1+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    2+/UIT/L.DSABLE
          PJN    GETU19      IF UNIT IS NOT DISABLED
 GETU18   BSS
          UJK    GETU8

* READ SS ENTRY FROM UNIT COMMUNICATION BUFFER.

 GETU19   BSS
          LDC    SS+/SS/P.ENTRY  ADDRESS OF SS ENTRY
          ADDL   SELIN
          STML   GETU20
          LDN    C.SS        NUMBER OF WORDS TO READ
          STDL   WC
          LOADF  P4          LOAD ADDRESS OF UNIT COMMUNICATION BUFFER
          CRML   **,WC       READ SS ENTRY
 GETU20   EQU    *-1

* SET UNIT LOCK.

          RJM    /RES/SETLOCK  SET UNIT LOCKWORD
          NJN    GETU57      IF LOCK COULD NOT BE SET
          LDML   SS+/SS/P.CUR,SELIN
          SHN    /SS/L.CUR+2
          MJN    GETU50      IF CURRENT REQUEST HAS BEEN SELECTED

* SELECT CURRENT REQUEST.

          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    GETU55      IF LOCK COULD NOT BE SET
          RJM    SELRQ       SELECT CURRENT REQUEST
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDML   SS+/SS/P.CUR,SELIN  CHECK IF REQUEST WAS FOUND
          SHN    /SS/L.CUR+2
          MJN    GETU50      IF A REQUEST WAS FOUND
 GETU55   BSS
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR SEEK FLAG IN SS
          LPC    -/SS/K.SEEK-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN
          RJM    CLRLOCK     CLEAR UNIT LOCKWORD
 GETU57   UJK    GETU8


* ISSUE THE SEEK.

 GETU50   BSS
          RJM    /RES/SEEKI  ISSUE INITIAL SEEK
          UJK    GETU7
          EJECT
** NAME-- READUD
*
** PURPOSE-- READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.
*
          SPACE  6
 REAX     LJM    **
 READUD   EQU    *-1

* READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.

          LDDL   CUNITS      NUMBER OF CONFIGURED UNITS
          ZJK    REAX        IF NO UNITS
          STDL   WC
          LOADC  CM.CB
          ADK    /CB/C.UNITS  UNIT INTERFACE TABLE POINTERS
          CRML   /RES/UDBUF,WC  READ UNIT INTERFACE TABLE POINTERS
          LDN    77B         SET FLAG FOR UNIT POINTERS IN MEMORY
          STML   /RES/RUD
          UJK    REAX
          EJECT
** NAME--POLLON
*
** PURPOSE-- THIS ROUTINE POLLS UNITS FOR ON-CYLINDER AND ON-SECTOR
*            AND CHOOSES THE CLOSEST UNIT FOR I/O TRANSFER.
*
** CALLING SEQUENCE--RJM POLLON
*
** INPUT-- SEKCNT, CHAN.
*
** OUTPUT-- A REGISTER = 0, IF THE UNIT IS ON-SECTOR.
*                      GT 0, IF THE UNIT IS CLOSEST TO ON-SECTOR.
*                            AND A REGISTER = NUMBER OF SECTORS TO THE
*                            START OF TRANSFER FOR THAT CLOSEST UNIT.
*                      LT 0, IF NO UNITS ARE ON-CYLINDER.
*           SELECT = SELECTED UNIT ENTRY (SS INDEX).
*           SELECTED UNIT IS CONNECTED.
*
          SPACE  6
 POLLX    LJM    **
 POLLON   EQU    *-1
          LDN    0           INITIALIZE SEKS TABLE INDEX
          STDL   P6
 Y2       IFNE   CONTYP,2
          LDN    77B
          STDL   P4          INITIALIZE CLOSEST UNIT'S SS INDEX
          STDL   P5          SECTOR DISTANCE OF CLOSEST UNIT
 Y2       ENDIF

* CHECK IF UNIT IS ON CYLINDER.

 POLL4    LDML   SEKS,P6     SET SELECTION SET INDEX
          STDL   SELECT
          STDL   SELIN
          LDML   SS+/SS/P.ENTRY,SELECT  CHECK IF LOCK IS SET AND SEEK ISSUED
          LPK    /SS/K.ENTRY+/SS/K.SEEK
          SBN    /SS/K.ENTRY+/SS/K.SEEK
          NJN    POLL20      IF SEEK WAS NOT ISSUED
 X1       IFEQ   MULT,1
          LDML   SS+/SS/P.CHAN,SELECT  GET CHANNEL NUMBER
          SHN    -16+/SS/L.CHAN+/SS/N.CHAN
          LPN    /SS/M.CHAN
          SBDL   CHAN
          NJN    POLL20      IF NOT SAME CHANNEL
 X1       ENDIF
 POLL14   BSS
          RJM    SEEK        ISSUE SEEK FUNCTION
 Y3       IFNE   CONTYP,2
          RJM    RSA         ISSUE RETURN SECTOR ADDRESS FUNCTION
 Y3       ELSE
          RJM    GENSTAT     GET GENERAL STATUS
 Y3       ENDIF
          LDDL   GNSTAT      CHECK GENERAL STATUS
          ZJN    POLL30      IF NO ERRORS
          SBN    2
          ZJN    POLL20      IF NO ERRORS
          RJM    GENSTAT     READ DETAILED STATUS
          RJM    CKSTAT      CHECK FOR GENERAL STATUS ERRORS
          MJK    POLL14      ATTEMPT RECOVERY OF ERROR
          RJM    /RES/RECRS  SEND ANY RECOVERED ERROR RESPONSES
 Y4       IFNE   CONTYP,2
 POLL20   UJN    POLL80

* COMPARE SECTOR ADDRESS OF REQUEST WITH CURRENT DISK SECTOR
* ADDRESS.
* COMPUTE SECTOR DISTANCE TO THE START OF THE REQUEST.

 POLL30   BSS
          LDML   SS+/SS/P.DV,SELECT  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   T3
          LDML   SS+/SS/P.WRITE,SELECT  CHECK IF READ OR WRITE
          SHN    /SS/L.WRITE+2
          PJN    POLL40      IF READ FUNCTION
          LDML   SECSC,T3    IF WRITE FUNCTION
          RADL   P2
 POLL40   LDML   SS+/SS/P.SECTOR,SELECT  STARTING SECTOR ADDRESS
          SBDL   P2          CURRENT DISK SECTOR ADDRESS
          ZJN    POLL48      IF CURRENT SECTOR = STARTING SECTOR
          PJN    POLL50      IF NOT END OF TRACK WRAP AROUND
 POLL48   ADML   DVSEC,T3    ADD NUMBER OF SECTORS/TRACK
 POLL50   STDL   T2
          ZJN    POLL60      IF NOT 1 OR 2 SECTORS AWAY
          SBN    3
          PJN    POLL60      IF NOT 1 OR 2 SECTORS AWAY
          LDN    0
          UJN    POLL85      EXIT, A REGISTER = 0, IF UNIT ON-SECTOR


* SELECT THE CLOSEST UNIT.

 POLL60   BSS
          LDDL   T2
          SBDL   P5
          PJN    POLL80      IF THIS UNIT IS NOT THE CLOSEST
          RADL   P5          SAVE THIS UNITS SECTOR DISTANCE
          LDDL   SELECT
          STDL   P4          SAVE THIS UNITS INDEX
 POLL80   AODL   P6          HAVE ALL UNITS BEEN CHECKED
          SBDL   SEKCNT
          MJK    POLL4       NO
          LDDL   P4          WERE ANY UNITS ON CYLINDER
          SBN    77B
          NJN    POLL90      IF AT LEAST 1 UNIT ON-CYLINDER
          LCN    1           A REGISTER .LT. 0, WHEN NO UNITS ON-CYLINDER
 POLL85   UJK    POLLX


* LEAVE CLOSEST UNIT SELECTED.

 POLL90   BSS
          LDDL   SELECT      CHECK IF UNIT IS ALREADY CONNECTED
          SBDL   P4
          ZJN    POLL98      IF UNIT IS ALREADY CONNECTED
          LDDL   P4
          STDL   SELECT      SET TO SELECTED UNIT ENTRY
          STDL   SELIN
          RJM    /RES/SEEKON  ISSUE SEEK FUNCTION AND RECOVER SEEK ERRORS
 POLL98   BSS
          LDDL   P5          A REGISTER .GT. 0, FOR CLOSEST UNIT
          UJK    POLL85      A REGISTER = SECTOR DISTANCE


 Y4       ELSE
 POLL20   UJN    POLL80
 POLL30   BSS
          LDN    1           A REGISTER .GT. 0, FOR SELECTED UNIT
          UJK    POLL85

 POLL80   BSS
          AODL   P6          HAVE ALL UNITS BEEN CHECKED
          SBDL   SEKCNT
          MJK    POLL4       NO
          LCN    1           A REGISTER .LT. 0, WHEN NO UNITS ON-CYLINDER
 POLL85   UJK    POLLX
 Y4       ENDIF
          EJECT
** NAME-- READ.
*
** PURPOSE-- PROCESS READ DATA COMMAND.
*
** INPUT-- CMLISTL = 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.
*          CML     = 0 IF NOT INDIRECT ADDRESS (COMMAND IS AT CMLIST)
*                  = 4 IF INDIRECT ADDRESS (COMMAND IS AT CMLIST + CML).
          SPACE  6
 READX    LJM    **
          QUAL   *
 READ     EQU    *-1
          QUAL   RD
 READ3    BSS
          LDDL   DEVICE      DEVICE TYPE
          STDL   DEV
          LDDL   FNC         FUNCTION CODE
          ZJN    READ1       IF READ
          LDN    0           FOR READ=FLAWS, TREAT AS SMALL
          STDL   DEV         SECTOR DEVICE
          RJM    SEEK        ISSUE SMALL SECTOR SEEK
 READ1    BSS
          LDN    5
          STDL   SMSEC       SET SMALL SECTOR COUNTER
          LDN    0
          STDL   TRKEND      SET TRACK END FLAG = 0
          STDL   SECPOS      SET SECTOR POSITION = 0
          STDL   SWFLG       CLEAR SWITCH FLAG

* SET UP NUMBER OF WORDS TO TRANSFER TO THIS CM ADDRESS.

 READ10   BSS
          LOADF  CMLIST+/CM/P.RMA,CML  SET UP CM ADDRESS OF DATA AREA
          STDL   DATADD+2
          SRD    DATADD      SAVE R REGISTER
          LDML   CMLIST+/CM/P.LEN,CML  NUMBER OF BYTES TO TRANSFER
          ADN    7           ROUND UP
          SHN    -3          NUMBER OF CM WORDS TO TRANSFER
          STDL   TWDS        TOTAL NUMBER OF CM WORDS TO TRANSFER TO THIS
                             ADDRESS
          ZJK    READ60      IF NO WORDS TO TRANSFER TO THIS ADDRESS
 READ20   STDL   WDS         COMPUTE NUMBER OF WORDS FROM CURRENT SECTOR
          SODL   SMSEC       DECREMENT SMALL SECTOR COUNTER
          NJN    READ22      IF NOT THE 5TH SECTOR
          LDN    5
          STDL   SMSEC       SET SMALL SECTOR COUNTER
          LDML   CMWDS5,DEV  COMPUTE NUMBER OF WORDS FROM CURRENT SECTOR
          UJN    READ23

 READ22   BSS
          LDML   CMWDS,DEV   COMPUTE NUMBER OF WORDS FROM CURRENT SECTOR
 READ23   BSS
          STDL   SECWDS      NUMBER OF DATA WORDS IN SECTOR
          SBDL   WDS
          SBDL   SECPOS      WORDS PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          PJN    READ25      IF LESS THAN 1 SECTOR
          LDDL   SECWDS
          SBDL   SECPOS
          PJN    READ24      IF VALID SECTOR POSITION
          LDDL   WDS         IF WDS = 0, POSITIONING TO NEXT MAU
          ZJN    READ24      IF VALID SECTOR POSITION
          RJM    HALT        INVALID SECTOR POSITION
*         (NO RETURN FROM HALT.)

 READ24   BSS
          STDL   WDS         NUMBER OF CM WORDS TO TRANSFER FROM CURRENT SECTOR

* CHECK IF END OF TRACK ON LAST READ.

 READ25   BSS
          LDDL   SECPOS
          NJK    READ51      IF MORE WORDS TO TRANSFER FROM LAST SECTOR
          LDDL   TRKEND
          ZJN    READ30      IF NOT END OF TRACK
          LDN    0
          STDL   TRKEND      RESET END OF TRACK FLAG
          LDML   SS+/SS/P.TRACK,SELIN  CHECK FOR INVALID TRACK ADDRESS
          SBML   DVTRK,DEVICE  COMPARE WITH NUMBER OF TRACKS / CYLINDER
          MJN    READ30      IF NOT END OF CYLINDER
          LDC    E507        ERROR IN REQUEST
          RJM    ATERM       ABNORMAL TERMINATION  (NO RETURN)
*         (NO RETURN FROM ATERM)


* TRANSFER DATA FROM DISK.

 READ30   BSS
          LDDL   FNC
          ZJN    READ32      IF READ FUNCTION
          RJM    /RES/SEEKON  ISSUE SEEK AND RECOVER SEEK ERRORS
          LDN    0
          STDL   MAPC        INITIALIZE READ-TYPE FUNCTION INDEX
          LDML   MAPFN,MAPC  ISSUE READ PROTECTED SECTOR
          UJN    READ34

 READ32   BSS
          LDN    F.READ      ISSUE READ FUNCTION TO DISK CONTROLLER
 READ34   BSS
          RJM    FUNC
 READ40   RJM    ACN         ACN   DC
          LDDL   FNC
          NJN    READ42      IF READ FLAW MAP
          LDDL   DEV
          NJN    READ44      IF NOT 844
 READ42   BSS
          LDC    322
          RJM    IAPMBF      IAPM   BUFF,DC
          UJN    READ46

 READ44   BSS
          LDC    SBYTE7
          RJM    IAPMBF      IAPM   BUFF,DC
 READ46   BSS
 E4       IFEQ   ERRTST,1
          ADML   ICSTEST     INCOMPLETE SECTOR TEST
 E4       ENDIF
          STML   AREG        SAVE A REGISTER IN CASE OF PREMATURE TERMINATION
 E5       IFEQ   ERRTST,1
          LDML   CHTEST      CHANNEL PARITY ERROR TEST
          NJN    *+4
 E5       ENDIF
          RJM    CFM         CFM    READ47,DC
          UJN    READ47      IF NO CHANNEL ERROR

          RJM    CHNERR      RECORD CHANNEL ERROR
 READ45   BSS
          RJM    /RES/SEEKON  REISSUE SEEK
          UJK    READ30      RE-READ SECTOR

 READ47   BSS
          RJM    GENSTAT     GET GENERAL STATUS
          ZJN    READ48      IF NO ERRORS
          RJM    /RES/RDERR  CHECK READ ERRORS
          ZJN    READ48      IF ERROR WAS CORRECTED
          PJK    READ40      IF RETRY OF READ
 READ54   BSS
          AOML   SECTRY      INCREMENT SECTOR RETRY COUNT
          SBN    SCTRY
          PJN    READ57      IF MAXIMUM TRIES HAVE BEEN ATTEMPTED
          AOML   RS+/RS/P.STRY  INCREMENT SECTOR RETRY COUNT
          UJK    READ45      RESEEK AND READ SECTOR

* UNRECOVERED ERROR.

 READ57   BSS
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)


* CHECK IF A FULL SECTOR WAS READ.

 READ48   BSS
 E6       IFEQ   ERRTST,1
          RJM    TESTREC     RECOVERED ERROR TEST
 E6       ENDIF
          LDML   AREG        WAS ENTIRE SECTOR READ
          ZJN    READ50      IF ENTIRE SECTOR WAS READ
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT RECEIVED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
          RJM    SERRID      ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          UJK    READ54      RETRY SECTOR AND REQUEST


* UPDATE SECTOR ADDRESS AND CHECK FOR END OF TRACK.

 READ50   BSS
          LDML   SECSC,DEV   SECTOR INCREMENT
          RAML   SS+/SS/P.SECTOR,SELIN  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS / TRACK
          MJN    READ51      IF NOT END OF TRACK
          STML   SS+/SS/P.SECTOR,SELIN  SET SECTOR
          AODL   TRKEND      SET FLAG FOR END OF TRACK
          AOML   SS+/SS/P.TRACK,SELIN  INCREMENT HEAD ADDRESS

* TRANSFER DATA TO CM.

 READ51   BSS
          LDDL   SECPOS      CALCULATE SECTOR BUFFER TRANSFER ADDRESS
          SHN    2
          ADC    CBUF
          STML   READ53
          LDDL   WDS
          ZJN    READ55      IF 0 WORDS TO TRANSFER
          LOADC  DATADD      CM ADDRESS OF DATA AREA
          CWML   CBUF,WDS    SEND SECTOR TO CM
 READ53   EQU    *-1
          LDDL   SECPOS
          NJN    READ55      IF SOME DATA IS LEFT IN THE BUFFER,
                             DONT LET AN OVERLAY BE READ
          RJM    /RES/RECRS  CHECK IF A PREVIOUS ERROR WAS RECOVERED

* UPDATE BYTES TRANSFERRED.

 READ55   BSS
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          SBDL   SECWDS      CHECK FOR END OF SECTOR
          NJN    READ58      IF NOT END OF SECTOR
          STDL   SECPOS      RESET SECTOR POSITION = 0
 READ58   BSS
          LDDL   SECPOS
          NJN    READ59      IF SOME DATA IS LEFT IN THE BUFFER,
                             DONT LET AN OVERLAY BE READ
          RJM    /RES/RECRS  CHECK IF A PREVIOUS ERROR WAS RECOVERED
 READ59   BSS
          LDDL   WDS
          SHN    3
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
          SHN    -16
          RAML   RS+/RS/P.XFER
          LDDL   WDS
          RADL   DATADD+2    UPDATE CM ADDRESS
          LDDL   TWDS        UPDATE TOTAL WORDS LEFT TO TRANSFER TO THIS
                             CM ADDRESS
          SBDL   WDS
          STDL   TWDS
          NJN    READ61      IF MORE WORDS TO TRANSFER TO THIS CM ADDRESS

* FOR 844, MAKE SURE A MULTIPLE OF 5 SECTORS IS TRANSFERRED IN
* ORDER TO INSURE THE CORRECT SECTOR ADDRESS FOR THE NEXT TRANSFER.

          LDDL   CMLISTL
          SBN    1
          NJN    READ60      IF NOT END OF ADDRESS-LENGTH-PAIRS IN COMMAND
          LDDL   DEV
          NJN    READ60      IF NOT 844
          LDDL   SMSEC
          SBN    5
          ZJN    READ60      IF A MULTIPLE OF 5 SECTORS HAS BEEN TRANSFERRED
          LDN    0           READ 0 WORDS FROM NEXT SECTOR
 READ61   LJM    READ20

* GET NEXT CM ADDRESS OF DATA AREA.

 READ60   SODL   CMLISTL     DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    READ80      IF END OF ADDRESS-LENGTH-PAIRS IN COMMAND
          LDDL   SECPOS      CHECK IF A PARTIAL SECTOR WAS TRANSFERRED TO CM
          ZJN    READ70      IF FULL SECTOR WAS TRANSFERRED
          LDDL   SMSEC
          SBN    5
          NJN    READ65
          STDL   SMSEC
 READ65   BSS
          AODL   SMSEC       READJUST SMALL SECTOR COUNTER
 READ70   BSS
          LDN    P.CM        BUMP INDEX TO NEXT CM ADDRESS
          RADL   CML
          ADC    -CMLN
          NJN    READ75      IF MORE DATA TO TRANSFER
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
 READ75   UJK    READ10

 READ80   BSS
          RJM    CSWIT       CHECK IF SWITCH TO NEXT REQUEST
          NJK    READ1       IF SWITCH TO NEXT REQUEST
          UJK    READX       IF END OF STREAMING REQUESTS

          EJECT
** NAME-- WRITE
*
** PURPOSE-- PROCESS THE WRITE DATA COMMAND.
*
** INPUT-- CMLISTL = 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  6
 WRIX     LJM    **
          QUAL   *
 WRITE    EQU    *-1
          QUAL   RD
 WRI3     BSS
          LDN    0
          STDL   WDSS        USED TO UPDATE BYTES TRANSFERRED IN
                             RESPONSE TABLE
          STDL   SWFLG       CLEAR SWITCH FLAG
 WRI5     BSS
          LDN    5
          STDL   SMSEC       SET SMALL SECTOR COUNTER
          LDN    0
          STDL   TRKEND      SET TRACK END FLAG = 0
          STDL   SECPOS      SET SECTOR POSITION = 0
          STDL   RLAST       NONZERO, IF RECOVERING AN ERROR ON LAST SECTOR

* SETUP NUMBER OF WORDS TO TRANSFER FROM THIS CM ADDRESS.

 WRI20    BSS
          LOADF  CMLIST+/CM/P.RMA,CML  SET UP CM ADDRESS OF DATA AREA
          STDL   DATADD+2
          SRD    DATADD      SAVE R REGISTER
          LDML   CMLIST+/CM/P.LEN,CML  NUMBER OF 8-BIT BYTES TO TRANSFER
          ADN    7           ROUND UP
          SHN    -3          NUMBER OF CM WORDS TO TRANSFER
          STDL   TWDS        TOTAL NUMBER OF CM WORDS TO TRANSFER
                             FROM THIS ADDRESS
          ZJK    WRI70       IF NO WORDS TO TRANSFER FROM THIS ADDRESS
 WRI30    BSS
          STDL   WDS         COMPUTE NUMBER OF WORDS TO TRANSFER TO
                             CURRENT SECTOR
          SODL   SMSEC       DECREMENT SMALL SECTOR COUNTER
          NJN    WRI32       IF NOT THE 5TH SECTOR
          LDN    5
          STDL   SMSEC       SET SMALL SECTOR COUNTER
          LDML   CMWDS5,DEVICE  COMPUTE NUMBER OF WORDS FROM CURRENT SECTOR
          UJN    WRI33

 WRI32    BSS
          LDML   CMWDS,DEVICE  COMPUTE NUMBER OF WORDS FROM CURRENT SECTOR
 WRI33    BSS
          STDL   SECWDS      NUMBER OF DATA WORDS IN SECTOR
          SBDL   WDS
          SBDL   SECPOS      WORDS PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          PJN    WRI35       IF LESS THAN 1 SECTOR
          LDDL   SECWDS
          SBDL   SECPOS
          PJN    WRI34       IF VALID SECTOR POSITION
          LDDL   WDS         IF WDS = 0, POSITIONING TO NEXT MAU
          ZJN    WRI34       IF VALID SECTOR POSITION
          RJM    HALT        INVALID SECTOR POSITION
*         (NO RETURN FROM HALT.)

 WRI34    BSS
          STDL   WDS         NUMBER OF CM WORDS TO TRANSFER TO
                             CURRENT SECTOR

* TRANSFER DATA FROM CM.

 WRI35    BSS
          LDDL   SECPOS      CALCULATE SECTOR BUFFER TRANSFER ADDRESS
          SHN    2
          ADC    CBUF
          STML   WRI37
          LDDL   WDS
          ZJN    WRI38       IF 0 WORDS TO TRANSFER
          LOADC  DATADD      CM ADDRESS OF DATA AREA
          CRML   CBUF,WDS    READ SECTOR FROM CM
 WRI37    EQU    *-1

* UPDATE SECTOR POSITION.

 WRI38    BSS
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          SBDL   SECWDS      CHECK FOR END OF SECTOR
          NJN    WRI39       IF NOT END OF SECTOR
          STDL   SECPOS      RESET SECTOR POSITION = 0
 WRI39    BSS

* CHECK IF END OF TRACK ON LAST WRITE.

          LDDL   SECPOS
          ZJN    WRI46       IF FULL SECTOR HAS BEEN TRANSFERRED FROM CM
          LDDL   CMLISTL     CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          NJK    WRI68       IF MORE CM DATA TO TRANSFER
          LDN    0
          STDL   SECPOS      RESET SECTOR POSITION = 0
 WRI46    BSS
          LDDL   TRKEND
          ZJN    WRI50       IF NOT END OF TRACK
          LDN    0
          STDL   TRKEND      RESET TRACK END FLAG
          LDML   SS+/SS/P.TRACK,SELIN  CHECK FOR INVALID TRACK ADDRESS
          SBML   DVTRK,DEVICE  COMPARE WITH NUMBER OF TRACKS / CYLINDER
          MJN    WRI50       IF NOT END OF CYLINDER
          LDC    E507        ERROR IN REQUEST
          RJM    ATERM       ABNORMAL TERMINATION (NO RETURN)
*         (NO RETURN FROM ATERM)


* TRANSFER DATA TO DISK.

 WRI50    BSS
          LDN    F.WRITE     ISSUE WRITE FUNCTION TO DISK CONTROLLER
          RJM    FUNC        ISSUE THE FUNCTION
 WRI56    BSS
          RJM    ACN         ACN    DC
          LDML   CHWDS,DEVICE  NUMBER OF CHANNEL WORDS
          RJM    OAPMBF      OAPM   BUFF,DC
          RJM    DCN         FJM    *,DC      DCN    40B+DC
          RJM    GENSTAT     GET GENERAL STATUS
          RJM    CFM         CFM    WRI57,DC
          UJN    WRI57       IF NO CHANNEL ERROR

          RJM    CHERO       RECORD CHANNEL ERROR
          UJN    WRI58       CHANNEL OUTPUT PARITY ERROR, UNRECOVERED

 WRI57    BSS
          LDDL   GNSTAT      GENERAL STATUS
          ZJN    WRI60       IF NO ERRORS
          RJM    /RES/RDERR  CHECK WRITE ERRORS
          ZJN    WRI60       IF ERROR WAS CORRECTED
          PJN    WRI56       IF RETRY OF WRITE.
                             'CONTINUE' FUNCTION HAS BEEN ISSUED
 WRI58    UJK    WRI100      UNRECOVERED ERROR

* UPDATE BYTES TRANSFERRED FROM PREVIOUS SECTOR WRITTEN.

 WRI60    BSS
          LDDL   RLAST
          NJK    WRI85       IF RECOVERY OF ERROR FROM LAST SECTOR

          LDDL   SECPOS
          NJN    WRI64       IF SOME DATA IS LEFT IN THE BUFFER,
                             DONT LET AN OVERLAY BE READ
          RJM    /RES/RECRS  CHECK IF AN ERROR WAS RECOVERED

* UPDATE SECTOR ADDRESS AND CHECK FOR END OF TRACK.

 WRI64    BSS
          LDML   SECSC,DEVICE  SECTOR INCREMENT
          RAML   SS+/SS/P.SECTOR,SELIN  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS / TRACK
          MJN    WRI66       IF NOT END OF TRACK
          STML   SS+/SS/P.SECTOR,SELIN  SET SECTOR
          AODL   TRKEND      SET FLAG FOR END OF TRACK
          AOML   SS+/SS/P.TRACK,SELIN  INCREMENT HEAD ADDRESS

* UPDATE BYTES TRANSFERRED.

 WRI66    BSS
          LDDL   WDSS
          SHN    3
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
          SHN    -16
          RAML   RS+/RS/P.XFER
          LDN    0
          STDL   WDSS
          LDDL   SWFLG       WAS THIS THE FIRST WRITE AFTER A REQUEST SWITCH
          ZJN    WRI69       IF NOT THE FIRST WRITE AFTER A REQUEST SWITCH
          LDN    0
          STDL   SWFLG       CLEAR SWITCH FLAG
          RJM    SNDRSP      SEND RESPONSE TO CM
 WRI67    BSS
          AODL   NCOMRQ      INCREMENT NUMBER OF COMPLETED REQUESTS
          LDML   CURRQ       SAVE RMA OF PREVIOUS REQUEST
          STML   PRERQ
          LDML   CURRQ+1
          STML   PRERQ+1
          LDML   SS+/SS/P.REQ,SELIN  SAVE RMA OF CURRENT REQUEST
          STML   CURRQ
          LDML   SS+/SS/P.REQ+1,SELIN
          STML   CURRQ+1
 WRI69    BSS
 WRI68    BSS
          LDDL   WDS
          RADL   WDSS        SAVE WORDS TRANSFERRED THIS SECTOR
          LDDL   WDS
          RADL   DATADD+2    UPDATE CM ADDRESS
          LDDL   TWDS        UPDATE TOTAL WORDS LEFT TO TRANSFER
                               TO THIS CM ADDRESS.
          SBDL   WDS
          STDL   TWDS
          NJN    WRI75       IF MORE WORDS TO TRANSFER FROM THIS CM ADDRESS

* FOR 844, MAKE SURE A MULTIPLE OF 5 SECTORS IS TRANSFERRED IN
* ORDER TO INSURE THE CORRECT SECTOR ADDRESS FOR THE NEXT TRANSFER.

          LDDL   CMLISTL
          SBN    1
          NJN    WRI70       IF NOT END OF ADDRESS-LENGTH-PAIRS IN COMMAND
          LDDL   SECPOS      CHECK IF A PARTIAL SECTOR WAS TRANSFERRED TO CM
          ZJN    WRI63       IF FULL SECTOR WAS TRANSFERRED
 WRI63    BSS
          LDDL   DEVICE
          NJN    WRI70       IF NOT 844
          LDDL   SMSEC
          SBN    5
          ZJN    WRI70       IF A MULTIPLE OF 5 SECTORS HAS BEEN TRANSFERRED
          LDN    0           WRITE 0 WORDS FROM NEXT SECTOR
 WRI75    LJM    WRI30

* GET NEXT CM ADDRESS OF DATA AREA.

 WRI70    BSS
          SODL   CMLISTL     DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    WRI74       IF END OF ADDRESS-LENGTH-PAIRS IN COMMAND
          LDDL   SECPOS      CHECK IF A PARTIAL SECTOR WAS TRANSFERRED
          ZJN    WRI72       IF FULL SECTOR WAS TRANSFERRED
          LDDL   SMSEC
          SBN    5
          NJN    WRI71
          STDL   SMSEC
 WRI71    BSS
          AODL   SMSEC       ADJUST SMALL SECTOR POSITION
 WRI72    BSS
          LDN    P.CM        BUMP INDEX TO NEXT CM ADDRESS
          RADL   CML
          ADC    -CMLN
          NJN    WRI73       IF MORE DATA TO TRANSFER
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH
                             POINTS TO THE CM DATA AREA
 WRI73    UJK    WRI20

* GET NEXT COMMAND.

WRI74     BSS
          RJM    UNCMND      GET NEXT COMMAND
          ZJN    WRI80       IF NO MORE COMMANDS
          LDDL   FNC         GET COMMAND CODE
          SBN    1
          ZJK    WRI20       IF WRITE COMMAND
          LDC    E50A
          RJM    ATERM       ABNORMAL TERMINATION (NO RETURN)
*         (NO RETURN FROM ATERM)

* END OF DATA.  GET GENERAL STATUS FOR LAST SECTOR

 WRI80    BSS
          RJM    CSWIT       CHECK IF SWITCH TO NEXT REQUEST
          NJK    WRI5        IF SWITCH TO NEXT REQUEST
 WRI85    BSS
          RJM    GENSTAT     GET GENERAL STATUS
          ZJN    WRI90       IF NO ERRORS
          AODL   RLAST       SET NONZERO FOR ERROR ON LAST SECTOR
          RJM    /RES/RDERR  CHECK WRITE ERRORS
          ZJN    WRI90       IF ERROR WAS RECOVERED
          MJN    WRI100      IF UNRECOVERED ERROR
          UJK    WRI50       IF RETRY OF WRITE

* UPDATE BYTES TRANSFERRED FROM LAST SECTOR.

 WRI90    BSS
          RJM    /RES/RECRS  CHECK IF ERROR WAS RECOVERED


 WRI95    BSS
          LDDL   WDSS
          SHN    3
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
          SHN    -16
          RAML   RS+/RS/P.XFER
          UJK    WRIX

* UNRECOVERED WRITE ERROR.

 WRI100   BSS
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)
          EJECT
** NAME-- CSWIT
*
** PURPOSE-- CHECK IF A SWITCH SHOULD BE MADE TO THE NEXT
*            REQUEST DURING THE SECTOR GAP.
*            AND, IF SO, MAKE THE SWITCH TO THE NEXT REQUEST.
*
** EXIT-- A REGISTER = 0, IF NOT SWITCH.
*         A REGISTER NONZERO, IF SWITCH.
          SPACE  6
 CSWX     LJM    **
 CSWIT    EQU    *-1
          LDDL   NUMCM       CHECK IF MORE COMMANDS TO PROCESS
          ZJN    CSW6        IF END OF COMMANDS
 CSW5     BSS
          LDN    0           EXIT A REGISTER = 0
          UJK    CSWX


* RE-READ THE SWITCH FLAG AND LINKAGE WORDS.

 CSW6     BSS
          LDML   RECOV
          NJK    CSW5        IF IN ERROR RECOVERY, DON'T STREAM
          LDN    2
          STDL   WC
          LOADF  SS+/SS/P.REQ,SELIN  REREAD SWITCH FLAG IN REQUEST
          ADN    2
          CRML   RQ+2*4,WC
          SBN    4
          CRML   RQ,WC
          LDML   RQ+/RQ/P.SWIT  CHECK IF REQUEST SWITCH FLAG SET
          SHN    -16+/RQ/N.SWIT+/RQ/L.SWIT
          ERRNZ  -1+/RQ/N.SWIT+/RQ/L.SWIT
          STDL   SWFLG       SAVE SWITCH FLAG
          ZJK    CSWX        IF SWITCH FLAG IS NOT SET
          LDDL   FNC         FUNCTION CODE
          NJN    CSW10       IF NOT READ
          AODL   NCOMRQ      INCREMENT NUMBER OF COMPLETED REQUESTS
          LDML   CURRQ       SAVE RMA OF PREVIOUS REQUEST
          STML   PRERQ
          LDML   CURRQ+1
          STML   PRERQ+1
          LDML   RQ+/RQ/P.NEXT  SAVE RMA OF NEXT REQUEST
          STML   CURRQ
          LDML   RQ+/RQ/P.NEXT+1
          STML   CURRQ+1
 CSW10    BSS

* THIS PP TRANSFERRED NEXT TO THE LAST SECTOR.
* GET NEXT REQUEST.
* PREPARE SS ENTRY.

          LDML   RQ+/RQ/P.NEXT  PUT RMA OF NEXT REQUEST IN SS TABLE
          STML   SS+/SS/P.REQ,SELIN
          LDML   RQ+/RQ/P.NEXT+1
          STML   SS+/SS/P.REQ+1,SELIN
          LDML   RQ+/RQ/P.NEXTPV  PUT PVA OF NEXT REQUEST IN SS TABLE
          STML   SS+/SS/P.PVA,SELIN
          LDML   RQ+/RQ/P.NEXTPV+1
          STML   SS+/SS/P.PVA+1,SELIN
          LDML   RQ+/RQ/P.NEXTPV+2
          STML   SS+/SS/P.PVA+2,SELIN
          RJM    UREQ        READ NEXT REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL
          SBML   SS+/SS/P.CYL,SELIN  CYLINDER ADDRESS
          ZJN    CSW11       IF VALID CYLINDER ADDRESS
          RJM    HALT        INVALID CYLINDER ADDRESS
*         (NO RETURN FROM HALT.)

 CSW11    BSS
          LDML   RQ+/RQ/P.TRACK
          SBML   SS+/SS/P.TRACK,SELIN  TRACK ADDRESS
          ZJN    CSW12       IF VALID TRACK ADDRESS
          RJM    HALT        INVALID TRACK ADDRESS
*         (NO RETURN FROM HALT.)

 CSW12    BSS
          LDML   RQ+/RQ/P.SECTOR
          SBML   SS+/SS/P.SECTOR,SELIN  SECTOR ADDRESS
          ZJN    CSW13       IF VALID SECTOR ADDRESS
          RJM    HALT        INVALID SECTOR ADDRESS
*         (NO RETURN FROM HALT.)

 CSW13    BSS
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          LDDL   FNC         FUNCTION CODE
          NJN    CSW30       IF NOT READ
          RJM    SNDRSP      SEND RESPONSE TO CM
 CSW30    BSS
          LDN    1           EXIT A REGISTER NONZERO
          UJK    CSWX
          EJECT
** NAME-- SNDRSP
*
** PURPOSE-- SEND THE RESPONSE TO CM.
*            USED WHEN SWITCHING TO THE NEXT REQUEST.
          SPACE  6
 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
          EJECT
          ERRPL  *-OVAD1     READ - WRITE
          QUAL   *

          OVERLAY (SELECT REQUEST),OVAD1
          ROUTINE SELRQO
          CON    SELRQOO

** NAME-- SELRQ.
*
** PURPOSE-- SELECTS THE FIRST REQUEST IN THE CHAIN FOR THE
*            CURRENT REQUEST.
*
** INPUTS-- SS+P.UQT,SELIN = POINTER TO UNIT QUEUE TABLE.
*
** OUTPUTS-- RQ = CURRENT REQUEST.
*            SS+/SS/P.REQ
*            SS+/SS/P.CYL
*            SS+/SS/P.TRACK
*            SS+/SS/P.SECTOR
*            SS+/SS/M.CUR
*            SS+/SS/M.WRITE
*
** NOTE-- ASSUMES UNIT QUEUE LOCK HAS BEEN SET.
          SPACE  6
          QUAL   SL
          QUAL   *
 SELRQ1   BSS
          QUAL   SL

* READ RMA OF NEXT REQUEST FROM UNIT QUEUE.
* SET CURRENT REQUEST = FIRST REQUEST IN QUEUE.

          LDML   SS+/SS/P.QSTRT,SELIN  SET CURRENT QUEUE POINTER TO START OF CHAIN
          STML   SS+/SS/P.QP,SELIN
          LDML   SS+/SS/P.QSTRT+1,SELIN
          STML   SS+/SS/P.QP+1,SELIN
          LOADF  SS+/SS/P.QP,SELIN   LOAD CM ADDRESS OF UNIT QUEUE TABLE
          CRDL   T1          READ RMA OF FIRST REQUEST IN CHAIN
          ADN    1
          CRDL   T1+4
          LDML   SS+/SS/P.CUR,SELIN  CLEAR 'CURRENT REQUEST' AND -WRITE- FLAG
          LPC    -/SS/K.CUR-/SS/K.WRITE
          STML   SS+/SS/P.CUR,SELIN
          LDDL   T7
          STML   SS+/SS/P.REQ,SELIN  SET RMA OF CURRENT REQUEST
          LDDL   T8
          STML   SS+/SS/P.REQ+1,SELIN
          ADDL   T7
          ZJK    /RES/SELRQX  IF QUEUE EMPTY
          LDDL   T2          SET PVA OF CURRENT REQUEST
          STML   SS+/SS/P.PVA,SELIN
          LDDL   T3
          STML   SS+/SS/P.PVA+1,SELIN
          LDDL   T4
          STML   SS+/SS/P.PVA+2,SELIN
          RJM    UREQ        READ SELECTED REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL
          STML   SS+/SS/P.CYL,SELIN  CYLINDER ADDRESS OF CURRENT REQUEST
          LDML   RQ+/RQ/P.TRACK
          STML   SS+/SS/P.TRACK,SELIN  TRACK ADDRESS OF CURRENT REQUEST
          LDML   RQ+/RQ/P.SECTOR
          STML   SS+/SS/P.SECTOR,SELIN  SECTOR ADDRESS OF CURRENT REQUEST

* SET /SS/M.WRITE FOR ALL WRITE OPERATIONS.

          LDML   CM+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ERRNZ  /CM/L.CODE
          ADC    -C.WRITE
          NJN    SELRQ20     IF COMMAND CODE .NE. WRITE
          LDK    /SS/K.WRITE+/SS/K.CUR  SET WRITE FLAG AND
                                        CURRENT REQUEST FLAG
          ERRNZ  /SS/P.WRITE-/SS/P.CUR
          UJN    SELRQ30

* SET CURRENT REQUEST FLAG.

 SELRQ20  BSS
          LDK    /SS/K.CUR   SET CURRENT REQUEST FLAG
 SELRQ30  RAML   SS+/SS/P.CUR,SELIN
          UJK    /RES/SELRQX



          EJECT
          QUAL   *
          ERRPL  *-BUFF      IF > 0, SELRQ IS TOO LONG

          OVERLAY (RECOVER READ/WRITE ERRORS),OVAD1
          ROUTINE RDERRO
          CON    RDERROO

** NAME-- RDERR
*
** PURPOSE-- CHECK GENERAL STATUS ERRORS AFTER A READ OR WRITE FUNCTION.
*            READ EXTENDED DETAILED STATUS.
*
** INPUT-- GNSTAT = GENERAL STATUS
*
** EXIT-- A REGISTER = 0, IF ERROR WAS CORRECTED
*         A REGISTER .GT. 0, IF 'CONTINUE' FUNCTION WAS ISSUED TO
*                RETRY THE DATA TRANSFER.
*         A REGISTER .LT. 0, IF UNRECOVERED ERROR.
          SPACE  6
 RDERR1   BSS
          QUAL   RD


          AODL   ERRCNT      INCREMENT ERROR COUNTER
          LDDL   GNSTAT      GET GENERAL STATUS
          ZJK    /RES/RDEX   IF NO ERROR, A REGISTER = 0
          SHN    17-11
          MJN    RDE20       IF ABNORMAL TERMINATION
 RDE10    BSS
          LDC    -1          INVALID STATUS
 RDE15    UJK    /RES/RDEX   EXIT, A REGISTER .LT. 0

* CHECK IF RECOVERY IS IN PROGRESS.

 RDE20    BSS
          SHN    11-9        CHECK FOR NON-RECOVERABLE ERROR
          PJK    RDE26       IF NOT NON-RECOVERABLE ERROR

* THIS IS A NON-RECOVERABLE ERROR.
* IF THE FUNCTION = READ FLAW MAP, TRY VARIOUS READ-TYPE FUNCTIONS.

          LDDL   FNC         CHECK IF READ FLAW MAP
          SBN    2
          NJK    RDE10       IF NOT READ FLAW MAP
          LDML   RS+/RS/P.DET2  CHECK FOR ADDRESS ERROR
          LPN    10B
          ZJK    RDE10       IF NOT ADDRESS ERROR
          AODL   MAPC        INCREMENT READ-TYPE FUNCTION INDEX
          SBN    MAPLN       CHECK IF ALL FUNCTIONS HAVE BEEN TRIED
          PJK    RDE10       IF ALL READ-TYPE FUNCTIONS HAVE BEEN TRIED
          SODL   ERRCNT      DO NOT REPORT THIS ERROR
          LDN    8
          STML   RS+/RS/P.RESPL  SET RESPONSE LENGTH FOR NORMAL RESPONSE
          RJM    /RES/SEEKON ISSUE SEEK AND RECOVER SEEK ERRORS
          LDML   MAPFN,MAPC  ISSUE NEXT READ TYPE FUNCTION
 RDE25    BSS
          RJM    FUNC
          AOML   RS+/RS/P.STRY  INCREMENT SECTOR RETRY COUNT
          LDN    1           EXIT WITH A REGISTER .GT. 0
          UJK    RDE15

* CHECK IF RECOVERY IS IN PROGRESS.  IF SO, ISSUE THE 'CONTINUE'
* FUNCTION.

 RDE26    BSS
          SHN    9-8
          PJN    RDE30       IF NOT 'RECOVERY IN PROGRESS'
          LDN    F.CONT      ISSUE CONTINUE FUNCTION
          UJK    RDE25

 RDE30    BSS
 Z4       IFNE   CONTYP,2
          UJK    RDE10       IF INVALID STATUS
 Z4       ELSE
 Z5       IFEQ   HARDW,1
          SHN    8-5         CHECK FOR CORRECTABLE CHECKWORD ERROR
          PJK    RDE10       IF INVALID STATUS

* THE CORRECTION VECTORS AND BUFFER ADDRESS WHICH APPEAR IN THE
* DETAILED STATUS ARE SET UP FOR 12-BIT DATA BYTES.  SINCE THE
* DATA WAS READ PACKED INTO 16-BIT BYTES, A NEW BUFFER ADDRESS AND
* NEW CORRECTION VECTORS MUST BE COMPUTED.
*
* COMPUTE BUFFER ADDRESS AND PUT IN T4.
* BUFFER ADDRESS = BUFF + P.WRDAD - (P.WRDAD + 3)/4.

          LDML   RS+/RS/P.DET2+P.WRDAD  PP WORD ADDRESS
                               OF CORRECTABLE READ ERROR
          ADN    3
          SHN    -2
          STDL   T4
          LDC    BUFF
          ADML   RS+/RS/P.DET2+P.WRDAD
          SBDL   T4
          STDL   T4
          LDML   RS+/RS/P.DET2+P.WRDAD  IF LAST BYTE, ADD 1 TO
                               COMPUTED ADDRESS
          ADC    -321
          NJN    RDE34       IF NOT THE LAST BYTE
          AODL   T4

* SET UP SHIFTED VECTORS AND PUT IN T1, T2, T3.

 RDE34    BSS
          LDN    0
          STDL   T3
          LDML   RS+/RS/P.DET2+P.WRDAD  WORD ADDRESS OF ERROR
          ADC    -319        SPECIAL CASE THE LAST 3 BYTES
          MJN    RDE50       IF NOT THE LAST 3 BYTES
          SBN    4
          MJN    RDE38       IF THE LAST 3 BYTES
*                            ERROR, WORD ADDRESS OUT OF RANGE
          RJM    RECS        ABNORMAL TERMINATION  (NO RETURN)
*         (NO RETURN FROM RECS.)

* THE LAST 3 WORDS MUST BE SPECIAL CASED, BECAUSE THE LAST 2 12-BIT
* BYTES WERE READ SEPARATELY.

 RDE38    BSS
          LDML   RS+/RS/P.DET2+P.VECT1  FIRST WORD OF CORRECTION VECTOR
          STDL   T1
          LDML   RS+/RS/P.DET2+P.VECT2  2ND WORD OF CORRECTION VECTOR
          STDL   T2

* CORRECT THE DATA.

 RDE40    BSS
          LDIL   T4          FIRST BUFFER WORD TO CORRECT
          LMDL   T1          CORRECT WITH 1ST VECTOR WORD
          STIL   T4
          AODL   T4
          LDIL   T4          2ND BUFFER WORD TO CORRECT
          LMDL   T2          2ND PART OF CORRECTION VECTOR
          STIL   T4
          AODL   T4
          LDIL   T4          3RD BUFFER WORD TO CORRECT
          LMDL   T3          3RD PART OF CORRECTION VECTOR
          STIL   T4
 Z5       ENDIF
          LDN    0           EXIT WITH A REGISTER = 0
          UJK    /RES/RDEX

* THE PATTERN REPEATS EVERY 4 12-BIT BYTES.
* SHIFT THE CORRECTION VECTORS FOR EACH OF THE 4 PATTERNS.

 Z6       IFEQ   HARDW,1
 RDE50    BSS
          LDML   RS+/RS/P.DET2+P.WRDAD  WORD ADDRESS OF ERROR
          LPN    3
          NJN    RDE60       IF NOT THE 1ST PATTERN
          LDML   RS+/RS/P.DET2+P.VECT1
          SHN    4
          STDL   T1
          LDML   RS+/RS/P.DET2+P.VECT2
          SHN    -8
          RADL   T1
          LDML   RS+/RS/P.DET2+P.VECT2
          LPC    377B
          SHN    8
          STDL   T2
          UJK    RDE40

 RDE60    BSS
          SBN    1
          NJN    RDE70       IF NOT THE 2ND PATTERN
          LDML   RS+/RS/P.DET2+P.VECT1
          SHN    -8
          STDL   T1
          LDML   RS+/RS/P.DET2+P.VECT1
          LPC    377B
          SHN    8
          STDL   T2
          LDML   RS+/RS/P.DET2+P.VECT2
          SHN    -4
          RADL   T2
          LDML   RS+/RS/P.DET2+P.VECT2
          LPN    17B
          SHN    12
          STDL   T3
          UJK    RDE40

 RDE70    BSS
          SBN    1
          NJN    RDE80       IF NOT THE 3RD PATTERN
          LDML   RS+/RS/P.DET2+P.VECT1
          SHN    -4
          STDL   T1
          LDML   RS+/RS/P.DET2+P.VECT1
          LPK    17B
          SHN    12
          ADML   RS+/RS/P.DET2+P.VECT2
          STDL   T2
          UJK    RDE40

 RDE80    BSS
          LDML   RS+/RS/P.DET2+P.VECT1  1ST WORD OF CORRECTION VECTOR
          STDL   T1
          LDML   RS+/RS/P.DET2+P.VECT2  2ND WORD OF CORRECTION VECTOR
          SHN    4
          STDL   T2
          UJK    RDE40
 Z6       ENDIF
 Z4       ENDIF


          EJECT
          QUAL   *
          ERRPL  *-BUFF      IF > 0, RDERR IS TOO LONG

          OVERLAY (RECOVER ERRORS),BUFF
          ROUTINE RECSO
          QUAL   RC
          QUAL   *
          EJECT
 FUNERR   BSS
          QUAL   RC
          LDML   FUNTO
          NJN    FUN60       IF NOT FIRST FUNCTION TIMEOUT
          LDK    /RS/K.FTO   SET FUNCTION TIMEOUT FLAG IN RESPONSE
          RJM    SERR        PUT ERROR ID IN RESPONSE
          LDML   RS+/RS/P.FUNTO
          NJN    FUN45       IF FUNCTION CODE ALREADY IN RESPONSE BUFFER
          LDDL   FUNCD       PUT FUNCTION CODE IN RESPONSE BUFFER
          STML   RS+/RS/P.FUNTO
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
 FUN45    BSS
          AOML   FUNTO       SET FUNC PROCESSING FLAG
          AODL   FNERR       SET FUNCTION TIMEOUT FLAG
          RJM    GENSTAT     READ GENERAL AND DETAILED STATUSES
          LDML   RS+/RS/P.DET2+13-1
          SHN    17-11
          PJN    FUN60       IF DATA IS NOT IN CONTROLLER BUFFER
          LDML   RS+/RS/P.FUNTO
          SBN    F.WRITE
          NJN    FUN60       IF NOT FORCED TIMEOUT ON WRITE FUNCTION
          STDL   FNERR       CLEAR FUNCTION TIMEOUT FLAG
          UJN    FUN70

 FUN60    BSS
          AOML   RS+/RS/P.STRY  INCREMENT RETRY COUNT
 H1       IFNE   CONTYP,2
 H9       IFEQ   RAM,1
 H2       IFEQ   HARDW,1
          LDK    F.AUTOP     SEND AUTOLOAD FUNCTION
          RJM    FUNC
          ACN    DC
          PAUSE  5           DELAY 5 MICROSECONDS
          DCN    40B+DC

          LDN    F.AUTDP     SEND AUTODUMP FUNCTION
          RJM    FUNC
          LDC    12288       NUMBER OF CHANNEL WORDS TO INPUT
          STDL   T1
          ACN    DC
 FUN65    BSS
          IAN    DC          READ CONTROLLER MEMORY
          SODL   T1
          NJN    FUN65       IF NOT ALL WORDS READ
          DCN    40B+DC
          LDK    F.CHST      INPUT PROCESSOR CHANNEL STATUS
          RJM    FUNC
          ACN    DC
          IAN    DC
          DCN    40B+DC
 H2       ELSE
          LDN    20B
 H2       ENDIF
          SHN    17-4        CHECK BIT 4
          PJN    FUN70       IF NOT RAM PARITY ERROR
          LDK    /RS/K.RAM   PUT RAM PARITY FLAG IN RESPONSE
          RJM    SERRID      ERROR ID
 H9       ENDIF
 H1       ENDIF
 FUN70    BSS
          LDN    0
          STML   FUNTO
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)

          SPACE  4
          EJECT
** NAME-- SCLOCK
*
** PURPOSE-- SETS THE CHANNEL LOCK.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                   .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
          QUAL   *
 SCL10    BSS
          QUAL   RC
          LDDL   CUNITS
          ZJN    SCL35       IF NO UNITS
          LDN    C.CHCNT
          STML   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP CHANNEL
          LDDL   CUNITS
          ZJN    SCL35       IF NO UNITS
          LDN    6           SET TIMEOUT DELAY TO 5 SECONDS ON S1
          STDL   P1
          STDL   P2
 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    SCL40       IF LOCK WAS NOT SET
          AOML   CHLOCK      SET FLAG IF LOCK WAS SET
          LDN    0
          STML   SHARECH     CLEAR SHARE CHANNEL FLAG
 SCL35    BSS
          LDN    0
          UJK    /RES/SCLX   EXIT, A REGISTER = 0, LOCK WAS SET

 SCL40    BSS
          SODL   P1
          NJK    SCL30
          SODL   P2
          NJK    SCL30
          LDN    1           TIMEOUT ON TRYING TO GET CHANNEL LOCK
          UJK    /RES/SCLX   EXIT A REGISTER NONZERO
          EJECT
** NAME-- SEEKON
*
** PURPOSE-- ISSUE SEEK, CHECK FOR ERRORS, WAIT FOR ON-CYLINDER.
          SPACE  6
 SEEKON   CON    0
 SEKO10   BSS
          LDML   SEEKON
          STML   /RES/SEEKON
          RJM    SEEKCK      ISSUE SEEK AND RECOVER SEEK ERRORS
          LDDL   GNSTAT      GENERAL STATUS
          NJN    SEKO10      IF NOT ON CYLINDER
          UJK    /RES/SEKOX
          EJECT
** NAME-- SEEKERR.
*
** PURPOSE-- ISSUE A SEEK AND RECOVER ANY SEEK ERRORS.
          SPACE  6
 SEEKCK   CON    0
          LDML   SEEKCK
          STML   /RES/SEEX+1
          QUAL   *
 SEEKERR1 BSS
          QUAL   RC
          LDN    6           SET TIMEOUT FOR CONTROLLER RESERVE
          STML   CRSV1       = 10 SECONDS ON S1
          STML   CRSV2
 SEE10    BSS
          RJM    GENSTAT     RESERVE THE CONTROLLER
          SHN    17-10
          PJN    SEE16       IF MULTI-ACCESS COUPLER CONNECTED
          RJM    /RES/PPREQ  CHECK FOR PP REQUESTS
          SOML   CRSV2       DECREMENT CONTROLLER RESERVE TIMEOUT COUNTERS
          NJN    SEE10       IF NOT TIMED OUT
          SOML   CRSV1
          NJN    SEE10       IF NOT TIMED OUT
          LJM    SEE30       IF TIMEOUT OF CONTROLLER RESERVE

 SEE14    BSS
          RJM    RECRS       SEND ANY RECOVERED ERROR RESPONSES
          UJK    /RES/SEEX

* LOAD CONTROLWARE BEFORE THE FIRST REQUEST WHEN THE DRIVER IS LOADED.

 SEE16    BSS
          LDML   ILOAD
          ADML   RECOV       DONT LOAD CONTROLWARE IF IN RECOVERY
          NJN    SEE17       IF CONTROLWARE HAS BEEN LOADED
          RJM    LDCN        LOAD CONTROLWARE
          AOML   ILOAD       SET FLAG FOR INITIAL CONTROLWARE LOAD

* GET UNIT RESERVE.

 SEE17    BSS
          LDC    37500       SET TIMEOUT FOR UNIT RESERVE
          STML   CRSV2       = 10 SECONDS ON S1
 SEE20    BSS
          RJM    /RES/PPREQ  CHECK FOR PP REQUESTS
          SOML   CRSV2       DECREMENT UNIT RESERVE TIMEOUT COUNTERS
          ZJN    SEE40       IF TIMED OUT
          RJM    SEEK        ISSUE SEEK
          RJM    GENSTAT     READ GENERAL STATUS
          SHN    17-3
          MJN    SEE20       IF UNIT RESERVED
          RJM    CKSTAT      PROCESS GENERAL STATUS ERRORS
          PJK    SEE14       IF NO ERROR
          UJK    SEE20       RETRY THE SEEK


* CONTROLLER RESERVED FOR MORE THAN 10 SECONDS.

 SEE30    BSS
          LDK    /RS/K.CRS   SET CONTROLLER RESERVED FLAG IN RESPONSE
          RJM    SERRID      ERROR ID
          UJK    SEE50

* UNIT RESERVED FOR MORE THAN 10 SECONDS.

 SEE40    BSS
          LDK    /RS/K.URS   SET UNIT RESERVED FLAG IN RESPONSE
          RJM    SERRID      ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          AODL   ERRCNT      INCREMENT RETRY COUNT
          SBN    UTRY
          PJK    SEE50       IF UNRECOVERED REQUEST
          AOML   RS+/RS/P.STRY  INCREMENT RETRY COUNT
          LOADR  SS+/SS/P.UQT,SELIN  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.SHARE  READ SHARE UNIT FLAG
          CRDL   T1
          LDDL   T1
          SHN    17-15
          MJN    SEE60       IF SHARING UNIT, DO NOT CLEAR OPPOSITE RESERVE

* CLEAR UNIT RESERVE ON OPPOSITE ACCESS.

          LDK    /RS/K.CRES  SET -CLEAR OPPOSITE UNIT RESERVE ATTEMPT-
                             IN DETAILED STATUS
          RJM    SERRID      ERROR ID
          LDK    K.CPRES     CLEAR UNIT RESERVE ON OPPOSITE ACCESS
          RAML   SS+/SS/P.UNIT,SELIN
          RJM    SEEK        CLEAR UNIT RESERVE ON OPPOSITE ACCESS
          LDML   SS+/SS/P.UNIT,SELIN
          LPC    -K.CPRES
          STML   SS+/SS/P.UNIT,SELIN
          UJK    SEE17       RETRY

* UNRECOVERED UNIT RESERVE.

 SEE50    BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    RECS        ABNORMAL TERMINATION
*         (NO RETURN FROM RECS.)

* SHARING UNIT WITH MALET OR DFT.  DO NOT CLEAR RESERVE.
* SEND AN INTERMEDIATE RESPONSE.
* LEAVE THE REQUEST ON THE QUEUE, AND TRY AGAIN LATER.

 SEE60    BSS
          RJM    LTERM       LEAVE REQUEST ON THE UNIT QUEUE




          EJECT
** NAME-- RECS
*
** PURPOSE-- GENERAL ERROR RECOVERY
          SPACE  6
          QUAL   *
 RECS1    BSS                CONTINUATION OF RECS ROUTINE
          QUAL   RC
          LDDL   NORQ
          NJK    RECE        IF NO REQUEST WAS BEING PROCESSED
                             RELOAD CONTROLWARE
          LDML   RECOV       INDEX TO ERROR RECOVERY PROCEDURE
          STDL   T1
          LDML   RPROC,T1    ERROR RECOVERY PROCEDURE
          STML   REC10
          LJM    **          EXECUTE NEXT STEP IN ERROR RECOVERY
 REC10    EQU    *-1
          SPACE  6

* RETRY THE REQUEST.

 RECA     BSS
          LDML   SS+/SS/P.CONF,SELIN  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          PJN    REC14       IF NOT DOING INITIAL CONFIDENCE TEST

          LDML   NMED        NUMBER OF MEDIA ERRORS
          SBN    NMEDL+1     NUMBER OF MEDIA ERRORS ALLOWED
          PJN    REC14       IF LIMIT OF MEDIA ERRORS HAS BEEN REACHED
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LOADOVL CONFO      LOAD CONFIDENCE TEST OVERLAY
          RJM    /CF/CREC    HANDLE CONFIDENCE TEST ERRORS
          UJN    REC25       CONFIDENCE TEST WAS SUCCESSFUL


 REC14    BSS
          AOML   RECOV       INDEX TO NEXT RECOVERY PROCEDURE

 REC15    BSS
          LDDL   SIO
          NJN    REC20       IF REQUEST HAS BEEN SET UP
          RJM    SFRESP      SET UP THE STATUS RESPONSE BUFFER
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          LDDL   SELIN
          STDL   SELECT      SET SS INDEX TO SELECTED REQUEST
          AODL   SIO         SET -START I/O- FLAG
 REC20    BSS
          LDML   SS+/SS/P.CONF,SELIN  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          MJN    REC25       IF DOING INITIAL CONFIDENCE TEST
          RJM    RSTRQ       RESTART THE REQUEST
          LJM    MAINC       RETRY THE REQUEST

* RESTART CONFIDENCE TEST.

 REC25    BSS
          LJM    MAINA
          SPACE  6
* RUN THE CONFIDENCE TEST.

 RECB     BSS
          LDML   SS+/SS/P.CONF,SELIN  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          MJK    RECE        IF DOING INITIAL CONFIDENCE TEST
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    R20
          STML   RECOV       INDEX TO NEXT RECOVERY PROCEDURE
          LOADOVL CONFO      LOAD CONFIDENCE TEST OVERLAY
          RJM    /CF/CONFR   RUN THE CONFIDENCE TEST

* CONFIDENCE TEST WAS SUCCESSFUL.

 RECB10   BSS
          LDN    R10
          STML   RECOV       INDEX TO NEXT RECOVERY PROCEDURE
          UJK    REC15       RETRY THE REQUEST

          SPACE  6
* UNRECOVERED MEDIA ERROR.

 RECC     BSS
          LDK    /RS/K.DATERR  SOFTWARE FLAW THE ALLOCATION UNIT
          RJM    SERR        ERROR ID
          LDK    /RS/K.UNMED  UNRECOVERED MEDIA ERROR
          RJM    SERRID      ERROR ID
          RJM    HTERM       UNRECOVERED ERROR
*         (NO RETURN FROM HTERM.)
          SPACE  6
* CONFIDENCE TEST FAILED.
* RELOAD THE CONTROLLER.

 RECD     BSS
          LDML   NMED        NUMBER OF MEDIA ERRORS
          SBN    NMEDL+1     NUMBER OF MEDIA ERRORS ALLOWED
          PJN    RECD10      IF LIMIT OF MEDIA ERRORS HAS BEEN REACHED
          RJM    INTRS       SEND RESPONSE FOR CONFIDENCE TEST FAILURE
          LOADOVL CONFO      LOAD CONFIDENCE TEST OVERLAY
          RJM    /CF/CREC    HANDLE CONFIDENCE TEST ERRORS
          LDML   NCPERR      NUMBER OF SECTORS SUCCESSFULLY COMPARED
          NJK    RECB10      IF CONFIDENCE TEST WAS SUCCESSFUL



 RECD10   BSS
          LDML   SS+/SS/P.CONF,SELIN  CLEAR CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          STML   SS+/SS/P.CONF,SELIN

* LOAD CONTROLWARE.

 RECE     BSS
          RJM    FAILAD      MAKE SURE RESPONSE IS SENT AFTER
                             CONTROLWARE IS LOADED
          LDN    R30
          STML   RECOV
          AODL   LDC         INCREMENT LOAD CONTROLLER RETRY COUNTER
          SBN    CNTRY+1
          MJN    REC30       IF LOAD CONTROLLER RETRY NOT EXHAUSTED
          RJM    OTERM       TURN OFF ALL UNITS ON THE CONTROLLER
*         (NO RETURN FROM OTERM.)

 REC30    BSS
          RJM    LDCN        LOAD THE CONTROLLER

* THE CONTROLLER HAS BEEN SUCCESSFULLY LOADED.

          LDML   SS+/SS/P.CONF,SELIN  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          PJN    REC40       IF NOT DOING INITIAL CONFIDENCE TEST
          RJM    INTRS       LOG CONTROLLER LOADED MESSAGE

 REC40    BSS
          LDN    0
          STDL   LDC         ZERO OUT LOAD CONTROLLER RETRY COUNTER
          LDDL   NORQ
          ZJK    RECA        IF A REQUEST WAS BEING PROCESSED
          LDN    0           IF NO REQUEST WAS BEING PROCESSED
          STDL   NORQ        CLEAR NO REQUEST FLAG
          LJM    MAINA       GO TO MAIN LOOP


* UNRECOVERED ERROR.

 RECH     BSS
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         (NO RETURN FROM UTERM.)
          EJECT
* SEQUENCE TO ERROR RECOVERY PROCEDURES.
          SPACE  6
 RPROC    BSS
          CON    RECA        RETRY THE REQUEST
          CON    RECA        RETRY THE REQUEST
          CON    RECA        RETRY THE REQUEST
          CON    RECB        RUN THE CONFIDENCE TEST
 RP10     CON    RECC        UNRECOVERED MEDIA ERROR
 RP20     CON    RECD        CONFIDENCE TEST FAILED
 RP30     CON    RECE        RELOAD THE CONTROLLER
          CON    RECA        RETRY THE REQUEST
          CON    RECH        UNRECOVERED ERROR, DOWN THE UNIT


 R10      EQU    RP10-RPROC
 R20      EQU    RP20-RPROC
 R30      EQU    RP30-RPROC
          EJECT
** NAME-- RSTRQ
*
** PURPOSE-- INCREMENT REQUEST RETRY COUNTER.  IF RETRIES HAVE
*            NOT BEEN EXHAUSTED, RESTART THE REQUEST.
          SPACE  6
 RSTRQ    CON    0
          LDML   RSTRQ
          STML   /RES/RSTX+1
          AOML   RQTRY       INCREMENT REQUEST RETRY COUNTER

* RESTART REQUEST FROM BEGINNING.

          LDML   CURRQ       RESTORE RMA OF CURRENT REQUEST
          STML   SS+/SS/P.REQ,SELIN
          LDML   CURRQ+1
          STML   SS+/SS/P.REQ+1,SELIN
          LDML   RS+/RS/P.PVA  RESTORE PVA OF CURRENT REQUEST
          STML   SS+/SS/P.PVA,SELIN
          LDML   RS+/RS/P.PVA+1
          STML   SS+/SS/P.PVA+1,SELIN
          LDML   RS+/RS/P.PVA+2
          STML   SS+/SS/P.PVA+2,SELIN
          RJM    UREQ        READ UNIT REQUEST
          LDML   RQ+/RQ/P.CYL  RESTORE CYLINDER ADDRESS
          STML   SS+/SS/P.CYL,SELIN
          LDML   RQ+/RQ/P.TRACK  RESTORE TRACK ADDRESS
          STML   SS+/SS/P.TRACK,SELIN
          LDML   RQ+/RQ/P.SECTOR  RESTORE SECTOR ADDRESS
          STML   SS+/SS/P.SECTOR,SELIN

          LDML   RECOV
          SBN    R10
          ZJN    RST20       IF CONFIDENCE TEST WAS JUST RUN AND WAS
                             SUCCESSFUL
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 RST20    BSS
          RJM    SRESP       SET UP RESPONSE BUFFER
          RJM    SETADD      PUT STARTING ADDRESS IN RESPONSE BUFFER
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          RJM    SEEKON      ISSUE SEEK AND RECOVER SEEK ERRORS
          UJK    /RES/RSTX   RETURN A REGISTER = 0 TO RESTART REQUEST
          EJECT
** NAME-- ATERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR INTERFACE ERRORS.
          SPACE  6
          QUAL   *
 ATERM1   BSS
          QUAL   RC
          LDK    /RS/K.INTERR  INTERFACE ERROR
          RJM    SERR        ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    UTERM       DISABLE UNIT
*         (NO RETURN FROM UTERM.)
          EJECT
** NAME-- HTERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR HARDWARE ERRORS.
          SPACE  6
          QUAL   *
 HTERM1   BSS
          QUAL   RC


* SET ABNORMAL RESPONSE LENGTH.

          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDML   RS+/RS/P.PVA  PVA OF REQUEST
          ADML   RS+/RS/P.PVA+1
          ADML   RS+/RS/P.PVA+2
          NJN    HTERM90     IF UNRECOVERED REQUEST
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          LJM    TERMB

 HTERM90  BSS
 G3       IFEQ   ICHK,1
          LDML   INITL
          NJK    UNREC       IF ERROR DURING INITIALIZATION
 G3       ENDIF
          LDN    R.ABN       ABNORMAL TERMINATION
          STDL   RESPC       RESPONSE CODE

* TERMINATE REQUEST.

          LJM    /RES/TERM   SEND TERMINATION RESPONSE
          EJECT
** NAME-- RECRS
*
** PURPOSE-- IF AN ERROR HAS BEEN RECOVERED, SEND AN INTERMEDIATE
*            RESPONSE TO CM.
*
** EXIT-- A REGISTER = 0,    IF RECOVERED ERROR LIMIT HAS NOT BEEN REACHED.
*         A REGISTER .GT. 0, IF RECOVERED ERROR LIMIT HAS BEEN REACHED.
          SPACE  6
 RECRS    CON    0
          LDML   RECRS
          STML   /RES/RECRS
          LDDL   ERRCNT      ERROR COUNTER
          ADDL   FNERR       FUNCTION TIMEOUT COUNTER
          ADML   CHERR       CHANNEL ERROR COUNTER
          ZJK    /RES/RECRSX  IF NO ERRORS

          QUAL   *
 RECRS1   BSS
          QUAL   RC
          AOML   RVCNT       COUNT OF RECOVERED ERRORS PER REQUEST
          SBN    RVTRY       HAS LIMIT BEEN REACHED
          PJK    /RES/RECRSX  IF TOO MANY RECOVERED ERRORS ON THIS REQUEST
          RJM    SFRESP      SET UP THE STATUS RESPONSE BUFFER
          LDK    /RS/K.REC   RECOVERED ERROR
          STML   RCON        ADDITIONAL RESPONSE CONDITION
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    0
          UJK    /RES/RECRSX
          EJECT
** NAME-- TERMP
*
** PURPOSE-- TERMINATE PP REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE
          SPACE  6
 TERX     LJM    **
 TERMP    EQU    *-1
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
** NAME-- INTRS
*
** PURPOSE-- SEND INTERMEDIATE RESPONSE.
          SPACE  6
 INTRSX   LJM    **
 INTRS    EQU    *-1
          LDML   RS+/RS/P.PVA  PVA OF REQUEST
          ADML   RS+/RS/P.PVA+1
          ADML   RS+/RS/P.PVA+2
          NJN    INTRS10     IF REQUEST EXISTS
          RJM    SNMSG       SEND UNSOLICITED RESPONSE
          UJK    INTRSX

 INTRS10  BSS
          LDK    C.RS*8      SET RESPONSE LENGTH FOR ERROR
          STML   RS+/RS/P.RESPL
          LDN    R.INT       INTERMEDIATE RESPONSE
          STDL   RESPC       RESPONSE CODE
          RJM    TERMP       SEND RESPONSE TO CM
          UJK    INTRSX
          EJECT
* SEND UNSOLICITED MESSAGE.
          SPACE  6
 SNMSGX   LJM    **
 SNMSG    EQU    *-1
          RJM    SFRESP      SET UP THE STATUS RESPONSE BUFFER
          LDK    C.RS*8      SET RESPONSE LENGTH FOR ERROR
          STML   RS+/RS/P.RESPL
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE
          RJM    TERMP       SEND RESPONSE TO CM
          UJK    SNMSGX
          EJECT
** NAME-- SFRESP
*
** PURPOSE-- SET UP FIRST RESPONSE.
          SPACE  6
 SFRESX   LJM    **
 SFRESP   EQU    *-1
          LDDL   SIO         CHECK IF RESPONSE HAS BEEN SET UP
          NJN    SFRES10     IF I/O HAS BEEN STARTED
          RJM    UREQ        READ THE REQUEST FROM CM
          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    SRESP       SET UP RESPONSE
 SFRES10  BSS
          UJK    SFRESX
          EJECT
** NAME-- TERMSK
*
** PURPOSE-- SET UP TERMINATION FOR SEEK ERRORS.
          SPACE  6
          QUAL   *
 TERMSK1  BSS
          QUAL   RC

* UNRECOVERED ERROR DURING SEEK PROCESS.

          RJM    SFRESP      SET UP STATUS RESPONSE BUFFER
          LDDL   SELIN
          STDL   SELECT
          LDDL   FNERR       CHECK FOR FUNCTION TIMEOUT ERROR
          NJN    TERM14      IF FUNCTION TIMEOUT ERROR
          RJM    DROPS       DROP SEEKS ON OTHER UNITS
 TERM14   BSS
          LDDL   SELECT
          STDL   SELIN
          UJK    /RES/TSKX
          EJECT
 F34      IFEQ   OFFU,1
** NAME-- ONUN
*
** PURPOSE-- CLEAR THE DISABLE FLAG IN THE UNIT INTERFACE TABLE.
          SPACE  6
 F1       IFEQ   ERRTST,0
 ONUNX    LJM    **
 ONUN     EQU    *-1
          LDK    -/UIT/K.DSABLE  CLEAR UNIT DISABLE FLAG
          STDL   T3
          LDC    177777B
          STDL   T2
          STDL   T4
          STDL   T5
          LOADF  CM+/CM/P.RMA  LOAD ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          RDCL   T2          -LOGICAL AND- TO CLEAR THE UNIT DISABLE FLAG
          UJK    ONUNX
 F1       ENDIF
 F34      ENDIF
          EJECT
*         THIS IS TEMPORARY UNTIL THE SIMULATOR SUPPORTS READ FLAW MAPS.
          SPACE  6
 B2       IFNE   HARDW,1
 RFLX     LJM    **
 RFLAW    EQU    *-1
B1        IFEQ   VER,1
          LDC    256*4
          STDL   T1
 RFL10    BSS
          LDN    0           ZERO OUT BUFFER
          STML   CBUF-1,T1
          SODL   T1
          NJN    RFL10

          LDML   CMLIST+/CM/P.LEN,CML  NUMBER OF BYTES TO TRANSFER
          SHN    -3
          STDL   TWDS
 RFL40    BSS
          STDL   WDS
          ADC    -256
          MJN    RFL50
          LDC    256
          STDL   WDS
 RFL50    BSS
          LOADF  CMLIST+/CM/P.RMA,CML  LOAD CM ADDRESS AND REFORMAT
          CWML   CBUF,WDS    SEND TO CM
          LDDL   WDS
          SHN    3
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
          LDDL   WDS
          SHN    3
          RAML   CMLIST+/CM/P.RMA+1,CML  UPDATE CM ADDRESS
          SHN    -16
          RAML   CMLIST+/CM/P.RMA,CML
          LDDL   TWDS
          SBDL   WDS
          STDL   TWDS
          NJK    RFL40
 B1       ELSE
          LDN    0
          STDL   P1
          STDL   P2
          STDL   P3
          STDL   P4
          LOADF  CMLIST+/CM/P.RMA,CML  LOAD CM ADDRESS AND REFORMAT
          CWDL   P1          ZERO OUT 1 WORD
 B1       ENDIF
          UJK    RFLX
 B2       ENDIF
          EJECT
** NAME-- LDCN
*
** PURPOSE-- LOAD CONTROLWARE.
          SPACE  6
 LDCN     CON    0
          LDML   LDCN
          STML   /RES/LDCNX+1
          QUAL   *
 LDCN1    BSS
          QUAL   RC
 E11      IFEQ   ETST,0
 Z1       IFEQ   CHANTYP,1

* MASTER CLEAR THE CHANNEL IF RUNNING IN A CIO PP.

          LDK    F.MC        MASTER CLEAR THE CHANNEL
          RJM    FUNC
 Z1       ENDIF

          LDN    1
          STDL   WC
 LDCN10   BSS
          LOADC  CM.CB       CM ADDRESS OF COMMUNICATION BUFFER
          ADN    /CB/C.CONTRL  CM ADDRESS OF CONTROLWARE COMMAND
          CRML   CM,WC       READ COMMAND
          LDML   CM+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ERRNZ  /CM/L.CODE
          SBN    C.LDCON
          NJK    LDCN10      IF LOAD CONTROLWARE COMMAND IS NOT PRESENT
          LDK    /RS/K.CLOAD  SET -ATTEMPTED CONTROLWARE LOAD- FLAG
          RJM    SERRID      ERROR ID
          LDML   CM+/CM/P.LEN
          SHN    -3
          STDL   CMLISTL     LENGTH OF CM ADDRESS AREA (CM WORDS)
          RJM    GLIST       GET CM ADDRESS LIST OF DATA AREA
          RJM    LOADCON     LOAD CONTROLWARE
*         RETURN ONLY IF CONTROLWARE LOAD WAS SUCCESSFUL

          UJK    /RES/LDCNX

 E11      ELSE
 LOADCON  EQU    LDCN
          UJK    /RES/LDCNX
 E11      ENDIF
          EJECT
** NAME-- LOADCON
*
** PURPOSE-- LOAD CONTROLWARE.
*
** INPUT-- CMLISTL = 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.
*          CML    =  INDEX TO CM LIST.
          SPACE  6
 E10      IFEQ   ETST,0
 LOAX     LJM    **
 LOADCON  EQU    *-1
          LDML   CMLIST+/CM/P.LEN,CML  CHECK FOR 0 WORDS OF CONTROLWARE
          NJN    LOA10       IF LENGTH .GT. 0
          LDC    E213        CONTROLWARE IS NOT PRESENT
          RJM    ATERM
*         (NO RETURN FROM ATERM.)

 LOA10    BSS
          LDK    F.AUTOP     ISSUE LOAD CONTROLWARE FUNCTION
          RJM    FUNC        ISSUE THE FUNCTION
          RJM    ACN         ACN   DC

* SETUP NUMBER OF WORDS TO TRANSFER FROM THIS CM ADDRESS.

 LOA20    BSS
          LOADF  CMLIST+/CM/P.RMA,CML  SET UP CM ADDRESS OF DATA AREA
          LDML   CMLIST+/CM/P.LEN,CML  NUMBER OF 8-BIT BYTES TO TRANSFER
          ADN    7           ROUND UP
          SHN    -3          NUMBER OF CM WORDS TO TRANSFER
          STDL   TWDS        TOTAL NUMBER OF CM WORDS TO TRANSFER
                             FROM THIS ADDRESS
          ZJK    LOA70       IF NO WORDS TO TRANSFER FROM THIS ADDRESS
 LOA30    BSS
          STDL   WDS         COMPUTE NUMBER OF CM WORDS TO TRANSFER TO BUFFER
          ADC    -CTLN       MAXIMUM SIZE OF BUFFER IN PP
          MJN    LOA40       IF LESS THAN PP BUFFER
          LDK    CTLN
          STDL   WDS         NUMBER OF CM WORDS TO TRANSFER TO BUFFER

* TRANSFER DATA FROM CM.

 LOA40    BSS
          LDDL   CMADR+2     CM ADDRESS OF DATA AREA
          LMC    400000B
          CRML   CTBUF,WDS   READ CONTROLWARE BINARY FROM CM
          STDL   CMADR+2     UPDATE CM ADDRESS

* CONVERT DATA TO ONE 8-BIT BYTE PER PP WORD.

          LDDL   WDS         NUMBER OF CM WORDS
          SHN    3
          STDL   T2          NUMBER OF 8-BIT BYTES
          STDL   T3
          SHN    -1          NUMBER OF 16-BIT PP WORDS
          ADC    CTBUF-1
          STDL   T1
 LOA50    BSS
          LDIL   T1          CONVERT DATA
          LPC    377B
          STML   CTBUF-1,T2
          LDIL   T1
          SHN    -8
          STML   CTBUF-2,T2
          SODL   T1
          SODL   T2
          SODL   T2
          NJK    LOA50       IF MORE DATA

* SEND DATA TO CONTROLLER.

          LDDL   T3
          RJM    OAMCT       OAM    CTBUF,DC
          NJN    LOA90       IF THE TRANSFER DID NOT COMPLETE
          LDDL   TWDS        UPDATE TOTAL WORDS LEFT TO TRANSFER
                               TO THIS CM ADDRESS.
          SBDL   WDS
          STDL   TWDS
          NJK    LOA30       IF MORE WORDS TO TRANSFER FROM THIS CM ADDRESS

* GET NEXT CM ADDRESS OF DATA AREA.

 LOA70    BSS
          SODL   CMLISTL     DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    LOA80       IF END OF ADDRESS-LENGTH-PAIRS IN COMMAND
          LDN    P.CM        BUMP INDEX TO NEXT CM ADDRESS
          RADL   CML
          ADC    -CMLN
          NJN    LOA75       IF MORE DATA TO TRANSFER
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
 LOA75    BSS
          UJK    LOA20

* END OF DATA.  GET GENERAL STATUS.

 LOA80    BSS
 H11      IFNE   HARDW,1
          LDN    4
          RJM    OAMCT       OAM    CTBUFF,DC
 H11      ENDIF
          RJM    DCN         FJM    *,DC          DCN    40B+DC
          RJM    GENSTAT     GET GENERAL STATUS
          ZJK    LOAX        IF NOT UNRECOVERED ERROR

* UNRECOVERED ERROR.

 LOA85    BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    RECS        ABNORMAL TERMINATION
*         (NO RETURN FROM RECS.)

 LOA90    BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT TRANSFERRED
          LDK    /RS/K.IST   INCOMPLETE TRANSFER
          RJM    SERRID      SAVE ERROR ID
          UJN    LOA85
 E10      ENDIF
          EJECT
 R4       ERRPL  *-END       IF > 0, RECSO IS TOO LONG
          QUAL   *

          OVERLAY (DOWN UNIT),BUFF
          ROUTINE DOWNO

** NAME-- UTERM
*
** PURPOSE-- TURN OFF A UNIT.
*            DO NOT DELINK ANY REQUESTS.
          SPACE  6
 UTERM1   BSS
          QUAL   DN
          LDK    /RS/K.UDN   UNIT DOWN
          RJM    SID         ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    OFFUN       SET UNIT DISABLE FLAG
          RJM    LTERM       LEAVE THE REQUEST ON THE UNIT Q
*         (NO RETURN FROM LTERM.)
          EJECT
** NAME-- OTERM
*
** PURPOSE-- TURN OFF ALL UNITS ON THE CONTROLLER.
*            DO NOT DELINK ANY REQUESTS.
          SPACE  6
          QUAL   *
 OTERM1   BSS
          QUAL   DN
          LDK    /RS/K.CHDN  CHANNEL DOWN
          RJM    SID         ERROR ID
          RJM    OFFUN       SET UNIT DISABLE FLAG
          RJM    OFFCH       TURN OFF ALL UNITS ON CONTROLLER
          SPACE  6
* LEAVE THE REQUEST ON THE UNIT Q.
* SEND AN UNSOLICITED MESSAGE.

          QUAL   *
 LTERM1   BSS
          QUAL   DN
          LDDL   SIO
          ZJN    OTERM30     IF I/O HAS NOT BEEN STARTED
          RJM    DELCM       DELINK ANY COMPLETED REQUESTS
 OTERM30  BSS
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          AOML   NODEL       SET NO DELINK FLAG, SO REQUEST IS NOT DELINKED
          LDML   SS+/SS/P.SEEK,SELIN  RESET FLAGS
          LPC    -/SS/K.CUR-/SS/K.SEEK
          STML   SS+/SS/P.SEEK,SELIN
          LJM    /RES/TERM   TERMINATE REQUEST
          EJECT
** NAME-- DELCM.
*
** PURPOSE-- DELINK COMPLETED REQUESTS.
*            THIS IS CALLED ONLY ON ERRORS IN ORDER TO DELINK REQUESTS
*            WHICH HAVE STREAMED SUCCESSFULLY.
          SPACE  6
 DELCX    LJM    **
 DELCM    EQU    *-1
          LDDL   NCOMRQ      NUMBER OF COMPLETED REQUESTS
          ZJN    DELC10      IF NO REQUESTS HAVE BEEN COMPLETED
          SODL   NCOMRQ      DECREMENT COMPLETED REQUEST COUNT
          ZJN    DELC10      IF NOT STREAMING OF REQUESTS
          LDML   PRERQ       SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   CURRQ
          LDML   PRERQ+1
          STML   CURRQ+1
          RJM    DELRQ       DELINK COMPLETED REQUESTS FROM QUEUE
                             AND SELECT NEW REQUEST
 DELC10   BSS
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED',
                             'WRITE REQUEST', 'CURRENT REQUEST'
          LPC    -/SS/K.SEEK-/SS/K.WRITE-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/L.SEEK-11
          ERRNZ  /SS/L.WRITE-12
          ERRNZ  /SS/L.CUR-13
          UJK    DELCX
          EJECT
** NAME-- OFFCH
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROLLER.
          SPACE  6
 OFCX     LJM    **
 OFFCH    EQU    *-1
          RJM    CLRUT       CLEAR UNIT TABLES AND SET
                             UNIT DISABLE FLAG
          UJK    OFCX
          EJECT
** NAME-- CLRUT
*
** PURPOSE-- CLEAR UNIT TABLES,
*            AND, IF NOT PROCESSING AN IDLE COMMAND,
*            THEN SET THE UNIT DISABLE FLAG.
*
** NOTE --   IF THE LOCK CAN NOT BE SET, JUST SET THE UNIT DISABLE
*            FLAG.  AN IDLE REQUEST WHICH GOES TO ALL PPS WHENEVER
*            A UNIT IS DISABLED WILL CLEAR THE OTHER FLAGS.
          SPACE  6
 CLRUX    LJM    **
 CLRUT    EQU    *-1
          LDN    0
          STML   IALF        CLEAR FLAG SO CONFIDENCE TEST WILL
                             BE RERUN
          STDL   P5          UNIT POINTER INDEX
          LDDL   CUNITS
          ZJK    CLRUX       IF NO UNITS
          RJM    RDUD        READ UNIT INTERFACE TABLE POINTERS
          LDDL   SELIN       SAVE SELIN
          STDL   P6
          ADN    C.SS*4      FIND A DIFFERENT SS ENTRY
          STDL   SELIN
          ADK    -SSL        CHECK FOR END OF TABLE
          MJK    CLRU10      IF NOT END OF TABLE
          LDN    0
          STDL   SELIN

* READ SS ENTRY FROM UNIT COMMUNICATION BUFFER.

 CLRU10   BSS
          LDC    SS+/SS/P.ENTRY  ADDRESS OF SS ENTRY
          ADDL   SELIN
          STML   CLRU15
          LDN    C.SS        NUMBER OF WORDS TO TRANSFER
          STDL   WC
          LOADR  UDBF+/UN/P.UIT,P5  LOAD ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5          READ UNIT DISABLED BIT
          ADN    /UIT/C.UBUF
          CRDL   T1
          LDDL   T5+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    CLRU50      IF UNIT IS DISABLED
          LOADF  T3          LOAD ADDRESS OF UNIT COMMUNICATION BUFFER
          CRML   **,WC       READ SS ENTRY
 CLRU15   EQU    *-1
          RJM    STLOCK      SET THE UNIT LOCK
          ZJN    CLRU30      IF LOCK WAS SET
          LDML   IDLE
          NJN    CLRU50      IF PROCESSING AN IDLE COMMAND
          RJM    OFFUN       SET UNIT DISABLE FLAG
          UJN    CLRU50

 CLRU30   BSS
          LDML   IDLE
          NJN    CLRU40      IF PROCESSING AN IDLE COMMAND
          RJM    OFFUN       SET UNIT DISABLE FLAG
 CLRU40   BSS
          LDML   SS+/SS/P.SEEK,SELIN  RESET FLAGS
          LPC    -/SS/K.CUR-/SS/K.SEEK-/SS/K.INIT
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/P.CUR-/SS/P.SEEK
          ERRNZ  /SS/P.SEEK-/SS/P.INIT
          RJM    CLRLOCK     CLEAR THE UNIT LOCK
 CLRU50   BSS
          LDN    4
          RADL   P5          BUMP UNIT POINTER INDEX
          SHN    -2
          SBDL   CUNITS
          NJK    CLRU10      IF NOT END OF TABLE
          LDDL   P6          RESTORE SELIN
          STDL   SELIN

* CLEAR INTERNAL TABLES.

          LDN    0
          STDL   T1
 CLRU60   BSS
          LDN    0
          STML   SS+/SS/P.ENTRY,T1  CLEAR ENTRY ASSIGNED
          LDN    C.SS*4      BUMP TO NEXT ENTRY
          RADL   T1
          ADK    -SSL        CHECK FOR END OF TABLE
          MJK    CLRU60      IF NOT END OF TABLE
          UJK    CLRUX
          EJECT
** NAME-- STLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE TABLE.
*            THIS ROUTINE IS THE SAME AS SETLOCK, ONLY IT DOESN'T
*            SET THE CHANNEL LOCK.  THIS IS TO PREVENT THIS OVERLAY
*            FROM BEING READ AGAIN, CAUSING THE RJM-S TO BE DESTROYED.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SETLX    LJM    **
 STLOCK   EQU    *-1
          LDC    SS+/SS/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADDL   SELIN
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          ZJK    SETLX       IF CHANNEL LOCK WAS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
          LDN    1           LOCK COULD NOT BE SET
          UJK    SETLX
          EJECT
** NAME-- SCLOCK
*
** PURPOSE-- SETS THE CHANNEL LOCK.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                   .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SCLX     LJM    **
 SCLOCK   EQU    *-1
          LDML   CHLOCK
          ZJN    SCL10       IF CHANNEL LOCK IS NOT SET
          LDN    0           EXIT A REGISTER = 0
          UJK    SCLX

 SCL10    BSS
          LDN    C.CHCNT
          STML   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP CHANNEL
          LDDL   CUNITS
          ZJN    SCL35       IF NO UNITS
          LDN    6           SET TIMEOUT DELAY TO 5 SECONDS ON S1
          STDL   P1
          STDL   P2
 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    SCL40       IF LOCK WAS NOT SET
          AOML   CHLOCK      SET FLAG IF LOCK WAS SET
          LDN    0
          STML   SHARECH     CLEAR SHARE CHANNEL FLAG
 SCL35    BSS
          LDN    0
          UJK    SCLX        EXIT, A REGISTER = 0, LOCK WAS SET

 SCL40    BSS
          SODL   P1
          NJK    SCL30
          SODL   P2
          NJK    SCL30
          LDN    1           TIMEOUT ON TRYING TO GET CHANNEL LOCK
          UJK    SCLX        EXIT A REGISTER NONZERO
          EJECT
** NAME-- RDUD
*
** PURPOSE-- READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.
*
          SPACE  6
 RDUX     LJM    **
 RDUD     EQU    *-1

* READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.

          LDDL   CUNITS      NUMBER OF CONFIGURED UNITS
          ZJK    RDUX        IF NO UNITS
          STDL   WC
          LOADC  CM.CB
          ADK    /CB/C.UNITS  UNIT INTERFACE TABLE POINTERS
          CRML   UDBF,WC     READ UNIT INTERFACE TABLE POINTERS
          UJK    RDUX
          SPACE  6
 UDBF     BSSZ   UDBUFL      UNIT INTERFACE TABLE POINTERS
          EJECT
** NAME-- OFFUN
*
** PURPOSE-- SET THE DISABLE FLAG ON THE UNIT INTERFACE TABLE.
*
** INPUT-- A & R REGISTERS = CM ADDRESS OF UNIT INTERFACE TABLE.
          SPACE  6
 OFUX     LJM    **
 OFFUN    EQU    *-1
          LDDL   SELIN
          ADC    -SSL
          ZJK    OFUX        IF INVALID UIT
          LOADR  SS+/SS/P.UQT,SELIN  LOAD ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          STDL   T1
          LDK    /UIT/K.DSABLE  SET UNIT DISABLE FLAG
          STDL   T3
          LDN    0
          STDL   T2
          STDL   T4
          STDL   T5
          LDDL   T1
          LMC    400000B
          RDSL   T2          -LOGICAL OR- THE UNIT DISABLE FLAG
          UJK    OFUX
          EJECT
 R4       ERRPL  *-END       IF > 0, DOWN UNIT IS TOO LONG
          QUAL   *

          OVERLAY (PP REQUESTS),BUFF
          ROUTINE PPREQO


          QUAL   PR
          EJECT
          QUAL   *
 CKC10    BSS
          QUAL   PR
          AOML   SHARECH     SET FLAG THAT CHANNEL HAD TO BE GIVEN UP
          LDDL   SEKCNT
          ZJN    CKC20       IF NO OUTSTANDING SEEKS

          AODL   NORQ        SET NO REQUEST FLAG IN CASE OF ERROR
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC
          LCN    0           SET 'SELECT' INVALID SO DROPS CLEARS ALL
                             LOCKS
          STDL   SELECT
          RJM    DROPS       TERMINATE ACTIVE REQUESTS
          LDN    0
          STDL   NORQ        CLEAR NO REQUEST FLAG

 CKC20    BSS
          RJM    CCLOCK      CLEAR CHANNEL LOCK

          PAUSE  130000      DELAY 130 MILLISECONDS TO ALLOW
                             MAINTENANCE PP TO GET THE CHANNEL
          UJK    /RES/CKCX
          EJECT
** NAME-- PPR
*
** PURPOSE-- CHECK FOR IDLE OR RESUME REQUESTS.
          SPACE  6
          QUAL   *
 PPR1     BSS
          QUAL   PR
          LOADC  CM.PIT      CM ADDRESS OF PP INTERFACE TABLE
          ERRNZ  /PIT/C.IDLE
          CRDL   T1          READ PP REQUEST FLAGS
          LDDL   T4
          SHN    /PIT/L.IDLE+2
          MJN    PPR20       IF IDLE REQUEST FLAG IS SET
          SHN    /PIT/L.RESUME-/PIT/L.IDLE
          PJK    PPR40       IF RESUME REQUEST FLAG IS NOT SET

* PROCESS RESUME REQUEST.

          LDML   IDLE
          ZJN    PPR10       IF ALREADY RESUMED
          RJM    RESUME      RESUME THE DRIVER

 PPR10    BSS
          LDK    -/PIT/K.RESUME-/PIT/K.IDSTAT-/PIT/K.LOCKF  FLAGS TO CLEAR
          STDL   T5
          LDN    0
          STDL   T6          FLAGS TO SET
          UJN    PPR30


* PROCESS IDLE REQUEST.

 PPR20    BSS
          LDDL   SIO
          ZJN    PPR22       IF I/O HAS NOT BEEN STARTED
          AOML   DEBUG1      SET FOR DEBUG PURPOSES ONLY
          RJM    DELCM       DELINK COMPLETED REQUESTS
 PPR22    BSS
          RJM    IDLEP       SOFTWARE IDLE THE DRIVER
          LDK    -/PIT/K.IDLE-/PIT/K.IDSTAT-/PIT/K.LOCKF  FLAGS TO CLEAR
          STDL   T5
          LDK    /PIT/K.IDSTAT  FLAGS TO SET
          STDL   T6
 PPR30    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          LDK    /PIT/K.LOCKF
          STDL   T4
          LOADC  CM.PIT
          ERRNZ  /PIT/C.LOCKF
          RDSL   T1          TRY TO SET THE LOCK
          LDDL   T4
          LPK    /PIT/K.LOCKF
          NJK    PPR30       IF SOMEONE ELSE HAS THE LOCK
          LDDL   T4
          LPDL   T5          CLEAR FLAGS
          LMDL   T6          SET FLAGS
          STDL   T4
          LOADC  CM.PIT
          ERRNZ  /PIT/C.LOCKF
          CWDL   T1          WRITE THE NEW FLAGS
 PPR40    BSS
          UJK    /RES/MAINA
          EJECT
** NAME-- PPREQ
*
** PURPOSE-- CHECK FOR ANY PP REQUESTS ON THE PP QUEUE.
*
** EXIT-- A REGISTER = 0, IF NO PP REQUESTS.
*                    .NE. 0, IF A PP REQUEST WAS FOUND
          SPACE  6
          QUAL   *
 PPREQ1   BSS
          QUAL   PR


          LDN    0
          STDL   FRST        SET FLAG WHEN REQUEST IS READ

* SET PP QUEUE LOCKWORD.

          RJM    SPLOCK      SET PP QUEUE LOCKWORD
          ZJN    PPRQ20      IF LOCK WAS SET

          LDN    0
          UJK    /RES/PPRQX  EXIT, A REGISTER = 0

* GET THE RMA OF THE FIRST PP REQUEST IN THE CHAIN.

 PPRQ20   BSS
          LDN    2
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA
          CRML   T1,WC       READ PVA AND RMA OF FIRST REQUEST IN CHAIN

* PUT PVA AND RMA OF REQUEST IN SS TABLE.

          LDK    SSL
          STDL   SELIN
          LDDL   T2          PUT PVA OF REQUEST IN SS TABLE
          STML   SS+/SS/P.PVA,SELIN
          LDDL   T3
          STML   SS+/SS/P.PVA+1,SELIN
          LDDL   T4
          STML   SS+/SS/P.PVA+2,SELIN
          LDDL   T7          PUT RMA OF REQUEST IN SS TABLE
          STML   SS+/SS/P.REQ,SELIN
          LDDL   T8
          STML   SS+/SS/P.REQ+1,SELIN

* READ THE PP REQUEST.

          LDN    C.RQ
          STDL   P1
          LOADF  T7          CM ADDRESS OF FIRST PP REQUEST
          CRML   RQ,P1       READ PP REQUEST

* CLEAR PP QUEUE LOCKWORD.

          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD

* DETERMINE NUMBER OF COMMANDS.

          LDML   RQ+/RQ/P.LEN  DETERMINE NUMBER OF COMMANDS
          SHN    -3
          SBN    /RQ/C.CMND
          STDL   NUMCM       NUMBER OF COMMANDS

* PROCESS PP REQUEST.

          RJM    SRESP       SET UP RESPONSE BUFFER
 PPRQ30   RJM    UNCMND      GET PP COMMAND AND SET UP TO PROCESS
          ZJN    PPRQ50      IF NO MORE COMMANDS
          LDML   UCMDPR,FNC  GET COMMAND PROCESSOR
          STML   PPRQ40
          RJM    **          PROCESS COMMAND
 PPRQ40   EQU    *-1
          LDDL   RESPC       CHECK FOR ABNORMAL RESPONSE CODE
          SBN    R.ABN
          NJK    PPRQ30      IF NO ERROR, LOOK FOR ANOTHER COMMAND


* SET PP QUEUE LOCKWORD.

 PPRQ50   BSS
          RJM    SPLOCK      SET PP QUEUE LOCKWORD
          NJN    PPRQ50      IF LOCK WAS NOT SET
          LDN    2
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA
          CRML   T1,WC       READ PVA AND RMA OF FIRST REQUEST IN CHAIN
          LOADF  T7          CM ADDRESS OF FIRST PP REQUEST
          CRML   RQ,WC       READ THE LINK PORTION TO THE NEXT REQUEST

* DELINK THE FIRST PP REQUEST FROM THE CHAIN.

          LOADC  CM.PIT
          ADN    /PIT/C.PPQPVA  CM ADDRESS OF PP QUEUE POINTER
          CWML   RQ,WC       WRITE PVA AND RMA POINTERS OF NEXT REQUEST

* CLEAR PP QUEUE LOCKWORD.

          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD

          RJM    TERMP       SEND TERMINATION RESPONSE
          UJK    /RES/PPRQX


* UNRECOVERED ERROR.

          QUAL   *
 PPRQC1   BSS
          QUAL   PR
          LDN    R.ABN       UNRECOVERED ERROR
          STDL   RESPC
          UJK    PPRQ50
          EJECT
** NAME-- STLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE TABLE.
*            THIS ROUTINE IS THE SAME AS SETLOCK, ONLY IT DOESN'T
*            SET THE CHANNEL LOCK.  THIS IS TO PREVENT THIS OVERLAY
*            FROM BEING READ AGAIN, CAUSING THE RJM-S TO BE DESTROYED.
*
** INPUT-- SELIN = INDEX TO SS TABLE WHICH IDENTIFIES THE UNIT TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SETLX    LJM    **
 STLOCK   EQU    *-1
          LDC    SS+/SS/P.UQT  UNIT INTERFACE TABLE ADDRESS
          ADDL   SELIN
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          ZJK    SETLX       IF CHANNEL LOCK WAS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
          LDN    1           LOCK COULD NOT BE SET
          UJK    SETLX
          EJECT
** NAME-- SCLOCK
*
** PURPOSE-- SETS THE CHANNEL LOCK.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                   .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SCLX     LJM    **
 SCLOCK   EQU    *-1
          LDML   CHLOCK
          ZJN    SCL10       IF CHANNEL LOCK IS NOT SET
          LDN    0           EXIT A REGISTER = 0
          UJK    SCLX

 SCL10    BSS
          LDN    C.CHCNT
          STML   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP CHANNEL
          LDDL   CUNITS
          ZJN    SCL35       IF NO UNITS
          LDN    6           SET TIMEOUT DELAY TO 5 SECONDS ON S1
          STDL   P1
          STDL   P2
 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    SCL40       IF LOCK WAS NOT SET
          AOML   CHLOCK      SET FLAG IF LOCK WAS SET
          LDN    0
          STML   SHARECH     CLEAR SHARE CHANNEL FLAG
 SCL35    BSS
          LDN    0
          UJK    SCLX        EXIT, A REGISTER = 0, LOCK WAS SET

 SCL40    BSS
          SODL   P1
          NJK    SCL30
          SODL   P2
          NJK    SCL30
          LDN    1           TIMEOUT ON TRYING TO GET CHANNEL LOCK
          UJK    SCLX        EXIT A REGISTER NONZERO
          EJECT
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP REQUEST QUEUE LOCK IN THE
*            PP INTERFACE TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SPLX     LJM    **
 SPLOCK   EQU    *-1
          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
          NJK    SPLX        IF LOCK COULD NOT BE SET
          UJK    SPLX
          EJECT
** NAME-- CPLOCK
*
** PURPOSE-- CLEARS THE PP QUEUE LOCK IN THE PP INTERFACE TABLE.
*
          SPACE  6
 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 LOCKWROD
          UJK    CPLX
          EJECT
** NAME-- CCLOCK
*
** PURPOSE-- CLEARS CHANNEL LOCK.
*
          SPACE  6
 CCLX     LJM    **
 CCLOCK   EQU    *-1
          LDML   CHLOCK
          ZJK    CCLX        IF CHANNEL LOCK WAS NOT SET
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDDL   CHAN        CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD
          LDN    0
          STML   CHLOCK      CLEAR CHANNEL LOCK FLAG
          STML   ILOAD       LOAD CONTROLWARE AND MASTER CLEAR A CIO
                             CHANNEL BEFORE DOING THE NEXT DISK REQUEST
          UJK    CCLX
          EJECT
** NAME-- TERMP
*
** PURPOSE-- TERMINATE PP REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE
          SPACE  6
 TERX     LJM    **
 TERMP    EQU    *-1
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
** NAME-- IDLEP
*
** PURPOSE-- PROCESS IDLE COMMAND.
          SPACE  6
 IDLX     LJM    **
          QUAL   *
 IDLEP    EQU    *-1
          QUAL   PR
          AOML   IDLE        SET IDLE FLAG
          AOML   IGNORE      IGNORE ERRORS DURING IDLE PROCESSING
          LDK    SSL
          STDL   SELECT      SET -SELECT- SO -DROPS- WILL NOT FIND A MATCH
          RJM    DROPS       ISSUE DROP SEEKS COMMAND
          LDML   CHLOCK
          ZJN    IDL10       IF CHANNEL LOCK IS NOT SET
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC
 IDL10    BSS
          RJM    CLRUT       CLEAR UNIT TABLES
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          RJM    CFLGS       CLEAR FLAGS
          LDN    0
          STML   IGNORE      ALLOW ERRORS TO BE PROCESSED
          UJK    IDLX
          EJECT
** NAME-- CLRUT
*
** PURPOSE-- CLEAR UNIT TABLES,
*            AND, IF NOT PROCESSING AN IDLE COMMAND,
*            THEN SET THE UNIT DISABLE FLAG.
*
** NOTE --   IF THE LOCK CAN NOT BE SET, JUST SET THE UNIT DISABLE
*            FLAG.  AN IDLE REQUEST WHICH GOES TO ALL PPS WHENEVER
*            A UNIT IS DISABLED WILL CLEAR THE OTHER FLAGS.
          SPACE  6
 CLRUX    LJM    **
 CLRUT    EQU    *-1
          LDN    0
          STML   IALF        CLEAR FLAG SO CONFIDENCE TEST WILL
                             BE RERUN
          STDL   P5          UNIT POINTER INDEX
          LDDL   CUNITS
          ZJK    CLRUX       IF NO UNITS
          RJM    RDUD        READ UNIT INTERFACE TABLE POINTERS
          LDDL   SELIN       SAVE SELIN
          STDL   P6
          ADN    C.SS*4      FIND A DIFFERENT SS ENTRY
          STDL   SELIN
          ADK    -SSL        CHECK FOR END OF TABLE
          MJK    CLRU10      IF NOT END OF TABLE
          STDL   SELIN

* READ SS ENTRY FROM UNIT COMMUNICATION BUFFER.

 CLRU10   BSS
          LDC    SS+/SS/P.ENTRY  ADDRESS OF SS ENTRY
          ADDL   SELIN
          STML   CLRU15
          LDN    C.SS        NUMBER OF WORDS TO TRANSFER
          STDL   WC
          LOADR  UDBF+/UN/P.UIT,P5  LOAD ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5          READ UNIT DISABLED BIT
          ADN    /UIT/C.UBUF
          CRDL   T1
          LDDL   T5+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    CLRU50      IF UNIT IS DISABLED
          LOADF  T3          LOAD ADDRESS OF UNIT COMMUNICATION BUFFER
          CRML   **,WC       READ SS ENTRY
 CLRU15   EQU    *-1
          RJM    STLOCK      SET THE UNIT LOCK
          ZJN    CLRU30      IF LOCK WAS SET

* FOR IDLE REQUESTS, LET THE SHARING PP CLEAR THIS UNIT'S TABLE.
* IF A CHANNEL IS MANUALLY DOWNED, ONLY 1 PP WILL GET AN IDLE REQUEST.
* IN THAT CASE, THE TABLE DOESN'T NEED TO BE CLEARED.

          LDML   IDLE
          NJN    CLRU50      IF PROCESSING AN IDLE COMMAND
          RJM    OFFUN       SET UNIT DISABLE FLAG
          UJN    CLRU50

 CLRU30   BSS
          LDML   IDLE
          NJN    CLRU40      IF PROCESSING AN IDLE COMMAND
          RJM    OFFUN       SET UNIT DISABLE FLAG
 CLRU40   BSS
          LDML   SS+/SS/P.SEEK,SELIN  RESET FLAGS
          LPC    -/SS/K.CUR-/SS/K.SEEK-/SS/K.INIT
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/P.CUR-/SS/P.SEEK
          ERRNZ  /SS/P.SEEK-/SS/P.INIT
          RJM    CLRLOCK     CLEAR THE UNIT LOCK
 CLRU50   BSS
          LDN    4
          RADL   P5          BUMP UNIT POINTER INDEX
          SHN    -2
          SBDL   CUNITS
          NJK    CLRU10      IF NOT END OF TABLE
          LDDL   P6          RESTORE SELIN
          STDL   SELIN

* CLEAR INTERNAL TABLES.

          LDN    0
          STDL   T1
 CLRU60   BSS
          LDN    0
          STML   SS+/SS/P.ENTRY,T1  CLEAR ENTRY ASSIGNED
          LDN    C.SS*4      BUMP TO NEXT ENTRY
          RADL   T1
          ADK    -SSL        CHECK FOR END OF TABLE
          MJK    CLRU60      IF NOT END OF TABLE
          UJK    CLRUX
          EJECT
** NAME-- RDUD
*
** PURPOSE-- READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.
*
          SPACE  6
 RDUX     LJM    **
 RDUD     EQU    *-1

* READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.

          LDDL   CUNITS      NUMBER OF CONFIGURED UNITS
          ZJK    RDUX        IF NO UNITS
          STDL   WC
          LOADC  CM.CB
          ADK    /CB/C.UNITS  UNIT INTERFACE TABLE POINTERS
          CRML   UDBF,WC     READ UNIT INTERFACE TABLE POINTERS
          UJK    RDUX
          SPACE  6
 UDBF     BSSZ   UDBUFL      UNIT INTERFACE TABLE POINTERS
          EJECT
** NAME-- OFFUN
*
** PURPOSE-- SET THE DISABLE FLAG ON THE UNIT INTERFACE TABLE.
*
** INPUT-- A & R REGISTERS = CM ADDRESS OF UNIT INTERFACE TABLE.
          SPACE  6
 OFUX     LJM    **
 OFFUN    EQU    *-1
          LOADR  SS+/SS/P.UQT,SELIN  LOAD ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          STDL   T1
          LDK    /UIT/K.DSABLE  SET UNIT DISABLE FLAG
          STDL   T3
          LDN    0
          STDL   T2
          STDL   T4
          STDL   T5
          LDDL   T1
          LMC    400000B
          RDSL   T2          -LOGICAL OR- THE UNIT DISABLE FLAG
          UJK    OFUX
          EJECT
** NAME-- RESUME
*
** PURPOSE-- PROCESS RESUME COMMAND.
          SPACE  6
 RESX     LJM    **
          QUAL   *
 RESUME   EQU    *-1
          QUAL   PR
          LDN    0
          STML   IDLE        CLEAR IDLE FLAG
          RJM    ICOM        INITIALIZE UNIT TABLES
          UJK    RESX
          EJECT
 F33      IFEQ   OFFU,1
** NAME-- STOP
*
** PURPOSE-- SET THE UNIT DISABLE FLAG IN THE UNIT INTERFACE TABLE.
          SPACE  6
 STOPX    LJM    **
 STOP     EQU    *-1
          LOADF  CM+/CM/P.RMA  LOAD ADDRESS OF UNIT INTERFACE TABLE
          RJM    OFFUN       SET UNIT DISABLE
          UJK    STOPX
 F33      ENDIF
          EJECT
** NAME-- DELCM.
*
** PURPOSE-- DELINK COMPLETED REQUESTS.
*            THIS IS CALLED ONLY ON ERRORS IN ORDER TO DELINK REQUESTS
*            WHICH HAVE STREAMED SUCCESSFULLY.
          SPACE  6
 DELCX    LJM    **
 DELCM    EQU    *-1
          LDDL   NCOMRQ      NUMBER OF COMPLETED REQUESTS
          ZJN    DELC10      IF NO REQUESTS HAVE BEEN COMPLETED
          SODL   NCOMRQ      DECREMENT COMPLETED REQUEST COUNT
          ZJN    DELC10      IF NOT STREAMING OF REQUESTS
          LDML   PRERQ       SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   CURRQ
          LDML   PRERQ+1
          STML   CURRQ+1
          RJM    DELRQ       DELINK COMPLETED REQUESTS FROM QUEUE
                             AND SELECT NEW REQUEST
 DELC10   BSS
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED',
                             'WRITE REQUEST', 'CURRENT REQUEST'
          LPC    -/SS/K.SEEK-/SS/K.WRITE-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/L.SEEK-11
          ERRNZ  /SS/L.WRITE-12
          ERRNZ  /SS/L.CUR-13
          UJK    DELCX
          EJECT
 UBUF     BSSZ   C.UIT*4     UNIT INTERFACE TABLE BUFFER

 IBUF     BSSZ   C.UD*4      UNIT DESCRIPTOR BUFFER
          EJECT
** NAME-- ICOM
*
** PURPOSE-- INITIALIZE THE UNIT COMMUNICATION BUFFER IN ALL THE UNIT
*            INTERFACE TABLES.
*            INITIALIZE ALL STATIC VARIABLES IN THE COMMUNICATION
*            BUFFER:  DEVICE TYPE, CHANNEL NUMBER, SEEK FUNCTION,
*            UNIT NUMBER, COMMUNICATION BUFFER (RMA), UNIT INTERFACE
*            TABLE (RMA).
          SPACE  6
 ICOMX    LJM    **
          QUAL   *
 ICOM     EQU    *-1
          QUAL   PR

* INITIALIZE VARIABLES.

          LDN    0
          STML   LUD         LAST UNIT SELECTED

          LDML   UDL         LENGTH OF UNIT DESCRIPTORS (CM WORDS)
          ZJN    ICOMX       IF NO UNIT DESCRIPTORS
          LDN    0
          STDL   P6          INDEX TO UNIT DESCRIPTORS
          STDL   CUNITS      NUMBER OF CONFIGURED UNITS
 ICOM10   BSS
          LDDL   CM.PIT+2    CM ADDRESS OFFSET OF UNIT DESCRIPTORS
          ADN    C.PIT
          ADDL   P6
          STDL   CMADR+2
          LDN    C.UD        READ 2 CM WORDS
          STDL   WC
          LOADC  CM.PIT,CMADR+2
          CRML   IBUF,WC     READ UNIT DESCRIPTOR
          IFEQ   LARGE,SMALL
          RJM    CHKUD       CHECK FOR VALID UNIT DESCRIPTOR
          ENDIF

* CHECK FOR NULL ENTRY.

          LDML   IBUF+/UD/P.UQT  RMA = 0 IF NULL ENTRY
          ADML   IBUF+/UD/P.UQT+1
          ZJK    ICOM80      IF NULL ENTRY

* ZERO OUT SS ENTRY.

          LDN    C.SS*4
          STDL   T1
 ICOM20   BSS
          LDN    0
          STML   SS-1,T1     ZERO OUT SS ENTRY
          SODL   T1
          NJN    ICOM20
          LDML   IBUF+/UD/P.UQT+1  INITIALIZE START OF QUEUE CHAIN
          ADN    4*8
          STML   SS+/SS/P.QSTRT+1
          SHN    -16
          ADML   IBUF+/UD/P.UQT
          STML   SS+/SS/P.QSTRT
          LOADF  IBUF+/UD/P.UQT  REFORMAT RMA ADDRESS OF UNIT QUEUE TABLE
          STML   SS+/SS/P.UQT+2
          LDDL   CMADR
          STML   SS+/SS/P.UQT
          LDDL   CMADR+1
          STML   SS+/SS/P.UQT+1

* PUT ADDRESS OF UNIT INTERFACE TABLE IN PP COMMUNICATION BUFFER.

          LDN    0
          STML   SS+/SS/P.UQT+3  SET FLAGS = 0 FOR UNIT TABLE
          LDN    1
          STDL   WC
          LOADC  CM.CB
          ADK    /CB/C.UNITS
          ADDL   CUNITS      NUMBER OF CONFIGURED UNITS
          CWML   SS+/SS/P.UQT,WC  SAVE REFORMATTED UNIT INTERFACE TABLE ADDRESS

* READ UNIT INTERFACE TABLE.

          LDN    C.UIT
          STDL   WC
          LOADR  SS+/SS/P.UQT  LOAD ADDRESS OF UNIT INTERFACE TABLE
          CRML   UBUF,WC     READ UNIT INTERFACE TABLE
          LDML   UBUF+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    2+/UIT/L.DSABLE
          MJK    ICOM80      IF UNIT IS DISABLED

          AODL   CUNITS      NUMBER OF CONFIGURED UNITS
          SBN    41
          NJN    ICOM25      IF 40 OR LESS UNITS
          RJM    HALT        IF MORE THAN 40 UNITS
*         (NO RETURN FROM HALT.)

 ICOM25   BSS
          IFEQ   LARGE,SMALL
          RJM    CHKUIT      CHECK FOR VALID UNIT INTERFACE TABLE
          ENDIF

* GET DEVICE TYPE AND TRANSLATE TO INTERNAL DEVICE TYPE.

          LDML   UBUF+/UIT/P.UTYPE  CHECK DEVICE TYPE
          ADC    -400B       CHECK FOR 844
          NJN    ICOM30      IF NOT 844
          LDN    DT844
          UJN    ICOM60

 ICOM30   BSS
          SBN    401B-400B   CHECK FOR 885-1X
          ZJN    ICOM50      IF 885-1X
          RJM    HALT        INVALID DEVICE TYPE
*         (NO RETURN FROM HALT.)

 ICOM50   BSS
          LDN    DT885.1
 ICOM60   BSS
          STDL   T1
          ERRNZ  16-/SS/L.DV-/SS/N.DV
          RAML   SS+/SS/P.DV

* GET CHANNEL NUMBER AND MOVE TO SS ENTRY.

          IFEQ   HARDW,1
          LDML   IBUF+/UD/P.CHAN
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    /SS/M.CHAN
          ENDIF
 W1       IFNE   HARDW,1
 W2       IFEQ   CONTYP,2
          LDN    2
 W2       ELSE
          LDN    4
 W2       ENDIF
 W1       ENDIF
          STDL   CHAN        CHANNEL NUMBER
          SHN    16-/SS/L.CHAN-/SS/N.CHAN
          RAML   SS+/SS/P.CHAN

* SET LARGE SECTOR BIT IN SEEK FUNCTION.

          LDDL   T1
          SBN    DT844
          ZJN    ICOM65      IF 844, USE SMALL SECTOR SEEK FUNCTION
          LDN    /SS/M.LS
          SHN    16-/SS/L.LS-/SS/N.LS
          RAML   SS+/SS/P.LS

* CHANGE DISK CHANNEL INSTRUCTIONS.

 ICOM65   BSS
          RJM    CHGCH       CHANGE DISK CHANNEL INSTRUCTIONS

          LDML   FDCN        DISCONNECT THE CHANNEL
          STML   ICOM67
 ICOM67   DCN    40B         DISCONNECT THE CHANNEL

* PUT PHYSICAL UNIT NUMBER IN SEEK FUNCTION.

          LDML   IBUF+/UD/P.UNIT
          ERRNZ  /UD/L.UNIT
          ERRNZ  /UD/N.UNIT-16
          LPN    /SS/M.UNIT
          ERRNZ  16-/SS/L.UNIT-/SS/N.UNIT
          RAML   SS+/SS/P.UNIT  PUT PHYSICAL UNIT NUMBER IN SEEK FUNCTION
          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN SS TABLE
          STML   SS+/SS/P.LU

* REFORMAT COMMUNICATION BUFFER RMA.

          LOADF  UBUF+/UIT/P.UBUF  REFORMAT RMA ADDRESS OF UNIT QUEUE TABLE
          STML   SS+/SS/P.COM+2
          LDDL   CMADR
          STML   SS+/SS/P.COM
          LDDL   CMADR+1
          STML   SS+/SS/P.COM+1

* CHECK THAT COMMUNICATION BUFFER IS LONG ENOUGH.

          LDML   UBUF+/UIT/P.UBUFL  NUMBER OF 8-BIT BYTES IN COMMUNICATION BUFFER
          SHN    -3          NUMBER OF CM WORDS
          SBN    C.SS        MUST BE LARGER THAN SS ENTRY
          PJN    ICOM70      IF COMMUNICATION BUFFER IS LARGE ENOUGH
                             ERROR - COMMUNICATION BUFFER TOO SMALL
          LDC    E308
          RJM    INTERR      SEND ERROR TO CM
*         (NO RETURN FROM INTERR)


* SAVE SS ENTRY IN COMMUNICATION BUFFER.

 ICOM70   BSS
          LDN    C.SS
          STDL   WC
          LDK    /SS/K.INIT  SET SS ENTRY INITIALIZED FLAG
          RAML   SS+/SS/P.INIT

          LOADR  SS+/SS/P.UQT  ADDRESS OF UNIT INTERFACE TABLE
          ADN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          CRDL   T2          READ UNIT LOCKWORD
          LDDL   T2
          NJN    ICOM73      IF UNIT IS LOCKED

          LOADR  SS+/SS/P.COM  LOAD ADDRESS OF COMMUNICATION BUFFER
          STDL   T1
          CRDL   T2          READ SS ENTRY
          LDDL   T2
          SHN    /SS/L.INIT+2
          MJN    ICOM73      IF SS ENTRY ALREADY INITIALIZED
          LDDL   T1
          LMC    400000B
          CWML   SS,WC       WRITE SS ENTRY TO COMMUNICATION BUFFER

 ICOM73   BSS

* CHECK IF CONTROLLER IS RESERVED TO ANOTHER ACCESS.

 W3       IFNE   HARDW,1
          RJM    CHGCH2      CHANGE DISK CHANNEL INSTRUCTIONS
          LDC    F.AUTOP     SIMULATOR ONLY
          RJM    FUNC        SIMULATOR ONLY
          ACN    DC
          LDC    100
          OAM    BUFF,DC
          FJM    *,DC
          DCN    40B+DC
 W3       ENDIF

 W4       IFEQ   ICHK,1
          RJM    CONRSV      CHECK IF CONTROLLER IS RESERVED


* CHECK IF UNIT IS RESERVED TO ANOTHER ACCESS.

          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN RESPONSE BUFFER
          STML   RS+/RS/P.LU
 ICOM72   BSS
          RJM    SEEKCK      ISSUE SEEK AND CHECK FOR ERRORS
          LDDL   GNSTAT      GENERAL STATUS
          SHN    17-3
          PJN    ICOM75      IF DSU NOT RESERVED
          LDK    /RS/K.URS   UNIT RESERVED
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          UJK    ICOM72      KEEP CHECKING RESERVE FLAG

 ICOM75   BSS
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC
 W4       ENDIF

* BUMP TO NEXT ENTRY.

 ICOM80   BSS
          LDN    C.UD
          RADL   P6          BUMP TO NEXT UNIT DESCRIPTOR ENTRY
          SBML   UDL         CHECK FOR END OF UNIT DESCRIPTORS
          NJK    ICOM10      IF MORE UNIT DESCRIPTORS
          UJK    ICOMX       EXIT
** NAME--CHGCH
*
** PURPOSE--REPLACE CHANNEL INSTRUCTIONS WITH A DIFFERENT CHANNEL NUMBER.
*
** INPUT--CHAN = CHANNEL NUMBER
*
          SPACE  6
 CHGX     LJM    **
 CHGCH    EQU    *-1
          LDDL   CHAN        CHANNEL NUMBER
          SBML   CURCH       CURRENT CHANNEL NUMBER
          ZJN    CHGX        NO CHANGE NEEDED
          RAML   CURCH       SAVE NEW CHANNEL
          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
          EJECT
* CHECK FOR VALID UNIT DESCRIPTOR.
          SPACE  6
          IFEQ   LARGE,SMALL
 CHKUX    LJM    **
 CHKUD    EQU    *-1
 F4       IFEQ   ERRTST,0
          LDML   IBUF+/UD/P.CHAN  CHANNEL NUMBER
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    /SS/M.CHAN
          SBN    14B         VALID CHANNELS ARE 0 - 13B AND 20B - 33B
          MJN    CHKU30      CHANNEL OK
          SBN    20B-14B
          PJN    CHKU25
 CHKU20   BSS
          LDC    E20A        INVALID CHANNEL NUMBER
          UJN    CHKU42

 CHKU25   BSS
          SBN    34B-20B
          PJN    CHKU20

 CHKU30   BSS
          LDML   IBUF+/UD/P.UNIT  PHYSICAL UNIT NUMBER
          SBN    10B         VALID UNIT NUMBERS ARE 0 - 7, 40B - 57B
          MJN    CHKU50      UNIT OK
          SBN    40B-10B
          PJN    CHKU45
 CHKU40   BSS
          LDC    E210        INVALID PHYSICAL UNIT NUMBER
 CHKU42   UJN    CHKU100

 CHKU45   BSS
          SBN    60B-40B
          PJN    CHKU40

 CHKU50   BSS
          LDML   IBUF+/UD/P.UQT+1  UNIT INTERFACE TABLE ADDRESS
          LPN    7
          ZJK    CHKUX
          LDC    E209        UNIT INTERFACE TABLE NOT A WORD BOUNDARY

 CHKU100  BSS
          RJM    INTERR      SEND ERROR TO CM
*         (NO RETURN FROM INTERR)
 F4       ELSE
          UJN    CHKUX
 F4       ENDIF
          ENDIF
          EJECT
* CHECK FOR VALID UNIT INTERFACE TABLE.
          SPACE  6
 W10      IFEQ   LARGE,SMALL
 CUTX     LJM    **
 CHKUIT   EQU    *-1
 W9       IFEQ   HARDW,1
 W11      IFEQ   CONTYP,0
          LDN    0
          STDL   T1
          LDML   UBUF+/UIT/P.LU  LOGICAL UNIT NUMBER
          SBML   IBUF+/UD/P.LU
          NJN    CUT25       LOGICAL UNIT NUMBER MISMATCH

          AODL   T1
          LDML   UBUF+/UIT/P.UTYPE  UNIT TYPE
          ADC    -400B       VALID UNIT TYPE = 400B - 402B
          MJN    CUT100      INVALID UNIT TYPE

          SBN    403B-400B
          PJN    CUT100
*
          AODL   T1
          LDML   UBUF+/UIT/P.UBUFL  UNIT COMMUNICATION BUFFER LENGTH
          LPN    7
          ZJN    CUT30
 CUT25    UJN    CUT100

 CUT30    BSS
          AODL   T1
          LDML   UBUF+/UIT/P.UBUF+1  UNIT COMMUNICATION BUFFER
          LPN    7
          NJN    CUT100      NOT A WORD BOUNDARY

          AODL   T1
          LDML   UBUF+/UIT/P.NEXTPV-1  RESERVED FIELD OF UNIT
                             REQUEST QUEUE DESCRIPTOR
          ADML   UBUF+/UIT/P.NEXT-2
          ADML   UBUF+/UIT/P.NEXT-1
          ZJK    CUTX

 CUT100   BSS
          LDML   CUT110,T1   INTERFACE ERROR CODE
          RJM    INTERR      SEND ERROR TO CM
*         (NO RETURN FROM INTERR)

 CUT110   BSS
          CON    E301        LOGICAL UNIT NUMBER MISMATCH
          CON    E306        INVALID UNIT TYPE
          CON    E307        UNIT COMMUNICATION BUFFER LENGTH NOT A
                             MULTIPLE OF WORDS
          CON    E302        UNIT COMMUNICATION BUFFER NOT A WORD BOUNDARY
          CON    E305        RESERVED FIELD OF UNIT REQUEST QUEUE
                             DESCRIPTOR IS NOT ZERO
 W11      ELSE
          UJK    CUTX
 W11      ENDIF
 W9       ELSE
          UJK    CUTX
 W9       ENDIF
 W10      ENDIF
          EJECT
* INTERFACE ERROR.
          SPACE  6
 INTERR   CON    0
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          LDK    /RS/K.INTERR  INTERFACE ERROR
          STML   RS+/RS/P.INTERR  ABNORMAL STATUS CODE
          RJM    TERMP       SEND RESPONSE TO CM
          RJM    HALT        ERROR
*         (NO RETURN FROM HALT.)

          EJECT
 T11      IFNE   HARDW,1
 CHG2X    LJM    **
 CHGCH2   EQU    *-1
          RJM    CHGCH
          LDN    0
          STDL   T1
 CHG210   LDML   CONCH2,T1
          ZJN    CHG2X
          STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   CHAN
          STIL   T2
          AODL   T1
          UJK    CHG210
 T11      ENDIF
          EJECT
 SL2      IFNE   LARGE,SMALL
 WTDX     LJM    **
 WTDSK    EQU    *-1
 WTD1     BSS
          LDN    3
          STDL   CHAN
          RJM    CHGCH2
          LDN    0
          STML   RESTRT
          LDN    0
          STDL   SELIN

* SET FOR 844.

          LDC    820
          STML   NMCYL
          LDN    19
          STML   TK.CY
 S2       IFEQ   SMALL,1
          LDN    6*4
 S2       ELSE
          LDN    6
 S2       ENDIF
          STML   SC.TK
 S3       IFEQ   IN844,1
          LDC    0           UNIT 00B
 S3       ELSE
          LDC    43B
 S3       ENDIF
          STML   SS+/SS/P.UNIT
          LPN    40B
          ZJN    WTD5        IF 844
          LDC    842
          STML   NMCYL
          LDN    40
          STML   TK.CY
 SL4      IFEQ   SMALL,1
          LDN    8*4
 SL4      ELSE
          LDN    8
 SL4      ENDIF
          STML   SC.TK
 WTD5     BSS
 S4       IFNE   SMALL,1
          LDML   SS+/SS/P.UNIT  SET LARGE SECTOR BIT
          LPC    -1000B
          LMC    1000B
          STML   SS+/SS/P.UNIT
 S4       ENDIF
          LDC    0
          STML   SS+/SS/P.CYL
          LDC    0
          STML   SS+/SS/P.TRACK
          LDC    0
          STML   SS+/SS/P.SECTOR
 WTD10    BSS
          LDN    0
          STML   ERROR
 WTD15    BSS
 S5       IFEQ   PAT,1
          RJM    PATCH
 S5       ENDIF
          LDML   RESTRT
          NJK    WTD1
          RJM    SEEK
          RJM    GENSTAT
          NJN    WTD15
 WTD20    BSS
          LDN    F.WRITE
          IJM    WTD52,DC
          RJM    FUNC
          UJN    *

 WTD52    BSS
          FAN    DC
          LDC    100000
 WTD54    IJM    WTD56,DC
          SBN    1
          NJN    WTD54
          UJN    *

 WTD56    BSS
          ACN    DC
 S6       IFEQ   SMALL,1
          LDN    2
          OAM    BUFF,DC
          LDC    322
 S6       ELSE
          LDC    SBYTE7
 S6       ENDIF
          OAPM   BUFF,DC
          FJM    *,DC
          PSN
          PSN
          DCN    40B+DC
          RJM    GENSTAT
          ZJK    WTD60
          AOML   ERROR
          LDML   ERR1
          STDL   T1
          ZJN    WTD58       IF THIS IS THE FIRST ERROR
          LDML   SS+/SS/P.CYL
          SBML   ERRORS-3,T1
          NJN    WTD58       IF NOT THE SAME TRACK
          LDML   SS+/SS/P.TRACK
          SBML   ERRORS-2,T1
          ZJN    WTD60       IF ERROR ON THE SAME TRACK, DO NOT RECORD
 WTD58    BSS
          LDML   SS+/SS/P.CYL
          STML   ERRORS,T1
          LDML   SS+/SS/P.TRACK
          STML   ERRORS+1,T1
          LDML   SS+/SS/P.SECTOR
          STML   ERRORS+2,T1
          LDN    3
          RAML   ERR1
          ADC    -ERRLN
          MJN    WTD60
          UJN    *

 WTD60    BSS
 S7       IFEQ   PAT,1
          RJM    PATCH
 S7       ENDIF
          LDML   RESTRT
          NJK    WTD1
          AOML   SS+/SS/P.SECTOR
          SBML   SC.TK
          NJK    WTD70
          STML   SS+/SS/P.SECTOR
          AOML   SS+/SS/P.TRACK
          SBML   TK.CY
          NJK    WTD70
          STML   SS+/SS/P.TRACK
          AOML   SS+/SS/P.CYL
          SBML   NMCYL
          NJK    WTD10
          UJK    WTDX

 WTD70    BSS
          LDML   ERROR
          NJK    WTD10
          UJK    WTD20

 NSEC     BSSZ   1
 NMCYL    BSSZ   1
 RESTRT   BSSZ   1
 TK.CY    BSSZ   1
 SC.TK    BSSZ   1
 ERROR    BSSZ   1
 ERR1     BSSZ   1
 ERRORS   BSSZ   3*33
 ERRLN    EQU    *-ERRORS
 SL2      ENDIF
          EJECT
          IFEQ   DUMP,1
 BF1      EQU    7770B
 BF       EQU    5
 BP       EQU    1


          ORG    7700B
 RCDUMP   BSS
          LDN    1
          STDL   CHAN
          RJM    CHGCH2
          LDN    0
          STDL   BP
 RCD10    IAN    DC
          SHN    8
          STML   BF1,BP
          IAN    DC
          RAML   BF1,BP
          AODL   BP
          SBN    5
          NJN    RCD10

          LDN    0
          STDL   BP
 RCD20    IAN    DC
          SHN    8
          STML   BF,BP
          IAN    DC
          RAML   BF,BP
          AODL   BP
          ADC    -7700B
          NJN    RCD20
          UJN    *
          ENDIF
          EJECT
 CONCH2   BSS
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0
          EJECT
          QUAL   *
 R6       ERRPL  *-END       IF > 0, PPREQ IS TOO LONG

          OVERLAY (CONFIDENCE TEST),OVAD2
          ROUTINE CONFO
          CON    CONFOO

          QUAL   CF
          EJECT
** NAME-- CTEST
*
** PURPOSE-- RUN THE CONFIDENCE TEST ON ALL UNITS
*            WHEN THE PP IS FIRST LOADED.
          SPACE  6
 CTESTX   LJM    **
          QUAL   *
 CTEST    EQU    *-1
          QUAL   CF
          LDDL   CUNITS
          ZJK    CTEST60     IF NO UNITS
          LDDL   SELIN       SAVE SELIN
          STML   SAVE
          ADN    C.SS*4      FIND A DIFFERENT SS ENTRY
          STDL   SELIN
          ADK    -SSL        CHECK FOR END OF TABLE
          MJK    CTEST5      IF NOT END OF TABLE
          STDL   SELIN
 CTEST5   BSS
          LDN    0
          STML   CTESTU      UNIT POINTER INDEX

* READ POINTERS TO UNIT INTERFACE TABLES FROM THE PP COMMUNICATION BUFFER.

 CTEST10  BSS
          LOADC  CM.CB
          ADK    /CB/C.UNITS  UNIT INTERFACE TABLE POINTERS
          ADML   CTESTU      UNIT INDEX
          CRDL   T1

          LDDL   T1+/UN/P.CTST  HAS THE CONFIDENCE TEST BEEN RUN
          SHN    /UN/L.CTST+2
          MJK    CTEST50     IF THE CONFIDENCE TEST HAS BEEN RUN

* READ SS ENTRY FROM UNIT COMMUNICATION BUFFER.

          LDC    SS+/SS/P.ENTRY  ADDRESS OF SS ENTRY
          ADDL   SELIN
          STML   CTEST15
          LDN    C.SS        NUMBER OF WORDS TO TRANSFER
          STDL   WC
          LOADR  T1          LOAD ADDRESS OF UNIT INTERFACE TABLE
          CRDL   T5          READ UNIT DISABLED BIT
          ADN    /UIT/C.UBUF
          CRDL   T1

* DON'T RUN THE CONFIDENCE TEST IF THE UNIT DISABLE FLAG IS SET.

          LDDL   T5+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    CTEST50     IF UNIT IS DISABLED
          LOADF  T3          LOAD ADDRESS OF UNIT COMMUNICATION BUFFER
          CRML   **,WC       READ SS ENTRY
 CTEST15  EQU    *-1

 CTEST20  BSS
          RJM    /RES/PPREQ  CHECK IDLE AND ACTIVE FLAGS
          RJM    /RES/SETLOCK  SET THE UNIT LOCK

* TEMPORARY, PUT IN A TIMEOUT OF 30 SECONDS.

          NJK    CTEST20     IF LOCK WAS NOT SET
          STML   RS+/RS/P.PVA    CLEAR OUT ANY LEFT OVER PVA
          STML   RS+/RS/P.PVA+1  FROM RESPONSE BUFFER.
          STML   RS+/RS/P.PVA+2
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR  'SEEK ISSUED',
          LPC    -/SS/K.SEEK-/SS/K.WRITE-/SS/K.CUR
                             'WRITE REQUEST', 'CURRENT REQUEST'
                             IN CASE OPPOSITE ACCESS LEFT THESE SET
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/L.SEEK-11
          ERRNZ  /SS/L.WRITE-12
          ERRNZ  /SS/L.CUR-13
          RJM    CONF        EXECUTE THE CONFIDENCE TEST

* SET FLAG THAT THE CONFIDENCE TEST WAS RUN.

 CTEST30  BSS
          LOADC  CM.CB
          ADK    /CB/C.UNITS  UNIT INTERFACE TABLE POINTERS
          ADML   CTESTU      UNIT INDEX
          STDL   T5          SAVE CM ADDRESS
          CRDL   T1
          LDDL   T1+/UN/P.CTST  SET FLAG THAT CONFIDENCE TEST WAS RUN
          LPC    -/UN/K.CTST
          ADK    /UN/K.CTST
          STDL   T1+/UN/P.CTST
          LDDL   T5
          LMC    400000B
          CWDL   T1          WRITE FLAG IN PP COMMUNICATION BUFFER


* CLEAR FLAGS IN SS ENTRY.

          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED',
                             'WRITE REQUEST', 'CURRENT REQUEST'
          LPC    -/SS/K.SEEK-/SS/K.WRITE-/SS/K.CUR
          STML   SS+/SS/P.SEEK,SELIN
          ERRNZ  /SS/L.SEEK-11
          ERRNZ  /SS/L.WRITE-12
          ERRNZ  /SS/L.CUR-13

          RJM    CLRLOCK     CLEAR THE UNIT LOCK
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER

 CTEST50  BSS
          AOML   CTESTU      BUMP UNIT POINTER INDEX
          SBDL   CUNITS
          NJK    CTEST10     IF NOT END OF TABLE
          LDML   SAVE        RESTORE SELIN
          STDL   SELIN
 CTEST60  BSS
          AOML   IALF        SET FLAG FOR CONFIDENCE TEST STARTED ON
                             ALL UNITS
          UJK    CTESTX
          EJECT
** NAME-- CONFR
*
** PURPOSE-- EXECUTE THE CONFIDENCE TEST.
*            THIS IS THE ENTRY DURING RECOVERY OF AN ERROR.
*            RELOAD THE RECOVERY OVERLAY WHEN THE CONFIDENCE TEST IS
*            FINISHED.
          SPACE  6
 CONFRX   LJM    **
 CONFR    EQU    *-1
          RJM    CONF        EXECUTE THE CONFIDENCE TEST.

 E9       IFEQ   ERRTST,1
          RJM    TESTR2      TEST REQUEST RETRY RECOVERED ERRORS
 E9       ENDIF

          LOADOVL RECSO
          UJK    CONFRX
          EJECT
** NAME-- CONF
*
** PURPOSE-- EXECUTE THE CONFIDENCE TEST.
          SPACE  6
 CONFX    LJM    **
 CONF     EQU    *-1
 Q15      IFEQ   ERRTST,1
          LDML   CTPAR
          ZJN    CONF2       IF NO ERROR TO FORCE
          STDL   P1          PARAMETER FOR /RES/FORC
          SBN    5
          PJN    CONF2       IF NOT FORCE ERROR FUNCTION
          RJM    /RES/FORC   ISSUE FORCE ERROR FUNCTION
          LDN    0
          STML   CTPAR       END OF TEST
 CONF2    BSS
 Q15      ENDIF

          LDML   SS+/SS/P.CONF,SELIN  SET CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          ADK    /SS/K.CONF
          STML   SS+/SS/P.CONF,SELIN
          LDK    /RS/K.CT    SET FLAG FOR CONFIDENCE TEST STARTED
          RJM    SDET        PUT ID IN RESPONSE

* GET DEVICE TYPE.

          LDML   SS+/SS/P.DV,SELIN  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE
          LDN    0           INDEX TO TABLE OF STARTING VALUES OF DATA
          STML   STV
          STML   NMED        NUMBER OF MEDIA ERRORS

 CONF10   BSS
          LDN    0
          STML   NTRANS      SECTORS TRANSFERRED
          STML   SNTRANS     STARTING NTRANS VALUE
          LDN    1
          STDL   FNC         SET FUNCTION CODE = WRITE
          AODL   SIO         SET START I/O FLAG
          AODL   SEKCNT      INCREMENT SEEK ISSUED FLAG

 CONFA    BSS
          RJM    CSETUP      SET UP THE DISK ADDRESS
          RJM    SETADD      SET STARTING DISK ADDRESS IN RESPONSE BUFFER
          RJM    /RES/SEEKON  SEEK AND WAIT FOR ON-CYLINDER
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED' FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK,SELIN
          RJM    CWRITE      WRITE THE CYLINDER
          SODL   SEKCNT      DECREMENT SEEK ISSUED FLAG
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC

          LDN    0
          STML   NTRANS      SET SECTORS TRANSFERRED = 0
          STML   SNTRANS     STARTING NTRANS VALUE
          STML   CPERR       COMPARE ERROR FLAG
          STDL   FNC         SET FUNCTION CODE = READ

 CONFB    BSS
          RJM    CSETUP      SET UP THE DISK ADDRESS
          RJM    SETADD      SET STARTING DISK ADDRESS IN RESPONSE BUFFER
          RJM    /RES/SEEKON  SEEK AND WAIT FOR ON-CYLINDER
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED' FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK,SELIN
          RJM    CREAD       READ AND COMPARE THE DATA
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC
          LDML   CPERR       CHECK IF THERE WAS A COMPARE ERROR
          NJN    CONF20      IF COMPARE ERROR

          AOML   STV         INDEX TO TABLE OF STARTING VALUES OF DATA
          SBN    STVL
          NJK    CONF10      IF NOT END OF STARTING VALUE TABLE

* END OF CONFIDENCE TEST.

          LDML   SS+/SS/P.CONF,SELIN  CLEAR CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          STML   SS+/SS/P.CONF,SELIN
          UJK    CONFX

* DATA COMPARE ERROR.

 CONF20   BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDK    /RS/K.DIE   DRIVE INTERFACE INTEGRITY ERROR
          RJM    SDET        PUT ERROR ID IN RESPONSE
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         (NO RETURN FROM UTERM.)
          SPACE  6
          EJECT
** NAME-- CSETUP
*
** PURPOSE-- SET UP PARAMETERS FOR THE CONFIDENCE TEST.
          SPACE  6
 CSEX     LJM    **
 CSETUP   EQU    *-1
          LDML   /CF/CFCYL,DEVICE
          STML   SS+/SS/P.CYL,SELIN  CYLINDER ADDRESS OF CURRENT REQUEST
          LDN    0
          STDL   T1
          LDML   NTRANS      SECTORS TRANSFERRED
          STML   SS+/SS/P.SECTOR,SELIN  SECTOR ADDRESS
 CSE10    BSS
          LDML   SS+/SS/P.SECTOR,SELIN  COMPUTE TRACK AND SECTOR ADDRESS
          SBML   DVSEC,DEVICE  NUMBER OF SECTORS PER TRACK
          MJN    CSE20       IF END OF COMPUTATION
          STML   SS+/SS/P.SECTOR,SELIN
          AODL   T1          INCREMENT TRACK ADDRESS
          UJN    CSE10

 CSE20    BSS
          LDDL   T1          TRACK ADDRESS
          STML   SS+/SS/P.TRACK,SELIN  TRACK ADDRESS OF CURRENT REQUEST

          LDML   /CF/SECCYL,DEVICE  NUMBER OF SECTORS TO TRANSFER PER CYLINDER
          SBML   NTRANS      SECTORS TRANSFERRED
          STML   NSEC        NUMBER OF SECTORS TO END OF CYLINDER
          UJK    /CF/CSEX
          EJECT
** NAME-- CREAD.
*
** PURPOSE-- READ THE CONFIDENCE TEST CYLINDER.
          SPACE  6
 CREADX   LJM    **
 CREAD    EQU    *-1
          LOADOVL CRDO
          LJM    /CR/CREAD10
          EJECT
** NAME-- CWRITE
*
** PURPOSE-- WRITE THE CONFIDENCE TEST CYLINDER.
          SPACE  6
 CWRIX    LJM    **
 CWRITE   EQU    *-1
          LOADOVL CWRO
          LJM    /CW/CWRI10
          EJECT
** NAME-- CREC
*
** PURPOSE-- HANDLE ERRORS IN THE CONFIDENCE TEST.
          SPACE  6
 CRECX    LJM    **
 CREC     EQU    *-1
          LDC    CREC80      SET RETURN ADDRESS IF CONFIDENCE TEST RUNS OK
          STML   CONF

          LDK    /RS/K.CT    SET FLAG FOR CONFIDENCE TEST STARTED
          RJM    SDET        PUT ID IN RESPONSE
          LDDL   FNC
          ZJN    CREC10      IF READ
          LDML   NTRANS      WAS THE ERROR POSITIVELY ON THE FIRST
                             SECTOR AFTER THE SEEK
          SBML   SNTRANS
          NJN    CREC60      IF DON'T KNOW THE FAILING ADDRESS

* ASSUME EVERY ERROR IS A MEDIA ERROR, UNLESS THE SECTOR OR TRACK
* IS FLAWED.
* ACCEPT 3 MEDIA ERRORS IN THE CONFIDENCE TEST.

* CHECK IF SECTOR OR TRACK IS FLAWED.

 CREC10   BSS
          LOADOVL CRCO
          RJM    /CC/CRC     RECORD MEDIA ERROR

 CREC50   BSS
          LDDL   FNC
          NJK    CONFA       IF WRITE
          UJK    CONFB       IF READ

* FOR WRITES, DECREMENT STARTING ADDRESS AND WRITE 1 SECTOR.

 CREC60   BSS
          LDML   NTRANS      DECREMENT NUMBER OF SECTORS TRANSFERRED
          SBML   SECSC,DEVICE  SECTOR INCREMENT
          STML   NTRANS
          STML   SNTRANS     SAVE STARTING ADDRESS
          LDML   SS+/SS/P.SECTOR,SELIN  DECREMENT SECTOR ADDRESS
          SBML   SECSC,DEVICE
          STML   SS+/SS/P.SECTOR,SELIN
          PJN    CREC70      IF NO NEED TO ADJUST TRACK ADDRESS
          ADML   DVSEC,DEVICE  NUMBER OF SECTORS PER TRACK
          STML   SS+/SS/P.SECTOR,SELIN
          SOML   SS+/SS/P.TRACK,SELIN  DECREMENT TRACK ADDRESS
 CREC70   BSS
          LDML   SECSC,DEVICE  SET TO TRANSFER 1 SECTOR
          STML   NSEC        NUMBER OF SECTORS LEFT TO TRANSFER

          RJM    /RES/SEEKON  SEEK AND WAIT FOR ON-CYLINDER
          LDML   SS+/SS/P.SEEK,SELIN  CLEAR 'SEEK ISSUED' FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK,SELIN
          RJM    CWRITE      WRITE THE CYLINDER
          LDN    F.OPCMP     ISSUE OPERATION COMPLETE
          RJM    FUNC
          LDML   NTRANS      SAVE STARTING ADDRESS
          STML   SNTRANS
          UJK    CREC50      CONTINUE IN CONFIDENCE TEST

* CONFIDENCE TEST WAS SUCCESSFUL.

 CREC80   BSS
          LDML   NCPERR      NUMBER OF SECTORS SUCCESSFULLY COMPARED
          NJK    CREC90      IF CONFIDENCE TEST WAS SUCCESSFUL
          LDK    /RS/K.CFLAW  ALL THE SECTORS / TRACKS ARE FLAWED
          RJM    SDET        PUT ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LOADOVL RECSO      LOAD OVERLAY
          RJM    /RC/INTRS   SEND INTERMEDIATE RESPONSE
 CREC90   BSS
          LDML   RECOV
          SBN    /RC/R20
          ZJN    CREC95      IF THE CONFIDENCE TEST WAS RUN AS
                             PART OF ERROR RECOVERY

* THE INITIAL CONFIDENCE TEST WAS BEING RUN.

          LDC    MAINA       SET UP RETURN ADDRESS
          STML   CTEST
          LJM    CTEST30     CONTINUE INITIAL CONFIDENCE TEST

* GO BACK TO ERROR RECOVERY.

 CREC95   BSS
          LOADOVL RECSO
          UJK    CRECX
          EJECT
 SDETX    LJM    **
 SDET     EQU    *-1         SAVE ERROR ID
          STDL   T1
          LMC    -0
          STDL   T2
          LDML   RS+/RS/P.DET  ERROR ID
          LPDL   T2
          ADDL   T1          ADD ERROR FLAG
          STML   RS+/RS/P.DET
          UJK    SDETX
          EJECT
 CFCYL    CON    821         844 CONFIDENCE TEST CYLINDER
          CON    842         885 CONFIDENCE TEST CYLINDER
 SECCYL   CON    450         844 - NUMBER OF SECTORS PER CYLINDER
          CON    1280        885 - NUMBER OF SECTORS PER CYLINDER
 SWORDS   CON    240         844 - NUMBER OF WORDS PER SECTOR
          CON    1024        885 - NUMBER OF WORDS PER SECTOR
          SPACE  6

* EACH ENTRY IN THE STVAL TABLE CONTAINS THE STARTING 16-BIT VALUE
* FOR INITIALIZING THE WRITE DATA BUFFER.  EACH 16 BIT-FIELD IN THE
* WRITE DATA BUFFER IS INCREMENTED BY 1.

 STVAL    CON    170000B     STARTING VALUES OF DATA
          CON    174000B
 STVL     EQU    2           NUMBER OF ENTRIES IN STVAL TABLE
          EJECT
 Q11      IFEQ   ERRTST,1
 TESTR2X  LJM    **          TERMINATE THE TEST AFTER RUNNING THE CONFIDENCE TEST
 TESTR2   EQU    *-1
          LDML   TESTPAR
          SBN    11
          NJK    TESTR2X
          RJM    TESTEND     TERMINATE THE TEST
          UJK    TESTR2X

 Q11      ENDIF
          EJECT


          QUAL   *
E10       ERRPL  *-OVAD3     CONFO






          OVERLAY (CONFIDENCE TEST, CRC),OVAD3
          ROUTINE CRCO

          QUAL   CC
          EJECT
* ASSUME EVERY ERROR IS A MEDIA ERROR, UNLESS THE SECTOR OR TRACK
* IS FLAWED.
* ACCEPT 3 MEDIA ERRORS IN THE CONFIDENCE TEST.

* CHECK IF SECTOR OR TRACK IS FLAWED.

 CRCX     LJM    **
 CRC      EQU    *-1
          LDDL   DEVICE
          NJN    CRC14       IF 885
          LDML   RS+/RS/P.DET2+5
          LPN    30B
          NJN    CRC40       IF TRACK OR SECTOR IS FLAWED
          UJN    CRC16

 CRC14    BSS
          LDML   RS+/RS/P.DET2+4
          SHN    17-11
          MJN    CRC40       IF TRACK IS FLAWED

 CRC16    BSS
          LDML   NMED        NUMBER OF MEDIA ERRORS SO FAR
          STDL   T1
          STDL   T2
          ZJN    CRC30       IF NO MEDIA ERRORS SO FAR
 CRC20    BSS
          LDML   MEDERR-1,T1  RECORDED ADDRESS OF PREVIOUS MEDIA ERRORS
          SBML   NTRANS
          ZJN    CRC40       IF THIS ADDRESS IS ALREADY IN THE LIST
                             OF MEDIA ERRORS
          SODL   T1
          NJK    CRC20       IF MORE TO CHECK

 CRC30    BSS
          LDML   NTRANS
          STML   MEDERR,T2   SAVE ADDRESS OF THIS MEDIA ERROR
          AOML   NMED        INCREMENT NUMBER OF MEDIA ERRORS
          SBN    NMEDL+1     NUMBER OF MEDIA ERRORS ALLOWED
          MJN    CRC40       IF ACCEPTABLE COUNT OF MEDIA ERRORS

* CONFIDENCE TEST FAILED.
* TOO MANY ERRORS DURING THE CONFIDENCE TEST.

          RJM    RECS        RECOVER
*         (NO RETURN FROM RECS.)


* INCREMENT TO NEXT SECTOR.

 CRC40    BSS
          LDML   SECSC,DEVICE  SECTOR INCREMENT
          RAML   NTRANS      INCREMENT NUMBER OF SECTORS TRANSFERRED
          STML   SNTRANS     SAVE STARTING OFFSET
          UJK    CRCX
          EJECT


          QUAL   *
E10       ERRPL  *-OVAD1     CRC



          OVERLAY (CONFIDENCE TEST, CREAD),OVAD3
          ROUTINE CRDO

          QUAL   CR
          EJECT
** NAME-- CREAD.
*
** PURPOSE-- READ THE CONFIDENCE TEST CYLINDER.
          SPACE  6
 CREAD10  BSS
          LDML   SS+/SS/P.DV,SELIN  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE
          LDN    0
          STML   CKDATA      COMPARE DATA ON ONE SECTOR FOR EACH TRACK

* TRANSFER DATA FROM DISK.

 CREAD30  BSS
 Q20      IFEQ   ERRTST,1
          LDN    0
          STML   CITEST      CLEAR INCOMPLETE SECTOR ERROR
          LDML   CTPAR
          SBN    41B
          NJN    CREAD35
          LDML   SS+/SS/P.TRACK,SELIN
          NJN    CREAD32     IF NOT TIME TO FORCE AN ERROR
          LDML   SS+/SS/P.SECTOR,SELIN
          SBML   SAD1,DEVICE
          ZJN    CREAD36     ISSUE FORCE ERROR
          UJN    CREAD37

 CREAD32  BSS
          SBN    3
          NJN    CREAD37     IF NOT TIME TO FORCE AN ERROR
          LDML   SS+/SS/P.SECTOR,SELIN
          NJN    CREAD37     IF NOT TIME TO FORCE AN ERROR
          LDN    0           END OF TEST
          STML   CTPAR
          UJN    CREAD36

 CREAD35  BSS
          SBN    1
          NJN    CREAD37     IF NO ERROR TO FORCE
          LDN    0
          STML   ICSTEST     MAKE NEXT REQUEST RETRY SUCCEED
 CREAD36  BSS
          LDN    17B
          STML   CITEST      FORCE INCOMPLETE SECTOR
 CREAD37  BSS
 Q20      ENDIF

          LDN    F.READ      ISSUE READ FUNCTION TO DISK CONTROLLER
          RJM    FUNC
 CREAD40  RJM    ACN         ACN    DC
          LDML   CHWDS,DEVICE  NUMBER OF CHANNEL WORDS
          RJM    IAPMBF      IAPM   BUFF,DC
 E24      IFEQ   ERRTST,1
          ADML   CITEST      INCOMPLETE SECTOR
 E24      ENDIF
          STML   AREG        SAVE A REGISTER IN CASE OF PREMATURE TERMINATION
          RJM    CFM         CFM    CREAD47,DC
          UJN    CREAD47     IF NO CHANNEL ERROR

          RJM    CHNERR      RECORD CHANNEL ERROR
 CREAD45  BSS
          RJM    /RES/SEEKON  REISSUE SEEK
          UJK    CREAD30     RE-READ SECTOR

 CREAD47  BSS
          RJM    GENSTAT     GET GENERAL STATUS
          ZJN    CREAD48     IF NO ERRORS
          RJM    /RES/RDERR  CHECK READ ERRORS
          ZJN    CREAD48     IF ERROR WAS CORRECTED
          PJK    CREAD40     IF RETRY OF READ
 CREAD54  BSS
          AOML   SECTRY      INCREMENT SECTOR RETRY COUNT
          SBN    SCTRY
          PJN    CREAD57     IF MAXIMUM TRIES HAVE BEEN ATTEMPTED
          AOML   RS+/RS/P.STRY  INCREMENT SECTOR RETRY COUNT
          UJK    CREAD45     RESEEK AND READ SECTOR

* UNRECOVERED ERROR.

 CREAD57  BSS
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)


* CHECK IF A FULL SECTOR WAS READ.

 CREAD48  BSS
          LDML   AREG        WAS ENTIRE SECTOR READ
          ZJN    CREAD50     IF ENTIRE SECTOR WAS READ
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT RECEIVED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
          RJM    SERRID      ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          UJK    CREAD54     RETRY SECTOR AND REQUEST


* UPDATE SECTOR ADDRESS AND CHECK FOR END OF TRACK.

 CREAD50  BSS
          LDML   CKDATA
          NJN    CREAD60     IF A SECTOR HAS BEEN COMPARED FOR THIS TRACK

          LDML   NMED        NUMBER OF MEDIA ERRORS SO FAR
          ZJN    CREAD53     IF NO MEDIA ERRORS SO FAR
          STDL   T1
 CREAD51  BSS
          LDML   MEDERR-1,T1   RECORDED ADDRESS OF PREVIOUS MEDIA ERRORS
          SBML   NTRANS
          ZJN    CREAD60     IF THIS ADDRESS COULD NOT BE WRITTEN
          SODL   T1
          NJK    CREAD51     IF MORE TO CHECK

 CREAD53  BSS
          RJM    CKD         CHECK THE DATA
          AOML   CKDATA      SET FLAG THAT DATA HAS BEEN CHECKED

 CREAD60  BSS
          RJM    /RES/RECRS  CHECK IF A PREVIOUS ERROR WAS RECOVERED
          LDML   SECSC,DEVICE  SECTOR INCREMENT
          RAML   SS+/SS/P.SECTOR,SELIN  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS / TRACK
          MJN    CREAD70     IF NOT END OF TRACK
          STML   SS+/SS/P.SECTOR,SELIN  SET SECTOR
          AOML   SS+/SS/P.TRACK,SELIN  INCREMENT HEAD ADDRESS
          LDN    0
          STML   CKDATA      COMPARE DATA ON A SECTOR FOR EACH TRACK

* UPDATE BYTES TRANSFERRED.

 CREAD70  BSS
          LDML   SECSC,DEVICE  SECTOR INCREMENT
          RAML   NTRANS      INCREMENT NUMBER OF SECTORS TRANSFERRED
          LDML   NSEC        DECREMENT NUMBER OF SECTORS LEFT TO TRANSFER
          SBML   SECSC,DEVICE
          STML   NSEC
          NJK    CREAD30     IF MORE WORDS TO TRANSFER
          UJK    /CF/CREADX  IF END OF DATA

          EJECT
** NAME-- CKD
*
** PURPOSE-- CHECK THE DATA WHEN DOING THE CONFIDENCE TEST.
          SPACE  6
 CKX      LJM    **
 CKD      EQU    *-1
          LDML   STV         INDEX TO TABLE OF STARTING VALUES
          STDL   T1
          LDML   /CF/STVAL,T1  STARTING VALUE OF SECTOR
          ADN    1
          STDL   P1

          LDN    1
          STDL   T1

 CK20     BSS
          LDDL   P1
          SBML   BUFF,T1     COMPARE THE DATA
          NJN    CK40        IF COMPARE ERROR
          AODL   P1
          AODL   T1          INCREMENT PP WORD COUNT
          SBML   /CF/SWORDS,DEVICE  NUMBER OF WORDS PER SECTOR
          MJK    CK20        IF NOT END OF SECTOR
          LDML   SS+/SS/P.TRACK,SELIN  CHECK IF FIRST WORD OF SECTOR IS
                             THE TRACK AND SECTOR ADDRESS
          SHN    8
          ADML   SS+/SS/P.SECTOR,SELIN
          SBML   BUFF
          NJN    CK40        IF COMPARE ERROR
          AOML   NCPERR      COUNT NUMBER OF SECTORS SUCCESSFULLY COMPARED
          UJK    CKX

* DATA COMPARE ERROR.

 CK40     BSS
          AOML   CPERR       SET COMPARE ERROR
          UJK    CKX
          EJECT
 Q22      IFEQ   ERRTST,1
 SAD1     CON    20          SECTOR - 844
          CON    28          SECTOR - 885
 Q22      ENDIF
          EJECT


          QUAL   *
E10       ERRPL  *-OVAD1     CREAD



          OVERLAY (CONFIDENCE TEST, CWRITE),OVAD3
          ROUTINE CWRO

          QUAL   CW
          EJECT
** NAME-- CWRITE
*
** PURPOSE-- WRITE THE CONFIDENCE TEST CYLINDER.
          SPACE  6
 CWRI10   BSS
          LDML   SS+/SS/P.DV,SELIN  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE
          RJM    INID        INITIALIZE THE WRITE DATA BUFFER

* CHECK IF THE DATA IS STILL IN THE BUFFER.
* AN ERROR RECOVERY OVERLAY COULD WIPE IT OUT.  (RECRS MAY CALL AN OVRLAY.)

 CWRI50   BSS
 Q21      IFEQ   ERRTST,1
          LDN    0
          STML   CITEST      CLEAR INCOMPLETE SECTOR ERROR
          LDML   CTPAR
          SBN    41B
          NJN    CWRI35      IF NOT ERROR CODE 41B
          LDML   SS+/SS/P.TRACK,SELIN
          NJN    CWRI32      IF NOT TIME TO FORCE AN ERROR
          LDML   SS+/SS/P.SECTOR,SELIN
          SBML   SAD1,DEVICE
          ZJN    CWRI36      ISSUE FORCE ERROR
          UJN    CWRI37

 CWRI32   BSS
          SBN    2
          NJN    CWRI37      IF NOT TIME TO FORCE AN ERROR
          LDML   SS+/SS/P.SECTOR,SELIN
          NJN    CWRI37      IF NOT TIME TO FORCE AN ERROR
          UJN    CWRI36

 CWRI35   BSS
          SBN    1
          NJN    CWRI37      IF NO ERROR TO FORCE
          LDN    0
          STML   ICSTEST     MAKE NEXT REQUEST RETRY SUCCEED
 CWRI36   BSS
          LDN    37B
          STML   CITEST      FORCE INCOMPLETE SECTOR
 CWRI37   BSS
 Q21      ENDIF

 CWRI40   BSS
          LDML   STV         INDEX TO TABLE OF STARTING VALUES
          STDL   T1
          LDML   /CF/STVAL,T1
          ADN    1           CHECK THE SECOND WORD
          SBML   BUFF+1
          ZJN    CWRI54      IF DATA IS STILL IN BUFFER
          RJM    INID        INITIALIZE THE DATA

* TRANSFER DATA TO DISK.

 CWRI54   BSS
          LDML   SS+/SS/P.TRACK,SELIN  PUT TRACK AND SECTOR ADDRESS IN
                             FIRST WORD OF SECTOR
          SHN    8
          ADML   SS+/SS/P.SECTOR,SELIN
          STML   BUFF
          LDN    F.WRITE     ISSUE WRITE FUNCTION TO DISK CONTROLLER
          RJM    FUNC        ISSUE THE FUNCTION
 CWRI56   BSS
          RJM    ACN         ACN    DC
          LDML   CHWDS,DEVICE  NUMBER OF CHANNEL WORDS PER DEVICE
 E25      IFEQ   ERRTST,1
          SBML   CITEST      INCOMPLETE SECTOR
 E25      ENDIF
          RJM    OAPMBF      OAPM   BUFF,DC
          RJM    DCN         FJM    *,DC      DCN    40B+DC
          RJM    GENSTAT     GET GENERAL STATUS
          RJM    CFM         CFM    CWRI57,DC
          UJN    CWRI57      IF NO CHANNEL ERROR

          RJM    CHERO       RECORD CHANNEL ERROR
          UJN    CWRI58      CHANNEL OUTPUT PARITY ERROR, UNRECOVERED

 CWRI57   BSS
          LDDL   GNSTAT      GENERAL STATUS
          ZJN    CWRI60      IF NO ERRORS
          RJM    /RES/RDERR  CHECK WRITE ERRORS
          ZJN    CWRI60      IF ERROR WAS CORRECTED
          PJN    CWRI56      IF RETRY OF WRITE.
                             'CONTINUE' FUNCTION HAS BEEN ISSUED
 CWRI58   UJK    CWRI95      UNRECOVERED ERROR

* UPDATE BYTES TRANSFERRED FROM PREVIOUS SECTOR WRITTEN.

 CWRI60   BSS
          LDML   NSEC        CHECK IF LAST SECTOR WAS TRANSFERRED
          SBML   SECSC,DEVICE
          NJN    CWRI64      IF NOT THE LAST SECTOR
          RJM    GENSTAT     GET GENERAL STATUS
          ZJN    CWRI64      IF NO ERRORS
          RJM    /RES/RDERR  CHECK WRITE ERRORS
          ZJN    CWRI64      IF ERROR WAS RECOVERED
          MJN    CWRI95      IF UNRECOVERED ERROR
          UJK    CWRI40      IF RETRY OF WRITE

 CWRI64   BSS
          RJM    /RES/RECRS  CHECK IF AN ERROR WAS RECOVERED

* UPDATE SECTOR ADDRESS AND CHECK FOR END OF TRACK.

          LDML   SECSC,DEVICE  SECTOR INCREMENT
          RAML   SS+/SS/P.SECTOR,SELIN  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS / TRACK
          MJN    CWRI66      IF NOT END OF TRACK
          STML   SS+/SS/P.SECTOR,SELIN  SET SECTOR
          AOML   SS+/SS/P.TRACK,SELIN  INCREMENT HEAD ADDRESS

* UPDATE BYTES TRANSFERRED.

 CWRI66   BSS
          LDML   SECSC,DEVICE  SECTOR INCREMENT
          RAML   NTRANS      INCREMENT NUMBER OF SECTORS TRANSFERRED
          LDML   NSEC        DECREMENT NUMBER OF SECTORS LEFT TO TRANSFER
          SBML   SECSC,DEVICE
          STML   NSEC
          NJK    CWRI50      IF MORE TO TRANSFER
          UJK    /CF/CWRIX

* UNRECOVERED WRITE ERROR.

 CWRI95   BSS
          RJM    RECS        ATTEMPT TO RECOVER
*         (NO RETURN FROM RECS.)
          EJECT
** NAME-- INID
*
** PURPOSE-- INITIALIZE DATA FOR THE READ / WRITE CONFIDENCE TEST.
          SPACE  6
 INIX     LJM    **
 INID     EQU    *-1
          LDML   STV         INDEX TO TABLE OF STARTING VALUES
          STDL   T1
          LDML   /CF/STVAL,T1  INITIALIZE STARTING VALUE
          STDL   P1

          LDN    0
          STDL   T1

 INI20    BSS
          LDDL   P1
          STML   BUFF,T1     PUT DATA IN BUFFER
          AODL   P1
          AODL   T1          INCREMENT PP WORD COUNT
          SBML   /CF/SWORDS+1  NUMBER OF WORDS PER SECTOR (885)
          MJK    INI20       IF NOT DONE INITIALIZING THE DATA
          UJK    INIX
          EJECT
 Q22      IFEQ   ERRTST,1
 SAD1     CON    20          SECTOR - 844
          CON    28          SECTOR - 885
 Q22      ENDIF
          EJECT

          QUAL   *
E10       ERRPL  *-OVAD1     CWRITE

          OVERLAY (DEBUG TEST),BUFF
          ROUTINE TESTO
          QUAL   TE
          EJECT
* DEBUG TEST.
*
* PARAMETERS -
*    1 = WRITE FUNCTION ACCEPTED.
*        TIMEOUT ON GENERAL STATUS
*        TIMEOUT ON ALL FUNCTIONS EXCEPT AUTOLOAD
*        RAM PARITY ERROR.
*        (CONFIDENCE TEST FAILS, BUT REQUEST RETRY AFTER AUTOLOAD,
*        SUCCEEDS.)
*
*    2 = WRITE BUFFER TO DISK, RAM PARITY ERROR
*        TIMEOUT TO 2ND WRITE FUNCTION
*        TIMEOUT TO ALL FUNCTIONS EXCEPT AUTOLOAD
*        (CONFIDENCE TEST FAILS, BUT REQUEST RETRY AFTER AUTOLOAD,
*        SUCCEEDS.)
*
*    3 = INCOMPLETE DATA TRANSFER AFTER READ FUNCTION.
*        RAM PARITY ERROR.
*
*    4 = WRITE BUFFER TO DISK ERROR.  NOT RAM PARITY ERROR.
*        TIMEOUT TO 2ND WRITE FUNCTION.
*
*    5 = CONTROLLER RESERVED, RECOVERED.
*    6 = CONTROLLER RESERVED, UNRECOVERED.
*        (ALSO APPLIES TO CONFIDENCE TEST.)
*    7 = UNIT RESERVED, RECOVERED.
*  10B = UNIT RESERVED, UNRECOVERED.
*        (ALSO APPLIES TO CONFIDENCE TEST.)
*  11B = INCOMPLETE SECTOR TRANSFER, RECOVERED.
*  12B = INCOMPLETE SECTOR TRANSFER, UNRECOVERED.
*        CONFIDENCE TEST PASSES SO THE RESULT IS
*        UNRECOVERED MEDIA FAILURE.
*  13B = INCOMPLETE SECTOR TRANSFER, RECOVERED AFTER THE CONFIDENCE TEST IS RUN.
*  14B = CHANNEL PARITY ERROR, RECOVERED.
*  15B = CHANNEL PARITY ERROR, UNRECOVERED.
*        (ALSO APPLIES TO CONFIDENCE TEST.)
*
*
*  WHEN BITS 6 - 11 ARE SET WITH ONE OF THE ABOVE, IT APPLIES
*  TO THE CONFIDENCE TEST.
*
*  OTHER CONFIDENCE TEST CODES -
*
*  41B = THE CONFIDENCE TEST WILL RECORD THE FIRST 3 ERRORS AS
*        MEDIA ERRORS AND THEN SUCCEED.
*        WHEN WRITING, IT WILL ISSUE FORCE ERROR CODE 4 ON THE LAST SECTOR,
*        FIRST TRACK, AND ALSO, ON THE FIRST SECTOR, 3RD TRACK.
*        WHEN READING, IT WILL ISSUE FORCE ERROR CODE 3 ON THE LAST SECTOR,
*        FIRST TRACK, AND ALSO, ON THE FIRST SECTOR, 4TH TRACK.
*
*  4212B = CONFIDENCE TEST WILL FAIL BUT REQUEST RETRY WILL SUCCEED.
*          ISSUE FORCE ERROR CODE 3 OR 4 ON EVERY SECTOR ON THE CONFIDENCE
*          TEST.
          SPACE  6
 Q11      IFEQ   ERRTST,1
 TESTX    LJM    **
          QUAL   *
 TEST     EQU    *-1
          QUAL   TE
 Q111     IFEQ   ATST,1
          LDN    TESTN
          STDL   T1
 TEST2    BSS
          LDML   AUTOT
          SBML   TESTA-1,T1
          MJN    TEST3       IF NOT TIME TO SIMULATE AN ERROR
          SBN    10
          MJN    TEST4       IF TIME TO SIMULATE AN ERROR
 TEST3    BSS
          SODL   T1
          NJK    TEST2
          UJK    TESTX

 TEST4    BSS
          LDN    10
          RAML   AUTOT       TO PREVENT THE SAME FORCE ERROR CODE FROM BEING
                             ISSUED ON THE NEXT CALL
          RJM    TESTREC     MAKE SURE PREVIOUS ERROR IS ENDED
          LDML   TESTP-1,T1
          STML   TESTPAR

 Q111     ELSE
          LOADC  CM.PIT
          ADN    /PIT/C.CBUF  COMMUNICATION BUFFER
          STDL   P1
          CRDL   P2
          LDDL   P2
          ZJN    TESTX
          STML   TESTPAR     SAVE PARAMETER
          LDN    0
          STDL   P2
          LDDL   P1
          LMC    400000B
          CWDL   P2
 Q111     ENDIF

          LDML   TESTPAR
          SHN    -6
          STML   CTPAR       CONFIDENCE TEST CODES
          LDML   TESTPAR
          LPN    77B
          STDL   P1
          ZJN    TESTXX      IF NOT ERROR TO SIMULATE
          SBN    5
          PJN    TEST10      IF NOT FORCE ERROR FUNCTION
          RJM    /RES/FORC   FORCE ERROR FUNCTION (CODE = P1)
          UJN    TESTXX

 TEST10   BSS
          SBN    2
          PJN    TEST15

* PARAMETER = 5, 6.  CONTROLLER RESERVED TEST.

          LDC    2000B       CONTROLLER RESERVED STATUS
 TEST12   STDL   GNSTAT      GENERAL STATUS
          STML   GSTEST
 TESTXX   UJK    TESTX

 TEST15   BSS
          SBN    2
          PJN    TEST20

* PARAMETER = 7, 10B.  UNIT RESERVED TEST.

          LDN    10B         UNIT RESERVED STATUS
          UJK    TEST12

 TEST20   BSS
          SBN    3
          PJN    TEST30

* PARAMETER = 11B, 12B, 13B.  INCOMPLETE SECTOR TRANSFER TEST.

          LDC    123B        NUMBER OF WORDS NOT TRANSFERRED
          STML   ICSTEST
          UJK    TESTXX

 TEST30   BSS
          SBN    2
          PJK    TESTX

* PARAMETER = 14B, 15B.  CHANNEL PARITY TEST.

          AOML   CHTEST
          UJK    TESTXX
          SPACE  10
 Q112     IFEQ   ATST,1
 TESTA    BSS
*         CON    0           INITIAL CONFIDENCE TEST
          CON    11000
          CON    11200
          CON    11400
          CON    11600
          CON    11800
          CON    12000
          CON    12200
          CON    12400
          CON    12600
          CON    12800
          CON    13000
          CON    13100

 TESTP    BSS
***       CON    4100B
****      CON    4112B
*****     CON    4212B
******    CON    4200B       UNRECOVERED, USE FOR INITIAL CONFIDENCE TEST

**        CON    13B
**        CON    1
**        CON    5
**        CON    3
**        CON    7
**        CON    11B
**        CON    2
**        CON    14B
**        CON    4

***       CON    12B

          CON    15B         UNRECOVERED, DOWN UNIT

 TESTN    EQU    *-TESTP
 Q112     ENDIF
          EJECT

          QUAL   *
          ERRPL  *-END       IF > 0, TEST IS TOO LONG

