*copyc IODMAC1 "{RECORD DEFINITION MACROS}
*copyc IODMAC2 "{LOAD/STORE MACROS}
*copyc IODMAC3 "{GENERAL MACROS}
*copyc IODMAC4 "{GENERAL MACROS}
*copyc IODMAC5 "{OVERLAY MACROS}
** NAME--LOADS.
*
** PURPOSE-- LOAD A CM ADDRESS INTO THE R AND A REGISTERS.
*            AN INDEXED MEMORY LOCATION SPECIFIES THE ADDRESS.
*
** CALLING SEQUENCE-- LOADS   CMR,INDEX
*     THE 3-WORD CM ADDRESS IS CONTAINED IN THE LOCATIONS STARTING AT
*         CMR INDEXED BY INDEX.

 LOADS    MACRO  CMR,INDEX
 M        IFC    NE,$INDEX$$
          LDML   CMR,INDEX
          STD    CMADR
          LDML   CMR+1,INDEX
          STD    CMADR+1
          LRD    CMADR
          LDML   CMR+2,INDEX
          LMC    400000B
 M        ELSE
          LDML   CMR
          STD    CMADR
          LDML   CMR+1
          STD    CMADR+1
          LRD    CMADR
          LDML   CMR+2
          LMC    400000B
 M        ENDIF
          ENDM
          SPACE  6
          EJECT
 HARDW    EQU    1           = 1, TO RUN ON THE HARDWARE,
                             .NE. 1 TO RUN ON THE SIMULATOR
 SLOCK    EQU    1           = 0, TO ACTUALLY SET THE UNIT LOCK
 MULT     EQU    0           = 1, IF MULTIPLE CONTROLLERS ON 1 PP
 PAT      EQU    0           = 1, TO PATCH THE PP
 ERRTST   EQU    1           = 1, TO TEST ERROR HANDLING CODE
 ATST     EQU    0           = 1, TO TEST AUTOMATIC ERROR HANDLING CODE
 STREAM   EQU    1           = 1, TO STREAM REQUESTS
 VALID    EQU    0           = 1, TO VALIDATE CP TABLES
 SMALL    EQU    0           = 1, TO SUPPORT SMALL AND LARGE SECTORS


* EQUATES

 DC       EQU    22B         DISK CHANNEL
 SBYTE8   EQU    1024        NUMBER OF 16-BIT BYTES PER SECTOR
 CTLN     EQU    1           NUMBER OF CONTROLWARE WORDS TO READ INTO BUFFER
 CNTRY    EQU    3           NUMBER OF ATTEMPTS TO LOAD THE ADAPTER
 COSTRY   EQU    3           NUMBER OF ATTEMPTS TO LOAD COS
 RVTRY    EQU    10          LIMIT OF RECOVERED ERRORS PER REQUEST
 NRTRY    EQU    3           NUMBER OF ATTEMPTS TO RECOVER NOT READY
 C.CHCNT  EQU    37          NUMBER OF REQUESTS TO PROCESS BEFORE
                             CLEARING CHANNEL LOCK

* DISK FUNCTIONS

 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.LOADCB EQU    3           LOAD COMMAND BLOCK
 R.CON    EQU    0           CONNECT CM
 R.SEEK   EQU    21B         SEEK
 R.READ   EQU    60B         SEEK AND READ
 R.WRITE  EQU    40B         SEEK AND WRITE
 R.PUP    EQU    23B         POWER UP SPINDLE
 R.PDOWN  EQU    22B         POWER DOWN SPINDLE
 R.LDCM   EQU    116B        AUTOLOAD CONTROL MODULE
 R.DIAG   EQU    160B        70(16). RUN LEVEL II DIAGNOSTICS
 R.DIAGS  EQU    162B        RUN DIAGNOSTIC COMMAND 72

 F.READ   EQU    4           READ
 F.WRITE  EQU    5           WRITE
 F.LDCM   EQU    6           AUTOLOAD CONTROL MODULE
 F.WRITEV EQU    6           WRITE VERIFY
 F.OPCMP  EQU    10B         OPERATION COMPLETE
 F.GS     EQU    12B         GENERAL STATUS
 F.POLL   EQU    12B         POLL STATUS
 F.DS     EQU    13B         DETAILED STATUS
 F.CONT   EQU    14B         CONTINUE
 F.RCYL   EQU    21B         RETURN CYLINDER ADDRESS
 F.EDS    EQU    23B         EXTENDED DETAILED STATUS
 F.MOVD   EQU    24B         MOVE DATA
 F.MOVDT  EQU    25B         MOVE DATA AND TERMINATE
 F.TERT   EQU    26B         TERMINATE TRANSFER
 F.TERM   EQU    27B         TERMINATE ALL ACTIVE COMMANDS
 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.POWER  EQU    55B         POWER UP SPINDLE
 F.PDOWN  EQU    56B         POWER DOWN SPINDLE
 F.AUTDP  EQU    61B         AUTODUMP
 F.ADPT   EQU    64B         EXECUTE ADAPTER DIAGNOSTICS
 F.DIAG   EQU    65B         EXECUTE CM DIAGNOSTICS
 F.ERROR  EQU    66B         FORCE ERROR
 F.DELAY  EQU    73B         LOAD ATTENTION DELAY
 F.AUTOD  EQU    100B        AUTOLOAD FROM DISK
 F.AUTOP  EQU    414B        AUTOLOAD FROM PP
          SPACE  6
* INTERNAL DEVICE CODES

 DTISD1   EQU    0           ISD-1 DEVICE TYPE
 DTISD2   EQU    1           ISD-2 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

 UNUSED   SUBRANGE 0,37777B
 CTST     BOOLEAN            NONZERO IF THE CONFIDENCE TEST WAS STARTED
 BUSY     BOOLEAN            COMMAND IN PROGRESS.  WAITING FOR ACTION
                             FROM ADAPTER

* WORD 2

 CM       SUBRANGE 0,17777B  CONTROL MODULE NUMBER AS SENT TO ADAPTER
 UNIT     SUBRANGE 0,7       UNIT NUMBER AS SENT TO ADAPTER

* WORD 3

 LUN      PPWORD             LOGICAL UNIT NUMBER

* WORD 4

 TMOT1    PPWORD             TIMEOUT FOR OUTSTANDING COMMANDS

* WORD 5

 TMOT2    PPWORD             TIMEOUT FOR OUTSTANDING COMMANDS

* WORD 6 - 8

 UIT      STRUCT 6           RMA OF UNIT INTERFACE TABLE (REFORMATTED)

* WORD 9 - 11

 CB       STRUCT 6           RMA OF UNIT COMMUNICATION BUFFER (REFORMATTED)



          MASKP  BUSY
 K.BUSY   EQU    MSK
          MASKP  CTST
 K.CTST   EQU    MSK

 UN       RECEND
          SPACE  10
* SS TABLE DEFINITIONS. INFORMATION SAVED FOR EACH UNIT.

 SS       RECORD PACKED

* WORD 1

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

* WORDS 2 - 6 = PARAMETERS FOR LOAD COMMAND BLOCK FUNCTION.

 FILL2    SUBRANGE 0,7
 SMALL    BOOLEAN            512 BYTE SECTOR, IF SET
 PRIOV    BOOLEAN            PRIORITY OVERRIDE IF SET
 FILL3    SUBRANGE 0,37B
 CMOD     SUBRANGE 0,7       CONTROL MODULE NUMBER
 UNIT     SUBRANGE 0,7       UNIT NUMBER
*
 FUNC     PPWORD             FUNCTION CODE
*
 CYL      PPWORD             CYLINDER ADDRESS
*
 TRACK    SUBRANGE 0,377B    TRACK ADDRESS
 SECTOR   SUBRANGE 0,377B    SECTOR ADDRESS
*
 TLFLG    BOOLEAN            NONZERO MEANS USE TRANSFER LENGTH
 LENGTH   SUBRANGE 0,77777B  TRANSFER LENGTH

* WORD 7 - END = SAVED INFORMATION PER UNIT.

 FNC      PPWORD             FUNCTION CODE  READ = 0
                                            WRITE = 1
                                            WRITE INITIALIZE = 2
 REQ      STRUCT 4           CURRENT REQUEST (UNFORMATTED RMA)
 PVA      STRUCT 6           PVA OF CURRENT REQUEST
 REQ2     STRUCT 6           CURRENT REQUEST (REFORMATTED RMA)

 QP       STRUCT 4           CURRENT QUEUE POINTER
 LASTC    PPWORD             OFFSET OF COMMAND IN REQUEST
 FRST     PPWORD             = 0, IF FIRST TIME THROUGH UNCMND
 NUMCM    PPWORD             NUMBER OF COMMANDS LEFT TO PROCESS IN
                             THIS REQUEST
 LISTL    PPWORD             NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST.
                             (INCLUDES THE NUMBER OF WORDS WHICH HAVENT
                             BEEN READ FROM CM.)
 MAUS     PPWORD             NUMBER OF SECTORS TO TRANSFER ON CURRENT REQUEST
 TOTAL    STRUCT 2           TOTAL CM WORDS LEFT TO TRANSFER BEFORE TERMINATING
 FCOMRQ   STRUCT 4           FIRST COMPLETED REQUEST (RMA)
 CURRQ    STRUCT 4           CURRENT REQUEST (RMA)
 PRERQ    STRUCT 4           PREVIOUS REQUEST (RMA)
 NCOMRQ   PPWORD             NUMBER OF COMPLETED REQUESTS
 NCOMW    PPWORD             NUMBER OF COMPLETED WRITE REQUESTS
 CURTRK   PPWORD             CURRENT TRACK
 CURSEC   PPWORD             CURRENT SECTOR
 SWFLG    PPWORD             NONZERO IF A STREAMING REQUEST SWITCH WAS MADE
 RVCNT    PPWORD             COUNT OF RECOVERED ERRORS PER REQUEST
 RQTRY    PPWORD             REQUEST RETRY COUNT
 ADERR    PPWORD             ADAPTER ERROR
 NR       PPWORD             NOT READY RETRY COUNT
 LAD      PPWORD             LOAD ADAPTER RETRY COUNTER
 CMLD     PPWORD             CM LOAD RETRY COUNTER
 PRELD    PPWORD             PRELOAD OF CONTROL MODULE IF NONZERO
 DIAG     PPWORD             NONZERO IF RUNNING LEVEL II DIAGNOSTICS
 DIAGS    PPWORD             NONZERO IF RUNNING DIAGNOSTICS COMMAND 72
 RECOV    PPWORD             NONZERO IF IN RECOVERY

 FILL3    SUBRANGE 0,3777B
 CONF     BOOLEAN            NONZERO IF RUNNING THE CONFIDENCE TEST
 CPERR    BOOLEAN            NONZERO IF THERE WAS A COMPARE ERROR IN
                             THE CONFIDENCE TEST
 STV      SUBRANGE 0,7       INDEX TO TABLE OF DATA PATTERNS FOR THE
                             CONFIDENCE TEST


* CURRENT REQUEST.  MUST BE ALIGNED ON A WORD BOUNDARY.

          ALIGN  0,64
 RQ       STRUCT 40          REQUEST

 CMLIST   STRUCT 8           CURRENT DATA ADDRESS OR CURRENT COMMAND

* RESPONSE.

 RS       STRUCT 152         RESPONSE
          MGEN   N.CUR
 M.CUR    EQU    MASK$
          MGEN   N.SEEK
 M.SEEK   EQU    MASK$
          MASKP  SEEK
 K.SEEK   EQU    MSK
          MASKP  CUR
 K.CUR    EQU    MSK
          MASKP  INIT
 K.INIT   EQU    MSK
          MGEN   N.CHAN
 M.CHAN   EQU    MASK$
          MGEN   N.DV
 M.DV     EQU    MASK$
          MASKP  SMALL
 K.SMALL  EQU    MSK
          MGEN   N.SMALL
 M.SMALL  EQU    MASK$
          MASKP  PRIOV
 K.PRIOV  EQU    MSK
          MGEN   N.UNIT
 M.UNIT   EQU    MASK$
          MASKP  UNIT
 K.UNIT   EQU    MSK
          MASKP  CMOD
 K.CMOD   EQU    MSK
          MGEN   N.CMOD
 M.CMOD   EQU    MASK$
          MGEN   N.TRACK
 M.TRACK  EQU    MASK$
          MGEN   N.SECTOR
 M.SECTOR EQU    MASK$
          MASKP  CONF
 K.CONF   EQU    MSK
          MASKP  CPERR
 K.CPERR  EQU    MSK
          MASKP  STV
 K.STV    EQU    MSK
          MGEN   N.STV
 M.STV    EQU    MASK$

 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
                               = 402B, 885-42
 QCNT     PPWORD             QUEUE COUNT
*
          ALIGN  16,64
 UBUFL    PPWORD             UNIT COMMUNICATION BUFFER LENGTH
 UBUF     RMA                UNIT COMMUNICATION BUFFER (RMA)
 ULOCK    BOOLEAN            UNIT IS RESERVED FOR EXCLUSIVE USE
          ALIGN  48,64
 ULOCKP   PPWORD             UNIT LOCK OWNER
 QLOCK    BOOLEAN            UNIT QUEUE LOCK
          ALIGN  48,64
 QLOCKP   PPWORD             UNIT QUEUE LOCK OWNER
          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)

          MASKP  DSABLE
 K.DSABLE EQU    MSK

 UIT      RECEND
          SPACE  6
* PP REQUESTS.

 RQ       RECORD PACKED

          ALIGN  16,64
 NEXTPV   STRUCT 6           NEXT REQUEST ON UNIT QUEUE (PVA)
          ALIGN  32,64
 NEXT     RMA                NEXT REQUEST ON UNIT QUEUE (RMA)
 LEN      PPWORD             REQUEST LENGTH
 LU       PPWORD             LOGICAL UNIT
 RECOV    SUBRANGE 0,3       ERROR RECOVERY OPTIONS
                               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
 FILL     SUBRANGE 0,37B
 MAUS     SUBRANGE 0,1777B   NUMBER OF SECTORS IN THIS 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$
          MGEN   N.MAUS
 M.MAUS   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.LDCM   EQU    15B         LOAD CONTROL MODULE (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.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
                               WAS ENCOUNTERED
 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
 OVR      STRUCT 2000        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

 CM.PIT   BSSZ   3           CM ADDRESS OF PP INTERFACE TABLE (REFORMATED)

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

 CMADR    BSSZ   3           CM ADDRESS
 MOVFC    BSSZ   1           MOVE DATA FUNCTION CODE
 CHAN     BSSZ   1           CHANNEL NUMBER
 PLSTAT   BSSZ   1           POLL STATUS
 CMNDS    BSSZ   1           NUMBER OF OUTSTANDING COMMANDS TO ADAPTER
 CMOD     BSSZ   1           CONTROL MODULE NUMBER
 UX       BSSZ   1           INDEX TO UNITS TABLE
 FI       CON    0           INDEX TO FUNCTION HISTORY BUFFER
 SI       CON    0           INDEX TO POLL STATUS HISTORY BUFFER
 P1       BSSZ   1
 P2       BSSZ   1
 P3       BSSZ   1
 P4       BSSZ   1
 P5       BSSZ   1
 P6       BSSZ   1
 WC       BSSZ   1           WORD COUNT TO READ/WRITE CM WORDS

 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 DEVICE   BSSZ   1           DEVICE TYPE
 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 SECTORS TO TRANSFER TO THE
                             CM ADDRESS.
 SECPOS   BSSZ   1           SECTOR BUFFER TRANSFER POSITION (TO CM)
 RESPC    BSSZ   1           RESPONSE CODE
 UDL      BSSZ   1           LENGTH OF UNIT DESCRIPTORS (CM WORDS)
 LUX      BSSZ   1           VALUE OF UNIT INDEX OF LAST UNIT SELECTED
          IFEQ   SMALL,1
 SZ       BSSZ   1           SECTOR SIZE.  =0 IF SMALL SECTOR,
                             =1 IF LARGE SECTOR
          ENDIF
 AREG     BSSZ   1           A REGISTER AFTER TRANSFER
 SSUN     CON    7777B       UX VALUE OF CURRENT SS TABLE
 CHLOCK   BSSZ   1           SET NONZERO IF CHANNEL LOCK IS SET
 UNUML    BSSZ   1           LENGTH OF CONFIGURED UNIT ENTRIES
 QEND     BSSZ   1           SET NONZERO IF THE LAST REQUEST IN
                               THE QUEUE WAS PROCESSED
 IDLE     BSSZ   1           NONZERO IF IDLE COMMAND RECEIVED,
                               RESUME COMMAND RESETS IT TO 0
 STRRQ    BSSZ   1           SET NONZERO IF STREAMING REQUESTS
 CHGUN    BSSZ   1           FLAG USED BY POLSTAT TO CONTROL CHANGING
                             THE SS ENTRY
 DTSTAT   BSSZ   1           GET DETAILED STATUS DURING ERROR RECOVERY
 CSTREAM  BSSZ   1           CONTINUE STREAMING FLAG
 UNUSED1  BSSZ   1
 UNUSED2  BSSZ   1
 CURCH    CON    DC          CURRENT CHANNEL NUMBER
 FUNCD    BSSZ   1           FUNCTION CODE
 FRSTSC   BSSZ   1           FIRST SECTOR FLAG
 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
 CHLCNT   BSSZ   1           NUMBER OF REQUESTS TO PROCESS BEFORE
                             CLEARING CHANNEL LOCK
 IALF     BSSZ   1           BIT 1 = 1, IF CONTROLWARE HAS BEEN LOADED
                             ON ALL CONTROLLERS
                             BIT 2 = 1, IF CONFIDENCE TEST HAS BEEN STARTED
                             ON ALL CONTROLLERS
 RCON     BSSZ   1           ADDITIONAL RESPONSE CONDITION
          SPACE  3
          ORG    72B

 DSRTP    CON    0           HCS REAL MEMORY WORD-ADDRESS
          CON    1
 NODEL    EQU    DSRTP       DON'T DELINK REQUEST FLAG
 INPNT    EQU    DSRTP+1     IN POINTER FOR RESPONSE BUFFER
 LIM      BSSZ   1           LIMIT OF RESPONSE BUFFER (IN 8-BIT BYTES)
 PPNO     CON    1           LOGICAL PP NUMBER
          ORG    76B
          CON    5           TEMPORARY, PP TYPE USED BY DEADSTART
 LDCMF    EQU    76B         LOAD CONTROL MODULE, IF NONZERO
 LFF00    BSSZ   1
          EJECT
          ORG    100B
          LJM    INIT
          CON    CONTYP      ID FOR ISD
          SPACE  6
 HALT     CON    0
          UJN    *           HALT THE PP
          SPACE  6
* TRANSFER SIZE BEFORE SUSPENDING (64-BIT WORDS).

 XFERSZ   CON    4           TRANSFER SIZE BEFORE SUSPENDING (2048 BYTE SECTORS)
                             ISD-1
          CON    4           ISD-2

* NUMBER OF 16-BIT WORDS TO TRANSFER FOR EACH SECTOR.

          IFNE   SMALL,1
 SECWDS   EQU    1024        LARGE SECTOR
          ELSE
 SECWDS   CON    256         SMALL SECTOR
          CON    1024        LARGE SECTOR
          ENDIF

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

          IFNE   SMALL,1
 SECSC    EQU    4           LARGE SECTOR
          ELSE
 SECSC    CON    1           SMALL SECTOR
          CON    4           LARGE SECTOR
          ENDIF

* NUMBER OF SECTORS PER TRACK FOR EACH DEVICE.

 DVSEC    CON    32          ISD-1
          CON    47          ISD-2

* NUMBER OF TRACKS PER CYLINDER FOR EACH DEVICE.

          IFEQ   T1,0
 DVTRK    CON    10          ISD-1
          CON    24          ISD-2
          ENDIF

* NUMBER OF CM WORDS TO TRANSFER FOR EACH SECTOR.

          IFNE   SMALL,1
 CMWDS    EQU    256         LARGE SECTOR
          ELSE
 CMWDS    CON    64          SMALL SECTOR
          CON    256         LARGE SECTOR
          ENDIF

* DELAY VALUES FOR EACH DEVICE.

 DELV     CON    4010B       ISD-1, 1 LARGE SECTOR OR 8 TINY SECTORS
          CON    2004B       ISD-2, 1 LARGE SECTOR OR 4 TINY SECTORS



          SPACE  6
 CM.CB    BSSZ   3           CM ADDRESS OF PP COMMUNICATION BUFFER (REFORMATTED)
 CM.RS    BSSZ   3           CM ADDRESS OF RESPONSE 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  2
          EJECT
          QUAL   RES
*COPYC IODMAC6
          EJECT
 SCLX     LJM    **
 SCLOCK   EQU    *-1
          LDDL   CHLOCK
          ZJN    SCL1        IF CHANNEL LOCK IS NOT SET
          LDN    0           EXIT A REGISTER = 0
          UJK    SCLX

 SCL1     BSS
          LOADOVL RECSO
          LJM    SCL10

 ADPTERR  CON    0
          LOADOVL RECSO
          LJM    ADPTR

 RECS     CON    0
          LOADOVL RECSO
          LJM    RECSA

 NOTRX    LJM    **
 NOTRDY   EQU    *-1
          LOADOVL RECSO
          LJM    NOTR

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

 HTERM    CON    0
          LOADOVL RECSO
          LJM    HTERM1

 UTERM    CON    0
          LOADOVL DOWNO
          LJM    UTERM1

 OTERM    CON    0
          LOADOVL DOWNO
          LJM    OTERM1

 OCTERM   CON    0
          LOADOVL DOWNO
          LJM    OCTERM1

 LTERM    CON    0
          LOADOVL DOWNO
          LJM    LTERM1

 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

 LDCMBX   LJM    **
 LDCMB    EQU    *-1
          LOADOVL RECSO
          LJM    LDCMB1

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

 DCN2X    LJM    **
 DCN2     EQU    *-1
          DCN    40B+DC      DISCONNECT THE CHANNEL
          UJK    DCN2X

 IAX      LJM    **
 IAMBF    EQU    *-1
          ACN    DC
          IFNE   SMALL,1
          LDC    SECWDS      NUMBER OF WORDS IN SECTOR
          ELSE
          LDML   SECWDS,SZ   NUMBER OF WORDS IN SECTOR
          ENDIF
          IAM    BUFF,DC     READ A SECTOR OF DATA FROM DISK
          UJK    IAX

 OAX      LJM    **
 OAMBF    EQU    *-1
          OAM    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

 OAMP1X   LJM    **
 OAMP1    EQU    *-1
          OAM    P1,DC       SEND DELAY PARAMETER
          UJK    OAMP1X

 EJMX     LJM    **
 EJM      EQU    *-1
          EJM    EJMX,DC     IF CHANNEL IS EMPTY
          AOML   EJM
          UJK    EJMX


          EJECT
 MAINA    BSS
          LOADOVL PPREQO
          RJM    ICOM        INITIALIZE UNIT TABLES

 MAINB    BSS
          SODL   CHLCNT
          NJN    MAINC       IF PP DOESN'T HAVE TO GIVE UP CHANNEL
          RJM    CKCHAN      CHECK IF CHANNEL MUST BE GIVEN UP

 MAINC    BSS
          IFEQ   PAT,1
          RJM    PATCH       PATCH THE PP
          ENDIF
 Q13      IFEQ   ERRTST,1
          RJM    TEST        CHECK FOR FUNCTION TIMEOUT TEST
 Q13      ENDIF
          RJM    PPREQ       CHECK FOR ANY PP REQUESTS


 MAIND    BSS
          LDDL   UNUML
          ZJK    MAINB       IF NO UNITS
          LDDL   IDLE
          NJK    MAINB       IF SOFTWARE IDLED

          LDDL   IALF
          SBN    6
          ZJN    MAIN12      IF EVERYTHING INITIALIZED

          LDDL   IALF
          LPN    2
          NJN    MAIN5       IF INITIAL RESET HAS BEEN ISSUED ON ALL CONTROLLERS
          LOADOVL RECSO
          RJM    LOAD        LOAD ADAPTER AND ALL CONTROL MODULES

 MAIN5    BSS
          LDDL   IALF
          LPN    4
          NJN    MAIN12      IF CONFIDENCE TEST HAS BEEN RUN ON ALL UNITS
          LDML   OVAD1
          SBN    CONFOO
          ZJN    MAIN11      IF OVERLAY IS ALREADY LOADED
          LOADOVL CONFO
 MAIN11   BSS
          RJM    CTEST       RUN CONFIDENCE TEST ON ALL UNITS

 MAIN12   BSS
          RJM    SELSEK      SELECT UNIT REQUESTS, SEEK,
                             AND PROCESS ADAPTER COMMANDS
          UJK    MAINB
          EJECT

* UNIT COMMANDS

 UCMD     BSS
          CON    C.READ
          CON    C.WRITE

* PP COMMANDS.

          IFEQ   T1,0
          CON    C.OFFUN
          CON    C.ONUN
          ENDIF
 UCMDL    EQU    *-UCMD

* UNIT COMMAND PROCESSORS
 UCMDPR   BSS
          CON    READ        READ BYTES
          CON    WRITE       WRITE BYTES

* PP COMMAND PROCESSORS.

          IFEQ   T1,0
          CON    STOP        SET UNIT DISABLE
          CON    ONUN        CLEAR UNIT DISABLE FLAG
          ENDIF
          EJECT
** NAME-- SELSEK
*
** PURPOSE-- LOOK FOR NEW UNIT REQUESTS AND ISSUE SEEKS.
*            PROCESS COMMANDS OR ERRORS FROM POLL STATUS.
          SPACE  6
 SELSX    LJM    **
 SELSEK   EQU    *-1
          LDDL   UNUML
          ZJK    SELSX       IF NO UNITS
 SELS5    BSS
          RJM    GETUD       LOOK FOR NEW REQUESTS AND ISSUE SEEKS
          LDDL   CMNDS       NUMBER OF OUTSTANDING COMMANDS
          ZJK    SELSX       IF NO OUTSTANDING COMMANDS
 SELS10   BSS
          RJM    POLS        GET POLL STATUS
          LDDL   PLSTAT
          SHN    17-11
          MJN    SELS11      IF STATUS
          LDDL   PLSTAT
          SBN    10B         CHECK IF CONTROL MODULE RESERVED
          NJK    SELSX       IF NO STATUS

* PROCESS COMMAND.

 SELS11   BSS
          RJM    PROC        PROCESS COMMAND OR ERROR
          UJK    SELS5

          EJECT
** NAME-- CMND
*
** PURPOSE-- SEND THE LOAD COMMAND BLOCK FUNCTION TO THE ADAPTER.
          SPACE  6
 CMNDX    LJM    **
 CMND     EQU    *-1
          LDN    2           CONTROL MODULE RESERVE RETRY COUNTER
          STML   CRSV2
 CMND10   BSS
          LDN    F.LOADCB
          RJM    FUNC        ISSUE LOAD COMMAND BLOCK
          ACN    DC
          LDN    5
          OAM    SS+/SS/P.UNIT,DC  SEND LOAD COMMAND BLOCK
          RJM    DCN         DISCONNECT CHANNEL
*         (NO RETURN IF ERROR).

          LDML   SS+/SS/P.PRIOV  CLEAR PRIORITY OVERRIDE BIT
          LPC    -/SS/K.PRIOV
          STML   SS+/SS/P.PRIOV
          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT      POLL STATUS
          NJK    CMND70      IF ERROR
          LDML   SS+/SS/P.FUNC  LOAD COMMAND BLOCK FUNCTION
          SBN    R.PUP
          ZJN    CMND20      IF POWER UP SPINDLE
          SBN    R.LDCM-R.PUP
          ZJN    CMND30      IF LOAD CONTROL MODULE
          SBN    R.DIAGS-R.LDCM
          ZJN    CMND30      IF DIAGNOSTIC SUBTEST 5
          ADN    R.DIAGS-R.DIAG
          NJN    CMND40      IF NOT LEVEL II DIAGNOSTICS

* LEVEL II DIAGNOSTICS, POWER UP SPINDLE

 CMND20   BSS
          LDML   SC185       SET TIMEOUT OF 185 SECONDS
          STML   LDTIM,CMOD
          LDN    0
          STML   LDTIM+1,CMOD
          UJN    CMND60

* LOAD CONTROL MODULE, DIAGNOSTIC SUBTEST 5.
* (DIAGNOSTIC SUBTEST 5 SHOULD TAKE LESS THAN 4 SECONDS.
* A 60 SECOND TIMEOUT IS IMPLEMENTED DUE TO LACK OF SPACE IN THE PP.)

 CMND30   BSS
          LDML   SC60        SET TIMEOUT OF 60 SECONDS
          STML   UNITS+/UN/P.TMOT1,UX
          LDN    0
          STML   UNITS+/UN/P.TMOT2,UX
          UJN    CMND60

* READ, WRITE.

 CMND40   BSS
          LDN    1           SET TIMEOUT OF 2 SECONDS
          STML   UNITS+/UN/P.TMOT1,UX
          LDML   SC2
          STML   UNITS+/UN/P.TMOT2,UX
 CMND60   BSS
          AODL   CMNDS       INCREMENT COUNT OF OUTSTANDING ADAPTER COMMANDS
          UJK    CMNDX

* POLL STATUS IS NONZERO.
* EITHER CONTROL MODULE IS RESERVED OR ERROR.

 CMND70   BSS
          SBN    10B
          NJN    CMND80      IF ERROR


* CONTROL MODULE IS RESERVED.
* SET PRIORITY OVERRIDE TO CLEAR RESERVE ON OTHER CM ACCESS.

          SOML   CRSV2       DECREMENT CONTROL MODULE RESERVE RETRY COUNTER
          ZJN    CMND90      IF UNRECOVERED CONTROL MODULE RESERVE
          LDK    /RS/K.CRS   SET CONTROLLER RESERVED FLAG IN RESPONSE
          RJM    SERRID      ERROR ID
          LDML   SS+/SS/P.PRIOV  SET PRIORITY OVERRIDE TO CLEAR RESERVE
                             ON OTHER CM ACCESS
          LPC    -/SS/K.PRIOV
          ADC    /SS/K.PRIOV
          STML   SS+/SS/P.PRIOV
          UJK    CMND10

 CMND80   BSS
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR)

 CMND90   BSS
          RJM    RECS        RECOVER ERROR
*         (NO RETURN FROM RECS)

 CRSV2    BSSZ   1           TIMEOUT COUNTER FOR CONTROLLER RESERVE
          EJECT
** NAME-- PROC
*
** PURPOSE-- PROCESS A COMMAND OR AN ERROR FROM POLL STATUS.
          SPACE  6
 PROCX    LJM    **
 PROC     EQU    *-1
          LDDL   PLSTAT
          SHN    17-11
          PJN    PROC15      IF ERROR
          SHN    11-9
          PJN    PROC20

* ADAPTER ERROR.

 PROC15   BSS
          RJM    ADPTERR     TRY TO RECOVER
*         (NO RETURN FROM ADPTERR)

 PROC20   BSS
          RJM    GETUX       CHANGE UX INDEX TO MATCH UNIT IN PLSTAT,
                             GET SS ENTRY
          LDDL   PLSTAT      GET STATUS CODE
          SHN    -12
          STDL   P1
          SBN    7
          MJN    PROC50
          LDN    7           SUBSYSTEM ERROR
          STDL   P1
 PROC50   BSS
          LDML   SS+/SS/P.CONF
          SHN    /SS/L.CONF+2
          MJN    PROC70      IF RUNNING THE CONFIDENCE TEST
          LDML   OVAD1
          SBN    READOO
          ZJN    PROC55      IF OVERLAY IS ALREADY LOADED
          LOADOVL READO

 PROC55   BSS
          LDML   CMDPR,P1    GET COMMAND PROCESSOR
          STML   PROC60
          RJM    **          PROCESS COMMAND
 PROC60   EQU    *-1
 PROC65   BSS
          UJK    PROCX


 PROC70   BSS
          LOADOVL CONFO
          LDML   CTPR,P1     GET COMMAND PROCESSOR
          STML   PROC80
          RJM    **          PROCESS COMMAND
 PROC80   EQU    *-1
          UJK    PROC65
          SPACE  10
 CMDPR    BSS
          CON    TERMC       COMMAND COMPLETED WITHOUT ERROR
          CON    READ        READ DATA AVAILABLE
          CON    WRITE       WRITE BUFFER SPACE AVAILABLE
          CON    LDCMB       FIRST PART OF LOAD CONTROL MODULE COMPLETED
          CON    NOTRDY      DRIVE NOT READY
          CON    ADPTERR     ADAPTER ERROR
          CON    READ        MEDIA ERROR
          CON    RECS        RECOVER ERROR

 CTPR     BSS
          CON    CTERM       COMMAND COMPLETED WITHOUT ERROR
          CON    CREAD       READ DATA AVAILABLE
          CON    CWRITE      WRITE BUFFER SPACE AVAILABLE
          CON    LDCMB       FIRST PART OF LOAD CONTROL MODULE COMPLETED
          CON    NOTRDY      DRIVE NOT READY
          CON    ADPTERR     ADAPTER ERROR
          CON    CREAD       MEDIA ERROR
          CON    RECS        RECOVER ERROR
          EJECT
** NAME-- DCN
*
** PURPOSE-- DISCONNECT CHANNEL AFTER SENDING DATA.
          SPACE  6
 DCNX     LJM    **
 DCN      EQU    *-1
          ZJN    DCN10       IF TRANSFER WAS COMPLETE
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT TRANSFERRED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
          UJN    DCN40

 DCN10    BSS
          CFM    DCN20,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHERO       RECORD CHANNEL ERROR
*         (NO RETURN FROM CHERO.)

 DCN20    BSS
          LDC    250         SET TIMEOUT FOR 1 MILLISECOND ON S1
          STDL   T1
 DCN30    BSS
          EJM    DCN50,DC    IF CHANNEL IS EMPTY
          SODL   T1
          NJN    DCN30
          LDK    /RS/K.CEMPT  CHANNEL DOESNT GO EMPTY
 DCN40    BSS
          RJM    SERRID      SAVE ERROR FLAG
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)

 DCN50    BSS
          DCN    40B+DC
          UJK    DCNX
          EJECT
** NAME-- UREQ
*
** PURPOSE-- READ A UNIT REQUEST FROM CM.
*
** OUTPUT-- RQ  CONTAINS CURRENT REQUEST.
*           FRST = 0
*           NUMCM = NUMBER OF COMMANDS.
*           DEVICE = DEVICE TYPE.
*
          SPACE  6
 UREQX    LJM    **
 UREQ     EQU    *-1
          LDN    0
          STML   SS+/SS/P.FRST  SET FLAG WHEN REQUEST IS READ
          LDN    3           NUMBER OF WORDS TO READ
          STDL   WC
          LDC    SS+/SS/P.REQ2  REFORMAT RMA ADDRESS
          STDL   T2
          LOADF  SS+/SS/P.REQ  LOAD CM ADDRESS AND REFORMAT
          STML   2,T2
          ADN    2
          CRML   RQ+2*4,WC   READ CURRENT REQUEST
                             READ SWITCH FLAG BEFORE READING LINKAGE FLAGS
          SBN    5
          CRML   RQ,WC
          LDDL   CMADR       SAVE REFORMATED RMA ADDRESS
          STIL   T2
          LDDL   CMADR+1
          STML   1,T2

          LDML   RQ+/RQ/P.LEN  DETERMINE NUMBER OF COMMANDS
          SHN    -3
          SBN    /RQ/C.CMND
          STML   SS+/SS/P.NUMCM  NUMBER OF COMMANDS
          LDN    /RQ/C.CMND
          STML   SS+/SS/P.LASTC  OFFSET OF COMMAND
          LDML   RQ+/RQ/P.MAUS  GET SECTOR COUNT
          LPK    /RQ/M.MAUS
          STML   SS+/SS/P.MAUS
          UJK    UREQX
          EJECT
** NAME-- SRESP
*
** PURPOSE-- SET UP STATUS RESPONSE BUFFER.
          SPACE  6
 SREX     LJM    **
 SRESP    EQU    *-1
          LDML   SS+/SS/P.PVA  PUT PVA OF REQUEST IN RESPONSE BUFFER
          STML   RS+/RS/P.PVA
          LDML   SS+/SS/P.PVA+1
          STML   RS+/RS/P.PVA+1
          LDML   SS+/SS/P.PVA+2
          STML   RS+/RS/P.PVA+2
*
          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.CURTRK  FAILING TRACK ADDRESS
          STML   RS+/RS/P.FTRK
          LDML   SS+/SS/P.CURSEC  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
*           LISTL.
*
** EXIT-- A REGISTER = 0, IF NO MORE COMMANDS.
*         A REGISTER .NE. 0, IF NEXT COMMAND PRESENT.
          SPACE  6
 UNCX     LJM    **
 UNCMND   EQU    *-1
          LDML   SS+/SS/P.NUMCM
          ZJN    UNCX        IF NO MORE COMMANDS, EXIT, A REGISTER = 0
          SOML   SS+/SS/P.NUMCM  DECREMENT COMMAND COUNT
          LDML   SS+/SS/P.FRST  HAS FIRST COMMAND BEEN PROCESSED
          ZJN    UNC10       IF FIRST COMMAND HASN'T BEEN PROCESSED

*         READ NEXT COMMAND FROM CM.

          AOML   SS+/SS/P.LASTC  INCREMENT OFFSET OF LAST COMMAND
          LDN    C.CM
          STDL   WC
          LOADS  SS+/SS/P.REQ2  LOAD CM ADDRESS
          ADML   SS+/SS/P.LASTC  ADD OFFSET OF COMMAND
          CRML   CM,WC       READ COMMAND FROM CM

*         IF INDIRECT ADDRESS, READ CM ADDRESS LIST.

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

 UNC15    BSS
          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
 UNC35    BSS
          LDC    E501        ERROR IN COMMAND CODE
          RJM    ATERM       ABNORMAL TERMINATION (NO RETURN)
*         (NO RETURN FROM ATERM)

 UNC40    BSS
          LDML   SS+/SS/P.FRST
          ZJN    UNC60       IF FRST COMMAND
          LDDL   FNC
          SBML   SS+/SS/P.FNC  FUNCTION CODE
          ZJN    UNC70       IF SAME AS LAST COMMAND
          UJK    UNC35       IF NOT SAME AS LAST COMMAND, ERROR

 UNC60    BSS
          LDDL   FNC
          STML   SS+/SS/P.FNC  SAVE COMMAND CODE
 UNC70    BSS
          AOML   SS+/SS/P.FRST  SET FIRST COMMAND FLAG NONZERO
          UJK    UNCX        EXIT A REGISTER NONZERO
          EJECT
** NAME-- GLIST
*
** PURPOSE-- READ THE CM ADDRESS LIST PORTION OF A COMMAND.
*
** INPUT-- LISTL
*
** OUTPUT-- CMLIST, CM+/CM/P.RMA
          SPACE  6
 GLIX     LJM    **
 GLIST    EQU    *-1
          LDML   SS+/SS/P.LISTL  NO OF CM WORDS IN ADDRESS-LENGTH-PAIR LIST
          ZJN    GLIX        IF NO WORDS TO READ
          LDN    1
          STDL   WC          NUMBER OF CM WORDS TO READ
          LOADF  CM+/CM/P.RMA  LOAD CM ADDRESS AND REFORMAT
          CRML   CMLIST,WC
          LDN    8
          RAML   CM+/CM/P.RMA+1  UPDATE RMA ADDRESS FOR NEXT READ
          SHN    -16
          RAML   CM+/CM/P.RMA
          LDML   CMLIST+/CM/P.LEN  MAKE SURE IT IS AN EVEN NUMBER OF CM WORDS
          ADN    7
          SCN    7
          STML   CMLIST+/CM/P.LEN
          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
          STDL   FUNCD       SAVE FUNCTION CODE
          STML   FBUF,FI     SAVE HISTORY OF FUNCTIONS ISSUED
          AJM    FUN30,DC    IF CHANNEL ACTIVE
          FAN    DC          ISSUE THE FUNCTION
          AODL   FI          INCREMENT FUNCTION BUFFER INDEX
          ADC    -FBUFL
          NJN    FUN4        IF NOT END OF BUFFER
          STDL   FI          INITIALIZE INDEX
 FUN4     BSS
          IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE
          LDK    2           TIMEOUT 500 MILLISECONDS ON ALL FUNCTIONS
          STDL   T1
 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
          LDML   IGNORE
          NJK    FUNX        IGNORE ERRORS
          LDK    /RS/K.FTO   SET FUNCTION TIMEOUT FLAG IN RESPONSE
          RJM    SERR        ERROR ID
          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
          RJM    ADPTERR     PROCESS FUNCTION TIMEOUT ERROR
*         (NO RETURN FROM ADPTERR.)
          EJECT
** NAME-- POLSTAT
*
** PURPOSE-- READ POLL STATUS FROM CONTROLLER.
*
** OUTPUT-- PLSTAT = POLL STATUS.
*
          SPACE  6
 POLSX    LJM    **
 POLSTAT  EQU    *-1
          LDN    F.POLL      POLL STATUS FUNCTION CODE
          RJM    FUNC        ISSUE FUNCTION CODE
          ACN    DC
          LDN    1
          IAM    PLSTAT,DC   INPUT POLL STATUS
          NJK    POLS90      IF INPUT DID NOT COMPLETE
          LDDL   PLSTAT
          STML   SBUF,SI     SAVE HISTORY OF STATUS
          AODL   SI          INCREMENT STATUS BUFFER INDEX
          ADC    -SBUFL
          NJN    POLS4       IF NOT END OF BUFFER
          STDL   SI          INITIALIZE STATUS BUFFER INDEX
 POLS4    BSS
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
*         (NO RETURN IF ERROR).

          LDDL   PLSTAT      SAVE POLL STATUS
          ZJN    POLS40      IF NO ERRORS
          SHN    17-11
          PJN    POLS52      CHECK FOR CONTROL MODULE RESERVED
          SHN    11-9
          MJN    POLS60      IF REPORTED ERROR
          LDDL   PLSTAT
          SHN    -12
          SBN    4
          PJN    POLS55      IF REPORTED ERROR

 POLS40   BSS

**
*   THE FOLLOWING CODE WAS DISABLED TO PREVENT SENDING
*   SOMETIMES AMBIGUOUS GENERAL STATUS TO THE RESPONSE
*   BUFFER. THIS OCCURRED WHEN ATTEMPTING TO CAPTURE
*   INITIAL AND FINAL STATUS.

*         LDDL   DTSTAT      CHECK IF CALLED FROM ADPTERR
*         NJN    POLS60      IF IN ERROR RECOVERY, READ DETAILED STATUS

 POLS50   BSS
          UJK    POLSX

 POLS52   BSS
          LDDL   PLSTAT
          SBN    10B
          ZJK    POLS40      IF CONTROL MODULE RESERVED
          UJK    POLS50      NO STATUS AVAILABLE

* CHECK IF A DIFFERENT SS ENTRY SHOULD BE READ.

 POLS55   BSS
          LDDL   CHGUN
          ZJN    POLS60      IF SS ENTRY SHOULD NOT BE CHANGED
          RJM    GETUX       CHANGE UX TO MATCH UNIT IN POLL STATUS,
                             GET SS ENTRY

* CHECK STATUS.

 POLS60   BSS
          LDN    0
          STDL   DTSTAT      ZERO OUT GET STATUS FLAG
          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    POLS80      IF NOT THE FIRST TIME FOR THIS ERROR
          LDK    /RS/K.CSP
          RAML   RS+/RS/P.DET  SET FLAG FOR DETAILED STATUS PRESENT
          LDDL   PLSTAT      PUT POLL STATUS IN RESPONSE BUFFER
          STML   RS+/RS/P.GENST1
          LDN    F.EDS       READ EXTENDED DETAILED STATUS
          RJM    FUNC
          LDN    20
          ACN    DC
          IAM    RS+/RS/P.DETAIL,DC  READ EXTENDED DETAILED STATUS
          NJN    POLS90      INPUT DID NOT COMPLETE
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
*         (NO RETURN IF ERROR).


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

 POLS80   BSS
          LDDL   PLSTAT      PUT LAST POLL STATUS IN RESPONSE BUFFER
          STML   RS+/RS/P.GENST2
          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    POLS90      IF INPUT DID NOT COMPLETE
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
*         (NO RETURN IF ERROR).

          UJK    POLS50

 POLS90   BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF PP WORDS NOT RECEIVED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
 POLS95   BSS
          RJM    SERRID      SAVE ERROR ID
          RJM    ADPTERR     ABNORMAL TERMINATION, RECOVERED SUBSYSTEM
*         (NO RETURN FROM ADPTERR)
          EJECT
** NAME-- INC
*
** PURPOSE-- CHECK FOR CHANNEL ERRORS AFTER INPUTING DATA.
          SPACE  6
 INCX     LJM    **
 INC      EQU    *-1
          LDC    250         SET TIMEOUT FOR 1 MILLISECOND ON S1
          STDL   T3
 INC10    BSS
          IJM    INC20,DC    IF CHANNEL INACTIVE
          SODL   T3
          NJN    INC10
          LDK    /RS/K.CINAC  CHANNEL NOT INACTIVE
          UJK    POLS95      SAVE ERROR ID
*                            RECOVER ERROR.  CHANNEL ACTIVE TIMEOUT
*         (NO RETURN FROM ADPTERR)

 INC20    BSS
          CFM    INCX,DC     CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (NO RETURN FROM CHNERR)
          EJECT
** NAME-- POLS
*
** PURPOSE-- READ POLL STATUS AND CHANGE SS ENTRY IF THERE
*            IS AN ERROR.
          SPACE  6
 POLX     LJM    **
 POLS     EQU    *-1
          AODL   CHGUN       SET FLAG SO SS ENTRY WILL BE CHANGED
          RJM    POLSTAT     GET POLL STATUS
          LDN    0
          STDL   CHGUN
          UJK    POLX
          EJECT
** NAME-- TERMC.
*
** PURPOSE-- TERMINATE UNIT REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE.
          SPACE  6
 TERMC    CON    0           NORMAL TERMINATION
          SODL   CMNDS       DECREMENT COUNT OF OUTSTANDING ADAPTER COMMANDS

          LDML   CMLOAD,CMOD  CONTROL MODULE LOADING TABLE
          ADML   SS+/SS/P.NR  CHECK IF NOT READY ERROR PROCESSING
          ADML   SS+/SS/P.DIAG  CHECK IF RUNNING DIAGNOSTICS
          ADML   SS+/SS/P.DIAGS  CHECK IF RUNNING DIAGNOSTICS
          NJN    TERM40      CALL OVERLAY TO PROCESS

* NORMAL WRITE TERMINATION.

          LDML   SS+/SS/P.TOTAL  MAKE SURE ALL SECTORS WERE TRANSFERRED
          ADML   SS+/SS/P.LISTL
          ADML   SS+/SS/P.NUMCM
          ZJN    TERM        IF TERMINATION IS OK
          RJM    TERMA       PROBABLY ADAPTER ERROR
*         (NO RETURN FROM TERMA.)






* LOAD OVERLAY FOR SPECIAL PROCESSING

 TERM40   BSS
          LOADOVL RECSO
          LJM    TERMER1



 TERM     BSS
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    SNDWRS      SEND WRITE RESPONSES
          RJM    RESP        SEND RESPONSE TO CPU
          LDDL   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
          RJM    CLRLOCK     CLEAR LOCK ON UNIT
          UJK    MAINB
          EJECT

* ADAPTER INTERFACE ERROR.

 TERMA    CON    0
          LDK    /RS/K.ADPT  ADAPTER CONTROLWARE ERROR
          RJM    SERRID      ERROR ID
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)
          EJECT
** NAME-- CFLGS
*
** PURPOSE-- CLEAR FLAGS WHEN TERMINATING A REQUEST OR
*            PROCESSING AN IDLE COMMAND.
          SPACE  6
 CFLGX    LJM    **
 CFLGS    EQU    *-1
          LDML   UNITS+/UN/P.CM,UX
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER
          LDN    0
          STDL   DTSTAT      CLEAR STATUS READING FLAG
          STML   CMLOAD,CMOD  CLEAR CONTROL MODULE LOADING ENTRY
          STML   SS+/SS/P.RECOV  ZERO OUT ERROR RECOVERY INDEX
          STML   SS+/SS/P.PRELD  PRELOAD OF CONTROL MODULE
          STML   SS+/SS/P.ADERR  CLEAR ADAPTER ERROR FLAG
          STML   SS+/SS/P.CMLD  CONTROL MODULE LOAD RETRY COUNTER
          STML   SS+/SS/P.LAD  ADAPTER LOAD RETRY COUNTER
          STML   SS+/SS/P.DIAG  LEVEL II DIAGNOSTIC FLAG
          STML   SS+/SS/P.DIAGS  DIAGNOSTIC SUBTEST FLAG
          STML   SS+/SS/P.NR  NOT READY RETRY COUNTER
          STML   SS+/SS/P.NCOMW  ZERO OUT NUMBER OF COMPLETED WRITE REQUESTS
          STML   SS+/SS/P.RVCNT  ZERO OUT RECOVERED ERRORS COUNTER
          STML   SS+/SS/P.RQTRY  ZERO OUT REQUEST RETRY COUNTER
          LDML   SS+/SS/P.CONF  CLEAR CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          STML   SS+/SS/P.CONF
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    CFLGX
          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
*         LDN    0
*         STML   PPRQ        ZERO OUT PP REQUEST FLAG
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          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
          ADDL   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
          STDL   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
          AODL   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
          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
          LDN    1
          STML   RSP         SET PROCESSING RESPONSE FLAG
          RJM    PPREQ       CHECK IDLE AND ACTIVE FLAGS
          LDN    0
          STML   RSP
          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.

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

* UPDATE THE 'IN' POINTER.

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

* INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   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-- 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
          AOML   SS+/SS/P.NCOMRQ  INCREMENT NUMBER OF COMPLETED REQUESTS
                             (FOR DELRQ)
          UJK    SNDX
          EJECT
** NAME-- RECRS
*
** PURPOSE-- IF AN ERROR HAS BEEN RECOVERED, SEND AN INTERMEDIATE
*            RESPONSE TO CM.
          SPACE  6
 RECRSX   LJM    **
 RECRS    EQU    *-1
          LDML   RS+/RS/P.RESPL  RESPONSE LENGTH
          ADC    -C.RS*8
          NJN    RECRSX      IF NO ERRORS

          LOADOVL RECSO
          LJM    RECRS1
          EJECT
** NAME-- CHNERR
*
** PURPOSE-- RECORD INPUT CHANNEL ERROR.
          SPACE  6
 CHNERR   CON    0
          LDK    /RS/K.CHERR  INPUT CHANNEL ERROR
          RJM    CHER        RECORD CHANNEL ERROR
*         (NO RETURN FROM CHER.)
          EJECT
** NAME-- CHERO
*
** PURPOSE-- RECORD OUTPUT CHANNEL ERROR.
          SPACE  6
 CHERO    CON    0
          LDK    /RS/K.CHERO  OUTPUT CHANNEL ERROR
          RJM    CHER        RECORD CHANNEL ERROR
*         (NO RETURN FROM CHER.)
          EJECT
** NAME-- CHER
          SPACE  6
 CHER     CON    0
          RJM    SERR        SAVE ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER THE ERROR
*         (NO RETURN FROM ADPTERR.)
          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-- GETUX
*
** PURPOSE-- CHANGE UX INDEX TO MATCH UNIT IN PLSTAT.
*             READ SS ENTRY.
          SPACE  6
 GETUXX   LJM    **
 GETUX    EQU    *-1
          LDDL   UNUML
          ZJK    GETUXX      IF NO UNITS
          LDDL   PLSTAT
          LPN    77B
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER
          LDML   CMLOAD,CMOD
          ZJN    GETUX30     IF THIS CONTROL MODULE IS NOT BEING LOADED
          LPN    77B
          STDL   UX          UNITS TABLE INDEX
 GETUX20  BSS
          RJM    GETSS       GET SS ENTRY
          UJK    GETUXX

 GETUX30  BSS
          LDN    0
          STDL   UX
 GETUX40  BSS
          LDDL   PLSTAT
          LPN    77B         UNIT NUMBER IN POLL STATUS
          SBML   UNITS+/UN/P.UNIT,UX  COMPARE WITH UNIT NUMBER IN TABLE
          ZJN    GETUX20     IF THE UNIT ENTRY IS FOUND
          LDN    P.UN
          RADL   UX          BUMP TO NEXT ENTRY
          SBDL   UNUML
          MJN    GETUX40     IF NOT END OF TABLE
          RJM    TERMA       INVALID POLL STATUS
*         (NO RETURN FROM TERMA.)
          EJECT
** NAME-- GETSS
*
** PURPOSE-- READ SS ENTRY FROM UNIT COMMUNICATION BUFFER IN
*            CM UNIT INTERFACE TABLE.
*
          SPACE  6
 GETSSX   LJM    **
 GETSS    EQU    *-1

* CHECK IF SS TABLES NEEDS TO BE SAVED.

          LDDL   UX
          STML   SAVUX       SAVE UX
          SBDL   SSUN        UX OF CURRENT SS TABLE
          ZJN    GETSSX      IF SS TABLE ALREADY IN MEMORY
          LDDL   SSUN
          STDL   UX
          RJM    SAVSS       SAVE SS TABLE BEFORE READING ANOTHER SS TABLE
          LDML   SAVUX       RESTORE UX
          STDL   UX
          STDL   SSUN        SAVE UX OF NEW SS TABLE

* READ NEW SS TABLE.

          LDN    C.SS        NUMBER OF WORDS TO READ
          STDL   WC
          LOADR  UNITS+/UN/P.CB,UX  ADDRESS OF COMMUNICATION BUFFER
          CRML   SS,WC       READ SS ENTRY
          UJK    GETSSX
          EJECT
** NAME-- SAVSS
*
** PURPOSE-- WRITE THE SS ENTRY TO THE COMMUNICATION BUFFER
*            IN THE UNIT INTERFACE TABLE.
*
          SPACE  6
 SAVX     LJM    **
 SAVSS    EQU    *-1
          LDDL   UX
          SBDL   UNUML
          PJK    SAVX        IF INVALID SS TABLE

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

          LDN    C.SS        NUMBER OF WORDS TO WRITE
          STDL   WC
          LOADR  UNITS+/UN/P.CB,UX  ADDRESS OF COMMUNICATION BUFFER
          CWML   SS,WC       WRITE SS ENTRY
          UJK    SAVX
          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   RCON        RESPONSE CONDITION
          STDL   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-- GETUD
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL.
*            ISSUE ALL SEEKS.
          SPACE  6
 GETUDX   LJM    **
 GETUD    EQU    *-1
          LDDL   UNUML
          ZJK    GETUDX      IF NO UNITS
          LDDL   LUX         UNIT INDEX OF LAST REQUEST FOUND + 1
          STDL   P6
 GETU10   BSS
          LDDL   LUX
          STDL   UX
          LDN    P.UN
          RADL   LUX         BUMP UNIT ENTRY
          SBDL   UNUML
          MJN    GETU20      IF NOT END OF TABLE
          STDL   LUX
 GETU20   BSS
          LDML   UNITS+/UN/P.CM,UX  GET CONTROL MODULE NUMBER
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER
          LDML   CMLOAD,CMOD  CHECK IF CONTROL MODULE IS BEING LOADED
          ZJN    GETU22      IF CONTROL MODULE IS NOT BEING LOADED

* UPDATE/CHECK COMMAND TIMEOUT VALUE FOR CM LOAD
          SOML   LDTIM+1,CMOD  DECREMENT LOAD TIMEOUT VALUE
                               LOWER BITS
          NJK    GETU30      IF LSB'S NOT TIMED OUT
          SOML   LDTIM,CMOD    DECREMENT LOAD TIMEOUT VALUE
                               UPPER BITS
          ZJK    GETU75      IF COMMAND TIMED OUT
          UJN    GETU30      GET NEXT ENTRY

 GETU22   LDML   UNITS+/UN/P.BUSY,UX  CHECK IF OUTSTANDING COMMAND
          SHN    /UN/L.BUSY+2
          PJN    GETU40      IF NO COMMAND IN PROGRESS

* UPDATE/CHECK COMMAND TIMEOUT VALUE

 GETU24   BSS
          SOML   UNITS+/UN/P.TMOT2,UX  DECREMENT TIMEOUT VALUE
                                       LOWER BITS
          NJK    GETU30      IF NOT TIMED OUT
          SOML   UNITS+/UN/P.TMOT1,UX  DECREMENT TIMEOUT VALUE
                                       UPPER BITS
          ZJK    GETU75      IF COMMAND TIMED OUT

* GO TO NEXT UNIT ENTRY.

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

* CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.

 GETU40   BSS
          LDML   PIDLE       CHECK PRE-IDLE FLAG
          NJN    GETU30      IF PRE-IDLE, DON'T ISSUE ANY NEW SEEKS
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          CRDL   T5          READ UNIT DISABLED FLAG
          ADN    /UIT/C.NEXT
          CRDL   T1          READ RMA OF NEXT REQUEST FROM UNIT QUEUE
          LDDL   T3
          ADDL   T4
          ZJK    GETU30      IF NO REQUESTS ON THIS QUEUE
          LDDL   T5+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    GETU30      IF UNIT IS DISABLED

* SET UNIT LOCK.

          RJM    SETLOCK     SET UNIT LOCKWORD
          NJK    GETU30      IF LOCK COULD NOT BE SET
          LDML   SS+/SS/P.CUR
          SHN    /SS/L.CUR+2
          MJN    GETU60      IF CURRENT REQUEST HAS BEEN SELECTED

* SELECT CURRENT REQUEST.

          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    GETU50      IF LOCK COULD NOT BE SET
          RJM    SELRQ       SELECT CURRENT REQUEST
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD
          LDML   SS+/SS/P.CUR  CHECK IF A REQUEST WAS FOUND
          SHN    /SS/L.CUR+2
          MJN    GETU60      IF A REQUEST WAS FOUND
 GETU50   BSS
          RJM    CLRLOCK     CLEAR UNIT LOCKWORD
 GETU55   UJK    GETU30

* ISSUE THE SEEK.

 GETU60   BSS
          RJM    SEEKI       ISSUE INITIAL SEEK
          LDML   UNITS+/UN/P.BUSY,UX  CHECK IF OUTSTANDING COMMAND
          SHN    /UN/L.BUSY+2
          PJN    GETU50      IF SEEK COMMAND FAILED
          UJK    GETU55
 GETU75   BSS
          RJM    GETSS       GET SS ENTRY
          LDK    /RS/K.PTO   PP TIMED OUT A COMMAND
          RJM    SID         ERROR ID
          RJM    ADPTERR     ADAPTER / CONTROL MODULE ERROR
                             RESTART ALL REQUESTS
*         (NO RETURN FROM ADPTERR.)

          EJECT
** NAME-- SEEKI
*
** PURPOSE-- ISSUE INITIAL SEEK.
          SPACE  6
 SEKIX    LJM    **
 SEEKI    EQU    *-1
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          RJM    GETRQ       GET REQUEST
          RJM    SEEKCK      ISSUE INITIAL SEEK
          LDDL   PLSTAT
          NJK    SEKIX       IF COMMAND BLOCK ISSUE WAS UNSUCCESSFUL
          LDML   UNITS+/UN/P.BUSY,UX  SET 'UNIT BUSY' FLAG
          LPC    -/UN/K.BUSY
          ADK    /UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
 E110     IFEQ   ATST,1
          AOML   AUTOT       NUMBER OF SEEKS ISSUED
 E110     ENDIF
          UJK    SEKIX
          EJECT
** NAME-- SEEKCK.
*
** PURPOSE-- ISSUE A SEEK AND RECOVER ANY SEEK ERRORS.
          SPACE  6
 SEEX     LJM    **
 SEEKCK   EQU    *-1

* SET FUNCTION CODE FOR LOAD COMMAND BLOCK.

          LDML   SS+/SS/P.FNC  GET FUNCTION CODE
          ZJN    SEE10       IF READ
          LDK    R.WRITE     SEEK AND WRITE
          UJN    SEE15

 SEE10    BSS
          LDK    R.READ      SEEK AND READ
 SEE15    BSS
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK

* ISSUE LOAD COMMAND BLOCK.

          LDML   UNITS+/UN/P.UNIT,UX  UNIT NUMBER FOR LOAD COMMAND BLOCK
          STML   SS+/SS/P.UNIT
          LDN    0
          STML   SS+/SS/P.LENGTH  PARAMETER IN LOAD COMMAND BLOCK
          RJM    CMND        ISSUE LOAD COMMAND BLOCK
          UJK    SEEX
          EJECT
** NAME-- GETRQ
*
** PURPOSE-- GET FIRST REQUEST AND FIRST COMMAND.
*            SET UP STATUS RESPONSE BUFFER.
*            COMPUTE TOTAL BYTES TO TRANSFER
          SPACE  6
 GETRX    LJM    **
 GETRQ    EQU    *-1
          RJM    UREQ        READ UNIT REQUEST FROM CM
          RJM    SRESP       SET UP STATUS RESPONSE BUFFER
          RJM    SETRQ       SET UP FOR FIRST REQUEST
          RJM    UNCMND      GET FIRST COMMAND
          LDN    0
          STML   SS+/SS/P.SWFLG  CLEAR SWITCH FLAG

* COMPUTE TOTAL SECTORS TO TRANSFER.

          LDML   RQ+/RQ/P.MAUS  NUMBER OF SECTORS IN REQUEST
          LPK    /RQ/M.MAUS
          STML   SS+/SS/P.TOTAL  TOTAL SECTORS TO TRANSFER
          LDML   SS+/SS/P.RECOV
          NJN    GETR20      IF IN ERROR RECOVERY, DONT STREAM
          LDML   RQ+/RQ/P.SWIT  CHECK SWITCH FLAG
          SHN    /RQ/L.SWIT+2
 S2       IFNE   STREAM,1
          UJN    GETR20      TEMPORARY
 S2       ENDIF
          PJN    GETR20      IF NO SWITCH TO NEXT REQUEST
          LOADF  RQ+/RQ/P.NEXT  READ NEXT REQUEST
 GETR10   BSS
          ADN    /RQ/C.MAUS
          CRDL   P1          P1 = SWIT AND MAUS
          SBN    /RQ/C.MAUS-/RQ/C.NEXT
          CRDL   P2          P4, P5 = RMA OF NEXT REQUEST
          LDDL   P1          GET NUMBER OF SECTORS IN THIS REQUEST
          LPK    /RQ/M.MAUS
          RAML   SS+/SS/P.TOTAL  TOTAL SECTORS TO TRANSFER
          LDDL   P1          CHECK SWITCH FLAG
          SHN    /RQ/L.SWIT+2
          PJN    GETR20      IF NO SWITCH TO NEXT REQUEST
          LOADF  P4          READ NEXT REQUEST
          UJK    GETR10

 GETR20   BSS
          IFEQ   SMALL,1
          LDML   SS+/SS/P.SMALL  SET/CLEAR SMALL SECTOR FLAG
          LPC    -/SS/K.SMALL
          STML   SS+/SS/P.SMALL
          LDML   SMALL       NONZERO IF SMALL SECTORS
          ZJN    GETR40      IF LARGE SECTORS
          LDK    /SS/K.SMALL  SET SMALL SECTOR FLAG
          RAML   SS+/SS/P.SMALL
 GETR40   BSS
          ENDIF
          UJK    GETRX
          EJECT
** NAME-- SETRQ
*
** PURPOSE-- SET UP FOR FIRST REQUEST.
          SPACE  6
 SETRQX   LJM    **
 SETRQ    EQU    *-1
          LDML   SS+/SS/P.REQ  SAVE RMA OF REQUEST
          STML   SS+/SS/P.FCOMRQ  FIRST COMPLETED REQUEST (RMA)
          STML   SS+/SS/P.CURRQ  CURRENT REQUEST (RMA)
          LDML   SS+/SS/P.REQ+1
          STML   SS+/SS/P.FCOMRQ+1
          STML   SS+/SS/P.CURRQ+1
          LDN    1
          STML   SS+/SS/P.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

* PUT STARTING ADDRESS IN RESPONSE BUFFER.

          LDML   SS+/SS/P.CYL  STARTING CYLINDER ADDRESS
          STML   RS+/RS/P.SCYL
          LDML   SS+/SS/P.TRACK  TRACK
          SHN    /SS/L.TRACK+/SS/N.TRACK+2
          LPK    /SS/M.TRACK
          STML   SS+/SS/P.CURTRK
          STML   RS+/RS/P.STRK
          LDML   SS+/SS/P.SECTOR  SECTOR
          LPK    /SS/M.SECTOR
          STML   SS+/SS/P.CURSEC
          STML   RS+/RS/P.SSEC

* PUT REQUEST RETRY COUNT IN RESPONSE BUFFER.

          LDML   SS+/SS/P.RQTRY  REQUEST RETRY COUNT
          STML   RS+/RS/P.RTRY
          UJK    SETADDX
          EJECT
** NAME-- SNDWRS
*
** PURPOSE-- SEND WRITE RESPONSES FOR WRITE REQUESTS THAT HAVE
*            BEEN SUCCESSFULLY STREAMED.
          SPACE  6
 SNDWX    LJM    **
 SNDWRS   EQU    *-1
          LDML   SS+/SS/P.NCOMW  NUMBER OF COMPLETED WRITE REQUESTS MINUS 1
          ZJN    SNDWX       IF NO COMPLETED WRITE REQUESTS
          LDN    2
          STDL   WC
          LOADF  SS+/SS/P.CURRQ
          CRML   NRQ,WC      READ FIRST REQUEST TO GET START OF CHAIN
          LDML   SS+/SS/P.REQ  SET CURRQ TO END OF CHAIN SO DELRQ WILL
                             DELINK ALL REQUESTS
          STML   SS+/SS/P.CURRQ
          LDML   SS+/SS/P.REQ+1
          STML   SS+/SS/P.CURRQ+1
 SNDW10   BSS
          RJM    SNDRSP      SEND RESPONSE TO CM
          LDML   NRQ+/RQ/P.NEXT  PUT RMA IN PRERQ IN CASE THERE IS NO ROOM IN
                             RESPONSE BUFFER
          STML   SS+/SS/P.PRERQ
          LDML   NRQ+/RQ/P.NEXT+1
          STML   SS+/SS/P.PRERQ+1
          LDML   NRQ+/RQ/P.NEXTPV  PUT PVA OF NEXT RESPONSE IN RESPONSE BUFFER
          STML   RS+/RS/P.PVA
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   RS+/RS/P.PVA+1
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   RS+/RS/P.PVA+2
          LDN    2
          STDL   WC
          LOADF  NRQ+/RQ/P.NEXT  CM ADDRESS OF NEXT REQUEST
          CRML   NRQ,WC      READ NEXT REQUEST CHAIN POINTERS
          SOML   SS+/SS/P.NCOMW  DECREMENT COUNT OF RESPONSES LEFT TO SEND
          NJK    SNDW10      IF MORE RESPONSES
          UJK    SNDWX
          EJECT
** NAME-- SELRQ.
*
** PURPOSE-- SELECTS THE FIRST REQUEST IN THE CHAIN FOR THE
*            CURRENT REQUEST.
*
** INPUTS-- UNITS+/UN/P.UIT,UX = 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
*
** NOTE-- ASSUMES UNIT QUEUE LOCK HAS BEEN SET.
          SPACE  6
 SELRQX   LJM    **
 SELRQ    EQU    *-1

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

          LOADR  UNITS+/UN/P.UIT,UX  LOAD CM ADDRESS OF UNIT QUEUE TABLE
          ADN    /UIT/C.NEXTPV
          CRDL   T1          READ RMA OF FIRST REQUEST IN CHAIN
          ADN    1
          CRDL   T1+4
          LDML   SS+/SS/P.CUR  CLEAR 'CURRENT REQUEST' FLAG
          LPC    -/SS/K.CUR
          STML   SS+/SS/P.CUR
          LDDL   T7
          STML   SS+/SS/P.REQ  SET RMA OF CURRENT REQUEST
          LDDL   T8
          STML   SS+/SS/P.REQ+1
          ADDL   T7
          ZJK    SELRQX      IF QUEUE EMPTY
          LDDL   T2          SET PVA OF CURRENT REQUEST
          STML   SS+/SS/P.PVA
          LDDL   T3
          STML   SS+/SS/P.PVA+1
          LDDL   T4
          STML   SS+/SS/P.PVA+2
          RJM    UREQ        READ SELECTED REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL
          STML   SS+/SS/P.CYL  CYLINDER ADDRESS OF CURRENT REQUEST
          LDML   RQ+/RQ/P.TRACK
          SHN    /SS/N.SECTOR  TRACK ADDRESS OF CURRENT REQUEST
          ADML   RQ+/RQ/P.SECTOR
          STML   SS+/SS/P.SECTOR  SECTOR ADDRESS OF CURRENT REQUEST

* SET CURRENT REQUEST FLAG.

          LDK    /SS/K.CUR   SET CURRENT REQUEST FLAG
          RAML   SS+/SS/P.CUR
          UJK    SELRQX
          EJECT
** NAME-- DELRQ.
*
** PURPOSE-- DELETE COMPLETED REQUEST FROM THE UNIT QUEUE.
*            SELECT A NEW CURRENT REQUEST BASED UPON CYLINDER ADDRESS.
*
** INPUTS-- UNITS+/UN/P.UIT = POINTER TO UNIT QUEUE TABLE
*           SS+/SS/P.NCOMRQ.
*           SS+/SS/P.CURRQ.
*
** 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
          LDN    0
          STDL   QEND        SET QUEUE-END FLAG = 0
          STDL   STRRQ       STREAMING REQUEST FLAG

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

* DECREMENT QUEUE COUNTER.

          LOADR  UNITS+/UN/P.UIT,UX  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
          SBML   SS+/SS/P.NCOMRQ  NUMBER OF COMPLETED REQUESTS
          STDL   P1+/UIT/P.QCNT
          MJN    DEL3        IF INVALID QUEUE COUNT
          LDDL   T1
          LMC    400000B
          CWDL   P1          WRITE QUEUE COUNT

* RE-READ RMA CHAIN POINTERS OF CURRENT REQUEST.

 DEL3     BSS
          LDN    2
          STDL   P3
          LOADF  SS+/SS/P.CURRQ  RMA OF CURRENT REQUEST
          CRML   RQ,P3       READ RMA CHAIN OF CURRENT REQUEST

* CLEAR FLAGS IN SS ENTRY.

          LDN    C.RQ
          STDL   WC
          LDML   SS+/SS/P.CUR  CLEAR 'CURRENT REQUEST'
          LPC    -/SS/K.CUR
          STML   SS+/SS/P.CUR

* READ NEXT REQUEST ON QUEUE.

          LDC    RQ
          STDL   P6
 DEL4     BSS
          LDML   /RQ/P.NEXT,P6
          STML   SS+/SS/P.REQ  SAVE RMA ADDRESS OF NEXT REQUEST
          LDML   /RQ/P.NEXT+1,P6
          STML   SS+/SS/P.REQ+1
          ADML   SS+/SS/P.REQ
          NJN    DEL5        IF NEXT REQUEST EXISTS
          AODL   QEND        SET QUEUE-END FLAG
          LJM    DEL10

 DEL5     BSS
          LDML   /RQ/P.NEXTPV,P6  SAVE PVA OF NEXT REQUEST
          STML   SS+/SS/P.PVA
          LDML   /RQ/P.NEXTPV+1,P6
          STML   SS+/SS/P.PVA+1
          LDML   /RQ/P.NEXTPV+2,P6
          STML   SS+/SS/P.PVA+2
          LOADF  /RQ/P.NEXT,P6  LOAD AND FORMAT CM ADDRESS OF NEXT REQUEST
          CRML   NRQ,WC      READ NEXT REQUEST

* SELECT HIGHEST PRIORITY REQUESTS.

          LDC    NRQ
          STDL   P6
          LDML   NRQ+/RQ/P.CMND+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ADC    -C.READ
          NJN    DEL9        IF NOT A READ, GET NEXT REQUEST
          LDDL   STRRQ
          NJN    DEL6        IF PREVIOUS REQUEST IS A STREAMING REQUEST
          LDML   NRQ+/RQ/P.CMND+/CM/P.LEN  GET LENGTH OF CM ADDRESS AREA
          SBN    21B
          MJN    DEL10       IF READ OF 1 OR 2 PAGES
 DEL6     BSS
          LDML   NRQ+/RQ/P.SWIT  GET REQUEST SWITCH FLAG
          SHN    -16+/RQ/N.SWIT+/RQ/L.SWIT
          ERRNZ  -1+/RQ/N.SWIT+/RQ/L.SWIT
          STDL   STRRQ       NONZERO IF STREAMING REQUEST
 DEL9     UJK    DEL4

* GET RMA OF FIRST REQUEST IN CHAIN.
* START AT BEGINNING OF CHAIN IN ORDER TO DELINK THE REQUEST.
* ALSO, THE FIRST REQUEST IN THE CHAIN IS SELECTED IF THE END
* OF THE QUEUE WAS REACHED.

 DEL10    BSS
          LOADR  UNITS+/UN/P.UIT,UX  LOAD CM ADDRESS OF UNIT QUEUE TABLE
          ADN    /UIT/C.NEXTPV
          UJN    DEL35       READ RMA OF FIRST REQUEST IN CHAIN

* THE FIRST REQUEST IN THE CHAIN IS SELECTED IF THE END OF THE
* QUEUE WAS REACHED.

 DEL20    BSS
          LDDL   QEND        CHECK IF THE END OF Q WAS REACHED
          ZJN    DEL30       IF NOT THE END OF THE Q. GET NEXT REQUEST.
          LDN    0           TAKE THE FIRST REQUEST IN THE QUEUE
          STDL   QEND        RESET QUEUE-END FLAG
          LDML   NRQ+/RQ/P.NEXT  SAVE RMA OF THIS REQUEST
          STML   SS+/SS/P.REQ
          LDML   NRQ+/RQ/P.NEXT+1
          STML   SS+/SS/P.REQ+1
          LDML   NRQ+/RQ/P.NEXTPV  SAVE PVA OF THIS REQUEST
          STML   SS+/SS/P.PVA
          LDML   NRQ+/RQ/P.NEXTPV+1
          STML   SS+/SS/P.PVA+1
          LDML   NRQ+/RQ/P.NEXTPV+2
          STML   SS+/SS/P.PVA+2

* GET RMA AND PVA OF NEXT REQUEST IN CHAIN.
* (P3 = 2.)

 DEL30    BSS
          LOADF  NRQ+/RQ/P.NEXT  LOAD CM ADDRESS OF NEXT REQUEST
 DEL35    BSS
          STDL   P2          SAVE CM ADDRESS
          CRML   NRQ,P3      READ REQUEST FROM CHAIN
          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.

          LDML   NRQ+/RQ/P.NEXT
          SBML   SS+/SS/P.FCOMRQ  IS NEXT REQUEST IN CHAIN = COMPLETED REQUEST
          NJN    DEL42       IF NEXT REQUEST IN CHAIN IS NOT COMPLETED REQUEST
          LDML   NRQ+/RQ/P.NEXT+1
          SBML   SS+/SS/P.FCOMRQ+1
 DEL42    NJK    DEL20       IF NEXT REQUEST IN CHAIN IS NOT COMPLETED REQUEST

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

          LDDL   P2          CM ADDRESS OF REQUEST
          ERRNZ  /RQ/C.NEXTPV
          LMC    400000B
          CWML   RQ,P3       PVA AND RMA OF NEXT REQUEST IN CHAIN
          RJM    CQLOCK      CLEAR QUEUE LOCKWORD

* SET CURRENT REQUEST IN SS TO SELECTED REQUEST.

          LDML   SS+/SS/P.REQ  RMA OF SELECTED REQUEST
          ADML   SS+/SS/P.REQ+1
          ZJN    DEL70       IF QUEUE EMPTY
          RJM    UREQ        READ SELECTED REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL
          STML   SS+/SS/P.CYL  CYLINDER ADDRESS OF CURRENT REQUEST
          LDML   RQ+/RQ/P.TRACK
          SHN    /SS/N.SECTOR  TRACK ADDRESS
          ADML   RQ+/RQ/P.SECTOR
          STML   SS+/SS/P.SECTOR  SECTOR ADDRESS

          LDK    /SS/K.CUR   SET 'CURRENT REQUEST' FLAG
          RAML   SS+/SS/P.CUR
 DEL70    BSS
          LDN    0
          STML   SS+/SS/P.NCOMRQ  CLEAR COMPLETED REQUEST COUNT
          UJK    DELX
          EJECT
** NAME-- SETLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE 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
 F1       IFEQ   SLOCK,0
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
 F1       ENDIF
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          UJK    SETLX
          EJECT
** NAME-- SQLOCK
*
** PURPOSE-- SETS THE QUEUE LOCK IN THE UNIT INTERFACE 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    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          UJK    SQLX
          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
          NJN    LOCK20      IF THIS PP WAS FIRST TO WRITE
                             THE INTERMEDIATE VALUE
          AODL   LFF00
          UJK    LOCK10      REPEAT THE RDSL INSTRUCTION

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

 LOCK20   BSS
          LDDL   T2          SET THE 'REQUEST LOCKWORD' FLAG
          LPC    77777B
          ADC    100000B
          STDL   T2
          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
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          SET THE LOCKWORD
          LDN    0
          UJK    LOCKX       EXIT, A REGISTER = 0
          EJECT
** NAME-- CLRLOCK
*
** PURPOSE-- CLEARS UNIT LOCK IN UNIT INTERFACE TABLE.
*
          SPACE  6
 CLRLX    LJM    **
 CLRLOCK  EQU    *-1
          LDDL   SSUN        UX FOR THIS SS IMAGE
          SBDL   UX          UNIT INDEX
          NJK    CLRLX       IF NOT THIS UNITS SS TABLE
          RJM    SAVSS       WRITE SS ENTRY TO COMMUNICATION BUFFER
                               IN UNIT INTERFACE TABLE
 F2       IFEQ   CLRLOCK,0
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR UNIT LOCKWORD
 F2       ENDIF
          UJK    CLRLX
          EJECT
** NAME-- CQLOCK
*
** PURPOSE-- CLEARS THE QUEUE LOCK IN THE UNIT INTERFACE TABLE.
*
          SPACE  6
 CQLX     LJM    **
 CQLOCK   EQU    *-1
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.QLOCK  OFFSET OF QUEUE LOCKWORD
          STDL   T5
          RJM    CLOCK       CLEAR THE LOCKWORD
          UJK    CQLX
          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
          NJN    CLK20       IF THIS PP WAS FIRST TO WRITE
                             THE INTERMEDIATE VALUE
          AODL   LFF00
          UJK    CLK10       REPEAT THE RDSL INSTRUCTION

 CLK20    BSS
          LDDL   T4          CHECK PP NUMBER
          SBDL   PPNO
          ZJN    CLK30       IF THIS PP HAS THE LOCK SET

* RESTORE THE ORIGINAL CONTENTS.

          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          RESTORE THE ORIGINAL CONTENTS
          LDN    1
          UJK    CLKX        EXIT, A REGISTER NONZERO

* CLEAR THE LOCKWORD.

 CLK30    BSS
          LDN    0
          STDL   T1
          STDL   T2
          STDL   T3
          STDL   T4
          LDDL   T6          CM ADDRESS OF UNIT LOCK.
          LMC    400000B
          CWDL   T1          CLEAR THE LOCKWORD
          LDN    0
          UJK    CLKX        EXIT, A REGISTER = 0
          EJECT
** NAME-- CKCHAN
*
** PURPOSE-- CHECK IF MAINTENANCE PP WANTS THE CHANNEL.
          SPACE  6
 CKCX     LJM    **
 CKCHAN   EQU    *-1
          LDK    C.CHCNT     NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP THE CHANNEL
          STDL   CHLCNT
          LDDL   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    CKC1
          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        RMA ADDRESS ERROR
*         (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   PAT,1
 PATX     LJM    **
 PATCH    EQU    *-1
          LDN    1
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.RSBUF
          CRML   PCM,WC
          LDML   PCM
          ADML   PCM+1
          ZJN    PATX
          LOADF  PCM
          CRDL   P1
          LDN    0
          STDL   P5
          LJM    PAT29

 PAT20    LDML   P1,P5
          ADC    -177777B    END OF PATCHES
          NJN    PAT28
          LDN    0
          STML   PCM
          STML   PCM+1
          LDN    1
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.RSBUF
          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+1
          SHN    -16
          RAML   PCM
          LOADF  PCM
          CRDL   P1
          LDN    0
          STDL   P5
          UJK    PBUX

 PCM      BSSZ   4
 PAD      EQU    P6          PP ADDRESS TO PATCH
          ENDIF
          EJECT
* DEBUG TEST.
          SPACE  6
 Q11      IFEQ   ERRTST,1
 TESTX    LJM    **
 TEST     EQU    *-1
 Q111     IFEQ   ATST,1
          LDN    6
          STDL   T1
 TEST3    BSS
          LDML   AUTOT
          SBML   TESTA-1,T1
          ZJN    TEST5
          SODL   T1
          NJK    TEST3
          UJK    TESTX

 TEST5    BSS
          AOML   AUTOT       TO PREVENT THE SAME FORCE ERROR CODE TO BE
                             ISSUED ON THE NEXT CALL
          LDML   TESTP-1,T1
          STML   TESTPAR

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

          LDML   TESTPAR
          SBN    29
          MJK    TESTX
          SBN    34-29+1
          PJK    TESTX       IF NOT FORCE ERROR FUNCTION
          LDN    F.ADPT     FORCE ERROR
          RJM    FUNC
          ACN    DC
          LDML   TESTPAR     PARAMETER
          OAN    DC
          FJM    *,DC
          LDI    P5          TIME DELAY
          DCN    40B+DC
          UJK    TESTX
          SPACE  6
 TESTPAR  BSSZ   1           TEST PARAMETER

 Q112     IFEQ   ATST,1
 TESTA    CON    11000
          CON    11200
          CON    11400
          CON    11600
          CON    11800
          CON    12000
 TESTP    CON    31
          CON    32
          CON    33
          CON    34
          CON    29
          CON    30
          QUAL   *
 AUTOT    BSSZ   1           NUMBER OF SEEKS ISSUED
          QUAL   RES
 Q112     ENDIF

 Q11      ENDIF
          EJECT
 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE
          EJECT
          QUAL   *

 BUFF     EQU    7777B-SBYTE8  SECTOR DATA BUFFER
 CBUF     EQU    BUFF        START OF CM DATA IN SECTOR BUFFER
          SPACE  6
          SPACE  4
* PPRQ    BSSZ   1           PP REQUEST FLAG
          IFEQ   SMALL,1
 SMALL    BSSZ   1           NONZERO IF SMALL SECTOR TRANSFER
          ENDIF
 SAVE     BSSZ   1           USED TO SAVE UX VALUE
 SC2      BSSZ   1           TIMEOUT OF 2 SECONDS
 SC60     BSSZ   1           TIMEOUT OF 60 SECONDS
 SC185    BSSZ   1           TIMEOUT OF 185 SECONDS
 PIDLE    BSSZ   1           PRE-IDLE FLAG.  WHEN SET, DON'T ISSUE ANY
                             SEEKS.  BUT FINISH OUTSTANDING COMMANDS.
 SAVUX    BSSZ   1
 IADL     BSSZ   1           NONZERO IF LOADING THE ADAPTER DURING INITIALIZATION
 CKDATA   BSSZ   1           CONFIDENCE TEST COMPARE DATA FLAG
 IGNORE   BSSZ   1           NONZERO, IF ERRORS ARE TO BE IGNORED
 DEBUG2   BSSZ   1           USED FOR DEBUG PURPOSES
 RSP      BSSZ   1           IF SET, PROCESSING RESPONSE FLAG
          SPACE  6
 CMNUM    EQU    8           MAXIMUM NUMBER OF CONTROL MODULES
 LDTIM    BSSZ   CMNUM*2     CONTROL MODULE TIMEOUT TABLE
*                            (TWO CELLS/CONTROL MODULE)
 CMLOAD   BSSZ   CMNUM       CONTROL MODULE LOAD TABLE
                             CONTROL MODULE NUMBER INDEXES INTO THIS TABLE.
                             BIT 11 = 1 IF LOADING THIS CONTROL MODULE.
                             BITS 5 - 0 = INDEX TO UNITS TABLE.
 UNUM     EQU    8           SUPPORT 8 UNITS
 UNITS    BSSZ   UNUM*P.UN   RMA OF UNIT QUEUE TABLE
 SS       BSSZ   P.SS        INFORMATION SAVED IN UNIT COMMUNICATION BUFFER
 RQ       EQU    SS+/SS/P.RQ  REQUEST
 CM       EQU    RQ+/RQ/P.CMND  CURRENT COMMAND
 CMLIST   EQU    SS+/SS/P.CMLIST  INDIRECT RMA LIST
 RS       EQU    SS+/SS/P.RS  RESPONSE BUFFER
          BSSZ   3           MUST FOLLOW RS, FOR ZEROING OUT RS
          SPACE  6
 FBUF     BSSZ   16          FUNCTION HISTORY BUFFER
 FBUFL    EQU    *-FBUF      LENGTH OF FUNCTION BUFFER
 SBUF     BSSZ   16          STATUS HISTORY BUFFER
 SBUFL    EQU    *-SBUF      LENGTH OF STATUS BUFFER

 CTBUF    BSSZ   8           BUFFER FOR LOADING CONTROLWARE
 NRQ      BSSZ   C.RQ*4      NEXT REQUEST ON QUEUE
          SPACE  6
 R        ERRPL  *-OVAD1     IF > 0, RESIDENT PORTION IS TOO LARGE
          EJECT
 ADPTERR  EQU    /RES/ADPTERR
 RECS     EQU    /RES/RECS
 ATERM    EQU    /RES/ATERM
 HTERM    EQU    /RES/HTERM
 UTERM    EQU    /RES/UTERM
 OTERM    EQU    /RES/OTERM
 OCTERM   EQU    /RES/OCTERM
 LTERM    EQU    /RES/LTERM
 ACN      EQU    /RES/ACN
 INC      EQU    /RES/INC
 IAMBF    EQU    /RES/IAMBF
 OAMBF    EQU    /RES/OAMBF
 OAMP1    EQU    /RES/OAMP1
 CFM      EQU    /RES/CFM
 EJM      EQU    /RES/EJM
 OAMCT    EQU    /RES/OAMCT
 DCN      EQU    /RES/DCN
 DCN2     EQU    /RES/DCN2
 MAINA    EQU    /RES/MAINA
 MAINC    EQU    /RES/MAINC
 MAINB    EQU    /RES/MAINB
 MAIND    EQU    /RES/MAIND
 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
 SNDRSP   EQU    /RES/SNDRSP
 FUNC     EQU    /RES/FUNC
 CMND     EQU    /RES/CMND
 POLSTAT  EQU    /RES/POLSTAT
 FORMA    EQU    /RES/FORMA
 PAUS     EQU    /RES/PAUS
 DELRQ    EQU    /RES/DELRQ
 SELRQ    EQU    /RES/SELRQ
 UCMDPR   EQU    /RES/UCMDPR
 CONCH    EQU    /RES/CONCH
 TERM     EQU    /RES/TERM
 TERMA    EQU    /RES/TERMA
 TERMC    EQU    /RES/TERMC
          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

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


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

          LOADC  CM.PIT      ADDRESS OF PP INTERFACE TABLE
          ADN    /PIT/C.CBUF  OFFSET OF PP COMMUNICATION BUFFER ADDRESS
          CRDL   P1          READ ADDRESS OF PP COMMUNICATION BUFFER
          REFAD  P3,CM.CB    REFORMAT CM ADDRESS OF PP 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   VALID,1
          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
          STDL   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   VALID,1
          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

* GO TO MAIN LOOP.

          LJM    MAINA
          EJECT
 SAVAX    LJM    **
 SAVAD    EQU    *-1
          STML   2,T2
          LDDL   CMADR
          STI    T2
          LDDL   CMADR+1
          STML   1,T2
          UJK    SAVAX
          EJECT
* CHECK FOR VALID PP RESPONSE BUFFER.
          SPACE  6
 D1       IFEQ   VALID,1
 CHKRX    LJM    **
 CHKRS    EQU    *-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       ENDIF
          EJECT
* CHECK FOR VALID PP-INTERFACE-TABLE.
          SPACE  6
 D2       IFEQ   VALID,1
 CHKPX    LJM    **
 CHKPIT   EQU    *-1
          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    INTERR2     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
 D2       ENDIF
          EJECT
* INTERFACE ERROR.
          SPACE  6
 INTERR2  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        HALT THE PP
*         (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
*         LDN    0
*         STML   PPRQ        ZERO OUT PP REQUEST FLAG
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
 R2       ERRPL  *-7761B
          EJECT
          QUAL   *


 PRGNAM   MICRO  1,4,*ISDD*

 OVAD1    EQU    BUFF-206B*4
          EJECT
          OVERLAY (READ WRITE),OVAD1
          ROUTINE READO
          CON    READOO

          QUAL   RD
          EJECT
** NAME-- READ.
*
** PURPOSE-- PROCESS READ DATA COMMAND.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST  = LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                    CM DATA AREA.
          SPACE  6
 READX    LJM    **
          QUAL   *
 READ     EQU    *-1
          QUAL   RD
          LDML   SS+/SS/P.TOTAL  TOTAL SECTORS LEFT TO TRANSFER
          NJN    READ10      IF MORE DATA TO TRANSFER
          RJM    TERMA       PROBABLY ADAPTER ERROR
*         (NO RETURN FROM TERMA.)

 READ10   BSS
          RJM    RDWT        SET UP FOR READ / WRITE
 READ20   BSS
          LDML   CMLIST+/CM/P.LEN  NUMBER OF BYTES LEFT TO TRANSFER
          SHN    -3
          STDL   WDS         CM WORDS LEFT TO TRANSFER
          ZJK    READ125     IF NO WORDS TO TRANSFER TO THIS ADDRESS
          IFNE   SMALL,1
          ADC    -CMWDS      CM WORDS PER SECTOR
          ELSE
          SBML   CMWDS,SZ    CM WORDS PER SECTOR
          ENDIF
          ADDL   SECPOS      WORDS PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    READ30      IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          IFNE   SMALL,1
          LDC    CMWDS       COMPUTE NUMBER OF CM WORDS TO TRANSFER THIS LOOP
          ELSE
          LDML   CMWDS,SZ    COMPUTE NUMBER OF CM WORDS TO TRANSFER THIS LOOP
          ENDIF
          SBDL   SECPOS
          PJN    READ24
          LDDL   WDS
          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
 READ30   BSS
          LDDL   SECPOS
          NJK    READ90      IF MORE WORDS TO TRANSFER FROM LAST SECTOR

* DETERMINE IF THE ENDING STATUS SHOULD BE TAKEN.
* IN OTHER WORDS, DETERMINE IF THIS IS THE LAST SECTOR BEFORE
* SUSPENDING OR TERMINATING.

          LDN    0
          STDL   P1          P1 = 0 IF NOT LAST SECTOR
          SOML   SS+/SS/P.MAUS  DECREMENT MAU COUNT FOR THIS REQUEST
          LDDL   MOVFC       CHECK IF SUSPEND
          SBN    F.MOVD
          NJN    READ35      IF NOT SUSPEND
          LDN    1
          STDL   T1
          LDDL   FRSTSC
          ZJN    READ32      IF FIRST SECTOR
          AODL   T1
 READ32   BSS
          LDDL   TWDS        SECTORS LEFT TO TRANSFER
          SBDL   T1
          NJN    READ40      IF NOT SUSPEND OR TERMINATE
          UJN    READ37      LAST SECTOR

 READ35   BSS
          LDML   SS+/SS/P.MAUS  MAU COUNT
          NJN    READ40      IF MORE DATA
          LDN    1           RE-READ REQUEST
          RJM    CKSTR       CHECK STREAM FLAG
          NJN    READ40      IF NOT END OF DATA
 READ37   BSS
          AODL   P1          LAST SECTOR

* READ FROM DISK.

 READ40   BSS
          LDDL   MOVFC       SEND MOVE DATA FUNCTION
          RJM    FUNC
          RJM    IAMBF       ACN    DC
                             LDC    SECWDS      NUMBER OF CHANNEL WORDS
                             IAM   BUFF,DC
          ZJN    READ50      IF TRANSFER WAS COMPLETE
          STDL   AREG        SAVE A REGISTER IN CASE OF PREMATURE TERMINATION
          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT      IF POLL STATUS = 640XX B, THEN
                             IT WAS A MEDIA ERROR, REPEAT MOVE DATA
          ADC    -64000B
          SBML   UNITS+/UN/P.UNIT,UX
          NJN    READ45      IF NOT MEDIA ERROR
          LDK    /RS/K.MEDIA  MEDIA ERROR
          RJM    SERRID      SAVE ERROR ID
          UJK    READ40      REPEAT MOVE DATA

 READ45   BSS
          LDDL   AREG
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT RECEIVED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
          UJN    READ75

 READ50   BSS
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
*         (NO RETURN IF ERROR).

          LDDL   P1
          ZJN    READ85      IF NOT SUSPEND OR TERMINATE

* SUSPEND OR TERMINATE.
* THIS STATUS MUST BE ISSUED IMMEDIATELY, (WITHIN 50 MICROSECONDS),
* AFTER THE READ FUNCTION.
* THE TIMING PERIOD STARTS AFTER THE  IAM  FROM INPUTING THE DATA AND
* ENDS AFTER THE  FAN  OF SENDING THE POLL STATUS FUNCTION.

          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT
          ADC    -4000B
          SBML   UNITS+/UN/P.UNIT,UX
          ZJN    READ85      IF NO ERROR ON LAST SECTOR
          LDK    /RS/K.RERR  STATUS BEFORE SUSPEND / TERMINATE READ .NE.
                             4XXXB.
 READ75   BSS
          RJM    SERRID      SAVE ERROR FLAG
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)

 READ85   BSS
          AODL   FRSTSC
          SBN    1
          ZJN    READ90      IF FIRST SECTOR TRANSFERRED FOR THIS
                             READ SEQUENCE

* PREVIOUS SECTOR HAS BEEN TRANSFERRED WITHOUT ERROR.
* UPDATE COUNTERS AND POINTERS.

          RJM    RDWTOK      UPDATE COUNTERS FOR GOOD READ TRANSFER

* TRANSFER DATA TO CM.

 READ90   BSS
          LDDL   SECPOS      CALCULATE SECTOR BUFFER TRANSFER ADDRESS
          SHN    2
          ADC    CBUF
          STML   READ100
          LDDL   WDS
          ZJN    READ110     IF 0 WORDS TO TRANSFER
          LOADF  CMLIST+/CM/P.RMA  CM ADDRESS OF DATA AREA
          CWML   CBUF,WDS    SEND DATA TO CM
 READ100  EQU    *-1
          LDDL   SECPOS
          NJN    READ110     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.

 READ110  BSS
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          IFNE   SMALL,1
          ADC    -CMWDS      CHECK FOR END OF SECTOR
          ELSE
          SBML   CMWDS,SZ    CHECK FOR END OF SECTOR
          ENDIF
          NJN    READ120
          STDL   SECPOS      RESET SECTOR POSITION = 0
 READ120  BSS
          LDDL   SECPOS
          NJN    READ122     IF SOME DATA IS LEFT IN THE BUFFER,
                             DONT LET AN OVERLAY BE READ
          RJM    /RES/RECRS  CHECK IF A PREVIOUS ERROR WAS RECOVERED
 READ122  BSS
          LDDL   WDS         CM WORDS TRANSFERRED
          SHN    3
          STDL   T1          BYTES TRANSFERRED
          RADL   WDSS        SAVE BYTES TRANSFERRED THIS SECTOR
          LDDL   T1
          RAML   CMLIST+/CM/P.RMA+1  UPDATE CM ADDRESS
          SHN    -16
          RAML   CMLIST+/CM/P.RMA
          LDML   CMLIST+/CM/P.LEN  UPDATE BYTES LEFT TO TRANSFER
          SBDL   T1
          STML   CMLIST+/CM/P.LEN
          NJN    READ150     IF MORE WORDS TO TRANSFER TO THIS CM ADDRESS
 READ125  BSS
          SOML   SS+/SS/P.LISTL  DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    READ130     IF END OF RMA LIST
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
          UJN    READ150

* GET NEXT COMMAND.

 READ130  BSS
          LDN    0
          STDL   SECPOS      THROW AWAY ANY PARTIAL SECTOR
          RJM    UNCMND      GET NEXT COMMAND
          NJN    READ150     IF MORE COMMANDS
          LDDL   CSTREAM
          NJN    READ160     CHECK IF MORE REQUESTS TO STREAM

* CHECK IF SWITCH TO NEXT REQUEST.

          LDML   SS+/SS/P.TOTAL  TOTAL SECTORS LEFT TO TRANSFER
          SBN    1
          ZJN    READ150     IF END OF TRANSFER
          RJM    CSWIT       CHECK IF SWITCH TO NEXT REQUEST
          NJN    READ150     IF SWITCH TO NEXT REQUEST
          LDN    0           PARTIAL SECTOR WAS TRANSFERRED
                             AND NO MORE DATA
          STML   SS+/SS/P.TOTAL
          UJN    READ160

* CHECK IF TIME TO SUSPEND OR TERMINATE.

 READ150  BSS
          LDDL   CSTREAM
          NJN    READ156     IF MORE TO TRANSFER
          LDDL   TWDS
          SBN    1
          ADDL   SECPOS      MAKE SURE FULL SECTOR IS TRANSFERRED
 READ156  BSS
          NJK    READ20      IF MORE TO TRANSFER

* IF NOT SUSPENDING THE TRANSFER, REREAD THE STREAM FLAG.

 READ160  BSS
          LDN    2           DON'T RE-READ REQUEST
          RJM    CKSTR       CHECK STREAM FLAG
          NJK    READ156     IF MORE TO TRANSFER

* SUSPEND OR TERMINATE.

          RJM    RDWTOK      UPDATE COUNTERS FOR GOOD READ TRANSFER

* CHECK IF END OF REQUEST.

          LDML   SS+/SS/P.TOTAL
          NJN    READ170     IF MORE WORDS TO TRANSFER
          RJM    TERMC       TERMINATE REQUEST
*         (NO RETURN FROM TERMC.)

 READ170  BSS
          LDDL   SECPOS
          ZJK    READX
          RJM    HALT        SHOULD NEVER HAPPEN
*         (NO RETURN FROM HALT.)
          EJECT
** NAME-- WRITE
*
** PURPOSE-- PROCESS THE WRITE DATA COMMAND.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST = LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                   CM DATA AREA.
          SPACE  6
 WRIX     LJM    **
          QUAL   *
 WRITE    EQU    *-1
          QUAL   RD
          LDML   SS+/SS/P.TOTAL  TOTAL SECTORS LEFT TO TRANSFER
          NJN    WRI10       IF MORE DATA TO TRANSFER
          RJM    TERMA       PROBABLY ADAPTER ERROR
*         (NO RETURN FROM TERMA.)

 WRI10    BSS
          RJM    RDWT        SET UP FOR WRITE
 WRI20    BSS
          LDML   CMLIST+/CM/P.LEN  NUMBER OF BYTES LEFT TO TRANSFER
          SHN    -3
          STDL   WDS         CM WORDS LEFT TO TRANSFER
          IFNE   SMALL,1
          ADC    -CMWDS      CM WORDS PER SECTOR
          ELSE
          SBML   CMWDS,SZ    CM WORDS PER SECTOR
          ENDIF
          ADDL   SECPOS      WORDS PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    WRI30       IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          IFNE   SMALL,1
          LDC    CMWDS       COMPUTE NUMBER OF CM WORDS TO TRANSFER THIS LOOP
          ELSE
          LDML   CMWDS,SZ    COMPUTE NUMBER OF CM WORDS TO TRANSFER THIS LOOP
          ENDIF
          SBDL   SECPOS
          PJN    WRI24
          LDDL   WDS
          ZJN    WRI24       IF VALID SECTOR POSITION
          RJM    HALT        INVALID SECTOR POSITION
*         (NO RETURN FROM HALT.)

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

* TRANSFER DATA FROM CM.

 WRI30    BSS
          LDDL   SECPOS      CALCULATE SECTOR BUFFER TRANSFER ADDRESS
          SHN    2
          ADC    CBUF
          STML   WRI35
          LDDL   WDS
          ZJN    WRI40       IF 0 WORDS TO TRANSFER
          LOADF  CMLIST+/CM/P.RMA  CM ADDRESS OF DATA AREA
          CRML   CBUF,WDS    READ SECTOR FROM CM
 WRI35    EQU    *-1

* UPDATE SECTOR POSITION.

 WRI40    BSS
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          IFNE   SMALL,1
          ADC    -CMWDS      CHECK FOR END OF SECTOR
          ELSE
          SBML   CMWDS,SZ    CHECK FOR END OF SECTOR
          ENDIF
          NJN    WRI50       IF NOT END OF SECTOR
          STDL   SECPOS      RESET SECTOR POSITION = 0
 WRI50    BSS
          LDDL   SECPOS
          ZJN    WRI60       IF FULL SECTOR HAS BEEN TRANSFERRED FROM CM
          LDML   SS+/SS/P.LISTL  CHECK IF MORE CM ADDRESS-LENGTH-PAIRS
          SBN    1
          NJN    WRI120      IF MORE CM DATA TO TRANSFER
          LDN    0
          STDL   SECPOS      RESET SECTOR POSITION = 0

* TRANSFER DATA TO DISK.

 WRI60    BSS
          LDDL   MOVFC       SEND MOVE DATA FUNCTION
          RJM    FUNC
          RJM    ACN         ACN    DC
          IFNE   SMALL,1
          LDC    SECWDS      NUMBER OF WORDS IN SECTOR
          ELSE
          LDML   SECWDS,SZ   NUMBER OF WORDS IN SECTOR
          ENDIF
          RJM    OAMBF       OAM    BUFF,DC
          RJM    DCN         DISCONNECT CHANNEL
*         (NO RETURN IF ERROR).

          AODL   FRSTSC
          SBN    1
          ZJN    WRI120      IF FIRST SECTOR TRANSFERRED FOR
                             THIS WRITE SEQUENCE

* PREVIOUS SECTOR HAS BEEN TRANSFERRED WITHOUT ERROR.
* UPDATE COUNTERS AND POINTERS.

          RJM    RDWTOK      UPDATE COUNTERS FOR GOOD TRANSFER
 WRI120   BSS
          LDDL   WDS         CM WORDS TRANSFERRED
          SHN    3
          STDL   T1          BYTES TRANSFERRED
          RADL   WDSS        SAVE BYTES TRANSFERRED THIS SECTOR
          LDDL   T1
          RAML   CMLIST+/CM/P.RMA+1  UPDATE CM ADDRESS
          SHN    -16
          RAML   CMLIST+/CM/P.RMA
          LDML   CMLIST+/CM/P.LEN  UPDATE BYTES LEFT TO TRANSFER
          SBDL   T1
          STML   CMLIST+/CM/P.LEN
          NJN    WRI125      IF MORE WORDS LEFT TO TRANSFER TO THIS
                             CM ADDRESS
          SOML   SS+/SS/P.LISTL  DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    WRI130      IF END OF RMA LIST
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
 WRI125   BSS
          LDDL   SECPOS      CHECK IF PARTIAL SECTOR OF DATA
          NJK    WRI20       IF PARTIAL SECTOR OF DATA
          UJN    WRI150

* GET NEXT COMMAND.

 WRI130   BSS
          RJM    UNCMND      GET NEXT COMMAND
          NJN    WRI150      IF MORE COMMANDS
          LDDL   CSTREAM
          NJN    WRI160      CHECK IF MORE REQUESTS TO STREAM

* CHECK IF SWITCH TO NEXT REQUEST.

          LDML   SS+/SS/P.TOTAL  TOTAL SECTORS LEFT TO TRANSFER
          SBN    1
          ZJN    WRI150      IF END OF TRANSFER
          MJN    *
          RJM    CSWIT       CHECK IF SWITCH TO NEXT SECTOR
          NJN    WRI150      IF SWITCH TO NEXT REQUEST
          LDN    0           PARTIAL SECTOR WAS TRANSFERRED
                             AND NO MORE DATA
          STML   SS+/SS/P.TOTAL
          UJN    WRI160

* CHECK IF TIME TO SUSPEND OR TERMINATE.

 WRI150   BSS
          LDDL   CSTREAM
          NJN    WRI156
          LDDL   TWDS
          SBN    1
 WRI156   BSS
          NJK    WRI20       IF MORE TO TRANSFER

* IF NOT SUSPENDING THE TRANSFER, REREAD THE STREAM FLAG.

 WRI160   BSS
          LDN    0
          RJM    CKSTR       CHECK STREAM FLAG
          NJK    WRI156      IF MORE TO TRANSFER

* SUSPEND OR TERMINATE.

          RJM    RDWTOK      UPDATE COUNTERS FOR GOOD TRANSFER
          LDDL   SECPOS
          ZJK    WRIX
          RJM    HALT        SHOULD NEVER HAPPEN
*         (NO RETURN FROM HALT.)
          EJECT
** NAME-- RDWT
*
** PURPOSE-- SET UP FOR READ OR WRITE.
          SPACE  6
 RDWX     LJM    **
 RDWT     EQU    *-1
          LDN    0
          STDL   WDSS        BYTES TRANSFERRED IN SECTOR
          STDL   FRSTSC      FIRST SECTOR FLAG
          STDL   SECPOS      SET SECTOR POSITION = 0
          STDL   CSTREAM     CLEAR CONTINUE STREAMING FLAG
          LDML   SS+/SS/P.DV  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPK    /SS/M.DV
          STDL   DEVICE      DEVICE TYPE
          IFEQ   SMALL,1
          LDML   SS+/SS/P.SMALL  GET SMALL / LARGE SECTOR FLAG
          SHN    /SS/L.SMALL+/SS/N.SMALL+2
          ADN    1
          LPN    1
          STDL   SZ          = 1 IF LARGE SECTOR (1024 16-BIT WORDS),
                             = 0 IF SMALL SECTOR TRANSFER (256 16-BIT WORDS)
          ENDIF

* DON'T SUSPEND IF IN ERROR RECOVERY.
* THE REASON IS BECAUSE THE ADAPTER DOES NOT RECOVER A READ CHECKWORD
* ERROR IF IT IS THE LAST SECTOR BEFORE SUSPENDING.  AFTER RE-READING THE
* SECTOR, THE ADAPTER RETURNS A 5000(8) POLL STATUS WITH DETAILED STATUS
* WORD 3, BIT 0 SET, MEANING THAT THE DRIVER TOOK MORE THAN 50
* MICROSECONDS TO ISSUE THE POLL STATUS.

          LDML   SS+/SS/P.RECOV  DON'T SUSPEND IF IN ERROR RECOVERY
          NJN    RDW5        IF IN ERROR RECOVERY

          LDML   XFERSZ,DEVICE  SECTORS TO TRANSFER BEFORE SUSPENDING
          STDL   TWDS
          SBML   SS+/SS/P.TOTAL  TOTAL SECTORS LEFT TO TRANSFER
          MJN    RDW10       IF SUSPEND
 RDW5     BSS
          LDML   SS+/SS/P.TOTAL  TRANSFER REMAINING SECTORS AND
                             TERMINATE TRANSFER
          STDL   TWDS
          LDN    F.MOVDT     MOVE DATA FUNCTION (TERMINATE)
          UJN    RDW20

 RDW10    BSS
          LDN    F.MOVD      MOVE DATA FUNCTION (SUSPEND)
 RDW20    BSS
          STDL   MOVFC       FUNCTION CODE
          UJK    RDWX
          EJECT
** NAME-- RDWTOK
*
** PURPOSE-- UPDATE READ AND WRITE COUNTERS.
          SPACE  6
 RDWTX    LJM    **
 RDWTOK   EQU    *-1
          LDML   SS+/SS/P.TOTAL
          ZJN    RDWT5       IF STREAMING REQUESTS
          SOML   SS+/SS/P.TOTAL  DECREMENT SECTORS LEFT TO TRANSFER
 RDWT5    BSS
          LDDL   TWDS
          ZJN    RDWT7       IF STREAMING REQUESTS
          SODL   TWDS        DECREMENT SECTORS LEFT BEFORE SUSPENDING
                             OR TERMINATING
 RDWT7    BSS
          IFNE   SMALL,1
          LDN    SECSC       SECTOR INCREMENT
          ELSE
          LDML   SECSC,SZ    SECTOR INCREMENT
          ENDIF
          RAML   SS+/SS/P.CURSEC  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS PER TRACK
          MJN    RDWT10      IF NOT END OF TRACK
          STML   SS+/SS/P.CURSEC  CURRENT SECTOR
          AOML   SS+/SS/P.CURTRK  INCREMENT TRACK ADDRESS
 RDWT10   BSS
          LDDL   WDSS
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
          SHN    -16
          RAML   RS+/RS/P.XFER
          LDN    0
          STDL   WDSS

* CHECK FOR STREAMING REQUEST.

          LDML   SS+/SS/P.SWFLG  WAS THIS THE FIRST SECTOR AFTER A
                             REQUEST SWITCH
          ZJK    RDWTX       IF NOT THE FIRST SECTOR AFTER A REQUEST SWITCH
          LDN    0
          STML   SS+/SS/P.SWFLG  CLEAR SWITCH FLAG
          RJM    SNDRSP      SEND RESPONSE TO CM
          LDML   SS+/SS/P.CURRQ  SAVE RMA OF PREVIOUS REQUEST
          STML   SS+/SS/P.PRERQ
          LDML   SS+/SS/P.CURRQ+1
          STML   SS+/SS/P.PRERQ+1
          LDML   SS+/SS/P.REQ  SAVE RMA OF CURRENT REQUEST
          STML   SS+/SS/P.CURRQ
          LDML   SS+/SS/P.REQ+1
          STML   SS+/SS/P.CURRQ+1
          UJK    RDWTX
          EJECT
** NAME-- CKSTR
*
** PURPOSE-- RE-READ THE REQUEST AND CHECK THE STREAM FLAG.
*
** ENTRY--A REGISTER = 0, TO RE-READ THE REQUEST AND CALL CSWIT.
*                    = 1, TO RE-READ THE REQUEST AND CHECK THE
*                         SWITCH FLAG, BUT NOT CALL CSWIT.
*                    = 2, DO NOT RE-READ THE REQUEST, BUT CALL
*                         CSWIT.
*
** EXIT-- A REGISTER = 0, IF NO MORE DATA.
*         A REGISTER NONZERO, IF MORE DATA TO TRANSFER.
          SPACE  6
 CKSTRX   LJM    **
 CKSTR    EQU    *-1
          STDL   T1          SAVE PARAMETER
          LDDL   MOVFC       CHECK IF SUSPEND
          SBN    F.MOVD
          ZJN    CKSTRX      IF SUSPEND
          LDML   SS+/SS/P.RECOV  DON'T STREAM IF IN ERROR RECOVERY
          ZJN    CKSTR10     IF NOT IN ERROR RECOVERY
          LDN    0           EXIT A REGISTER = 0
          UJK    CKSTRX

 CKSTR10  BSS
          LDDL   T1          GET PARAMETER
          SBN    2
          ZJN    CKSTR20     IF NOT TO RE-READ REQUEST
          LDN    2           RE-READ REQUEST
          STDL   WC
          LOADS  SS+/SS/P.REQ2  ADDRESS OF REQUEST
          ADN    2
          CRML   RQ+2*4,WC
          SBN    4
          CRML   RQ,WC
          LDDL   T1          GET PARAMETER
          SBN    1
          NJN    CKSTR20     IF CSWIT IS TO BE CALLED
          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
          UJN    CKSTR30

 CKSTR20  BSS
          AODL   CSTREAM     SET CONTINUE STREAMING FLAG
          RJM    CSWIT       CHECK IF SWITCH TO NEXT REQUEST
 CKSTR30  UJK    CKSTRX      EXIT, A REGISTER NONZERO IF SWITCH
                             FLAG IS SET
          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
          LDML   SS+/SS/P.NUMCM  CHECK IF MORE COMMANDS TO PROCESS
 S1       IFEQ   STREAM,1
          ZJN    CSW6        IF END OF COMMANDS
 S1       ENDIF
          LDN    0           EXIT A REGISTER = 0
          UJK    CSWX

 CSW6     BSS
          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
          STML   SS+/SS/P.SWFLG  SAVE SWITCH FLAG
          ZJK    CSWX        IF SWITCH FLAG IS NOT SET

* GET NEXT REQUEST.
* PREPARE SS ENTRY.

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

 CSW10    BSS
          LDML   SS+/SS/P.CURSEC  CURRENT SECTOR - 1
          IFNE   SMALL,1
          ADN    SECSC       ADD SECTOR INCREMENT
          ELSE
          ADML   SECSC,SZ    ADD SECTOR INCREMENT
          ENDIF
          SBML   RQ+/RQ/P.SECTOR  SECTOR OF NEXT REQUEST
          ZJN    CSW20       IF OK
          SBML   DVSEC,DEVICE  NUMBER OF SECTORS PER TRACK
          ZJN    CSW15       IF VALID SECTOR ADDRESS
          RJM    HALT        INVALID SECTOR ADDRESS
*         (NO RETURN FROM HALT.)

 CSW15    BSS
          LDN    1           ADD 1 TO TRACK ADDRESS
 CSW20    BSS
          ADML   SS+/SS/P.CURTRK  CURRENT TRACK
          SBML   RQ+/RQ/P.TRACK  TRACK ADDRESS OF NEXT REQUEST
          ZJN    CSW25       IF VALID TRACK ADDRESS
          RJM    HALT        INVALID TRACK ADDRESS
*         (NO RETURN FROM HALT.)

 CSW25    BSS
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          LDML   SS+/SS/P.FNC
          ZJN    CSW30       IF READ, SEND RESPONSE OF COMPLETED REQUEST

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

          LDN    0
          STML   SS+/SS/P.SWFLG  CLEAR SWITCH FLAG
          AOML   SS+/SS/P.NCOMW  INCREMENT NUMBER OF COMPLETED WRITE REQUESTS
 CSW30    BSS
          LDN    1           EXIT A REGISTER NONZERO
          UJK    CSWX
          EJECT
          ERRPL  *-BUFF
          QUAL   *

          OVERLAY (RECOVER ERRORS),BUFF
          ROUTINE RECSO
          QUAL   RC
          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
 SCLOCK   CON    0
          LDML   SCLOCK
          STML   /RES/SCLX+1


          QUAL   *
 SCL10    BSS
          QUAL   RC
          LDDL   CHLOCK
          ZJN    SCL20       IF CHANNEL LOCK IS NOT SET
 SCL14    BSS
          LDN    0           EXIT A REGISTER = 0
          UJK    /RES/SCLX

 SCL20    BSS
          LDDL   UNUML
          ZJK    SCL14       IF NO UNITS
          LDK    C.CHCNT
          STDL   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP CHANNEL
          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
          AODL   CHLOCK      SET FLAG IF LOCK WAS SET
          UJK    SCL14       EXIT, 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

          QUAL   *
 ADPTR    BSS                CONTINUATION OF ADPTERR ROUTINE
          QUAL   RC

          LDML   SS+/SS/P.ADERR
          ADML   SS+/SS/P.PRELD  PRELOAD OF CONTROL MODULE
          NJN    ADPT5       IF PREVIOUS ADAPTER ERROR,
                             OR PRELOAD OF CONTROL MODULE,
                             CONTINUE IN RECOVERY
          LDN    0
          STML   SS+/SS/P.RECOV  START RECOVERY SEQUENCE FROM THE BEGINNING
          AOML   SS+/SS/P.ADERR  SET ADAPTER ERROR FLAG
 ADPT5    BSS

 ADPT10   BSS
          AODL   DTSTAT      MAKE SURE DETAILED STATUS IS READ
          RJM    DCN2        DISCONNECT THE CHANNEL
          RJM    CFM         CFM    **,DC   CLEAR CHANNEL ERROR (IF ANY)
          PSN
          LDML   SS+/SS/P.RECOV  INDEX TO ERROR RECOVERY PROCEDURE
          STDL   T1
          LDML   RPROC,T1    ERROR RECOVERY PROCEDURE
          STML   ADPT24
          LJM    **          EXECUTE NEXT STEP IN ERROR RECOVERY
 ADPT24   EQU    *-1
          SPACE  6
* RETRY THE REQUEST.

 ADPTA    BSS
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    POLSTAT     GET DETAILED STATUS
 ADPT30   BSS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 ADPT35   BSS
          RJM    RCMRQ       RESTART THE REQUESTS
          LJM    MAINC
          SPACE  6
* LOAD THE ADAPTER.

 ADPTB    BSS
          AOML   SS+/SS/P.LAD  INCREMENT LOAD ADAPTER RETRY COUNTER
          SBN    CNTRY+1
          MJN    ADPT40      IF LOAD ADAPTER RETRY NOT EXHAUSTED
          RJM    OTERM       TURN OFF ALL UNITS ON THE CONTROLLER
*         (NO RETURN FROM OTERM).

 ADPT40   BSS
          RJM    LDCON       LOAD THE ADAPTER

* ADAPTER HAS BEEN SUCCESSFULLY LOADED.

          LDN    0
          STML   SS+/SS/P.LAD  ZERO OUT LOAD ADAPTER RETRY COUNTER
          LDML   IADL        CHECK IF INITIAL ADAPTER LOAD
          NJK    MAINC       IF INITIAL ADAPTER LOAD
          LDN    R25
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          UJN    ADPT30      RETRY THE REQUEST
          EJECT
          QUAL   *
 RECSA    BSS                CONTINUATION OF RECS ROUTINE
          QUAL   RC
          LDML   SS+/SS/P.RECOV
          NJN    REC5        IF ALREADY IN ERROR RECOVERY
          LDN    R20         RETRY THE REQUEST
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
 REC5     BSS
          UJK    ADPT10      RETRY THE REQUEST
          SPACE  6
* EXECUTE CONTROL MODULE LEVEL II DIAGNOSTIC COMMAND 72, SUBTEST 5.

 RECA     BSS
          LDN    R40
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    POLSTAT     GET DETAILED STATUS
          RJM    RCMRQ       TERMINATE ACTIVE COMMANDS
          RJM    DIAGSUB     EXECUTE CM DIAGNOSTIC COMMAND 72, SUBTEST 5
 REC10    BSS
          LJM    MAINC
          SPACE  6
* CM DIAGNOSTIC COMMAND 72, SUBTEST 5, WAS SUCCESSFUL.

 RECB     BSS
          LDN    R30
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          UJK    ADPT30      RETRY THE REQUEST
          SPACE  6
* UNRECOVERED MEDIA ERROR.

 RECC     BSS
          LDML   RS+/RS/P.DETAIL+8
          SHN    -4          SYSTEM INTERVENTION STATUS
          ADC    -101B
          ZJN    REC20       IF MEDIA ERROR IN HEADER (READ OR WRITE)
          SBN    103B-101B
          NJN    REC30       IF NOT MEDIA ERROR ON DATA (READ)
 REC20    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

 RECI     BSS
          RJM    HTERM       UNRECOVERED ERROR
*         (NO RETURN FROM HTERM.)
          SPACE  6
 REC30    BSS
          LDN    R40         RELOAD CONTROL MODULE
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          SPACE  6
* RELOAD THE CONTROL MODULE.

 RECD     BSS
          AOML   SS+/SS/P.CMLD  INCREMENT LOAD CONTROL MODULE RETRY COUNTER
          SBN    COSTRY+1
          MJN    REC40       IF LOAD CM RETRY NOT EXHAUSTED
          RJM    OCTERM      TURN OFF ALL UNITS ON THE CONTROL MODULE
*         (NO RETURN FROM OCTERM.

 REC40    BSS
          RJM    POLSTAT     GET DETAILED STATUS
          RJM    LDCM        LOAD THE CONTROL MODULE
          LDML   SS+/SS/P.CMLD  CM LOAD RETRY COUNTER
          SBN    1
          NJN    REC45       IF NOT THE FIRST ATTEMPT
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 REC45    BSS
          UJK    REC10
          SPACE  6
* CONTROL MODULE SUCCESSFULLY LOADED.

 RECE     BSS
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
 REC50    BSS
          UJK    ADPT30      RETRY THE REQUEST
          SPACE  6
* EXECUTE CONTROL MODULE LEVEL II DIAGNOSTICS.

 RECF     BSS
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    POLSTAT     GET DETAILED STATUS
          RJM    RCMRQ       TERMINATE ACTIVE COMMANDS
          RJM    DIAG        EXECUTE CM LEVEL II DIAGNOSTICS
          UJK    REC45
          SPACE  6
* CM LEVEL II DIAGNOSTICS PASSED.

 RECG     BSS
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          UJK    REC50       RETRY THE REQUEST
          SPACE  6
* UNRECOVERED ERROR.  LEVEL II DIAGNOSTICS FAILED.

 RECH     BSS
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         (NO RETURN FROM UTERM.)
          EJECT
* SEQUENCE TO ERROR RECOVERY PROCEDURES.
          SPACE  6
 RPROC    BSS
          CON    ADPTA       RETRY THE REQUEST
 RP10     CON    ADPTB       LOAD THE ADAPTER
 RP20     CON    ADPTA       RETRY THE REQUEST
          CON    ADPTA       RETRY THE REQUEST
 RP25     CON    RECA        EXECUTE CM LEVEL II DIAGNOSTICS
 RP30     CON    RECC        UNRECOVERED MEDIA ERROR
 RP40     CON    RECD        LOAD THE CONTROL MODULE
          CON    RECF        EXECUTE LEVEL II DIAGNOSTIC COMMAND 70
          CON    RECH        UNRECOVERED ERROR, LEVEL II DIAGNOSTICS FAILED
          CON    RECI        UNRECOVERED ERROR, LEVEL II DIAGNOSTICS PASSED


 R10      EQU    RP10-RPROC
 R20      EQU    RP20-RPROC
 R25      EQU    RP25-RPROC
 R30      EQU    RP30-RPROC
 R40      EQU    RP40-RPROC
          EJECT
          QUAL   *
 NOTR     BSS                CONTINUATION OF NOTRDY ROUTINE
          QUAL   RC
          SODL   CMNDS       DECREMENT COUNT OF OUTSTANDING COMMANDS
          AOML   SS+/SS/P.NR  INCREMENT NOT READY FAILURE COUNTER
          SBN    NRTRY
          PJK    NOTR10      IF RETRY EXHAUSTED
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          LDK    R.PUP       POWER UP SPINDLE
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDML   UNITS+/UN/P.UNIT,UX  UNIT NUMBER FOR LOAD COMMAND BLOCK
          STML   SS+/SS/P.UNIT
          LDN    0
          STML   SS+/SS/P.LENGTH  PARAMETER IN LOAD COMMAND BLOCK
          RJM    CMND        ISSUE LOAD COMMAND BLOCK
          LDML   UNITS+/UN/P.BUSY,UX  SET 'UNIT BUSY' FLAG
          LPC    -/UN/K.BUSY
          ADK    /UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          LDK    /RS/K.PU    POWER UP SPINDLE
          RJM    SID         ERROR ID
          LDML   SS+/SS/P.NR
          SBN    1
          NJN    NOTR5       IF NOT FIRST ATTEMPT

* SEND AN INTERMEDIATE RESPONSE SO THAT AN MDD MESSAGE IS DISPLAYED.

          RJM    INTRS       SEND INTERMEDIATE RESPONSE
 NOTR5    BSS
          UJK    /RES/NOTRX

 NOTR10   BSS
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         NO RETURN FROM UTERM
          EJECT
** NAME-- RCMRQ
*
** PURPOSE-- RESTART ALL THE REQUESTS ON A CONTROL MODULE.
          SPACE  6
 RCMX     LJM    **
 RCMRQ    EQU    *-1
          LDDL   UNUML
          ZJK    RCMX        IF NO UNITS
          LDN    F.TERM      TERMINATE ACTIVE COMMANDS
          RJM    FUNC
          RJM    SAVSS       SAVE SS TABLE
          LDML   UNITS+/UN/P.CM,UX  GET CONTROL MODULE NUMBER
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER
          LDDL   UX          SAVE UX
          STML   SAVE
          LDN    0
          STDL   UX
          STDL   CMNDS       RECOMPUTE NUMBER OF OUTSTANDING COMMANDS
 RCM10    BSS
          LDML   UNITS+/UN/P.BUSY,UX  CHECK IF OUTSTANDING COMMAND
          SHN    /UN/L.BUSY+2
          PJN    RCM20       IF NOT AN OUTSTANDING COMMAND
          RJM    GETSS       GET SS ENTRY
          RJM    RSTRQ       RESTART REQUEST
 RCM20    BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJN    RCM10       IF NOT END OF TABLE

* ZERO OUT CONTROL MODULE LOAD TABLE.

          LDN    CMNUM       NUMBER OF ENTRIES
          STDL   T1
 RCM30    BSS
          LDN    0
          STML   CMLOAD-1,T1  ZERO OUT CONTROL MODULE LOAD TABLE
          SODL   T1
          NJN    RCM30       IF NOT END OF TABLE
 RCM40    BSS
          LDML   SAVE        RESTORE UX
          STDL   UX
          RJM    GETSS       GET SS ENTRY
          UJK    RCMX
          EJECT
** NAME-- RSTRQ
*
** PURPOSE-- INCREMENT REQUEST RETRY COUNTER.  IF RETRIES HAVE
*            NOT BEEN EXHAUSTED, RESTART THE REQUEST.
          SPACE  6
 RSTX     LJM    **
 RSTRQ    EQU    *-1
          AOML   SS+/SS/P.RQTRY  INCREMENT REQUEST RETRY COUNTER
          LDML   SS+/SS/P.CONF  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          MJK    RST40       IF DOING INITIAL CONFIDENCE TEST

* RESTART REQUEST FROM BEGINNING.

          LDML   SS+/SS/P.CURRQ  RESTORE RMA OF CURRENT REQUEST
          STML   SS+/SS/P.REQ
          LDML   SS+/SS/P.CURRQ+1
          STML   SS+/SS/P.REQ+1
          LDML   RS+/RS/P.PVA  RESTORE PVA OF CURRENT REQUEST
          STML   SS+/SS/P.PVA
          LDML   RS+/RS/P.PVA+1
          STML   SS+/SS/P.PVA+1
          LDML   RS+/RS/P.PVA+2
          STML   SS+/SS/P.PVA+2
          RJM    UREQ        READ UNIT REQUEST
          LDML   RQ+/RQ/P.CYL  RESTORE CYLINDER ADDRESS
          STML   SS+/SS/P.CYL
          LDML   RQ+/RQ/P.TRACK  RESTORE TRACK ADDRESS
          SHN    /SS/N.SECTOR
          ADML   RQ+/RQ/P.SECTOR  RESTORE SECTOR ADDRESS
          STML   SS+/SS/P.SECTOR
 RST20    BSS
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          RJM    DELCM       DELINK ANY COMPLETED REQUESTS
          RJM    CLRLOCK     CLEAR LOCK ON UNIT
          UJK    RSTX        RETURN A REGISTER = 0 TO RESTART REQUEST

* RESTART CONFIDENCE TEST.

 RST40    BSS
          LDDL   IALF        CLEAR FLAG FOR CONFIDENCE TEST STARTED
                             ON ALL CONTROLLERS
          LPC    -4
          STDL   IALF
          LDML   UNITS+/UN/P.CTST,UX  CLEAR FLAG FOR CONFIDENCE TEST STARTED
          LPC    -/UN/K.CTST
          STML   UNITS+/UN/P.CTST,UX
          UJK    RST20
          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
          LDN    0
          STML   SS+/SS/P.NCOMW  ZERO OUT NUMBER OF COMPLETED WRITE REQUESTS
          LDML   SS+/SS/P.NCOMRQ  NUMBER OF COMPLETED REQUESTS
          ZJN    DELCX       IF NO REQUESTS HAVE BEEN COMPLETED
          SOML   SS+/SS/P.NCOMRQ  DECREMENT COMPLETED REQUEST COUNT
          ZJN    DELCX      IF NOT STREAMING OF REQUESTS
          LDML   SS+/SS/P.PRERQ  SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   SS+/SS/P.CURRQ
          LDML   SS+/SS/P.PRERQ+1
          STML   SS+/SS/P.CURRQ+1
          RJM    DELRQ       DELINK COMPLETED REQUESTS FROM QUEUE
                             AND SELECT NEW REQUEST
          UJK    DELCX
          EJECT
** NAME-- HTERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR HARDWARE ERRORS.
          SPACE  6
          QUAL   *
 HTERM1   BSS
          QUAL   RC
          UJN    ATERM20
          EJECT
** NAME-- ATERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR INTERFACE ERRORS.
          SPACE  6
          QUAL   *
 ATERMA   BSS
          QUAL   RC
          LDK    /RS/K.INTERR  INTERFACE ERROR
          RJM    SERR        SAVE ERROR ID

* CHECK FOR ERRORS WHICH RESULT IN SETTING THE UNIT DOWN,
* AND THEN, SET THE UNIT DISABLE FLAG.

 ATERM20  BSS
          LDML   SS+/SS/P.NR  NOT READY FAILURE COUNTER
          SBN    3
          PJN    ATERM50     IF UNRECOVERED -NOT READY-

* CHECK IF UNIT WRITE PROTECT SWITCH ON.

          LDML   RS+/RS/P.DETAIL+9
          LPC    377B
          ADC    -302B       WRITE PROTECTED
          NJN    ATERM80     IF NOT WRITE PROTECTED
          LDML   SS+/SS/P.FNC
          ZJN    ATERM80     IF NOT A WRITE FUNCTION

* SET UNIT DISABLE BIT.

 ATERM50  BSS
          RJM    UTERM       TURN OFF UNIT
*         (NO RETURN FROM UTERM).

 ATERM80  BSS
          LDK    C.RS*8
          STML   RS+/RS/P.RESPL  RESPONSE LENGTH
          LDML   RS+/RS/P.PVA
          ADML   RS+/RS/P.PVA+1
          ADML   RS+/RS/P.PVA+2
          NJN    ATERM90     IF UNRECOVERED REQUEST
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          LJM    TERM90

 ATERM90  BSS
          LDN    R.ABN       ABNORMAL TERMINATION
          STDL   RESPC       RESPONSE CODE

          LJM    /RES/TERM   SEND TERMINATION RESPONSE
          EJECT
          QUAL   *
 RECRS1   BSS
          QUAL   RC
          AOML   SS+/SS/P.RVCNT  COUNT OF RECOVERED ERRORS PER REQUEST
          SBN    RVTRY       HAS LIMIT BEEN REACHED
          PJK    /RES/RECRSX  IF TOO MANY RECOVERED ERRORS ON THIS REQUEST
          LDK    /RS/K.REC   RECOVERED ERROR
          STDL   RCON        ADDITIONAL RESPONSE CONDITION
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          UJK    /RES/RECRSX
          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 MESSAGE
          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
          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
          QUAL   *
 TERMER1  BSS
          QUAL   RC

* CHECK IF LOADING A CONTROL MODULE.

          LDML   CMLOAD,CMOD  CONTROL MODULE LOADING TABLE
          ZJN    TERM10      IF NOT LOADING THE CONTROL MODULE
          LDN    0
          STML   CMLOAD,CMOD  ZERO OUT CONTROL MODULE LOADING ENTRY
          STML   SS+/SS/P.CMLD  ZERO OUT CM LOAD RETRY COUNTER
          LDK    /RS/K.CMLDS  CONTROLWARE RELOAD SUCCESSFUL
          RJM    SID         ERROR ID
          LDML   SS+/SS/P.PRELD  CHECK IF PRELOAD OF CM
          ZJN    TERM5       IF IN ERROR RECOVERY
          LJM    TERM80

 TERM5    BSS
          LJM    RECE        CONTINUE IN ERROR RECOVERY

* CHECK IF POWER UP SPINDLE COMPLETED.

 TERM10   BSS
          LDML   SS+/SS/P.NR  CHECK IF NOT READY ERROR PROCESSING
          ZJN    TERM20      IF NOT -NOT READY-

* POWER UP SPINDLE COMPLETED NORMALLY.

          LDN    0
          STML   SS+/SS/P.NR  CLEAR NOT READY RECOVERY FLAG
          LDK    /RS/K.PUC   POWER UP SPINDLE COMPLETED
          RJM    SID         SAVE ERROR ID
          RJM    INTRS       SEND AN INTERMEDIATE RESPONSE
          RJM    RSTRQ       RESTART REQUEST
          UJK    MAINC

* CHECK IF CONTROL MODULE LEVEL II DIAGNOSTICS HAVE FINISHED.

 TERM20   BSS
          LDML   SS+/SS/P.DIAG
          ZJN    TERM30      IF NOT RUNNING LEVEL II DIAGNOSTICS
          LDN    0
          STML   SS+/SS/P.DIAG  CLEAR DIAGNOSTIC FLAG
          LDK    /RS/K.XDP   LEVEL II DIAGNOSTICS PASSED
          RJM    SID         ERROR ID
          RJM    INTRS       SEND AN INTERMEDIATE MESSAGE
          LJM    RECG        CONTINUE IN ERROR RECOVERY

* CHECK IF DIAGNOSTIC COMMAND 72, SUBTEST 5, FINISHED

 TERM30   BSS
          LDML   SS+/SS/P.DIAGS
          ZJN    TERM95      IF NOT RUNNING DIAGNOSTIC 72, SUBTEST 5
          LDN    0
          STML   SS+/SS/P.DIAGS  CLEAR DIAGNOSTIC FLAG
          LJM    RECB        CONTINUE IN ERROR RECOVERY

 TERM80   BSS
 TERM90   BSS
          RJM    CFLGS       CLEAR FLAGS
          RJM    CLRLOCK     CLEAR LOCK ON UNIT
 TERM95   BSS
          UJK    MAINB
          EJECT
** NAME-- LOAD
*
** PURPOSE-- LOAD CONTROLWARE INTO THE ADAPTER AND ALL THE CONTROL
*            MODULES.
          SPACE  6
 LOADX    LJM    **
          QUAL   *
 LOAD     EQU    *-1
          QUAL   RC
          LDDL   UNUML
          ZJK    LOADX       IF NO UNITS

* LOAD THE ADPTER.
* LOAD THE CONTROL MODULES.

          AOML   IADL        INITIAL LOAD ADAPTER FLAG
          LDN    0
          STDL   UX          UNIT INDEX
 LOAD10   BSS
          LDML   UNITS+/UN/P.CM,UX  GET CONTROL MODULE NUMBER
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER

* CHECK IF UNIT IS DISABLED.

          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          CRDL   T1          READ UNIT DISABLED FLAG
          LDDL   T1+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    LOAD40      IF UNIT IS DISABLED
          LDML   IADL        HAS ADAPTER CONTROLWARE BEEN LOADED
          ZJN    LOAD30      IF ADAPTER HAS BEEN LOADED

* LOAD THE ADAPTER ONLY IF THERE IS AN ENABLED UNIT.

 LOAD20   BSS
          RJM    STLOCK      SET UNIT LOCK
          NJN    LOAD20      IF LOCK COULD NOT BE SET
          LDN    R10
          STML   SS+/SS/P.RECOV  INDEX TO RECOVERY PROCEDURE
          RJM    LDCON       LOAD ADAPTER
          LDN    0
          STML   IADL        CLEAR INITIAL LOAD ADAPTER FLAG
          RJM    CLRLOCK     CLEAR UNIT LOCK

* LOAD THE CONTROL MODULE.

 LOAD30   BSS
          LDML   CMLOAD,CMOD
          NJN    LOAD40      IF THIS CM HAS BEEN LOADED
          RJM    STLOCK      SET UNIT LOCK
          NJN    LOAD40      IF LOCK COULD NOT BE SET
          LDN    R40         RELOAD CONTROL MODULE
          STML   SS+/SS/P.RECOV  INDEX TO RECOVERY PROCEDURE
          AOML   SS+/SS/P.PRELD  PRELOAD OF CONTROL MODULE FLAG
          AOML   SS+/SS/P.CMLD  CM LOAD RETRY COUNTER
          RJM    LDCM        LOAD CONTROL MODULE
 LOAD40   BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    LOAD10      IF NOT END OF TABLE
          LDDL   IALF        SET FLAG FOR LOADING CONTROLWARE DONE ON
                             ALL CONTROLLERS
          LPC    -2
          ADN    2
          STDL   IALF
          LDN    0
          STML   IADL        CLEAR IN CASE ALL UNITS ARE DISABLED AND
                             ADAPTER LOAD WAS NOT DONE
          UJK    LOADX
          EJECT
** NAME-- LDCON
*
** PURPOSE-- LOAD CONTROLWARE IN ADAPTER IF COMMAND IS PRESENT.
          SPACE  6
 LDCX     LJM    **
 LDCON    EQU    *-1
          LDN    0
          STDL   LDCMF       LOAD ADAPTER
          LDN    1
          STDL   WC
 LDC20    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
          NJN    LDC20       IF CONTROLWARE LOAD COMMAND NOT PRESENT YET
          LDK    /RS/K.CLOAD  SET -ATTEMPTED CONTROLWARE LOAD- FLAG
          RJM    SERRID      SAVE ERROR ID
          LDML   CM+/CM/P.LEN
          SHN    -3
          STML   SS+/SS/P.LISTL  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

          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT      POLL STATUS
          ZJN    LDC30       IF NOT UNRECOVERED ERROR
          LDK    /RS/K.CF    POLL STATUS NONZERO AFTER SENDING CONTROLWARE
          RJM    SERRID      SAVE ERROR ID
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)

 LDC30    BSS
          RJM    SDELAY      SET ATTENTION DELAY
          UJK    LDCX
          SPACE  6
          EJECT
** NAME-- LDCM
*
** PURPOSE-- AUTOLOAD CONTROL MODULE.
          SPACE  6
 LDCMX    LJM    **
 LDCM     EQU    *-1
          LDDL   UX
          LMC    4000B
          STML   CMLOAD,CMOD  SET CONTROL MODULE LOADING ENTRY
          LDN    1
          STDL   WC
 LDCM10   BSS
          LOADC  CM.CB       CM ADDRESS OF COMMUNICATION BUFFER
          ADN    /CB/C.CMCTRL  CM ADDRESS OF CONTROL MODULE
                             AUTOLOAD 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.LDCM
          NJN    LDCM10      IF CONTROL MODULE AUTOLOAD COMMAND NOT PRESENT YET
          LDK    /RS/K.CMLD  SET -ATTEMPTED CONTROL MODULE LOAD- FLAG
                             IN RESPONSE
          RJM    SID         SAVE ERROR ID

* SEND LOAD COMMAND BLOCK TO AUTOLOAD THE CONTROL MODULE.

          LDK    R.LDCM      AUTOLOAD CONTROL MODULE
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDN    1
          STML   SS+/SS/P.LENGTH  SELECT LOADING THE CM FROM HOST
          LDML   SS+/SS/P.CMOD
          LPK    /SS/K.CMOD
          STML   SS+/SS/P.CMOD  SET UNIT NUMBER = 0
          RJM    CMND        LOAD COMMAND BLOCK
          UJK    LDCMX
          EJECT
* ENTRY WHEN FIRST PART OF LOAD CONTROL MODULE COMPLETES

          QUAL   *
 LDCMB1   BSS
          QUAL   RC

          AODL   LDCMF       SET LOAD CONTROL MODULE FLAG
          LDML   CM+/CM/P.LEN
          SHN    -3
          STML   SS+/SS/P.LISTL  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/LDCMBX
          EJECT
** NAME-- LOADCON
*
** PURPOSE-- LOAD CONTROLWARE.
*
** INPUT-- LISTL = NUMBER OF ADDRESS-LENGTH-PAIR ENTRIES IN THE
*                    COMMAND WHICH ARE LEFT TO PROCESS.
*          CMLIST =  LIST OF ADDRESS-LENGTH-PAIRS POINTING TO THE
*                    CM DATA AREA.
          SPACE  6
 LOAX     LJM    **
 LOADCON  EQU    *-1
          LDML   CMLIST+/CM/P.LEN  CHECK FOR 0 WORDS OF CONTROLWARE
          NJN    LOA5        IF LENGTH .GT. 0
          LDC    E213        CONTROLWARE IS NOT PRESENT
          RJM    ATERM
*         (NO RETURN FROM ATERM.)

 LOA5     BSS
          LDDL   LDCMF       LOAD CONTROL MODULE FLAG
          ZJN    LOA10       IF NOT LOAD CONTROL MODULE
          LDK    F.LDCM      ISSUE LOAD CONTROL MODULE FUNCTION
          UJN    LOA12

 LOA10    BSS
          LDK    F.AUTOP     ISSUE LOAD CONTROLWARE FUNCTION
 LOA12    BSS
          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  SET UP CM ADDRESS OF DATA AREA
          LDML   CMLIST+/CM/P.LEN  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
          LDDL   WDS         NUMBER OF CM WORDS
          SHN    2
          STDL   T3          NUMBER OF 16-BIT PP WORDS
          LDDL   LDCMF       LOAD CONTROL MODULE FLAG
          NJN    LOA60       IF LOADING CONTROL MODULE

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

 LOA60    BSS
          LDDL   T3
          RJM    OAMCT       OAM    CTBUF,DC    SEND DATA TO CONTROLLER
          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
          SOML   SS+/SS/P.LISTL  DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    LOA80       IF END OF ADDRESS-LENGTH-PAIRS IN COMMAND
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
          UJK    LOA20

 LOA80    BSS
          LDC    250         SET TIMEOUT FOR 1 MILLISECOND ON S1
          STDL   T5
 LOA85    BSS
          RJM    EJM         EJM    LOA88,DC    IF CHANNEL IS EMPTY
          UJN    LOA88       IF CHANNEL IS EMPTY

          SODL   T5
          NJN    LOA85
          LDK    /RS/K.CEMPT  CHANNEL DOESNT GO EMPTY
          UJN    LOA95       TIMEOUT ON CHANNEL EMPTY

 LOA88    BSS
          RJM    DCN2        DISCONNECT THE CHANNEL
          UJK    LOAX

 LOA90    BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT TRANSFERRED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
 LOA95    BSS
          RJM    SERRID      SAVE ERROR ID

* UNRECOVERED ERROR.

          RJM    ADPTERR      ABNORMAL TERMINATION
*         (NO RETURN FROM ADPTERR)

          EJECT
** NAME-- DIAG
*
** PURPOSE-- EXECUTE CONTROL MODULE LEVEL II DIAGNOSTICS.
          SPACE  6
 DIAGX    LJM    **
 DIAG     EQU    *-1
          AOML   SS+/SS/P.DIAG  SET FLAG WHEN RUNNING LEVEL II DIAGNOSTICS
          LDK    /RS/K.XD    SET -EXECUTING DIAGNOSTICS- IN RESPONSE
          RJM    SID         ERROR ID

* SEND LOAD COMMAND BLOCK TO RUN LEVEL II DIAGNOSTICS.

          LDN    0
          STML   SS+/SS/P.LENGTH  RUN ALL DIAGNOSTICS
          LDK    R.DIAG      RUN LEVEL II DIAGNOSTICS
          RJM    DIA         SEND LOAD COMMAND BLOCK
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          UJK    DIAGX
          EJECT
** NAME-- DIAGSUB
*
** PURPOSE-- EXECUTE CONTROL MODULE LEVEL II DIAGNOSTIC COMMAND 72,
*            SUBTEST 5.
          SPACE  6
 DIAGSX   LJM    **
 DIAGSUB  EQU    *-1
          AOML   SS+/SS/P.DIAGS  SET FLAG WHEN RUNNING DIAGNOSTIC 72, SUBTEST 5
          LDN    5           SUBTEST 5
          STML   SS+/SS/P.LENGTH  PARAMETER IN LOAD COMMAND BLOCK
          LDK    R.DIAGS     RUN DIAGNOSTIC COMMAND 72
          RJM    DIA         SEND LOAD COMMAND BLOCK
          UJK    DIAGSX
          EJECT
** NAME-- DIA
*
** PURPOSE-- USED BY DIAG AND DIAGSUB.
          SPACE  6
 DIAX     LJM    **
 DIA      EQU    *-1
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDML   UNITS+/UN/P.UNIT,UX  UNIT NUMBER FOR LOAD COMMAND BLOCK
          STML   SS+/SS/P.UNIT
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          RJM    CMND        LOAD COMMAND BLOCK
          LDML   UNITS+/UN/P.BUSY,UX  SET 'UNIT BUSY' FLAG
          LPC    -/UN/K.BUSY
          ADK    /UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          UJK    DIAX
          EJECT
** NAME-- SDELAY
*
** PURPOSE-- LOAD ATTENTION DELAY.
          SPACE  6
 SDEX     LJM    **
 SDELAY   EQU    *-1
          LDML   SS+/SS/P.DV  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE
          LDML   DELV,DEVICE  DELAY VALUE
          STDL   P1
          LDN    F.DELAY     LOAD ATTENTION DELAY
          RJM    FUNC
          RJM    ACN         ACN    DC
          LDN    1
          RJM    OAMP1       OAM    P1,DC       SEND DELAY PARAMETER
          RJM    DCN         DISCONNECT CHANNEL
*         (NO RETURN IF ERROR).

          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT
          ZJK    SDEX        IF NO ERROR
          LDK    /RS/K.DE    POLL STATUS NONZERO AFTER LOADING ATTENTION DELAY
          RJM    SERRID      SAVE ERROR ID
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)
          EJECT
** NAME-- STLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE TABLE.
*            SAME AS SETLOCK ROUTINE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SETLX    LJM    **
 STLOCK   EQU    *-1
 F1       IFEQ   SLOCK,0
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
 F1       ENDIF
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          UJK    SETLX
          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
*         LDN    0
*         STML   PPRQ        ZERO OUT PP REQUEST FLAG
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
 R4       ERRPL  *-7761B     IF > 0, OVERLAY IS TOO LONG
          QUAL   *

          OVERLAY (DOWN UNIT),BUFF
          ROUTINE DOWNO




** NAME-- OCTERM
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROL MODULE.
          SPACE  6
 OCTERM1  BSS
          QUAL   DN
          LDK    /RS/K.CMDN  CONTROL MODULE DOWN
          RJM    SID         ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    OFFUN       SET UNIT DISABLE FLAG
          RJM    OFFCM       TURN OFF ALL UNITS ON A CONTROL MODULE
          LJM    LTERM       LEAVE THE REQUEST ON THE UNIT QUEUE
          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    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          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
          RJM    DELCM       DELINK ANY COMPLETED REQUESTS
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          AODL   NODEL       SET NO DELINK FLAG, SO REQUEST IS NOT DELINKED
          LDML   SS+/SS/P.CUR  CLEAR 'CURRENT REQUEST'
          LPC    -/SS/K.CUR
          STML   SS+/SS/P.CUR
          LJM    TERM        TERMINATE REQUEST
          EJECT
** NAME-- UTERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR HARDWARE ERRORS.
*            TURN OFF THE UNIT.
          SPACE  6
          QUAL   *
 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
          UJK    LTERM       LEAVE THE REQUEST ON THE UNIT Q
          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
          LDN    0
          STML   SS+/SS/P.NCOMW  ZERO OUT NUMBER OF COMPLETED WRITE REQUESTS
          LDML   SS+/SS/P.NCOMRQ  NUMBER OF COMPLETED REQUESTS
          ZJN    DELCX       IF NO REQUESTS HAVE BEEN COMPLETED
          SOML   SS+/SS/P.NCOMRQ  DECREMENT COMPLETED REQUEST COUNT
          ZJN    DELCX      IF NOT STREAMING OF REQUESTS
          LDML   SS+/SS/P.PRERQ  SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   SS+/SS/P.CURRQ
          LDML   SS+/SS/P.PRERQ+1
          STML   SS+/SS/P.CURRQ+1
          RJM    DELRQ       DELINK COMPLETED REQUESTS FROM QUEUE
                             AND SELECT NEW REQUEST
          UJK    DELCX
          EJECT
** NAME-- OFFCH
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROLLER.
          SPACE  6
 OFCX     LJM    **
 OFFCH    EQU    *-1
          LDDL   UNUML
          ZJK    OFCX        IF NO UNITS
          RJM    SAVSS       SAVE SS ENTRY
          LDDL   UX          SAVE UX
          STDL   P6
          LDN    0
          STDL   CMNDS       SET OUTSTANDING ADAPTER COMMANDS = 0, SO
                             CHANNEL WILL NOT BE USED
          STDL   UX          UNITS TABLE INDEX
 OFC10    BSS
          RJM    OFF         SET UNIT DISABLE FLAG
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    OFC10       IF NOT END OF TABLE
          LDDL   P6
          STDL   UX          RESTORE UX
          RJM    GETSS       RESTORE SS ENTRY
          UJK    OFCX
          EJECT
** NAME-- OFFCM
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROL MODULE.
          SPACE  6
 OFFCMX   LJM    **
 OFFCM    EQU    *-1
          LDDL   UNUML
          ZJK    OFFCMX      IF NO UNITS
          RJM    SAVSS       SAVE SS ENTRY
          LDDL   UX          SAVE UX
          STDL   P6
          LDN    0
          STDL   UX          UNITS TABLE INDEX
 OFFCM10  BSS
          LDML   UNITS+/UN/P.UNIT,P6  COMPARE IF SAME CONTROL MODULE
          LMML   UNITS+/UN/P.UNIT,UX
          LPN    70B
          NJN    OFFCM20     IF NOT THE SAME CONTROL MODULE
          RJM    OFF         SET UNIT DISABLE FLAG
 OFFCM20  BSS
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    OFFCM10     IF NOT END OF TABLE
          LDDL   P6
          STDL   UX          RESTORE UX
          RJM    GETSS       RESTORE SS ENTRY
          UJK    OFFCMX
          EJECT
** NAME-- OFF
*
** PURPOSE-- SET THE UNIT LOCK, SET THE UNIT DISABLE FLAG,
*            AND CLEAR IMPORTANT FLAGS.
          SPACE  6
 OFFX     LJM    **
 OFF      EQU    *-1
 OFF10    BSS
          LOADR  UNITS+/UN/P.UIT,UX  READ UNIT DISABLE FLAG
          CRDL   T1
          LDDL   T1+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJN    OFF40       IF UNIT IS ALREADY DISABLED
          RJM    STLOCK      SET THE UNIT LOCK
          NJN    OFF10       IF LOCK WAS NOT SET

 OFF20    BSS
          RJM    OFFUN       SET UNIT DISABLE FLAG
          LDML   SS+/SS/P.CUR  CLEAR 'CURRENT REQUEST'
          LPC    -/SS/K.CUR
          STML   SS+/SS/P.CUR
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          RJM    CLRLOCK     CLEAR UNIT LOCK
 OFF40    BSS
          UJK    OFFX
          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  UNITS+/UN/P.UIT,UX  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-- ONUN
*
** PURPOSE-- CLEAR THE DISABLE FLAG IN THE UNIT INTERFACE TABLE.
          SPACE  6
          IFEQ   T1,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
          ENDIF
          EJECT
** NAME-- STLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE TABLE.
*            SAME AS SETLOCK ROUTINE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SETLX    LJM    **
 STLOCK   EQU    *-1
 F1       IFEQ   SLOCK,0
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
 F1       ENDIF
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          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
          LDDL   CHLOCK
          ZJN    SCL20       IF CHANNEL LOCK IS NOT SET
 SCL14    BSS
          LDN    0           EXIT A REGISTER = 0
          UJK    SCLX

 SCL20    BSS
          LDDL   UNUML
          ZJK    SCL14       IF NO UNITS
          LDK    C.CHCNT
          STDL   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP CHANNEL
          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
          AODL   CHLOCK      SET FLAG IF LOCK WAS SET
          UJK    SCL14       EXIT, 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
 R4       ERRPL  *-7761B     IF > 0, OVERLAY IS TOO LONG
          QUAL   *

          OVERLAY (PP REQUESTS),BUFF
          ROUTINE PPREQO


          QUAL   PR
          EJECT
          QUAL   *
 CKC1     BSS
          QUAL   PR
          RJM    CKCMND      CHECK IF OUTSTANDING COMMANDS
          LDDL   CMNDS
          NJN    CKC10       IF OUTSTANDING COMMANDS
          LDN    0
          STML   PIDLE       CLEAR PRE-IDLE FLAG
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          PAUSE  130000      DELAY 130 MILLISECONDS TO ALLOW
                             MAINTENANCE PP TO GET THE CHANNEL
          UJK    /RES/CKCX

* DON'T GIVE UP THE CHANNEL UNTIL ALL COMMANDS HAVE FINISHED.

 CKC10    BSS
          LDN    1
          STML   PIDLE       SET PRE-IDLE FLAG SO NO SEEKS WILL BE ISSUED
          UJK    /RES/CKCX
          EJECT
** NAME-- CKCMND
*
** PURPOSE-- COUNT THE NUMBER OF OUTSTANDING COMMANDS.
*
          SPACE  6
 CKCMX    LJM    **
 CKCMND   EQU    *-1

* FIND ALL UNITS IN WHICH A COMMAND WAS IN PROGRESS.

          LDN    0
          STDL   CMNDS       RESET OUTSTANDING ADAPTER COMMANDS
          STDL   T1
          LDDL   UNUML
          ZJK    CKCMX       IF NO UNITS
 CKCM10   BSS
          LDML   UNITS+/UN/P.BUSY,T1  CHECK IF OUTSTANDING COMMAND
          SHN    /UN/L.BUSY+2
          PJN    CKCM20      IF NO COMMAND IN PROGRESS
          AODL   CMNDS       NUMBER OF OUTSTANDING COMMANDS
 CKCM20   BSS
          LDN    P.UN
          RADL   T1          INCREMENT UNIT INDEX
          SBDL   UNUML       CHECK FOR END OF TABLE
          MJK    CKCM10      IF NOT END OF TABLE

* CHECK CONTROL MODULE LOAD TABLE.

          LDN    CMNUM       NUMBER OF ENTRIES
          STDL   T1
 CKCM30   BSS
          LDML   CMLOAD-1,T1  CHECK CONTROL MODULE LOAD TABLE
          ZJN    CKCM40      IF NOT LOADING CONTROL MODULE
          AODL   CMNDS       NUMBER OF OUTSTANDING COMMANDS
 CKCM40   BSS
          SODL   T1
          NJK    CKCM30      IF NOT END OF TABLE
          UJK    CKCMX
          EJECT
** NAME-- PPR
*
** PURPOSE-- CHECK FOR IDLE OR RESUME REQUESTS.
          SPACE  6
          QUAL   *
 PPR1     BSS
          QUAL   PR
          LDN    1
          STML   IGNORE      IGNORE ERRORS DURING IDLE PROCESSING
          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.

          LDDL   IDLE        IDLE FLAG
          ZJN    PPR10       IF ALREADY RESUMED
          RJM    ICOM        INITIALIZE UNIT TABLES
 PPR10    BSS
          RJM    RESUME      RESUME THE DRIVER
          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
          LDML   RSP         PROCESSING RESPONSE FLAG
          ZJN    PPR22       IF NOT PROCESSING A RESPONSE
          AOML   DEBUG2      SET FOR DEBUG PURPOSES ONLY
          RJM    RCMRQ       RESTART THE REQUESTS
          LDN    0
          STML   RSP         CLEAR PROCESSING RESPONSE FLAG

 PPR22    BSS
          RJM    CKCMND      CHECK IF ANY OUTSTANDING COMMANDS
          LDDL   CMNDS
          ZJN    PPR25       IF NO OUTSTANDING COMMANDS
          LDN    1
          STML   PIDLE       SET PRE-IDLE FLAG
          UJK    PPR40

 PPR25    BSS
          RJM    CLRUT       CLEAR UNIT TABLES
          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
          LDN    0
          STML   IGNORE      ALLOW ERRORS TO BE PROCESSED
          UJK    MAIND
          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
 MM1      IFEQ   T1,0
          QUAL   *
 PPREQ1   BSS
          QUAL   PR

* SET PP QUEUE LOCKWORD.

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

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

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

 PPRQ20   BSS
          LOADC  CM.PIT
          ADN    /PIT/C.PPQ
          CRDL   T5          READ RMA OF FIRST REQUEST IN CHAIN

* READ THE PP REQUEST.

          LOADF  T7          CM ADDRESS OF FIRST PP REQUEST
          ADN    /RQ/C.CMND
          CRDL   T1          READ COMMAND

* IF AN IDLE REQUEST, DON'T PROCESS IT UNTIL ALL OUTSTANDING CHANNEL
* COMMANDS HAVE BEEN PROCESSED.

          LDDL   T1+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          SBN    C.IDLE
          NJN    PPRQ30      IF NOT AN IDLE REQUEST
          RJM    CKCMND      CHECK IF ANY OUTSTANDING COMMANDS
          LDDL   CMNDS
          ZJN    PPRQ25      IF NO OUTSTANDING COMMANDS
          LDN    1
          STML   PIDLE       SET PRE-IDLE FLAG
          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD
          UJK    PPRQ15

 PPRQ25   BSS
          RJM    CLRUT       CLEAR UNIT TABLES
          UJN    PPRQ33


* IF AN RESUME REQUEST, INITIALIZE THE UNIT TABLES.

 PPRQ30   BSS
          SBN    C.RESUME-C.IDLE
          NJN    PPRQ33      IF NOT A RESUME REQUEST
          RJM    ICOM        INITIALIZE UNIT TABLES

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

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

          LDDL   T2          PUT PVA OF REQUEST IN SS TABLE
          STML   SS+/SS/P.PVA
          LDDL   T3
          STML   SS+/SS/P.PVA+1
          LDDL   T4
          STML   SS+/SS/P.PVA+2
          LDDL   T7          PUT RMA OF REQUEST IN SS TABLE
          STML   SS+/SS/P.REQ
          LDDL   T8
          STML   SS+/SS/P.REQ+1
          LDN    0
          STML   SS+/SS/P.FRST  SET FLAG WHEN REQUEST IS READ

* READ THE PP REQUEST.

          LDN    C.RQ
          STDL   P1
          LOADF  T7          CM ADDRESS OF FIRST PP REQUEST
          CRML   RQ,P1       READ PP 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

* DETERMINE NUMBER OF COMMANDS.

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

          AODL   PPRQ        SET PP REQUEST FLAG


* PROCESS PP REQUEST.

          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          RJM    SRESP       SET UP RESPONSE BUFFER
 PPRQ35   RJM    UNCMND      GET PP COMMAND AND SET UP TO PROCESS
          ZJN    PPRQ50      IF NO MORE COMMANDS
          QUAL   *
 PPRQB1   BSS
          QUAL   PR
          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    PPRQ35      IF NO ERROR, LOOK FOR ANOTHER COMMAND

 PPRQ50   RJM    TERMP       SEND TERMINATION RESPONSE
          UJK    /RES/PPRQX  EXIT, A REGISTER NONZERO
 MM1      ENDIF
          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
          LDDL   UX          SAVE UX
          STML   SAVUX
          LDDL   SSUN        UX OF CURRENT SS TABLE
          STDL   UX
          RJM    SAVSS       SAVE SS TABLE
          LDML   SAVUX       RESTORE UX
          STDL   UX
          LDC    7777B
          STDL   SSUN        INVALIDATE SS TABLE
          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
          RJM    SCLOCK      SET CHANNEL LOCK
          UJK    SPLX
          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
          LDDL   CHLOCK
          ZJN    SCL20       IF CHANNEL LOCK IS NOT SET
 SCL14    BSS
          LDN    0           EXIT A REGISTER = 0
          UJK    SCLX

 SCL20    BSS
          LDDL   UNUML
          ZJK    SCL14       IF NO UNITS
          LDK    C.CHCNT
          STDL   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP CHANNEL
          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
          AODL   CHLOCK      SET FLAG IF LOCK WAS SET
          UJK    SCL14       EXIT, 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-- 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
          LDDL   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
          STDL   CHLOCK      CLEAR CHANNEL LOCK FLAG
          UJK    CCLX
          EJECT
** NAME-- IDLEP
*
** PURPOSE-- PROCESS IDLE COMMAND.
          SPACE  6
 IDLX     LJM    **
          QUAL   *
 IDLEP    EQU    *-1
          QUAL   PR
          AODL   IDLE        SET IDLE FLAG
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          UJK    IDLX
          EJECT
** NAME-- RESUME
*
** PURPOSE-- PROCESS RESUME COMMAND.
          SPACE  6
 RESX     LJM    **
          QUAL   *
 RESUME   EQU    *-1
          QUAL   PR
          LDN    0
          STDL   IDLE        CLEAR IDLE FLAG
          STML   PIDLE       CLEAR PRE-IDLE FLAG
          UJK    RESX
          EJECT
** NAME-- STOP
*
** PURPOSE-- SET THE UNIT DISABLE FLAG IN THE UNIT INTERFACE TABLE.
          SPACE  6
          IFEQ   T1,0
 STOPX    LJM    **
 STOP     EQU    *-1
          LOADF  CM+/CM/P.RMA  LOAD ADDRESS OF UNIT INTERFACE TABLE
          RJM    OFFUN       SET UNIT DISABLE
          UJK    STOPX
          ENDIF
          EJECT
** NAME-- CLRUT
*
** PURPOSE-- CLEAR UNIT TABLES.
          SPACE  6
 CLRUX    LJM    **
 CLRUT    EQU    *-1
          LDN    0
          STDL   CMNDS       SET OUTSTANDING ADAPTER COMMANDS = 0, SO
                             CHANNEL WILL NOT BE USED
          STDL   IALF        CLEAR INITIALIZE FLAG SO EVERYTHING
                             WILL GET INITIALIZED
          STDL   UX          UNITS TABLE INDEX
          LDDL   UNUML
          ZJK    CLRUX       IF NO UNITS
 CLRU10   BSS
          LDML   UNITS+/UN/P.CTST,UX  CLEAR FLAG THAT CONFIDENCE TEST WAS RUN
          LPC    -/UN/K.CTST
          STML   UNITS+/UN/P.CTST,UX
          RJM    STLOCK      SET THE UNIT LOCK
          NJN    CLRU20      IF THE LOCK COULD NOT BE SET
          LDML   SS+/SS/P.CUR  CLEAR 'CURRENT REQUEST'
          LPC    -/SS/K.CUR-/SS/K.INIT
          STML   SS+/SS/P.CUR
          ERRNZ  /SS/P.CUR-/SS/P.INIT
          RJM    CFLGS       CLEAR FLAGS
          RJM    CLRLOCK     CLEAR THE UNIT LOCK
 CLRU20   BSS
          LDN    P.UN
          RADL   UX          BUMP UNITS TABLE INDEX
          SBDL   UNUML
          NJK    CLRU10      IF NOT END OF TABLE
          UJK    CLRUX
          EJECT
** NAME-- RCMRQ
*
** PURPOSE-- RESTART ALL THE REQUESTS ON A CONTROL MODULE.
          SPACE  6
 RCMX     LJM    **
 RCMRQ    EQU    *-1
          LDDL   UNUML
          ZJK    RCMX        IF NO UNITS
          LDN    F.TERM      TERMINATE ACTIVE COMMANDS
          RJM    FUNC
          RJM    SAVSS       SAVE SS TABLE
          LDML   UNITS+/UN/P.CM,UX  GET CONTROL MODULE NUMBER
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER
          LDDL   UX          SAVE UX
          STML   SAVE
          LDN    0
          STDL   UX
          STDL   CMNDS       RECOMPUTE NUMBER OF OUTSTANDING COMMANDS
 RCM10    BSS
          LDML   UNITS+/UN/P.BUSY,UX  CHECK IF OUTSTANDING COMMAND
          SHN    /UN/L.BUSY+2
          PJN    RCM20       IF NOT AN OUTSTANDING COMMAND
          RJM    GETSS       GET SS ENTRY
          RJM    RSTRQ       RESTART REQUEST
 RCM20    BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJN    RCM10       IF NOT END OF TABLE

* ZERO OUT CONTROL MODULE LOAD TABLE.

          LDN    CMNUM       NUMBER OF ENTRIES
          STDL   T1
 RCM30    BSS
          LDN    0
          STML   CMLOAD-1,T1  ZERO OUT CONTROL MODULE LOAD TABLE
          SODL   T1
          NJN    RCM30       IF NOT END OF TABLE
 RCM40    BSS
          LDML   SAVE        RESTORE UX
          STDL   UX
          RJM    GETSS       GET SS ENTRY
          UJK    RCMX
          EJECT
** NAME-- RSTRQ
*
** PURPOSE-- INCREMENT REQUEST RETRY COUNTER.  IF RETRIES HAVE
*            NOT BEEN EXHAUSTED, RESTART THE REQUEST.
          SPACE  6
 RSTX     LJM    **
 RSTRQ    EQU    *-1
          AOML   SS+/SS/P.RQTRY  INCREMENT REQUEST RETRY COUNTER
          LDML   SS+/SS/P.CONF  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          MJK    RST40       IF DOING INITIAL CONFIDENCE TEST

* RESTART REQUEST FROM BEGINNING.

          LDML   SS+/SS/P.CURRQ  RESTORE RMA OF CURRENT REQUEST
          STML   SS+/SS/P.REQ
          LDML   SS+/SS/P.CURRQ+1
          STML   SS+/SS/P.REQ+1
          LDML   RS+/RS/P.PVA  RESTORE PVA OF CURRENT REQUEST
          STML   SS+/SS/P.PVA
          LDML   RS+/RS/P.PVA+1
          STML   SS+/SS/P.PVA+1
          LDML   RS+/RS/P.PVA+2
          STML   SS+/SS/P.PVA+2
          RJM    UREQ        READ UNIT REQUEST
          LDML   RQ+/RQ/P.CYL  RESTORE CYLINDER ADDRESS
          STML   SS+/SS/P.CYL
          LDML   RQ+/RQ/P.TRACK  RESTORE TRACK ADDRESS
          SHN    /SS/N.SECTOR
          ADML   RQ+/RQ/P.SECTOR  RESTORE SECTOR ADDRESS
          STML   SS+/SS/P.SECTOR
 RST20    BSS
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          RJM    DELCM       DELINK ANY COMPLETED REQUESTS
          RJM    CLRLOCK     CLEAR LOCK ON UNIT
          UJK    RSTX        RETURN A REGISTER = 0 TO RESTART REQUEST

* RESTART CONFIDENCE TEST.

 RST40    BSS
          LDDL   IALF        CLEAR FLAG FOR CONFIDENCE TEST STARTED
                             ON ALL CONTROLLERS
          LPC    -4
          STDL   IALF
          LDML   UNITS+/UN/P.CTST,UX  CLEAR FLAG FOR CONFIDENCE TEST STARTED
          LPC    -/UN/K.CTST
          STML   UNITS+/UN/P.CTST,UX
          UJK    RST20
          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
          LDN    0
          STML   SS+/SS/P.NCOMW  ZERO OUT NUMBER OF COMPLETED WRITE REQUESTS
          LDML   SS+/SS/P.NCOMRQ  NUMBER OF COMPLETED REQUESTS
          ZJN    DELCX       IF NO REQUESTS HAVE BEEN COMPLETED
          SOML   SS+/SS/P.NCOMRQ  DECREMENT COMPLETED REQUEST COUNT
          ZJN    DELCX      IF NOT STREAMING OF REQUESTS
          LDML   SS+/SS/P.PRERQ  SET UP RMA OF LAST GOOD COMPLETED REQUEST
          STML   SS+/SS/P.CURRQ
          LDML   SS+/SS/P.PRERQ+1
          STML   SS+/SS/P.CURRQ+1
          RJM    DELRQ       DELINK COMPLETED REQUESTS FROM QUEUE
                             AND SELECT NEW REQUEST
          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

* INITILIZE VARIABLES.

          LDN    0
          STDL   LUX         LAST UNIT SELECTED
          LDC    7777B
          STDL   SSUN        INVALIDATE SS TABLE

          LDDL   UDL         LENGTH OF UNIT DESCRIPTORS (CM WORDS)
          ZJN    ICOMX       IF NO UNIT DESCRIPTORS

* ZERO OUT UNITS TABLE.

          LDK    UNUM*P.UN
          STDL   T1
 ICOM5    BSS
          LDN    0
          STML   UNITS-1,T1  ZERO OUT UNITS TABLE
          SODL   T1
          NJN    ICOM5

* ZERO OUT CONTROL MODULE LOAD TABLE.

          LDN    CMNUM       NUMBER OF ENTRIES
          STDL   T1
 ICOM8    BSS
          LDN    0
          STML   CMLOAD-1,T1  ZERO OUT CONTROL MODULE LOAD TABLE
          SODL   T1
          NJN    ICOM8       IF NOT END OF TABLE

          LDN    0
          STDL   P5          NUMBER OF CONFIGURED UNITS
          STDL   P6          INDEX TO UNIT DESCRIPTORS
          STDL   UX          CONFIGURED UNIT TABLE INDEX
 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   VALID,1
          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    ICOM85      IF NULL ENTRY

* ZERO OUT SS ENTRY.
* DONT ZERO OUT REQUEST OR RESPONSE BUFFER.

          LDK    /SS/P.RQ
          STDL   T1
 ICOM20   BSS
          LDN    0
          STML   SS-1,T1     ZERO OUT SS ENTRY
          SODL   T1
          NJN    ICOM20
          LOADF  IBUF+/UD/P.UQT  REFORMAT RMA ADDRESS OF UNIT QUEUE TABLE
          STML   UNITS+/UN/P.UIT+2,UX
          LDDL   CMADR
          STML   UNITS+/UN/P.UIT,UX
          LDDL   CMADR+1
          STML   UNITS+/UN/P.UIT+1,UX

* READ UNIT INTERFACE TABLE.

          LDN    C.UIT
          STDL   WC
          LDDL   CMADR+2     LOAD ADDRESS OF UNIT INTERFACE TABLE
          LMC    400000B
          CRML   UBUF,WC     READ UNIT INTERFACE TABLE
          LDML   UBUF+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    2+/UIT/L.DSABLE
          MJK    ICOM85      IF UNIT IS DISABLED
          IFEQ   VALID,1
          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    -403B       CHECK FOR ISD-1
          NJN    ICOM30      IF NOT ISD-1
          LDN    DTISD1
          UJN    ICOM60

 ICOM30   BSS
          SBN    404B-403B   CHECK FOR ISD-2
          ZJN    ICOM50      IF  ISD-2
          RJM    HALT        INVALID DEVICE TYPE
*         (NO RETURN FROM HALT.)

 ICOM50   BSS
          LDN    DTISD2
 ICOM60   BSS
          ERRNZ  16-/SS/L.DV-/SS/N.DV
          RAML   SS+/SS/P.DV

* GET CHANNEL NUMBER AND MOVE TO SS ENTRY.

          LDML   IBUF+/UD/P.CHAN
          SHN    /UD/L.CHAN+/UD/N.CHAN+2
          LPN    /SS/M.CHAN
          STDL   CHAN        CHANNEL NUMBER
          STML   RS+/RS/P.CHAN
          SHN    16-/SS/L.CHAN-/SS/N.CHAN
          RAML   SS+/SS/P.CHAN

* 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  UNIT AND CONTROL MODULE
          LDML   IBUF+/UD/P.CNTRLR
          LPN    77B
          SHN    3
          RAML   SS+/SS/P.UNIT
          STML   UNITS+/UN/P.UNIT,UX
          STML   RS+/RS/P.UNIT
          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN RESPONSE BUFFER
          STML   RS+/RS/P.LU

* REFORMAT COMMUNICATION BUFFER RMA.

          LOADF  UBUF+/UIT/P.UBUF  COMMUNICATION BUFFER RMA
          STML   UNITS+/UN/P.CB+2,UX
          LDDL   CMADR
          STML   UNITS+/UN/P.CB,UX
          LDDL   CMADR+1
          STML   UNITS+/UN/P.CB+1,UX

* 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
          LOADR  UNITS+/UN/P.CB,UX  LOAD ADDRESS OF COMMUNICATION BUFFER
          STDL   T1
          CRDL   T2          READ SS ENTRY
          LDDL   T2
          SHN    /SS/L.INIT+2
          MJN    ICOM80      IF SS ENTRY ALREADY INITIALIZED
          LDK    /SS/K.INIT
          RAML   SS+/SS/P.INIT  SET SS ENTRY INITIALIZED FLAG
          LDDL   T1
          LMC    400000B
          CWML   SS,WC       WRITE SS ENTRY TO COMMUNICATION BUFFER

* BUMP TO NEXT ENTRY.

 ICOM80   BSS
          AODL   P5          NUMBER OF CONFIGURED UNITS
          LDN    P.UN
          RADL   UX          BUMP CONFIGURED UNIT ENTRY
 ICOM85   BSS
          LDN    C.UD
          RADL   P6          BUMP TO NEXT UNIT DESCRIPTOR ENTRY
          SBDL   UDL         CHECK FOR END OF UNIT DESCRIPTORS
          NJK    ICOM10      IF MORE UNIT DESCRIPTORS
          LDDL   UX
          STDL   UNUML       END OF ACTIVE UNIT TABLE
          LDN    0
          STDL   UX          INITIALIZE INDEX

* SET COMMAND TIMEOUT VALUES BASED UPON THE NUMBER OF
* CONFIGURED UNITS.

          LDML   S2-1,P5     SET TIMEOUT FOR 2 SECONDS
          STML   SC2
          LDML   S60-1,P5    SET TIMEOUT FOR 60 SECONDS
          STML   SC60
          LDML   S185-1,P5   SET TIMEOUT FOR 185 SECONDS
          STML   SC185
          RJM    CHGCH       CHANGE CHANNEL REFERENCES
          UJK    ICOMX       EXIT
          EJECT
 S2       BSS                TABLE FOR 2 SECOND TIMEOUT VALUES
          CON    19231       1 UNIT
          CON    13514       2 UNITS
          CON    10417       3 UNITS
          CON    8475        4 UNITS
          CON    7143        5 UNITS
          CON    6173        6 UNITS
          CON    5435        7 UNITS
          CON    4855        8 UNITS

 S60      BSS                TABLE FOR 60 SECOND TIMEOUT VALUES
          CON    9           1 UNIT
          CON    7           2 UNITS
          CON    5           3 UNITS
          CON    4           4 UNITS
          CON    4           5 UNITS
          CON    3           6 UNITS
          CON    3           7 UNITS
          CON    3           8 UNITS

 S185     BSS                TABLE FOR 185 SECOND TIMEOUT VALUES
          CON    28          1 UNIT
          CON    20          2 UNITS
          CON    15          3 UNITS
          CON    12          4 UNITS
          CON    11          5 UNITS
          CON    9           6 UNITS
          CON    8           7 UNITS
          CON    7           8 UNITS
          EJECT
** 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
          SBDL   CURCH       CURRENT CHANNEL NUMBER
          ZJN    CHGX        NO CHANGE NEEDED
          RADL   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
 D5       IFEQ   VALID,1
 CHKUX    LJM    **
 CHKUD    EQU    *-1
          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    CHKU100

 CHKU25   BSS
          SBN    34B-20B
          PJN    CHKU20

 CHKU30   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)

 D5       ENDIF
          EJECT
* CHECK FOR VALID UNIT INTERFACE TABLE.
          SPACE  6
 W11      IFEQ   VALID,1
 CUTX     LJM    **
 CHKUIT   EQU    *-1
          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    -403B       VALID UNIT TYPE = 403B - 404B
          MJN    CUT100      INVALID UNIT TYPE

          SBN    404B-403B+1
          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      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        HALT THE PP
*         (NO RETURN FROM HALT.)

          EJECT
** NAME-- STLOCK
*
** PURPOSE-- SETS THE UNIT LOCK IN THE UNIT INTERFACE TABLE.
*            SAME AS SETLOCK ROUTINE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SETLX    LJM    **
 STLOCK   EQU    *-1
 F1       IFEQ   SLOCK,0
          LDC    UNITS+/UN/P.UIT  UNIT INTERFACE TABLE ADDRESS
          ADDL   UX
          STDL   T7
          LDN    /UIT/C.ULOCK  OFFSET OF UNIT LOCKWORD
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJK    SETLX       IF LOCK COULD NOT BE SET
 F1       ENDIF
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          UJK    SETLX
          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
*         LDN    0
*         STML   PPRQ        ZERO OUT PP REQUEST FLAG
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
          QUAL   *
 R3       ERRPL  *-7761B     IF .GT. 0, OVERLAY IS TOO LONG
          EJECT

          OVERLAY (CONFIDENCE TEST),OVAD1
          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

          LDN    0
          STML   UX          UNIT INDEX
          STML   CTEST100    CLEAR FLAG FOR CONFIDENCE TEST TO BE RECALLED LATER
          LDDL   UNUML
          ZJK    CTEST60     IF NO UNITS
 CTEST10  BSS
          LDML   UNITS+/UN/P.CTST,UX  HAS THE CONFIDENCE TEST BEEN STARTED
          SHN    /UN/L.CTST+2
          MJK    CTEST50     IF THE CONFIDENCE TEST HAS BEEN STARTED
          LDML   UNITS+/UN/P.CM,UX  GET CONTROL MODULE NUMBER
          SHN    -3
          STDL   CMOD        CONTROL MODULE NUMBER
          LDML   CMLOAD,CMOD  CHECK IF CONTROL MODULE IS BEING LOADED
          NJK    CTEST80     IF CONTROL MODULE IS BEING LOADED
          LDML   UNITS+/UN/P.BUSY,UX  CHECK IF OUTSTANDING COMMAND
          SHN    /UN/L.BUSY+2
          MJK    CTEST80     IF A COMMAND IS IN PROGRESS
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          CRDL   T5          READ UNIT DISABLED FLAG
          LDDL   T5+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    CTEST50     IF UNIT IS DISABLED
 CTEST20  BSS
          RJM    /RES/PPREQ  CHECK IDLE AND ACTIVE FLAGS
          RJM    /RES/SETLOCK  SET THE UNIT LOCK
          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   UNITS+/UN/P.CTST,UX  SET FLAG THAT CONFIDENCE TEST WAS STARTED
          LPC    -/UN/K.CTST
          ADK    /UN/K.CTST
          STML   UNITS+/UN/P.CTST,UX

* GET DEVICE TYPE.

          LDML   SS+/SS/P.DV  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES OF DATA
          LPC    -/SS/K.STV
          STML   SS+/SS/P.STV

          RJM    CONF        EXECUTE THE CONFIDENCE TEST

* SET FLAG THAT THE CONFIDENCE TEST WAS RUN.

          LDML   SS+/SS/P.CONF  SET CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          ADK    /SS/K.CONF
          STML   SS+/SS/P.CONF

          RJM    CLRLOCK     SAVE SS ENTRY

* LEAVE THE UNIT LOCKED.

 CTEST50  BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    CTEST10     IF NOT END OF TABLE
 CTEST60  BSS
          LDML   CTEST100
          NJN    CTEST70     IF AT LEAST 1 UNIT IS LEFT
          LDDL   IALF        SET FLAG FOR CONFIDENCE TEST STARTED ON
                             ALL CONTROLLERS
          LPC    -4
          ADN    4
          STDL   IALF
 CTEST70  BSS
          UJK    CTESTX

 CTEST80  BSS
          AOML   CTEST100    EXIT WITH IALF, BIT 2 = 0 TO BE RECALLED LATER
          UJK    CTEST50


 CTEST100 BSSZ   1           NONZERO IF CONFIDENCE TEST SHOULD BE ATTEMPTED LATER
          EJECT
** NAME-- CONF
*
** PURPOSE-- EXECUTE THE CONFIDENCE TEST.
          SPACE  6
 CONFX    LJM    **
 CONF     EQU    *-1
          LDK    /RS/K.CT    SET FLAG FOR CONFIDENCE TEST STARTED
          RJM    SDET        PUT ID IN RESPONSE

          LDN    0
          STML   SS+/SS/P.TOTAL  SECTORS TRANSFERRED
          LDN    1
          STDL   FNC         SET FUNCTION CODE = WRITE
          STML   SS+/SS/P.FNC  SET FUNCTION CODE = WRITE
          RJM    CSETUP      SET UP THE DISK ADDRESS
          RJM    SETADD      SET STARTING DISK ADDRESS IN RESPONSE BUFFER
          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          RJM    /RES/SEEKCK  ISSUE SEEK
          LDDL   PLSTAT
          NJK    CTERM60     IF COMMAND BLOCK ISSUE WAS UNSUCCESSFUL
          LDML   UNITS+/UN/P.BUSY,UX  SET 'UNIT BUSY' FLAG
          LPC    -/UN/K.BUSY
          ADK    /UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          UJK    CONFX
          EJECT
* THE COMMAND COMPLETED WITHOUT ERROR.
          SPACE  6
          QUAL   *
 CTERM    CON    0
          QUAL   CF

          SODL   CMNDS       DECREMENT COUNT OF OUTSTANDING COMMANDS
          LDML   CMLOAD,CMOD  CONTROL MODULE LOADING TABLE
          ADML   SS+/SS/P.NR  CHECK IF NOT READY ERROR PROCESSING
          ADML   SS+/SS/P.DIAG  CHECK IF RUNNING DIAGNOSTICS
          ADML   SS+/SS/P.DIAGS  CHECK IF RUNNING DIAGNOSTICS
          NJK    /RES/TERM40  CALL OVERLAY TO PROCESS

          LDML   UNITS+/UN/P.BUSY,UX  CLEAR BUSY FLAG
          LPC    -/UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          LDML   SS+/SS/P.FNC
          ZJK    CTERM20     IF READ
          LDN    0
          STML   SS+/SS/P.TOTAL  SET SECTORS TRANSFERRED = 0
          STDL   FNC         SET FUNCTION CODE = READ
          STML   SS+/SS/P.FNC  SET FUNCTION CODE = READ
          LDML   SS+/SS/P.CPERR  COMPARE ERROR FLAG
          LPC    -/SS/K.CPERR
          STML   SS+/SS/P.CPERR
          RJM    CSETUP      SET UP THE DISK ADDRESS
          RJM    SETADD      SET STARTING DISK ADDRESS IN RESPONSE BUFFER
          RJM    /RES/SEEKCK  ISSUE SEEK
          LDDL   PLSTAT
          NJK    CTERM60     IF COMMAND BLOCK ISSUE WAS UNSUCCESSFUL
          LDML   UNITS+/UN/P.BUSY,UX  SET 'UNIT BUSY' FLAG
          LPC    -/UN/K.BUSY
          ADK    /UN/K.BUSY
          STML   UNITS+/UN/P.BUSY,UX
          UJN    CTERM40

 CTERM20  BSS
          LDML   SS+/SS/P.CPERR  CHECK IF THERE WAS A COMPARE ERROR
          SHN    /SS/L.CPERR+2
          MJN    CTERM50     IF COMPARE ERROR

          LDN    1
          ERRNZ  16-/SS/N.STV-/SS/L.STV
          RAML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES OF DATA
          LPK    /SS/M.STV
          SBN    STVL
          ZJN    CTERM30     IF END OF STARTING VALUE TABLE

* ISSUE THE SEEK TO WRITE DATA.

          RJM    CONF        ISSUE THE SEEK FOR WRITE
          UJN    CTERM40

* END OF CONFIDENCE TEST.

 CTERM30  BSS
          LDML   SS+/SS/P.CONF  CLEAR CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          STML   SS+/SS/P.CONF
 CTERM40  BSS
          RJM    CLRLOCK     SAVE SS ENTRY
          UJK    MAINC

* DATA COMPARE ERROR.

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

 CTERM60  BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    RECS        UNRECOVERED ERROR
*         (NO RETURN FROM RECS.)
          SPACE  6
          EJECT
** NAME-- CSETUP
*
** PURPOSE-- SET UP PARAMETERS FOR THE CONFIDENCE TEST.
          SPACE  6
 CSEX     LJM    **
 CSETUP   EQU    *-1
          LDML   CFCYL,DEVICE
          STML   SS+/SS/P.CYL  CYLINDER ADDRESS OF CURRENT REQUEST
          LDN    0
          STDL   T1
          LDML   SS+/SS/P.TOTAL  SECTORS TRANSFERRED
          STML   SS+/SS/P.SECTOR  SECTOR ADDRESS
 CSE10    BSS
          LDML   SS+/SS/P.SECTOR  COMPUTE TRACK AND SECTOR ADDRESS
          SBML   DVSEC,DEVICE  NUMBER OF SECTORS PER TRACK
          MJN    CSE20       IF END OF COMPUTATION
          STML   SS+/SS/P.SECTOR
          AODL   T1          INCREMENT TRACK ADDRESS
          UJN    CSE10

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

          LDML   SECCYL,DEVICE  NUMBER OF SECTORS TO TRANSFER PER CYLINDER
          SBML   SS+/SS/P.TOTAL  SECTORS TRANSFERRED
          STML   SS+/SS/P.MAUS  NUMBER OF SECTORS TO END OF CYLINDER
          UJK    CSEX
          EJECT
** NAME-- CREAD.
*
** PURPOSE-- READ THE CONFIDENCE TEST CYLINDER.
          SPACE  6
          QUAL   *
 CREAD    CON    0
          QUAL   CF
          LDML   SS+/SS/P.MAUS  TOTAL SECTORS LEFT TO TRANSFER
          NJN    CREAD10     IF MORE DATA TO TRANSFER
          RJM    TERMA       PROBABLY ADAPTER ERROR
*         (NO RETURN FROM TERMA.)

 CREAD10  BSS
          LDN    0
          STDL   FRSTSC      FIRST SECTOR FLAG
          STML   CKDATA      COMPARE DATA ON ONE SECTOR FOR EACH TRACK
          LDML   SS+/SS/P.DV  GET DEVICE TYPE
          ERRNZ  -16+/SS/L.DV+/SS/N.DV
          LPN    /SS/M.DV
          STDL   DEVICE

* TRANSFER DATA FROM DISK.

 CREAD20  BSS
          LDN    F.MOVDT     MOVE DATA FUNCTION (TERMINATE)
          RJM    FUNC
          RJM    IAMBF       ACN    DC
                             LDC    SECWDS      NUMBER OF CHANNEL WORDS
                             IAM   BUFF,DC
          STDL   AREG        SAVE A REGISTER IN CASE OF PREMATURE TERMINATION
          ZJN    CREAD40     IF TRANSFER WAS COMPLETE

          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT      IF POLL STATUS = 640XX B, THEN
                             IT WAS A MEDIA ERROR, REPEAT MOVE DATA
          ADC    -64000B
          SBML   UNITS+/UN/P.UNIT,UX
          NJN    CREAD30     IF NOT MEDIA ERROR
          LDK    /RS/K.MEDIA  MEDIA ERROR
          RJM    SERRID      SAVE ERROR ID
          UJK    CREAD20     REPEAT MOVE DATA

 CREAD30  BSS
          LDDL   AREG
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT RECEIVED
          LDK    /RS/K.IST   INCOMPLETE SECTOR TRANSFER
          UJN    CREAD50

 CREAD40  BSS
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
*         (NO RETURN IF ERROR).

          LDML   SS+/SS/P.MAUS  NUMBER OF SECTORS LEFT TO TRANSFER
          SBN    SECSC       SECTOR INCREMENT
          NJN    CREAD60     IF NOT TERMINATE

* TERMINATE.
* THIS STATUS MUST BE ISSUED IMMEDIATELY, (WITHIN 50 MICROSECONDS),
* AFTER THE READ FUNCTION.

          RJM    POLSTAT     GET POLL STATUS
          LDDL   PLSTAT
          ADC    -4000B
          SBML   UNITS+/UN/P.UNIT,UX
          ZJN    CREAD60     IF NO ERROR ON LAST SECTOR
          LDK    /RS/K.RERR  STATUS BEFORE SUSPEND / TERMINATE READ .NE.
                             4XXXB.
 CREAD50  BSS
          RJM    SERRID      SAVE ERROR FLAG
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)



* UPDATE SECTOR ADDRESS AND CHECK FOR END OF TRACK.

 CREAD60  BSS
          LDML   CKDATA
          NJN    CREAD62     IF A SECTOR HAS BEEN COMPARED FOR THIS TRACK
          RJM    CKD         CHECK THE DATA
          AOML   CKDATA      SET FLAG THAT DATA HAS BEEN CHECKED

 CREAD62  BSS
          RJM    /RES/RECRS  CHECK IF A PREVIOUS ERROR WAS RECOVERED
          AODL   FRSTSC
          SBN    1
          ZJN    CREAD70     IF FIRST SECTOR TRANSFERRED FOR THIS
                             READ SEQUENCE
          LDN    SECSC       SECTOR INCREMENT
          RAML   SS+/SS/P.CURSEC  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS / TRACK
          MJN    CREAD70     IF NOT END OF TRACK
          STML   SS+/SS/P.CURSEC  SET SECTOR
          AOML   SS+/SS/P.CURTRK  INCREMENT HEAD ADDRESS
          LDN    0
          STML   CKDATA      COMPARE DATA ON A SECTOR FOR EACH TRACK

* UPDATE BYTES TRANSFERRED.

 CREAD70  BSS
          LDN    SECSC       SECTOR INCREMENT
          RAML   SS+/SS/P.TOTAL  INCREMENT NUMBER OF SECTORS TRANSFERRED
          LDML   SS+/SS/P.MAUS  DECREMENT NUMBER OF SECTORS LEFT TO TRANSFER
          SBN    SECSC
          STML   SS+/SS/P.MAUS
          NJK    CREAD20     IF MORE WORDS TO TRANSFER
          RJM    CTERM       TERMINATE THE READ
*         (NO RETURN FROM CTERM.)
          EJECT
** NAME-- CWRITE
*
** PURPOSE-- WRITE THE CONFIDENCE TEST CYLINDER.
          SPACE  6
 CWRIX    LJM    **
          QUAL   *
 CWRITE   EQU    *-1
          QUAL   CF
          LDML   SS+/SS/P.MAUS  TOTAL SECTORS LEFT TO TRANSFER
          NJN    CWRI10      IF MORE DATA TO TRANSFER
          RJM    TERMA       PROBABLY ADAPTER ERROR
*         (NO RETURN FROM TERMA.)

 CWRI10   BSS
          LDN    0
          STDL   FRSTSC      FIRST SECTOR FLAG
          LDML   SS+/SS/P.DV  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.)

 CWRI20   BSS
          ERRNZ  16-/SS/N.STV-/SS/L.STV
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES OF DATA
          LPK    /SS/M.STV
          STDL   T1
          LDML   STVAL,T1
          ADN    1           CHECK THE SECOND WORD
          SBML   BUFF+1
          ZJN    CWRI30      IF DATA IS STILL IN BUFFER
          RJM    INID        INITIALIZE THE DATA

* TRANSFER DATA TO DISK.

 CWRI30   BSS
          LDML   SS+/SS/P.CURTRK  PUT TRACK AND SECTOR ADDRESS IN
                             FIRST WORD OF SECTOR
          SHN    8
          ADML   SS+/SS/P.CURSEC
          STML   BUFF
          LDN    F.MOVDT     ISSUE MOVE DATA AND TERMINATE
          RJM    FUNC        ISSUE THE FUNCTION
          RJM    ACN         ACN    DC
          LDC    SECWDS      NUMBER OF WORDS IN SECTOR
          RJM    OAMBF       OAM   BUFF,DC
          RJM    DCN         DCN    40B+DC
*         (NO RETURN IF ERROR).

          AODL   FRSTSC
          SBN    1
          ZJN    CWRI40      IF FIRST SECTOR TRANSFERRED FOR THIS
                             READ SEQUENCE
          LDN    SECSC       SECTOR INCREMENT
          RAML   SS+/SS/P.CURSEC  INCREMENT SECTOR ADDRESS
          SBML   DVSEC,DEVICE  COMPARE WITH NUMBER OF SECTORS / TRACK
          MJN    CWRI40      IF NOT END OF TRACK
          STML   SS+/SS/P.CURSEC  SET SECTOR
          AOML   SS+/SS/P.CURTRK  INCREMENT HEAD ADDRESS

* UPDATE BYTES TRANSFERRED.

 CWRI40   BSS
          LDN    SECSC       SECTOR INCREMENT
          RAML   SS+/SS/P.TOTAL  INCREMENT NUMBER OF SECTORS TRANSFERRED
          LDML   SS+/SS/P.MAUS  DECREMENT NUMBER OF SECTORS LEFT TO TRANSFER
          SBN    SECSC
          STML   SS+/SS/P.MAUS
          NJK    CWRI20      IF MORE WORDS TO TRANSFER
          UJK    CWRIX       IF END OF DATA
          EJECT
** NAME-- INID
*
** PURPOSE-- INITIALIZE DATA FOR THE READ / WRITE CONFIDENCE TEST.
          SPACE  6
 INIX     LJM    **
 INID     EQU    *-1
          ERRNZ  16-/SS/N.STV-/SS/L.STV
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES OF DATA
          LPK    /SS/M.STV
          STDL   T1
          LDML   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
          ADC    -SECWDS     NUMBER OF WORDS PER SECTOR
          MJK    INI20       IF NOT DONE INITIALIZING THE DATA
          UJK    INIX
          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
** NAME-- CKD
*
** PURPOSE-- CHECK THE DATA WHEN DOING THE CONFIDENCE TEST.
          SPACE  6
 CKX      LJM    **
 CKD      EQU    *-1
          ERRNZ  16-/SS/N.STV-/SS/L.STV
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES OF DATA
          LPK    /SS/M.STV
          STDL   T1
          LDML   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
          ADC    -SECWDS     NUMBER OF WORDS PER SECTOR
          MJK    CK20        IF NOT END OF SECTOR
          LDML   SS+/SS/P.CURTRK  CHECK IF FIRST WORD OF SECTOR IS
                             THE TRACK AND SECTOR ADDRESS
          SHN    8
          ADML   SS+/SS/P.CURSEC
          SBML   BUFF
          NJN    CK40        IF COMPARE ERROR
          UJK    CKX

* DATA COMPARE ERROR.

 CK40     BSS
          LDML   SS+/SS/P.CPERR  SET COMPARE ERROR FLAG
          LPC    -/SS/K.CPERR
          ADK    /SS/K.CPERR
          STML   SS+/SS/P.CPERR
          UJK    CKX
          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    815         ISD-1   CONFIDENCE TEST CYLINDER
          CON    699         ISD-2   CONFIDENCE TEST CYLINDER
 SECCYL   CON    320         ISD-1 - NUMBER OF SECTORS PER CYLINDER
          CON    1128        ISD-2 - NUMBER OF SECTORS PER CYLINDER
          EJECT



          QUAL   *
          ERRPL  *-BUFF

