          IDENT  HYD
          CIPPU
          MEMSEL 8
          TITLE  HYD
          COMMENT *SMD* LVL=02
          COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
 CONTYP   EQU    12           CONTROLLER TYPE
                               = 2, FOR 7154 CONTROLLER
                               = 3, FOR 7155-1 CONTROLLER
                               = 4, FOR 7155-1X CONTROLLER
                               = 5, FOR 7155-4X CONTROLLER, 170 CHANNEL
                               = 7, FOR 7155-4X CONTROLLER, 180 CHANNEL
                               = 10, FOR ISD SUBSYSTEM
                               = 12, FOR HYDRA
*copyc IODMAC1 "{RECORD DEFINITION MACROS}
*copyc IODMAC2 "{LOAD/STORE MACROS}
*copyc IODMAC3 "{GENERAL MACROS}
*copyc IODMAC4 "{GENERAL MACROS}
          SPACE  6
 TIMER    MACRO  TM
 TT1      IFEQ   TIMES,1
          LDN    1
          STDL   WC
          LOADR  TIMAD
          CRML   TM,WC
 TT1      ENDIF
          ENDM
          SPACE  6
 TIMER2   MACRO  TM
 TT2      IFEQ   TIMES2,1
          LDN    1
          STDL   WC
          LOADR  TIMAD
          CRML   TM,WC
 TT2      ENDIF
          ENDM
          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
 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
 HARDW    EQU    1           = 1, TO RUN ON THE HARDWARE,
                             .NE. 1 TO RUN ON THE SIMULATOR
 PAT      EQU    1           =1, TO PATCH THE PP
 ERRTST   EQU    0           =1, TO TEST ERROR HANDLING CODE
 STREAM   EQU    1           = 1, TO STREAM REQUESTS
 VALID    EQU    0           = 1, TO VALIDATE CP TABLES
 TIMES    EQU    0           = 1, TO GATHER TIMINGS
 TIMES2   EQU    0           = 1, TO GATHER TIMINGS
 TRACE    EQU    0           = 1, TO TRACE FUNCTIONS
 CMSE     EQU    0           = 1, TO RUN WITH CMSE


* EQUATES

 DC       EQU    22          DISK CHANNEL
 SBYTE8   EQU    1024        NUMBER OF 16-BIT BYTES PER SECTOR
 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
 DHYDRA   EQU    0           INTERNAL DEVICE CODE

* ISI CHANNEL ADAPTER FUNCTION CODES.

 F.MC     EQU    0           MASTER CLEAR
 F.RDCR   EQU    400B        READ CONTROL REGISTER
 F.WTCR   EQU    401B        WRITE CONTROL REGISTER
 F.RDMR   EQU    1000B       READ MASK REGISTER
 F.WTMR   EQU    1001B       WRITE MASK REGISTER
 F.RDES   EQU    1400B       READ ERROR STATUS
 F.RDOS   EQU    2000B       READ OPERATIONAL STATUS
 F.RIS    EQU    2400B       REQUEST IDLE STATUS
 F.RDT    EQU    3000B       READ T REGISTER
 F.WTT    EQU    3001B       WRITE T REGISTER
 F.RDTS   EQU    3400B       READ TEST SEED
 F.WTTS   EQU    3401B       WRITE TEST SEED
 F.CSH    EQU    4000B       CLEAR SELECT HOLD
 F.SSH    EQU    4001B       SET SELECT HOLD
 F.CCS    EQU    4400B       CLEAR COMMAND SEQUENCE
 F.SCS    EQU    4401B       SET COMMAND SEQUENCE
 F.FSO    EQU    5000B       FORCE SYNC OUT
 F.SPM    EQU    5400B       SET PP MODE
 F.CDM    EQU    6000B       CLEAR DMA MODE
 F.SDM    EQU    6001B       SET DMA MODE
 F.CEM    EQU    6400B       CLEAR ECHO MODE
 F.SEM    EQU    6401B       SET ECHO MODE
 F.CT     EQU    7000B       CLEAR T REGISTERS
          SPACE  6
* FUNCTION WORD BIT DEFINITIONS

 T.SEL    EQU    400B        SELECT A CONTROLLER
 T.PO     EQU    200B        PRIORITY OVERRIDE
 T.BMR    EQU    40B         BROADCAST MASTER RESET
 T.NI     EQU    1000B       NON-INTERLOCKED TRANSFER
 T.TER    EQU    2000B       TERMINATE
 T.ZFI    EQU    4000B       ZERO FILL INHIBIT
 T.CA     EQU    10000B      CLEAR ATTENTION
 T.DATA   EQU    20000B      DATA / FUNCTION
 T.SR     EQU    40000B      SELECTIVE RESET
 T.OUT    EQU    100000B     WRITE / READ DIRECTION OF INFORMATION
          SPACE  3
* FUNCTION WORDS TO CONTROLLER.

 W.CMND   EQU    T.OUT+T.ZFI   WRITE A COMMAND TO COMMAND BLOCK 0
 W.STAT   EQU    200B+T.ZFI   READ HYDRA STATUS BLOCK
 W.DST    EQU    220B+T.ZFI   READ DEVICE STATUS BLOCK
 W.HOST   EQU    377B+T.ZFI   READ HYDRA HOST ID
 W.SEC    EQU    360B+T.ZFI   READ HYDRA SECTOR SIZE
 W.ATD    EQU    T.OUT+207B+T.ZFI  WRITE ATTENTION DELAY
 W.DOP    EQU    T.OUT+210B+T.ZFI  WRITE DEVICE OPERATING MODE
 W.READ   EQU    T.DATA+T.NI+T.ZFI  READ DATA
 W.READT  EQU    W.READ+T.TER  READ DATA AND TERMINATE
 W.WRITE  EQU    T.OUT+W.READ  WRITE DATA
 W.WRITT  EQU    W.WRITE+T.TER  WRITE DATA AND TERMINATE
 W.RESET  EQU    T.SR+T.CA+T.ZFI   SELECTIVE RESET
 W.RDI    EQU    T.DATA+T.TER+T.ZFI  READ DATA IN INTERLOCKED MODE
                             USED TO READ ERROR REGISTER IMAGE, ERROR LOG
 W.RCMND  EQU    0+T.ZFI       READ COMMAND BLOCK 0
 W.RCMND7 EQU    W.RCMND+7 READ WORD 7 OF COMMAND BLOCK 0
 W.CA     EQU    T.CA+T.ZFI  CLEAR ATTENTION
          SPACE  6
* COMMANDS TO THE CONTROLLER.
* TO BE PUT IN THE COMMAND BLOCK.

 R.REL    EQU    1           READ ERROR LOG
 R.RERI   EQU    2           READ ERROR REGISTER IMAGE
 R.PDOWN  EQU    22B         POWER DOWN SPINDLE
 R.PUP    EQU    23B         POWER UP SPINDLE
 R.WRITE  EQU    40B         WRITE SPECIFIED
 R.WDE    EQU    50B         WRITE DATA AND ECC
 R.READ   EQU    60B         READ SPECIFIED
 R.RDE    EQU    63B         READ DATA AND ECC
 R.SD     EQU    70B         SALVAGE DATA
 R.WB     EQU    112B        WRITE BUFFER
 R.RB     EQU    114B        READ BUFFER
 R.CFS    EQU    115B        CLEAR FAULT STATUS
 R.EEL    EQU    122B        ERASE ERROR LOG
 R.LOM    EQU    123B        LOAD OPERATING MODE
 R.LAD    EQU    124B        LOAD ATTENTION DELAY PARAMETERS
 R.DIAG2  EQU    160B        RUN LEVEL II DIAGNOSTICS
 R.DIAG   EQU    172B        RUN LEVEL I DIAGNOSTICS
                             (LEVEL II DIAGNOSTIC COMMAND 7A)
 R.DIAGS  EQU    170B        RUN DIAGNOSTIC COMMAND 78
 R.DIAGW  EQU    171B        RUN DIAGNOSTIC COMMAND 79
          EJECT
* CONFIGURED UNITS.

 UN       RECORD PACKED

* WORD 1

 UNUSED   SUBRANGE 0,77777B
 LOCK     BOOLEAN            NONZERO IF UNIT IS LOCKED BY THIS PP

* WORD 2

 CTST     BOOLEAN            NONZERO IF THE CONFIDENCE TEST WAS STARTED
 FILL     SUBRANGE 0,7
 CHIX     SUBRANGE 0,77B     INDEX TO CHANT TABLE
 CM       SUBRANGE 0,7       CONTROLLER NUMBER
 UNIT     SUBRANGE 0,7       UNIT NUMBER

* WORD 3

 LUN      PPWORD             LOGICAL UNIT NUMBER

* WORD 4

 UIT      STRUCT 6           RMA OF UNIT INTERFACE TABLE (REFORMATTED)

* WORD 7

 CB       STRUCT 6           RMA OF UNIT COMMUNICATION BUFFER (REFORMATTED)

* WORD 10

 RCNT     PPWORD             COMMAND COUNTER (INCREMENTED FOR EACH COMMAND
                             SENT TO HYDRA)
                             USED TO TIMEOUT A COMMAND ON DUAL ACCESS
                             SS+/SS/P.RCNT HAS LATEST COMMAND COUNTER VALUE

* WORD 11

 ELAPT    PPWORD             ELAPSED TIME FOR OUTSTANDING COMMAND

* WORD 12 - 13

 QSTRT    STRUCT 4           START OF QUEUE ( UIT + 4)



          MGEN   N.CHIX
 M.CHIX   EQU    MASK$
          MGEN   N.CM
 M.CM     EQU    MASK$
          MASKP  CM
 K.CM     EQU    MSK
          MASKP  UNIT
 K.UNIT   EQU    MSK
          MASKP  CTST
 K.CTST   EQU    MSK

 UN       RECEND
          SPACE  10
* CONFIGURED CHANNELS.

 CH       RECORD PACKED

* WORD 1

 CHAN     PPWORD             CHANNEL NUMBER

* WORD 2

 FILL1    BOOLEAN
 PORT     BOOLEAN            PORT B IF SET
 FILL2    SUBRANGE 0,37777B

* WORD 3

 LOCK     PPWORD             ADDRESS OF CHANNEL LOCK FLAG

* WORD 4
 ATTN     PPWORD             ATTENTION BITS FROM CHANNEL

* WORD 5
 DOWN     PPWORD             NONZERO IF CHANNEL IS DOWN




          MASKP  PORT
 K.PORT   EQU    MSK

 CH       RECEND
          SPACE  10
* T REGISTER VALUES.

 TR       RECORD PACKED

* WORD 1

 LEN      PPWORD             LENGTH IN BYTES

* WORDS 2 AND 3

 RMA      STRUCT 4           REAL MEMORY ADDRESS

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

 SS       RECORD PACKED

* WORD 1

 FILL1    SUBRANGE 0,777B
 INIT     BOOLEAN            NONZERO IF SS ENTRY HAS BEEN INITIALIZED
 FNC      BOOLEAN            FUNCTION CODE  READ = 0
                                            WRITE = 1
 FRST     BOOLEAN            = 0, IF FIRST TIME THROUGH UNCMND
 SEEK     BOOLEAN            NONZERO IF SEEK HAS BEEN ISSUED
 CUR      BOOLEAN            CURRENT REQUEST HAS BEEN SELECTED (IF SET)
 DV       SUBRANGE 0,3       DEVICE TYPE

* WORD 2

 RCNT     PPWORD             COMMAND COUNTER

* WORD 3

 TOVAL    PPWORD             TIMEOUT VALUE IN SECONDS FOR OUTSTANDING COMMAND

* WORDS 4 - 7 = COMMAND BLOCK WORDS 4 - 7.

 NSEC     PPWORD             NUMBER OF SECTORS TO END OF CYLINDER
*
 PCYL     PPWORD             CYLINDER ADDRESS
*
 PTRK     SUBRANGE 0,377B    TRACK ADDRESS
 PSEC     SUBRANGE 0,377B    SECTOR ADDRESS
*
 CER      BOOLEAN            COMMAND EXECUTE REQUEST FLAG (SET BY PP,
                             CLEARED BY CONTROLLER)
 FUNC     SUBRANGE 0,77777B  COMMAND CODE
*

* WORD 8 - END = SAVED INFORMATION PER UNIT.

 CMND     PPWORD             NONZERO IF OUTSTANDING COMMAND
                             =1, IF READ / WRITE SPECIFIED
                             =2, IF SALVAGE DATA
                             =3, IF POWER UP SPINDLE
                             =4, IF READ ERROR LOG
                             =5, IF READ ERROR REGISTER IMAGE
                             =6, IF RUN LEVEL I DIAGNOSTICS
                             =7, IF RUN LEVEL II DIAGNOSTIC COMMAND 78
                             =8, IF READ BUFFER
                             =9, IF WRITE BUFFER
                             =10, IF LOAD OPERATING MODE
                             =11, IF LOAD ATTENTION DELAY PARAMETERS
                             =12, IF READ ERROR LOG IN NORMAL REQUEST COMPLETION
                             =13, IF RUN LEVEL II DIAGNOSTIC COMMAND 79
                             =14, IF RUN LEVEL II DIAGNOSTICS
                             =15, IF WRITE CONFIDENCE TEST
                             =16, IF READ CONFIDENCE TEST
                             =17, IF WRITE TO CONTROLLER BUFFER
                             =18, IF READ FROM CONTROLLER BUFFER

 QP       STRUCT 4           CURRENT QUEUE POINTER
 CYL      PPWORD             CYLINDER ADDRESS
 TRACK    SUBRANGE 0,377B    TRACK ADDRESS
 SECTOR   SUBRANGE 0,377B    SECTOR ADDRESS
 REQ      STRUCT 4           CURRENT REQUEST (UNFORMATTED RMA)
 PVA      STRUCT 6           PVA OF CURRENT REQUEST

 CML      PPWORD             INDEX TO CMLIST
 CI       PPWORD             INDEX TO CMWORK TABLE
 LASTC    PPWORD             OFFSET OF COMMAND IN REQUEST
 NUMCM    PPWORD             NUMBER OF COMMANDS LEFT TO PROCESS IN
                             THIS REQUEST
 LISTL    PPWORD             NUMBER OF CM WORDS IN ADDRESS-LENGTH PAIR LIST.
                             (INCLUDES THE NUMBER OF WORDS WHICH HAVENT
                             BEEN READ FROM CM.)
 TOTAL    STRUCT 4           TOTAL CM WORDS LEFT TO TRANSFER BEFORE TERMINATING
 FCOMRQ   STRUCT 4           FIRST COMPLETED REQUEST (RMA)
 CURRQ    STRUCT 4           CURRENT REQUEST (RMA).  DELRQ DELINKS FCOMRQ
                             THROUGH CURRQ
 CURRQ2   STRUCT 4           REQUEST TO BE STARTED DURING ERROR RECOVERY.
                             IT IS EITHER THE SAME AS PRERQ, OR THE NEXT ONE
                             IN THE CHAIN.  ALSO, IT IS EITHER THE SAME AS CURRQ,
                             OR THE ONE BEFORE CURRQ IN THE CHAIN.
 PRERQ    STRUCT 4           LAST REQUEST IN WHICH A RESPONSE WAS SENT DURING
                             STREAMING, SO THAT, DURING ERROR RECOVERY, THESE
                             REQUESTS CAN BE DELINKED.  NOT VALID UNLESS
                             NCOMRQ > 1.
 NCOMRQ   PPWORD             NUMBER OF COMPLETED REQUESTS WHICH HAVE SENT RESPONSES
 NCOMW    PPWORD             NUMBER OF COMPLETED REQUESTS WHICH HAVE NOT SENT
                             RESPONSES
 SWFLG    PPWORD             NONZERO IF A STREAMING REQUEST SWITCH WAS MADE
                             BITS 0 AND 1 WORK TOGETHER TO REPRESENT
                             STREAMING FLAGS FOR THE LAST 2 REQUESTS
 CURTRK   PPWORD             CURRENT TRACK
 CURSEC   PPWORD             CURRENT SECTOR
 RECOV    PPWORD             NONZERO IF IN RECOVERY

 WTA      BOOLEAN            SET WHEN WAITING FOR ATTENTION DURING ERROR RECOVERY
 MCTRY    SUBRANGE 0,7       CHANNEL MASTER CLEAR RETRY COUNTER
 SRTRY    SUBRANGE 0,7       SELECTIVE RESET RETRY COUNTER
 ERI      SUBRANGE 0,7       READ ERROR REGISTER IMAGE RETRY COUNTER
 ELOG     SUBRANGE 0,7       READ ERROR LOG RETRY COUNTER
 NR       SUBRANGE 0,7       NOT READY RETRY COUNT

 RESET    BOOLEAN            NONZERO IF SELECTIVE RESET WAS ISSUED
 CONF     BOOLEAN            NONZERO IF RUNNING THE CONFIDENCE TEST
 FILL3    SUBRANGE 0,377B
 RVCNT    SUBRANGE 0,77B     COUNT OF RECOVERED ERRORS PER REQUEST

 IRSET    BOOLEAN            NONZERO IF INITIAL SELECTIVE RESET HAS BEEN ISSUED
 CPERR    BOOLEAN            NONZERO IF THERE WAS A COMPARE ERROR IN
                             THE CONFIDENCE TEST
 CWRITE   BOOLEAN            NONZERO IF WRITE PORTION OF THE CONFIDENCE TEST
 FILL4    SUBRANGE 0,1777B
 STV      SUBRANGE 0,7       INDEX TO TABLE OF DATA PATTERNS FOR THE
                             CONFIDENCE TEST
          ALIGN  0,64
 NMED     PPWORD             NUMBER OF MEDIA ERRORS IN CONFIDENCE TEST
 NMEDL    EQU    3           NUMBER OF ACCEPTED MEDIA ERRORS IN CONFIDENCE CYLINDER
 MEDERR   STRUCT 2*4         SECTOR OFFSET OF MEDIA ERRORS ENCOUNTERED (LENGTH = NMEDL+1)


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

          ALIGN  0,64
 RQ       STRUCT 40          REQUEST

 CIL      EQU    4           LENGTH OF CMWORK TABLE
 CMLIST   STRUCT 8*CIL       CURRENT DATA ADDRESS OR CURRENT COMMAND
 CMWORK   STRUCT CIL*2       ORIGINALLY EQUAL TO THE BYTE LENGTHS FROM CMLIST

* RESPONSE.

 RS       STRUCT 320         RESPONSE


          MGEN   N.CUR
 M.CUR    EQU    MASK$
          MGEN   N.SEEK
 M.SEEK   EQU    MASK$
          MASKP  SEEK
 K.SEEK   EQU    MSK
          MASKP  FNC
 K.FNC    EQU    MSK
          MASKP  FRST
 K.FRST   EQU    MSK
          MASKP  CUR
 K.CUR    EQU    MSK
          MASKP  INIT
 K.INIT   EQU    MSK
          MGEN   N.DV
 M.DV     EQU    MASK$
          MASKP  CER
 K.CER    EQU    MSK
          MGEN   N.TRACK
 M.TRACK  EQU    MASK$
          MGEN   N.SECTOR
 M.SECTOR EQU    MASK$
          MASKP  WTA
 K.WTA    EQU    MSK
          MASKP  MCTRY
 K.MCTRY  EQU    MSK
          MGEN   N.MCTRY
 M.MCTRY  EQU    MASK$
          MASKP  SRTRY
 K.SRTRY  EQU    MSK
          MGEN   N.SRTRY
 M.SRTRY  EQU    MASK$
          MASKP  ERI
 K.ERI    EQU    MSK
          MGEN   N.ERI
 M.ERI    EQU    MASK$
          MASKP  ELOG
 K.ELOG   EQU    MSK
          MGEN   N.ELOG
 M.ELOG   EQU    MASK$
          MASKP  NR
 K.NR     EQU    MSK
          MGEN   N.NR
 M.NR     EQU    MASK$
          MASKP  RESET
 K.RESET  EQU    MSK
          MASKP  CONF
 K.CONF   EQU    MSK
          MASKP  RVCNT
 K.RVCNT  EQU    MSK
          MGEN   N.RVCNT
 M.RVCNT  EQU    MASK$
          MASKP  IRSET
 K.IRSET  EQU    MSK
          MASKP  CWRITE
 K.CWRITE EQU    MSK
          MASKP  CPERR
 K.CPERR  EQU    MSK
          MASKP  STV
 K.STV    EQU    MSK
          MGEN   N.STV
 M.STV    EQU    MASK$

 SS       RECEND

          ERRPL  C.SS-64-1
          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
 PORT     SUBRANGE 0,3       PORT B IS SET
 CNTRLR   SUBRANGE 0,77B     CONTROLLER NUMBER
 UNIT     PPWORD             PHYSICAL UNIT NUMBER
 UQT      RMA                UNIT INTERFACE TABLE (RMA)




          MGEN   N.CHAN
 M.CHAN   EQU    MASK$

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

 PORT     BOOLEAN            PORT B IF SET
 CHAN     SUBRANGE 0,77777B  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 CONTROLLER WAS ATTEMPTED
 K.CMLDS  EQU    2           CONTROLLER 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.SR     EQU    1000B       SELECTIVE RESET WAS ATTEMPTED
 K.SRS    EQU    2000B       SELECTIVE RESET WAS SUCCESSFUL
 K.XD1    EQU    4000B       EXECUTING LEVEL I DIAGNOSTICS
 K.XDP1   EQU    10000B      LEVEL I DIAGNOSTICS PASSED
 K.UDN    EQU    20000B      UNIT DOWN
 K.CMDN   EQU    40000B      CONTROLLER DOWN
 K.CHDN   EQU    100000B     CHANNEL DOWN

 ID2      PPWORD
 K.ICM    EQU    1           INCOMPLETE COMMAND BLOCK TRANSFER
 K.SADCM  EQU    2           SELECT ACTIVE DROPPED WHEN WRITING COMMAND BLOCK
 K.ISTT   EQU    4           INCOMPLETE STATUS TRANSFER
 K.SADST  EQU    10B         SELECT ACTIVE DROPPED WHEN READING HYDRA STATUS
 K.IDS    EQU    20B         INCOMPLETE DEVICE STATUS TRANSFER
 K.SADDS  EQU    40B         SELECT ACTIVE DROPPED WHEN READING DEVICE STATUS
 K.IER    EQU    100B        INCOMPLETE ERROR REGISTER IMAGE TRANSFER
 K.SADER  EQU    200B        SELECT ACTIVE DROPPED WHEN READING ERROR REGISTER
                             IMAGE
 K.IEL    EQU    400B        INCOMPLETE ERROR LOG TRANSFER
 K.SADEL  EQU    1000B       SELECT ACTIVE DROPPED WHEN READING ERROR LOG
 K.SADAT  EQU    2000B       SELECT ACTIVE DROPPED WHEN TRANSFERRING DATA
 K.IES    EQU    4000B       INVALID EXECUTION STATUS
 K.XFER   EQU    10000B      I4 DETECTED ERROR DURING DATA TRANSFER
 K.XFRTO  EQU    20000B      TIMEOUT ON T' NOT EMPTY OR TRANSFER IN PROGRESS
 K.TRTO   EQU    40000B      TIMEOUT ON T REGISTER BYTE COUNT NONZERO
 K.SAC    EQU    100000B     SELECT ACTIVE DID NOT CLEAR


 STRY     PPWORD             SECTOR RETRY COUNT

* WORD 9.

 ESREG    PPWORD             ERROR STATUS REGISTER
 EID      PPWORD             PP ERROR STATUS
 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     CONTROLLER INTERFACE ERROR

* WORD 10.

 OPSTAT   PPWORD             OPERATIONAL STATUS REGISTER
 TREG     STRUCT 6           T REGISTER

* WORD 11.

 CREG     PPWORD             CONTROL REGISTER
 FMREG    PPWORD             FLAG MASK REGISTER
 IDSTAT   PPWORD             IDLE STATUS
 BSR      PPWORD             BSR IF INVALID

* WORD 12.

          ALIGN  0,64
 CMST1    STRUCT 12          CONTROLLER STATUS, WORDS 80 - 85.
                             THE FIRST TIME ERROR WAS ENCOUNTERED.
 DST1     STRUCT 8           DEVICE STATUS, WORDS 90 - 93.
                             THE FIRST TIME ERROR WAS ENCOUNTERED.
 CMST2    STRUCT 12          CONTROLLER STATUS, WORDS 80 - 85.
                             THE LAST TIME ERROR WAS ENCOUNTERED.
 DST2     STRUCT 8           DEVICE STATUS, WORDS 90 - 93.
                             THE LAST TIME ERROR WAS ENCOUNTERED.

* WORDS 17 - 28.

          ALIGN  0,64
 ERI      STRUCT 96          ERROR REGISTER IMAGE

* WORDS 29 - 40.

 ELOG     STRUCT 96          ERROR LOG


          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$
          MGEN   N.UNIT
 M.UNIT   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 CONTROLLER CONTROLWARE
          STRUCT 24
          STRUCT 24

          ALIGN  0,64
 ZERO     STRUCT 272         CONTAINS ALL ZEROES

          ALIGN  0,64
 WRDL     EQU    512+151     NUMBER OF CM WORDS FOR WRITE DATA
 WRDL1    EQU    WRDL*8      NUMBER OF BYTES FOR WRITE DATA
 RDDL     EQU    512         NUMBER OF CM WORDS FOR READ DATA
 RDDL1    EQU    RDDL*8      NUMBER OF BYTES FOR READ DATA
 WRD      STRUCT WRDL1       READ AND WRITE DATA FOR CONFIDENCE TEST

          ALIGN  0,64
 OVR      STRUCT 552         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

          ORG    5

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

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

 CH       BSSZ   1           INDEX TO CHANNEL TABLE, CHANT
 CMNDS    BSSZ   1           NUMBER OF OUTSTANDING COMMANDS TO CONTROLLER
 SEKCNT   CON    0           SEEK COUNT. NUMBER OF UNITS TO WHICH A SEEK WAS
                             ISSUED
 CMOD     BSSZ   1           CONTROLLER NUMBER
 UX       BSSZ   1           INDEX TO UNITS TABLE
 FI       CON    0           INDEX TO FUNCTION HISTORY BUFFER
 SI       CON    0           INDEX TO CONTROLLER STATUS HISTORY BUFFER

 OPSTAT   BSSZ   1           OPERATIONAL STATUS
 CI       BSSZ   1           INDEX TO CMWORK TABLE
 CML      BSSZ   1           INDEX TO CMLIST
 NT       BSSZ   1           INDEX TO TREG
 TOTAL    BSSZ   1           TOTAL SECTORS TO TRANSFER
 TWDS     BSSZ   2           TOTAL NUMBER OF CM WORDS TO TRANSFER TO THE
                             CM ADDRESS.
 WDS      BSSZ   1           NUMBER OF CM WORDS TO TRANSFER FROM CURRENT SECTOR.
 WDS2     BSSZ   1           CM WORDS TO TRANSFER
 WDSS     BSSZ   1           USED TO UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
 WDSS2    BSSZ   1           USED TO UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
 SECPOS   BSSZ   1           SECTOR BUFFER TRANSFER POSITION (TO CM)
 FUNCD    BSSZ   1           FUNCTION CODE
 MOVFC    BSSZ   1           MOVE DATA FUNCTION CODE
 FNC      BSSZ   1           FUNCTION CODE (INTERNAL)
 CREG     CON    0           CONTROL REGISTER
 BSR      BSSZ   1           BIT SIGNIFICANT RESPONSE
 CMFUN    BSSZ   1           CONTROLLER FUNCTION
 CMADR    BSSZ   3           CM ADDRESS

 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

 NOLOCK   EQU    75B         THIS VALUE IN LOCKS MEANS NO LOCK IS SET
 LOCKS    CON    NOLOCK      USED SO LOCK DOESN'T GET CLEARED UNTIL A
                             DIFFERENT LOCK IS SET. (UX INDEX)
 LUX      BSSZ   1           VALUE OF UNIT INDEX OF LAST UNIT SELECTED
 UNUML    BSSZ   1           LENGTH OF CONFIGURED UNIT ENTRIES
 CNUML    BSSZ   1           LENGTH OF CONFIGURED ENTRIES IN CHANT TABLE
 FRSTSC   BSSZ   1           FIRST SECTOR FLAG
 PIDLE    BSSZ   1           PRE-IDLE FLAG.  WHEN SET, DON'T ISSUE ANY
                             SEEKS.  BUT FINISH OUTSTANDING COMMANDS.
 IALF     BSSZ   1           BIT 0 = 1, IF ALL CHANNELS HAVE BEEN INITIALIZED
                             BIT 1 = 1, IF INITIAL RESET HAS BEEN ISSUED
                             ON ALL CONTROLLERS
                             BIT 2 = 1, IF CONFIDENCE TEST HAS BEEN STARTED
                             ON ALL CONTROLLERS
          SPACE  3
          ORG    72B

 DSRTP    CON    0           HCS REAL MEMORY WORD-ADDRESS
          CON    1
 SAVUX    EQU    DSRTP       USED TO SAVE UX INDEX
 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
 RESPC    EQU    76B         RESPONSE CODE
 LFF00    BSSZ   1
          EJECT
          ORG    100B
          LJM    INIT1
          CON    CONTYP      USED FOR DUMP IDENTIFICATION
          SPACE  6
 HALT     CON    0           HALT THE PP
          UJN    *
          SPACE  6
 PROC600  BSSZ   1           UNWANTED ATTENTIONS FOR READ DATA AVAILABLE
 PROC610  BSSZ   1           UNWANTED ATTENTIONS FOR BUFFER SPACE AVAILABLE
 PROC620  BSSZ   1           UNWANTED ATTENTIONS FOR COMMAND COMPLETE


 CURCH    CON    DC          CURRENT CHANNEL NUMBER

 FMREG    CON    377B        FLAG MASK REGISTER
          SPACE  6
* TRANSFER SIZE BEFORE SUSPENDING (64-BIT WORDS).

 XFERSZ   EQU    100000B     TRANSFER SIZE BEFORE SUSPENDING (64-BIT WORDS)
 XFERSZ2  EQU    8192        (16 SECTORS)

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

 SECWDS   EQU    2048        SECTOR SIZE (IN 16-BIT BYTES)

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

 SECSC    EQU    1

* NUMBER OF SECTORS PER TRACK FOR EACH DEVICE.

 DVSEC    EQU    38          HYDRA

* NUMBER OF TRACKS PER CYLINDER FOR EACH DEVICE.

 DVTRK    EQU    4           HYDRA

* NUMBER OF CM BYTES TO TRANSFER FOR EACH SECTOR.

 CMBTS    EQU    4096        SECTOR SIZE IN BYTES
          SPACE  4
 FW.CMND  CON    W.CMND      HYDRA FUNCTION TO WRITE COMMAND BLOCK
 FW.STAT  CON    W.STAT      HYDRA FUNCTION TO READ STATUS
 FW.HOST  CON    W.HOST      HYDRA FUNCTION TO READ HOST ID
 FW.SEC   CON    W.SEC       HYDRA FUNCTION TO READ SECTOR SIZE
 FW.CA    CON    W.CA        HYDRA FUNCTION TO CLEAR ATTENTION
          SPACE  6
 CM.CB    BSSZ   3           CM ADDRESS OF PP COMMUNICATION BUFFER (REFORMATTED)
 CM.CBU   BSSZ   2           CM ADDRESS OF PP COMMUNICATION BUFFER (UNFORMATTED)
 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


 TT11     IFEQ   TIMES,1
 TIMAD    CON    0           CM ADDRESS OF MICROSECOND CLOCK
          CON    4000B       100,000 (16)
          CON    0
 TT11     ENDIF

          SPACE  2
          EJECT
 DISK     BSS
          RJM    RDOVL
          RJM    ICOM        INITIALIZE UNIT TABLES

 MAIN10   BSS
 K1       IFEQ   PAT,1
          RJM    PATCH       PATCH THE PP
 K1       ENDIF
          RJM    PPREQ       CHECK FOR ANY PP REQUESTS

* PROCESS UNIT REQUESTS.

 MAIN15   BSS
          LDDL   UNUML
          ZJN    MAIN50      IF NO UNITS
          LDML   IDLE
          NJN    MAIN50      IF IDLE COMMAND, ONLY PROCESS PP REQUESTS
          LDDL   PIDLE
          NJN    MAIN40      IF PRE-IDLE, DON'T ISSUE NEW REQUESTS

          LDDL   IALF
          SBN    7
          ZJN    MAIN40      IF EVERYTHING INITIALIZED
          LDDL   IALF
          LPN    1
          NJN    MAIN20      IF ALL CHANNELS HAVE BEEN INITIALIZED
          RJM    IALCH       INITIALIZE CHANNEL ADAPTER ON ALL CHANNELS
          UJN    MAIN50      MAKE SURE ALL CHANNELS ARE INITIALIZED
                             BEFORE CONTINUING

 MAIN20   BSS
          LDDL   IALF
          LPN    2
          NJN    MAIN30      IF INITIAL RESET HAS BEEN ISSUED ON ALL CONTROLLERS
          RJM    RESALL      ISSUE SELECTIVE RESET TO ALL CONTROLLERS

 MAIN30   BSS
          LDDL   IALF
          LPN    4
          NJN    MAIN40      IF CONFIDENCE TEST HAS BEEN STARTED ON ALL CONTROLLERS
          RJM    CTEST       START CONFIDENCE TEST ON ALL CONTROLLERS

 MAIN40   BSS
          RJM    GETUD       SELECT UNIT REQUESTS, SEEK,
                             AND PROCESS ATTENTIONS
 MAIN50   BSS
          SOML   CHLCNT
          NJN    MAIN55      IF PP DOESN'T HAVE TO GIVE UP CHANNEL
          RJM    CKCHAN      CHECK IF CHANNEL MUST BE GIVEN UP
 MAIN55   BSS
          UJK    MAIN10
          EJECT

* UNIT COMMANDS

 UCMD     BSS
          CON    C.READ
          CON    C.WRITE

* PP COMMANDS.

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

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

* PP COMMAND PROCESSORS.

 K3       IFEQ   T1,0
          CON    STOP        SET UNIT DISABLE
          CON    ONUN        CLEAR UNIT DISABLE FLAG
 K3       ENDIF
          EJECT
** NAME-- GETUD
*
** PURPOSE-- GET A UNIT REQUEST FROM CENTRAL.
*            ISSUE ALL SEEKS.
*
** NOTE-- EXIT ONLY IF THERE WAS NO ACTIVITY ON ANY OF THE UNITS.
          SPACE  6
 GETUX    LJM    **
 GETUD    EQU    *-1
          LDDL   UNUML
          ZJK    GETUX       IF NO UNITS
          RJM    RDATTN      READ ATTENTION BITS
          RJM    RCLOCK      READ THE CLOCK
          LDDL   LUX         UNIT INDEX OF LAST REQUEST FOUND + 1
          STML   STUX
          UJN    GETU15

* GO TO NEXT UNIT ENTRY.

 GETU10   BSS
          LDDL   LUX         HAVE ALL ENTRIES BEEN CHECKED
          SBML   STUX
          ZJK    GETUX       IF NO MORE ENTRIES TO CHECK
 GETU15   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
          LOADR  UNITS+/UN/P.UIT,UX  ADDRESS OF UNIT INTERFACE TABLE
          ERRNZ  /UIT/C.DSABLE
          CRDL   T1          READ UNIT DISABLED FLAG
          ADN    /UIT/C.NEXT
          CRDL   T5          READ RMA OF NEXT REQUEST FROM UNIT QUEUE
          SBN    /UIT/C.NEXT-/UIT/C.ULOCK
          CRDL   T3          READ UNIT LOCKWORD

* CHECK IF OTHER ACCESS HAS THE LOCK SET.

          LDDL   T3
          ZJN    GETU25      IF NO ACCESS HAS THE LOCK SET
          LDML   UNITS+/UN/P.LOCK,UX  IS UNIT LOCKED BY THIS PP
          ZJK    GETU10      IF UNIT IS NOT LOCKED BY THIS PP
                             THEN IT MUST BE LOCKED BY THE OTHER ACCESS

* GET SEEK ISSUED FLAG, COMMAND ID, AND TIMEOUT VALUE.

          LDDL   LOCKS       CHECK IF SS ENTRY IS STILL IN MEMORY
          SBDL   UX
          NJN    GETU25      IF SS ENTRY IS NOT IN MEMORY
          LDML   SS+/SS/P.SEEK  GET SEEK ISSUED FLAG
          STDL   P1
          LDML   SS+/SS/P.RCNT  GET COMMAND ID
          STDL   P2
          LDML   SS+/SS/P.TOVAL  GET TIMEOUT VALUE
          STDL   P3
          UJN    GETU30

 GETU25   BSS
          LOADR  UNITS+/UN/P.CB,UX  ADDRESS OF UNIT COMMUNICATION  BUFFER
          CRDL   P1          CHECK IF SEEK HAS BEEN ISSUED
 GETU30   BSS
          ERRNZ  /SS/P.SEEK
          LDDL   P1          CHECK IF SEEK HAS BEEN ISSUED
          SHN    /SS/L.SEEK+2
          PJK    GETU65      IF SEEK HAS NOT BEEN ISSUED
          LDDL   T1+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJK    GETU10      IF UNIT IS DISABLED

* CHECK IF ATTENTION SET FOR THIS UNIT.

          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDML   UNITS+/UN/P.CHIX,UX  GET CHANNEL INDEX
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          LDML   CHANT+/CH/P.ATTN,CH  GET BUSY / ATTENTION BITS
          LPML   ATTAB,CMOD  ATTENTION BIT FOR THE CONTROLLER
          NJN    GETU40      IF ATTENTION IS SET

* CHECK FOR ATTENTION TIMEOUT.

          LDML   UNITS+/UN/P.ELAPT,UX  ELAPSED TIME
          SBDL   P3          /SS/P.TOVAL
          MJN    GETU35      IF COMMAND HAS NOT BEEN TIMED OUT
          LDDL   P2          /SS/P.RCNT
          SBML   UNITS+/UN/P.RCNT,UX  CURRENT COMMAND ID
          ZJK    GETU95      IF COMMAND HAS BEEN TIMED OUT
          LDDL   P2          GET LATEST COMMAND ID
          STML   UNITS+/UN/P.RCNT,UX  UPDATE CURRENT COMMAND ID
          LDN    0
          STML   UNITS+/UN/P.ELAPT,UX  CLEAR ELAPSED TIME
 GETU35   UJK    GETU10

 GETU40   BSS
          TIMER  TM1
          LDML   UNITS+/UN/P.LOCK,UX  IS UNIT LOCKED BY THIS PP
          ZJN    GETU45      IF UNIT IS NOT LOCKED
          RJM    GETSS       GET SS ENTRY
          UJN    GETU50

 GETU45   BSS
          RJM    SETLOCK     SET UNIT LOCK
          NJN    GETU35      IF LOCK COULD NOT BE SET

* RE-READ ATTENTION BITS NOW THAT LOCK IS SET.

          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          LDK    F.RIS       REQUEST IDLE STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    P6,DC       READ ATTENTION BITS
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    GETU47,DC   CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 GETU47   BSS
          LDDL   P6
          STML   CHANT+/CH/P.ATTN,CH  ATTENTION BITS
          LPML   ATTAB,CMOD
          NJN    GETU50      IF ATTENTION IS SET
          LDDL   UX          CLEAR THIS LOCK ONLY IF A NEW ONE IS SET
          STDL   LOCKS
 GETU48   BSS
          UJK    GETU10      GO TO NEXT ENTRY

* PROCESS ATTENTION.

 GETU50   BSS
          RJM    PROC        PROCESS ATTENTION
          TIMER  TM2

* READ ATTENTION BITS ON THIS CHANNEL ONLY.

 GETU55   BSS
          LDK    F.RIS       REQUEST IDLE STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    P6,DC       READ ATTENTION BITS
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    GETU60,DC   CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 GETU60   BSS
          LDDL   P6
          STML   CHANT+/CH/P.ATTN,CH  ATTENTION BITS

          UJK    GETU48

*
* CHECK FOR ANY REQUESTS ON THIS UNIT QUEUE.
*

 GETU65   BSS
          LDDL   T7
          ADDL   T8
          ZJN    GETU70      IF NO REQUESTS ON THIS QUEUE
          LDDL   T1+/UIT/P.DSABLE  CHECK IF UNIT IS DISABLED
          SHN    /UIT/L.DSABLE+2
          MJN    GETU70      IF UNIT IS DISABLED
          LDDL   PIDLE       CHECK PRE-IDLE FLAG
          NJN    GETU70      IF PRE-IDLE, DON'T ISSUE ANY SEEKS

          TIMER  TM3
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDML   UNITS+/UN/P.CHIX,UX  GET CHANNEL INDEX
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          LDML   UNITS+/UN/P.LOCK,UX  CHECK IF THIS PP ALREADY HAS THE LOCK SET
          ZJN    GETU75      IF THIS PP DOES NOT HAVE THE LOCK SET
          RJM    GETSS       GET SS ENTRY
          UJN    GETU80

 GETU70   UJK    GETU10

 GETU75   BSS
          LDN    0
          STML   CHANT+/CH/P.DOWN,CH  CLEAR CHANNEL DOWN FLAG

* SET UNIT LOCK.

          RJM    SETLOCK     SET UNIT LOCKWORD
          NJN    GETU70      IF LOCK COULD NOT BE SET
 GETU80   BSS
 M3       IFNE   CMSE,1
          LDML   UNITS+/UN/P.CTST,UX
          SHN    /UN/L.CTST+2
          PJN    GETU85      IF THE CONFIDENCE TEST HAS NOT BEEN RUN
 M3       ENDIF
          LDML   SS+/SS/P.CUR
          SHN    /SS/L.CUR+2
          MJN    GETU90      IF CURRENT REQUEST HAS BEEN SELECTED

* SELECT CURRENT REQUEST.

          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    GETU85      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    GETU90      IF A REQUEST WAS FOUND
 GETU85   BSS
*TEMPORARY
          LDDL   LOCKS
          SBDL   UX
          ZJN    GETU87
          LDDL   LOCKS
          SBN    NOLOCK
          NJN    GETU88      TEMPORARY HALT
*TEMPORARY END
          LDDL   UX          CLEAR THE LOCK ONLY IF A NEW ONE IS SET
          STDL   LOCKS
 GETU87   BSS
          TIMER  TM4
          UJK    GETU55

 GETU88   BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)

* ISSUE THE SEEK.

 GETU90   BSS
          LDML   SS+/SS/P.SEEK  MAKE THE CHECK AGAIN AFTER SETLOCK
          SHN    /SS/L.SEEK+2
          MJN    GETU85      IF SEEK HAS BEEN ISSUED
          RJM    SEEKI       ISSUE INITIAL SEEK
          UJK    GETU85

*
* LAST COMMAND TO HYDRA HAS BEEN TIMED OUT.
*

 GETU95   BSS
          LDML   UNITS+/UN/P.LOCK,UX  IS UNIT LOCKED BY THIS PP
          ZJN    GETU100     IF UNIT IS NOT LOCKED
          RJM    GETSS       GET SS ENTRY
          UJN    GETU110

 GETU100  BSS
          RJM    SETLOCK     SET UNIT LOCK
          NJK    GETU10      IF LOCK COULD NOT BE SET
 GETU110  BSS
          LDK    /RS/K.PTO   PUT COMMAND TIMEOUT FLAG IN RESPONSE
          RJM    SID         ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          RJM    SELCM       SELECT THE CONTROLLER
          RJM    ADPTERR     TRY TO RECOVER
*         (NO RETURN FROM ADPTERR.)
          EJECT
** NAME-- SEEKI
*
** PURPOSE-- ISSUE INITIAL SEEK.
          SPACE  6
 SEKIX    LJM    **
 SEEKI    EQU    *-1
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDML   UNITS+/UN/P.CHIX,UX  GET POINTER TO CHANT
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          RJM    GETRQ       GET REQUEST
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          RJM    SELCM       SELECT THE CONTROLLER
          RJM    SEEKCK      ISSUE INITIAL SEEK
          AODL   SEKCNT      INCREMENT 'SEEK ISSUED' COUNTER
          UJK    SEKIX
          EJECT
** NAME-- SEEKCK.
*
** PURPOSE-- ISSUE A SEEK AND RECOVER ANY SEEK ERRORS.
          SPACE  6
 SEEX     LJM    **
 SEEKCK   EQU    *-1

* SET COMMAND CODE FOR LOAD COMMAND BLOCK.

          LDML   SS+/SS/P.FNC  GET FUNCTION CODE
          SHN    /SS/L.FNC+2
          PJN    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

* COMPUTE NUMBER OF SECTORS TO END OF CYLINDER.

          LDML   SS+/SS/P.TRACK
          STML   SS+/SS/P.PTRK  PUT TRACK AND SECTOR ADDRESS IN COMMAND BLOCK
          SHN    -16+/SS/N.TRACK+/SS/L.TRACK
          STDL   T1          TRACK ADDRESS
          LDML   SS+/SS/P.SECTOR
          LPK    /SS/M.SECTOR
          STDL   T2          SECTOR ADDRESS
          LDN    DVSEC       NUMBER OF SECTORS PER TRACK
          SBDL   T2
          STML   SS+/SS/P.NSEC
          LDML   SEE100,T1   NUMBER OF SECTORS ON FULL TRACKS
          RAML   SS+/SS/P.NSEC  NUMBER OF SECTORS TO END OF CYLINDER
          LDML   SS+/SS/P.CYL  PUT CYLINDER ADDRESS IN COMMAND BLOCK
          STML   SS+/SS/P.PCYL


* WRITE THE COMMAND BLOCK.

          RJM    CMND        WRITE THE COMMAND BLOCK
          LDML   SS+/SS/P.SEEK  SET SEEK ISSUED FLAG
          LPC    -/SS/K.SEEK
          ADK    /SS/K.SEEK
          STML   SS+/SS/P.SEEK
          LDN    1
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    SEEX





 SEE100   BSS
          CON    38*3        TRACK 0
          CON    38*2        TRACK 1
          CON    38          TRACK 2
          CON    0           TRACK 3
          EJECT
** NAME-- CMND
*
** PURPOSE-- WRITE A COMMAND TO THE CONTROLLER.
          SPACE  6
 CMNDX    LJM    **
 CMND     EQU    *-1
          TIMER  TM5
          LDML   SS+/SS/P.CER  SET COMMAND EXECUTE REQUEST FLAG
          LPC    -/SS/K.CER
          ADK    /SS/K.CER
          STML   SS+/SS/P.CER
          LDC    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
 K4       IFEQ   TRACE,1
          LDML   FW.CMND
          RJM    TBUF        PUT IN TRACE BUFFER
 K4       ENDIF
          ACN    DC
          LDN    1
          OAM    FW.CMND,DC  FUNCTION WORD TO WRITE COMMAND BLOCK
          NJK    CMND80      IF TRANSFER DID NOT COMPLETE
          LDN    4
          OAM    CB,DC       SEND THE COMMAND BLOCK
          NJK    CMND80      IF TRANSFER DID NOT COMPLETE
          LDN    4
          OAM    SS+/SS/P.NSEC,DC
          RJM    DCN         DISCONNECT CHANNEL
*         (NO RETURN IF ERROR).

          RJM    WAITTR      WAIT FOR TRANSFER IN PROGRESS TO CLEAR
          LDC    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC

* SET A NEW COMMAND TIMEOUT VALUE IF THIS COMMAND HAS A
* LONGER TIMEOUT THAN THE REMAINING TIMEOUT VALUE.

 K5       IFEQ   TIMES,1
 CMND13   BSS
          RJM    RDATTN      READ ATTENTION BITS
          LDML   CHANT+/CH/P.ATTN,CH
          LPML   ATTAB,CMOD
          ZJK    CMND13
 K5       ENDIF
          TIMER  TM6
          LDML   SS+/SS/P.FUNC  LOAD COMMAND BLOCK FUNCTION
          LPC    177B
          SBN    R.PUP
          ZJN    CMND20      IF POWER UP SPINDLE
          ADC    -R.DIAG2+R.PUP
          ZJN    CMND30      IF LEVEL II DIAGNOSTICS
          SBN    R.DIAG-R.DIAG2
          NJN    CMND40      IF NOT LEVEL I DIAGNOSTICS

* LEVEL I DIAGNOSTICS, POWER UP SPINDLE

 CMND20   BSS
          LDC    210+1       SET TIMEOUT OF 210 SECONDS
          UJN    CMND50

* LEVEL II DIAGNOSTICS.

 CMND30   BSS
          LDC    600+1       SET TIMEOUT OF 10 MINUTES
          UJN    CMND50

* READ, WRITE.

 CMND40   BSS
          LDN    10+1         SET TIMEOUT OF 10 SECONDS
 CMND50   BSS
          STML   SS+/SS/P.TOVAL  TIMEOUT VALUE
          LDN    0
          STML   UNITS+/UN/P.ELAPT,UX  CLEAR ELAPSED TIME
          AOML   SS+/SS/P.RCNT  INCREMENT COMMAND ID
          STML   UNITS+/UN/P.RCNT,UX  KEEP COMMAND ID IN PP
          AODL   CMNDS       INCREMENT COUNT OF OUTSTANDING CONTROLLER COMMANDS
          UJK    CMNDX

 CMND80   BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF CHANNEL WORDS NOT TRANSFERRED
          LDK    /RS/K.ICM   INCOMPLETE COMMAND BLOCK TRANSFER
          RJM    SID2        SAVE ERROR FLAG
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)
          EJECT
** NAME-- RDATTN
*
** PURPOSE-- READ ATTENTION BITS ON ALL THE CHANNELS.
          SPACE  6
 RDATX    LJM    **
 RDATTN   EQU    *-1
          LDN    1
          STML   RDAT        SET READING ATTENTIONS FLAG
          LDN    0
          STDL   CH          CHANT TABLE INDEX

* DON'T READ ATTENTION IF CHANNEL IS DOWN.
* (WHEN CHANNEL IS DOWN, THE CHANNEL LOCK FLAG IS CLEARED.)

 RDAT10   BSS
          LDML   CHANT+/CH/P.LOCK,CH  CHANNEL LOCK FLAG
          STDL   T1
          LDIL   T1
          ZJN    RDAT20      IF CHANNEL LOCK IS NOT SET
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          LDK    F.RIS       REQUEST IDLE STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    P6,DC       READ ATTENTION BITS
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    RDAT15,DC   CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 RDAT15   BSS
          LDDL   P6
          STML   CHANT+/CH/P.ATTN,CH  ATTENTION BITS
 RDAT20   BSS
          LDN    P.CH        BUMP CHANNEL ENTRY
          RADL   CH
          SBDL   CNUML
          MJK    RDAT10      IF MORE CHANNELS
          LDN    0
          STML   RDAT        CLEAR READING ATTENTIONS FLAG
          UJK    RDATX

          EJECT
** NAME-- PROC
*
** PURPOSE-- PROCESS ATTENTION.
          SPACE  6
 PROCX    LJM    **
 PROC     EQU    *-1
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          TIMER  TM7
          RJM    SELCM       SELECT THE CONTROLLER
          TIMER  TM8
          RJM    STATUS      READ HYDRA STATUS
          TIMER  TM9
          LDML   SS+/SS/P.CMND  GET COMMAND PROCESSOR INDEX
          STDL   P2
          LDML   CMSTAT      CONTROLLER STATUS
          SHN    -11
          LPN    7
          STDL   P1          EXECUTION STATUS
          SBN    7
          NJN    PROC50      IF NOT COMMAND COMPLETE
          SODL   CMNDS       DECREMENT COUNT OF OUTSTANDING COMMANDS
          LDN    0
          STML   SS+/SS/P.CMND  CLEAR OUTSTANDING COMMAND INDEX
          LDML   CMSTAT      CONTROLLER STATUS
          SHN    17-15
          PJN    PROC10      IF NOT NORMAL END
          LDN    8
          STDL   P1
          UJN    PROC50

 PROC10   BSS
          SHN    15-14
          PJN    PROC50      IF NOT CHECK END
          SHN    14-9
          PJN    PROC50      IF MI STATUS IS NOT VALID
          LDML   CMSTAT+2    MANUAL INTERVENTION STATUS
          LPC    377B
          ADC    -301B       C1(16), ILLEGAL SEQUENCE
          NJN    PROC50      IF MI IS NOT C1(16)
          LDN    9           POWER UP SPINDLE
          STDL   P1

 PROC50   BSS
          LDML   CMDPR,P1    GET COMMAND PROCESSOR
          STML   PROC60
          RJM    **          PROCESS COMMAND
 PROC60   EQU    *-1
 PROC70   BSS
* TEMPORARY UNTIL TEMPORARY END. USED ONLY FOR CHECKOUT.
          LDDL   LOCKS
          SBDL   UX
          ZJN    PROC80
          LDDL   LOCKS
          SBN    NOLOCK
          NJN    PROC90      TEMPORARY HALT
* TEMPORARY END.
          LDDL   UX          CLEAR THIS LOCK ONLY IF A NEW ONE IS SET
          STDL   LOCKS
 PROC80   BSS
          TIMER  TM10
          UJK    PROCX

 PROC90   BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)

          SPACE  6
* READ DATA AVAILABLE.

 PROC100  CON    0
          LDML   CMDPR1,P2   GET COMMAND PROCESSOR
          STML   PROC110
          RJM    **          PROCESS COMMAND
 PROC110  EQU    *-1
          UJK    PROC70
          SPACE  6
* WRITE BUFFER SPACE AVAILABLE.

 PROC200  CON    0
          LDML   CMDPR2,P2   GET COMMAND PROCESSOR
          STML   PROC210
          RJM    **          PROCESS COMMAND
 PROC210  EQU    *-1
 PROC220  UJK    PROC70
          SPACE  6
* COMMAND COMPLETED WITHOUT ERROR.

 PROC300  CON    0
          LDML   CMDPR3,P2   GET COMMAND PROCESSOR
          STML   PROC310
          RJM    **          PROCESS COMMAND
 PROC310  EQU    *-1
          UJK    PROC220
          SPACE  6
* ATTENTION RECEIVED BUT NO OUTSTANDING COMMAND.

 PROC500  CON    0           READ DATA AVAILABLE, BUT NO COMMAND
          AOML   PROC600     COUNT IT
 PROC505  RJM    TERMA       ERROR
*         (NO RETURN FROM TERMA.)

 PROC510  CON    0           WRITE BUFFER SPACE AVAILABLE, BUT NO COMMAND
          AOML   PROC610     COUNT IT
          UJK    PROC505     ERROR

 PROC520  CON    0           COMMAND COMPLETED, BUT NO COMMAND
          AOML   PROC620     COUNT IT
          UJK    PROC505     ERROR
          SPACE  10
 PERROR   CON    0
          LDK    /RS/K.IES   INVALID EXECUTION STATUS
          RJM    SID2        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    STRS        PUT CONTROLLER STATUS IN RESPONSE
          RJM    ADPTERR     RECOVER
*         (NO RETURN FROM ADPTERR.)
          SPACE  10
 CMDPR    BSS
          CON    PERROR      ERROR
          CON    PROC100     READ DATA AVAILABLE
          CON    PROC200     WRITE BUFFER SPACE AVAILABLE
          CON    PERROR      ERROR
          CON    UNSOL       COMMAND BLOCK INDEPENDENT
          CON    PERROR      ERROR
          CON    UNSOL       UNSOLICITED ATTENTION
          CON    RECS        RECOVER ERROR
          CON    PROC300     COMMAND COMPLETED WITHOUT ERROR
          CON    NOTRDY      DRIVE NOT READY, POWER UP SPINDLE


* READ DATA AVAILABLE.

 CMDPR1   BSS
          CON    PROC500     NO OUTSTANDING COMMAND
          CON    WRITE       READ / WRITE SPECIFIED
          CON    PERROR      SALVAGE DATA
          CON    PERROR      POWER UP SPINDLE
          CON    ELOGA       READ ERROR LOG
          CON    RDERA       READ ERROR REGISTER IMAGE
          CON    PERROR      LEVEL I DIAGNOSTICS
          CON    PERROR      LEVEL II DIAGNOSTIC COMMAND 78
          CON    PERROR      READ BUFFER
          CON    PERROR      WRITE BUFFER
          CON    PERROR      LOAD OPERATING MODE
          CON    PERROR      LOAD ATTENTION DELAY PARAMETERS
          CON    TERMD       READ ERROR LOG IN NORMAL REQUEST TERMINATION
          CON    PERROR      LEVEL II DIAGNOSTIC COMMAND 79
          CON    PERROR      LEVEL II DIAGNOSTICS
          CON    PERROR      WRITE CONFIDENCE TEST
          CON    TDATA       READ CONFIDENCE TEST
          CON    PERROR      WRITE TO CONTROLLER BUFFER
          CON    TDATA       READ FROM CONTROLLER BUFFER

* BUFFER SPACE AVAILABLE.

 CMDPR2   BSS
          CON    PROC510     NO OUTSTANDING COMMAND
          CON    WRITE       READ / WRITE SPECIFIED
          CON    PERROR      SALVAGE DATA
          CON    PERROR      POWER UP SPINDLE
          CON    PERROR      READ ERROR LOG
          CON    PERROR      READ ERROR REGISTER IMAGE
          CON    PERROR      LEVEL I DIAGNOSTICS
          CON    PERROR      LEVEL II DIAGNOSTIC COMMAND 78
          CON    PERROR      READ BUFFER
          CON    PERROR      WRITE BUFFER
          CON    PERROR      LOAD OPERATING MODE
          CON    PERROR      LOAD ATTENTION DELAY PARAMETERS
          CON    PERROR      READ ERROR LOG IN NORMAL REQUEST TERMINATION
          CON    PERROR      LEVEL II DIAGNOSTIC COMMAND 79
          CON    PERROR      LEVEL II DIAGNOSTICS
          CON    TDATA       WRITE CONFIDENCE TEST
          CON    PERROR      READ CONFIDENCE TEST
          CON    TDATA       WRITE TO CONTROLLER BUFFER
          CON    PERROR      READ FROM CONTROLLER BUFFER

* COMMAND COMPLETED WITHOUT ERROR.

 CMDPR3   BSS
          CON    PROC520     NO OUTSTANDING COMMAND
          CON    TERMC       READ / WRITE SPECIFIED
          CON    PERROR      SALVAGE DATA
          CON    NOTRDC      POWER UP SPINDLE
          CON    ELOGC       READ ERROR LOG
          CON    RDERC       READ ERROR REGISTER IMAGE
          CON    DIAGC       LEVEL I DIAGNOSTICS
          CON    DIAGSC      LEVEL II DIAGNOSTIC COMMAND 78
          CON    PERROR      READ BUFFER
          CON    PERROR      WRITE BUFFER
          CON    LOM         LOAD OPERATING MODE
          CON    LAD         LOAD ATTENTION DELAY PARAMETERS
          CON    TERME       READ ERROR LOG IN NORMAL REQUEST TERMINATION
          CON    DIAGT       LEVEL II DIAGNOSTIC COMMAND 79
          CON    DIAGD       LEVEL II DIAGNOSTICS PASSED
          CON    CWRC        WRITE CONFIDENCE TEST
          CON    CRDC        READ CONFIDENCE TEST
          CON    CWBC        WRITE TO CONTROLLER BUFFER
          CON    CRBC        READ FROM CONTROLLER BUFFER
          SPACE  4
          EJECT
** NAME-- WRITE
*
** PURPOSE-- TRANSFER DATA TO / FROM THE CONTROLLER.
*
** 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    **
 WRITE    EQU    *-1
          LDML   SS+/SS/P.TOTAL  TOTAL CM WORDS LEFT TO TRANSFER
          ADML   SS+/SS/P.TOTAL+1
          NJN    WRI10       IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

 WRI10    BSS
          RJM    RDWT        SET UP FOR WRITE

* THE CONTROLLER IS ALREADY SELECTED.
* AN ATTENTION HAS BEEN RECEIVED SAYING READ DATA AVAILABLE
* OR WRITE BUFFER SPACE AVAILABLE.
* SEND A FUNCTION WORD TRANSFER TO SET UP FOR A READ DATA
* OR WRITE DATA OPERATION.

          LDC    F.SCS       SET COMMAND SEQUENCE
          RJM    FUNC
          ACN    DC
          LDN    1
          OAM    MOVFC,DC    READ / WRITE DATA FUNCTION WORD
          RJM    DCN         DISCONNECT CHANNEL
 K6       IFEQ   TRACE,1
          LDDL   MOVFC
          RJM    TBUF        PUT IN TRACE BUFFER
 K6       ENDIF
          RJM    WAITTR      WAIT FOR TRANSFER IN PROGRESS TO CLEAR

* ENABLE DMA MODE.

          LDC    F.SDM       SET DMA MODE
          RJM    FUNC
          TIMER2 TM11

* PREPARE T REGISTER VALUES.

 WRI20    BSS
          TIMER  TM23
          LDML   CMLIST+/CM/P.RMA,CML  RMA TO LOAD INTO T REGISTER
          STML   TREG+/TR/P.RMA,NT
          LDML   CMLIST+/CM/P.RMA+1,CML
          STML   TREG+/TR/P.RMA+1,NT
          LDML   CMWORK,CI   NUMBER OF BYTES LEFT TO TRANSFER
          STDL   WDS
          SHN    -3
          STDL   WDS2        NUMBER OF CM WORDS LEFT TO TRANSFER
          ZJK    WRI68       IF 0 WORDS TO TRANSFER
          LDDL   WDS
          STML   TREG+/TR/P.LEN,NT  CM BYTES LEFT TO TRANSFER
          ADC    -CMBTS      CM BYTES PER SECTOR
          ADDL   SECPOS      BYTES PREVIOUSLY TRANSFERRED FROM THIS SECTOR
          MJN    WRI30       IF LESS THAN 1 SECTOR LEFT TO TRANSFER
          LDC    CMBTS       COMPUTE NUMBER OF CM BYTES TO TRANSFER THIS LOOP
          SBDL   SECPOS
          STML   TREG+/TR/P.LEN,NT  NUMBER OF CM BYTES TO TRANSFER
                             TO CURRENT SECTOR

* UPDATE SECTOR POSITION.

 WRI30    BSS
          LDML   TREG+/TR/P.LEN,NT
          STDL   WDS
          SHN    -3
          STDL   WDS2        CM WORDS TO TRANSFER
          LDDL   WDS
          RADL   SECPOS      UPDATE SECTOR POSITION
          ADC    -CMBTS      CHECK FOR END OF SECTOR
          NJN    WRI40       IF NOT END OF SECTOR
          STDL   SECPOS      RESET SECTOR POSITION = 0

* CHECK IF SELECT ACTIVE IS STILL SET AND T' REGISTER EMPTY.

 WRI40    BSS
          LDDL   FRSTSC
          ZJK    WRI50       IF FIRST SECTOR, T' IS EMPTY
          TIMER  TM24
          LDN    2
          STML   WRI201      SET TIMEOUT VALUE FOR 2 SECONDS
 WRI42    BSS
          LDK    177777B
          STML   WRI200      SET TIMEOUT VALUE WHEN CHECKING T' REGISTER EMPTY
 WRI44    BSS
          LDK    F.RDOS      READ OPERATIONAL STATUS
*                            DONT CALL ROPS, PROCESS CHANNEL ERRORS HERE
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
 K7       IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K7       ENDIF
          CFM    WRI46,DC    CHECK CHANNEL ERROR FLAG
          AOML   WRI300
          LDK    /RS/K.XFER  I4 DETECTED ERROR DURING DATA TRANSFER
 WRI45    LJM    WRI124

 WRI46    BSS
          LDDL   OPSTAT
          SHN    17-9        CHECK SELECT ACTIVE STILL SET
          PJK    WRI170      IF SELECT ACTIVE IS NOT SET
          SHN    9-1
          MJN    WRI50       IF T' REGISTER EMPTY
          SOML   WRI200
          NJN    WRI44       IF NOT TIMED OUT
          SOML   WRI201
          NJK    WRI42       IF NOT TIMED OUT
          AOML   WRI301
          LDK    /RS/K.XFRTO  TIMEOUT ON T' NOT EMPTY OR TRANSFER IN PROGRESS
          UJK    WRI45


* WRITE T' REGISTER.

 WRI50    BSS
          TIMER  TM25
          LDC    TREG
          ADDL   NT
          STML   WRI54
          LDC    F.WTT       WRITE T' REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          OAM    **,DC
 WRI54    EQU    *-1
          RJM    DCN         DISCONNECT CHANNEL
          AODL   FRSTSC
          RJM    RCLOCK      READ THE CLOCK

* SECTOR N HAS BEEN PUT IN THE T' REGISTER.
* THEREFORE SECTOR (N-2) HAS BEEN TRANSFERRED WITHOUT ERROR.
* UPDATE COUNTERS AND POINTERS.

          RJM    RDWTOK      UPDATE COUNTERS FOR GOOD TRANSFER
          LDDL   WDS         CM BYTES TRANSFERRED
          RADL   WDSS        SAVE BYTES TRANSFERRED THIS SECTOR

* MAKE SURE A FULL SECTOR IS WRITTEN FOR EACH COMMAND.

          LDDL   SECPOS
          ZJK    WRI60       IF A FULL SECTOR WAS TRANSFERRED
          LDML   CMWORK,CI
          SBDL   WDS
          NJN    WRI60       IF MORE WORDS TO TRANSFER TO THIS CM ADDRESS
          LDML   SS+/SS/P.LISTL
          SBN    1
          NJN    WRI60       IF NOT THE LAST RMA ENTRY
          LDC    CMBTS       CM BYTES PER SECTOR
          SBDL   SECPOS      BYTES TRANSFERRED THIS SECTOR
          STDL   WDS
          STML   CMWORK,CI
          STML   TREG+/TR/P.LEN,NT  CM BYTES LEFT TO TRANSFER
          LDN    0
          STDL   SECPOS
          LDK    /CB/C.WRD   OFFSET FOR DATA IN COMMUNICATION BUFFER
          SHN    3           BYTE OFFSET
          ADML   CM.CBU+1    RMA OF COMMUNICATION BUFFER
          STML   TREG+/TR/P.RMA+1,NT
          SHN    -16
          ADML   CM.CBU
          STML   TREG+/TR/P.RMA,NT
          UJK    WRI40

* PREPARE FOR NEXT T REGISTER VALUES.

 WRI60    BSS
          LDN    3
          RADL   NT          BUMP TO NEXT T REGISTER ENTRY
          SBN    NTL
          NJN    WRI64       IF NOT WRAP AROUND
          STDL   NT
 WRI64    BSS
          LDDL   WDS         UPDATE RMA ADDRESS
          RAML   CMLIST+/CM/P.RMA+1,CML
          SHN    -16
          RAML   CMLIST+/CM/P.RMA,CML
          LDML   CMWORK,CI   DECREMENT BYTES LEFT TO TRANSFER
          SBDL   WDS
          STML   CMWORK,CI
          NJN    WRI69       IF MORE WORDS LEFT TO TRANSFER TO THIS
                             CM ADDRESS
          LDN    P.CM
          RADL   CML         BUMP INDEX TO NEXT CM ADDRESS
          STML   SS+/SS/P.CML
          AODL   CI          BUMP WORKING LENGTHS INDEX
          STML   SS+/SS/P.CI
          SBN    /SS/CIL
          NJN    WRI68       IF NOT END OF TABLE
          STDL   CML
          STML   SS+/SS/P.CML
          STDL   CI
          STML   SS+/SS/P.CI
 WRI68    BSS
          SOML   SS+/SS/P.LISTL  DECREMENT ADDRESS-LENGTH-PAIR COUNT
          ZJN    WRI70       IF END OF RMA LIST
          RJM    GLIST       READ NEXT SECTION OF THE LIST WHICH POINTS
                             TO THE CM DATA AREA
 WRI69    UJN    WRI80

* GET NEXT COMMAND.

 WRI70    BSS
          RJM    UNCMND      GET NEXT COMMAND
          NJN    WRI80       IF MORE COMMANDS
          LDML   CSTREAM
          NJK    WRI94       CHECK IF MORE REQUESTS TO STREAM

* CHECK IF SWITCH TO NEXT REQUEST.

          LDML   SS+/SS/P.TOTAL  TOTAL CM WORDS LEFT TO TRANSFER
          NJN    WRI74       IF NOT END OF TRANSFER
          LDML   SS+/SS/P.TOTAL+1
          SBDL   WDS2        NUMBER OF CM WORDS TRANSFERRED THIS LOOP
          ZJN    WRI80       IF END OF TRANSFER
          MJN    *           TEMPORARY HALT
 WRI74    BSS
          RJM    CSWIT       CHECK IF SWITCH TO NEXT REQUEST
          NJN    WRI80       IF SWITCH TO NEXT REQUEST
          LDN    0           PARTIAL SECTOR WAS TRANSFERRED AND
                             NO MORE DATA
          STML   SS+/SS/P.TOTAL
          STML   SS+/SS/P.TOTAL+1
          LJM    WRI90


* CHECK IF TIME TO SUSPEND OR TERMINATE.

 WRI80    BSS
          LDML   CSTREAM
          NJN    WRI84       IF MORE TO TRANSFER
          LDML   SS+/SS/P.TOTAL+1  DECREMENT CM WORDS LEFT TO TRANSFER
          SBDL   WDS2        NUMBER OF CM WORDS TRANSFERRED THIS LOOP
          STML   SS+/SS/P.TOTAL+1
          PJN    WRI82       IF NOT NECESSARY TO ADJUST SECOND WORD
          ADC    200000B     ADD CARRY BIT
          STML   SS+/SS/P.TOTAL+1
          SOML   SS+/SS/P.TOTAL  SUBTRACT CARRY BIT FROM FIRST WORD
          MJN    *           IF INVALID COUNT, TEMPORARY HALT
 WRI82    BSS
          LDDL   TWDS+1      CM WORDS LEFT TO TRANSFER BEFORE
                             SUSPENDING / TERMINATING
          SBDL   WDS2        NUMBER OF CM WORDS TRANSFERRED THIS LOOP
          STDL   TWDS+1
          ZJN    WRI86       CHECK 2ND WORD
          PJN    WRI84       IF MORE TO TRANSFER
          ADC    200000B     ADD CARRY BIT
          STDL   TWDS+1
          SODL   TWDS        SUBTRACT CARRY BIT FROM FIRST WORD
          MJN    *           IF INVALID COUNT, TEMPORARY HALT
 WRI84    BSS
          UJK    WRI20       IF MORE TO TRANSFER

 WRI86    BSS
          LDDL   TWDS
          NJK    WRI84       IF MORE TO TRANSFER

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

 WRI90    BSS
          LDDL   MOVFC       CHECK IF SUSPEND
          LPK    T.TER
          ZJN    WRI100      IF SUSPEND
          LDML   SS+/SS/P.RECOV  DON'T STREAM IF IN ERROR RECOVERY
          NJN    WRI100      IF IN ERROR RECOVERY
 WRI94    BSS
          LDN    2           RE-READ REQUEST
          STDL   WC
          LOADF  SS+/SS/P.REQ  ADDRESS OF REQUEST
          ADN    2
          CRML   RQ+2*4,WC
          SBN    4
          CRML   RQ,WC
          AOML   CSTREAM     SET CONTINUE STREAMING FLAG
          RJM    CSWIT       CHECK IF SWITCH TO NEXT REQUEST
          NJK    WRI84       IF MORE TO TRANSFER

* SUSPEND OR TERMINATE.
* WAIT FOR T AND T' REGISTERS TO BECOME EMPTY.
* THEN CLEAR COMMAND SEQUENCE AND CLEAR SELECT HOLD.

 WRI100   BSS
          TIMER  TM26
          LDN    2
          STML   WRI201      SET TIMEOUT VALUE FOR 2 SECONDS
 WRI102   BSS
          LDC    177777B     SET TIMEOUT VALUE WHEN CHECKING T REGISTER
                             COMPLETION
          STML   WRI200
 WRI106   BSS
          LDC    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC   READ OPERATIONAL STATUS
          RJM    DCN         DISCONNECT CHANNEL
          CFM    WRI110,DC   CHECK CHANNEL ERROR FLAG
          AOML   WRI302
          LDK    /RS/K.XFER  I4 DETECTED ERROR DURING DATA TRANSFER
          UJN    WRI118

 WRI110   BSS
          LDDL   OPSTAT
          SHN    17-9        CHECK SELECT ACTIVE STILL SET
          PJK    WRI170      IF SELECT ACTIVE IS NOT SET
          LDDL   OPSTAT
          LPN    3           CHECK T' REGISTER, AND TRANSFER IN PROGRESS
          SBN    2
          ZJN    WRI120      IF T' REGISTER EMPTY, AND TRANSFER NOT IN PROGRESS
          SOML   WRI200      DECREMENT TIMEOUT COUNTER
 WRI112   NJK    WRI106      IF NOT TIMED OUT
          SOML   WRI201
 WRI114   NJK    WRI102      IF NOT TIMED OUT

          AOML   WRI303
          LDK    /RS/K.XFRTO  TIMEOUT ON T' NOT EMPTY OR TRANSFER IN PROGRESS
 WRI118   UJN    WRI124

* READ T REGISTER AND CHECK BYTE COUNT = 0.

 WRI120   BSS
          LDK    F.RDT       READ T REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          IAM    RS+/RS/P.TREG,DC  T REGISTER
          DCN    40B+DC
          LDML   RS+/RS/P.TREG
          ZJK    WRI145      IF ALL WORDS HAVE BEEN TRANSFERRED
          SOML   WRI200      DECREMENT TIMEOUT COUNTER
          NJK    WRI112      IF NOT TIMED OUT
          SOML   WRI201
          NJK    WRI114      IF NOT TIMED OUT
          AOML   WRI304
          LDK    /RS/K.TRTO  TIMEOUT ON T REGISTER BYTE COUNT NONZERO
 WRI124   BSS
          RJM    SID2        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    CHREG       SAVE CHANNEL REGISTERS
          LDN    3
          STML   WRI306
 WRI130   BSS
          LDC    177777B
          STML   WRI305
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
 WRI135   BSS
          RJM    ROPS        READ OPERATIONAL STATUS
          LDDL   OPSTAT
          LPC    1400B
          ZJN    WRI140      IF SELECT HOLD AND SELECT ACTIVE ARE CLEAR
          SOML   WRI305
          NJK    WRI135      IF NOT TIMED OUT
          SOML   WRI306      DECREMENT RETRY COUNTER
          NJK    WRI130      TRY CLEARING SELECT HOLD AGAIN
          LDK    /RS/K.SAC   SELECT ACTIVE DID NOT CLEAR
          RJM    SID2        PUT ERROR ID IN RESPONSE
 WRI140   BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER
*         (NO RETURN FROM ADPTERR.)

 WRI145   BSS
          LDC    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          TIMER2 TM12
 K8       IFEQ   TIMES,1
 WRI150   BSS
          RJM    RDATTN      READ ATTENTION BITS
          LDML   CHANT+/CH/P.ATTN,CH
          LPML   ATTAB,CMOD
          ZJK    WRI150
 K8       ENDIF
          TIMER  TM13
 K9       IFEQ   TIMES2,1
          LDML   TM12+3
          SBML   TM11+3
          STML   TM50
 WRI155   EQU    *-1
          LDML   TM13+3
          SBML   TM12+3
          STML   TM51
 WRI160   EQU    *-1
          AOML   WRI155
          AOML   WRI160
          ADC    -TM51-12
          NJN    WRI165
          LDC    TM50
          STML   WRI155
          LDC    TM51
          STML   WRI160
 WRI165   BSS
 K9       ENDIF

          RJM    RDWTOK      UPDATE COUNTERS FOR GOOD TRANSFER
          RJM    RDWTOK      UPDATE COUNTERS AGAIN FOR GOOD TRANSFER
 WRI168   BSS
          UJK    WRIX

* SELECT ACTIVE IS CLEAR.

 WRI170   BSS
          LDK    /RS/K.SADAT  SELECT ACTIVE DROPPED WHEN TRANSFERRING DATA
          RJM    SID2        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    CHREG       SAVE CHANNEL REGISTERS IN RESPONSE
          RJM    ICH         MASTER CLEAR THE I4 CHANNEL ADAPTER
          UJK    WRI168
          SPACE  6
 WRI200   BSSZ   1           TIMEOUT COUNTER
 WRI201   BSSZ   1           TIMEOUT COUNTER

 WRI300   BSSZ   1           ERROR COUNTER
 WRI301   BSSZ   1           ERROR COUNTER
 WRI302   BSSZ   1           ERROR COUNTER
 WRI303   BSSZ   1           ERROR COUNTER
 WRI304   BSSZ   1           ERROR COUNTER
 WRI305   BSSZ   1           ERROR COUNTER
 WRI306   BSSZ   1           ERROR COUNTER

          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   WDSS2
          STDL   FRSTSC      FIRST SECTOR FLAG
          STDL   SECPOS      SET SECTOR POSITION = 0
          STML   CSTREAM     CLEAR CONTINUE STREAMING FLAG
          LDML   SS+/SS/P.CML  INDEX TO CMLIST
          STDL   CML
          LDML   SS+/SS/P.CI  INDEX TO CMWORK
          STDL   CI
          LDC    XFERSZ2     CM WORD TRANSFER SIZE BEFORE SUSPENDING
          STDL   TWDS+1      CM WORDS TO TRANSFER IN READ SEQUENCE
          LDC    XFERSZ
          STDL   TWDS
          SBML   SS+/SS/P.TOTAL  TOTAL CM WORDS LEFT TO TRANSFER
          MJN    RDW10       IF SUSPEND
          NJN    RDW8        IF TERMINATE
          LDDL   TWDS+1
          SBML   SS+/SS/P.TOTAL+1
          MJN    RDW10       IF SUSPEND
 RDW8     BSS
          LDML   SS+/SS/P.TOTAL  TRANSFER REMAINING WORDS AND
                             TERMINATE TRANSFER
          STDL   TWDS
          LDML   SS+/SS/P.TOTAL+1
          STDL   TWDS+1
          LDK    W.READT     READ AND TERMINATE
          UJN    RDW20

 RDW10    BSS
          LDK    W.READ      READ (SUSPEND)
 RDW20    BSS
          STDL   MOVFC       FUNCTION CODE
          LDML   SS+/SS/P.FNC
          SHN    /SS/L.FNC+2
          PJN    RDW30       IF READ
          LDK    T.OUT       IF WRITE
          RADL   MOVFC
 RDW30    BSS
          UJK    RDWX
          EJECT
** NAME-- RDWTOK
*
** PURPOSE-- UPDATE READ AND WRITE COUNTERS.
          SPACE  6
 RDWTX    LJM    **
 RDWTOK   EQU    *-1
          LDDL   WDSS2
          ADC    -CMBTS      BYTES PER SECTOR
          PJN    RDWT5       IF A FULL SECTOR WAS TRANSFERRED

* PARTIAL SECTOR WAS TRANSFERRED.

          LDDL   WDSS        ACCUMULATE THE BYTE COUNT UNTIL A FULL SECTOR
                             IS TRANSFERRED
          RADL   WDSS2
          LDN    0
          STDL   WDSS
          UJN    RDWT15


* FULL SECTOR WAS TRANSFERRED.

 RDWT5    BSS
          AOML   SS+/SS/P.CURSEC  INCREMENT SECTOR ADDRESS
          SBN    DVSEC       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   WDSS2
          RAML   RS+/RS/P.XFER+1  UPDATE BYTES TRANSFERRED IN RESPONSE STATUS
          SHN    -16
          RAML   RS+/RS/P.XFER
          LDDL   WDSS
          STDL   WDSS2
          LDN    0
          STDL   WDSS

* CHECK FOR STREAMING REQUEST.

 RDWT15   BSS
          LDML   SS+/SS/P.SWFLG  WAS THERE A REQUEST SWITCH
          ZJK    RDWTX       IF NOT A REQUEST SWITCH
          LPN    2           WAS THIS THE SECOND SECTOR AFTER A
                             REQUEST SWITCH
          ZJN    RDWT20      IF NOT THE SECOND SECTOR AFTER A REQUEST SWITCH
          LMML   SS+/SS/P.SWFLG
          STML   SS+/SS/P.SWFLG  CLEAR SWITCH FLAG
          RJM    SNDRSP      SEND RESPONSE TO CM

 RDWT20   BSS
          LDML   SS+/SS/P.SWFLG  WAS THIS THE FIRST SECTOR AFTER A
                             REQUEST SWITCH  (BIT 0 = 1)
          ZJN    RDWT30      IF NOT THE FIRST SECTOR AFTER A REQUEST SWITCH
          SHN    1
          STML   SS+/SS/P.SWFLG  SAVE SWITCH FLAG IN BIT 1
 RDWT30   BSS
          LDML   SS+/SS/P.CURRQ  SAVE RMA OF PREVIOUS REQUEST
          STML   SS+/SS/P.CURRQ2
          LDML   SS+/SS/P.CURRQ+1
          STML   SS+/SS/P.CURRQ2+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-- 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
          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
          NJN    CSW15       TEMPORARY HALT
          LDN    SECSC*2     ADD A 2 SECTOR INCREMENT
          STDL   T1
          LDDL   FRSTSC      NUMBER OF SECTORS TRANSFERRED
          SBN    1
          NJN    CSW10       IF MORE THAN 1 SECTOR WAS TRANSFERRED
          LDN    SECSC*1     ADD A 1 SECTOR INCREMENT
          STDL   T1
 CSW10    BSS
          LDML   SS+/SS/P.CURSEC  CURRENT SECTOR - 2 (OR 1)
          ADDL   T1          ADD A 1 OR 2 SECTOR INCREMENT
          SBML   RQ+/RQ/P.SECTOR  SECTOR OF NEXT REQUEST
          ZJN    CSW20       IF OK
          SBN    DVSEC       NUMBER OF SECTORS PER TRACK
          ZJN    CSW17       IF OK
 CSW15    BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)

 CSW17    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
          NJN    CSW15       TEMPORARY HALT
          RJM    UNCMND      GET COMMAND AND SET UP TO PROCESS
          LDML   SS+/SS/P.FNC
          SHN    /SS/L.FNC+2
          MJN    CSW30       IF WRITE

* IF READ, SET SWFLG TO SEND RESPONSE OF COMPLETED REQUEST.
* IF WRITE, DON'T SEND RESPONSES FOR COMPLETED REQUESTS.
* FOR WRITE ERROR RECOVERY, RESTART ALL REQUESTS.

          LDN    1
          RAML   SS+/SS/P.SWFLG  SET SWITCH FLAG
 CSW30    BSS
          AOML   SS+/SS/P.NCOMW  INCREMENT NUMBER OF COMPLETED REQUESTS WHICH
                                 HAVE NOT SENT RESPONSES
          LDN    1           EXIT A REGISTER NONZERO
          UJK    CSWX
          EJECT
** NAME-- UREQ
*
** PURPOSE-- READ A UNIT REQUEST FROM CM.
*
** OUTPUT-- RQ  CONTAINS CURRENT REQUEST.
*           FRST = 0
*           NUMCM = NUMBER OF COMMANDS.
*
          SPACE  6
 UREQX    LJM    **
 UREQ     EQU    *-1
          LDML   SS+/SS/P.FRST  SET FLAG WHEN REQUEST IS READ
          LPC    -/SS/K.FRST
          STML   SS+/SS/P.FRST
          LDN    0
          STDL   CML         INDEX TO CMLIST
          STDL   CI          INDEX TO CMWORK
          STML   SS+/SS/P.CML  INDEX TO CMLIST
          STML   SS+/SS/P.CI  INDEX TO CMWORK
          LDN    3           NUMBER OF WORDS TO READ
          STDL   WC
          LOADF  SS+/SS/P.REQ  LOAD CM ADDRESS AND REFORMAT
          ADN    2
          CRML   RQ+2*4,WC   READ CURRENT REQUEST
                             READ SWITCH FLAG BEFORE READING LINKAGE WORDS
          SBN    5
          CRML   RQ,WC
          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
          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
          SHN    /SS/L.FRST+2
          PJN    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
          LOADF  SS+/SS/P.REQ  LOAD CM ADDRESS AND REFORMAT
          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,CML
          STML   CMWORK,CI
          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,CML
          LDML   CM+/CM/P.RMA+1
          STML   CMLIST+/CM/P.RMA+1,CML
          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
          LDML   SS+/SS/P.FNC
          LPC    -/SS/K.FNC
          STML   SS+/SS/P.FNC
          LDML   CM+/CM/P.CODE  GET COMMAND CODE
          SHN    -16+/CM/N.CODE+/CM/L.CODE
          ERRNZ  /CM/L.CODE
          ADC    -C.READ     COMPARE COMMAND CODE
          ZJN    UNC40       IF READ
          SBN    C.WRITE-C.READ
          NJN    UNC47       IF NOT WRITE
          AODL   FNC         SET FUNCTION CODE FOR WRITE
          LDK    /SS/K.FNC   SET FUNCTION CODE FOR WRITE
          RAML   SS+/SS/P.FNC
 UNC40    BSS
          LDML   SS+/SS/P.FRST  SET FIRST COMMAND FLAG NONZERO
          LPC    -/SS/K.FRST
          ADK    /SS/K.FRST
          STML   SS+/SS/P.FRST
          UJK    UNCX        EXIT A REGISTER NONZERO

 UNC45    BSS
          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
 UNC47    AODL   FNC
          SBN    UCMDL
          MJN    UNC45       IF MORE COMMANDS TO CHECK
          LDC    E501        ERROR IN COMMAND CODE
          RJM    ATERM       ABNORMAL TERMINATION (NO RETURN)
*         (NO RETURN FROM ATERM)
          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
          LDC    CMLIST
          ADDL   CML
          STML   GLI10
          LOADF  CM+/CM/P.RMA  LOAD CM ADDRESS AND REFORMAT
          CRML   CMLIST,WC
 GLI10    EQU    *-1
          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,CML  MAKE SURE IT IS AN EVEN NUMBER OF
                             CM WORDS
          ADN    7
          SCN    7
          STML   CMLIST+/CM/P.LEN,CML
          STML   CMWORK,CI
          UJK    GLIX
          EJECT
** NAME-- SELCM
*
** PURPOSE-- SELECT A CONTROLLER.
*            CM = CONTROLLER NUMBER TO SELECT.
*            ASSUMES SELECT HOLD IS DEACTIVATED.
*
** NOTE--    IF SELECT ACTIVE DOESN'T SET IN 10 MICROSECONDS, IT WILL NEVER SET.
*            BUSY CAN BE SET AS A RESULT OF THE CONTROLLER BEING IN THE FUNCTION
*            BUFFER.  IN THIS CASE, BUSY WILL BE SET FOR LESS THAN 1 MILLISECOND.
*            SELECT HOLD MUST BE CLEARED IN ORDER TO GET CORRECT BUSY STATUS.
*            ALSO, IF ANY OTHER CONTROLLER IS SELECTED, BUSY STATUS IS INVALID.
          SPACE  6
 SELCX    LJM    **
 SELCM    EQU    *-1
          LDC    177777B
          STML   CSATRY      RETRY COUNTER FOR CLEARING SELECT ACTIVE

* CHECK IF DESIRED CONTROLLER IS STILL SELECTED.

 SELC1    BSS
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    SELC2,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 SELC2    BSS
 K10      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K10      ENDIF

          LDDL   OPSTAT      OPERATIONAL STATUS
          LPC    1400B       CHECK IF SELECT HOLD AND SELECT ACTIVE ARE SET
          ZJN    SELC5       IF SELECT HOLD AND SELECT ACTIVE ARE NOT SET
          ADC    -1400B
          NJN    SELC3       IF SELECT HOLD AND SELECT ACTIVE ARE NOT SET
          LDDL   BSR         CHECK IF DESIRED CONTROLLER IS STILL SELECTED
          SBML   ATTAB,CMOD
          ZJK    SELCX       IF CORRECT CONTROLLER IS STILL SELECTED
 SELC3    BSS
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
          SOML   CSATRY
          NJK    SELC1       RETRY TO CLEAR SELECT HOLD AND SELECT ACTIVE
          LDK    /RS/K.SAC   SELECT ACTIVE DID NOT CLEAR
          RJM    SID2        PUT ERROR ID IN RESPONSE
          UJK    SELC50      CANNOT SELECT THE CONTROLLER

* SET SELECT HOLD AND COMMAND SEQUENCE.  OUTPUT CONTROLLER SELECT WORD.

 SELC5    BSS
          LDN    3
          STML   PRITRY      PRIORITY OVERRIDE RETRY COUNTER
          LDC    T.SEL       SELECT A CONTROLLER
          ADDL   CMOD        CONTROLLER NUMBER
          STDL   CMFUN
 SELC8    BSS
          LDN    5
          STML   SELTRY      SELECT RETRY COUNTER

 SELC10   BSS
          LDC    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
 K11      IFEQ   TRACE,1
          LDDL   CMFUN
          RJM    TBUF        PUT IN TRACE BUFFER
 K11      ENDIF
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    OUTPUT SELECT WORD
          RJM    DCN         DISCONNECT CHANNEL

* CONTROLLER IS SELECTED IF SELECT ACTIVE ACTIVE AND PAUSE NOT ACTIVE.
* ALSO, WAIT FOR TRANSFER IN PROGRESS TO CLEAR.
* TIME OUT AFTER 12 MICROSECONDS ON THE FIRST 2 ATTEMPTS.
* THEN TIMEOUT 32 MILLISECONDS ON THE LAST 3 ATTEMPTS.

          LDML   SELTRY      CHECK IF FIRST OR SECOND TIMEOUT
          SBN    4
          MJN    SELC14      IF NOT THE FIRST OR SECOND TIMEOUT
          LDN    2           TIMEOUT 12 MICROSECONDS
          UJN    SELC16

 SELC14   BSS
          LDN    0           TIMEOUT 32 MILLISECONDS
 SELC16   BSS
          STML   SELTO       SET SELECT TIMEOUT VALUE
 SELC20   BSS
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    SELC25,DC   CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 SELC25   BSS
 K12      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K12      ENDIF

          LDDL   OPSTAT
          LPC    21001B      CHECK PAUSE, SELECT ACTIVE,
                             AND TRANSFER IN PROGRESS
          ADC    -1000B      WAIT UNTIL PAUSE NOT ACTIVE, SELECT ACTIVE SET,
                             AND TRANSFER NOT IN PROGRESS
          ZJN    SELC30      IF CONTROLLER SELECTED
          SOML   SELTO       DECREMENT SELECT TIMEOUT COUNTER
          NJK    SELC20      IF NOT TIMED OUT
          AOML   SELC100+1   SELECT TIMED OUT
          SHN    -16
          RAML   SELC100
          LDDL   OPSTAT
          SHN    17-9
          PJK    SELC40      IF SELECT ACTIVE NOT SET
          SHN    9-0
          PJN    SELC27      IF TRANSFER IN PROGRESS IS NOT SET
          LDK    /RS/K.TIP   TIMEOUT - TRANSFER IN PROGRESS DIDN'T CLEAR
          UJN    SELC28

 SELC27   BSS
          LDK    /RS/K.TOP   TIMEOUT - PAUSE DIDN'T CLEAR
 SELC28   LJM    SELC52

* READ BIT SIGNIFICANT RESPONSE FROM CONTROLLER.

 SELC30   BSS
          LDC    F.FSO       FORCE SYNC OUT
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    BSR,DC      READ BIT SIGNIFICANT RESPONSE
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    SELC35,DC   CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 SELC35   BSS
          LDC    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          LDDL   BSR
          SBML   ATTAB,CMOD
          NJN    SELC38      IF CORRECT CONTROLLER IS NOT SELECTED

* CHECK IF PRIORITY OVERRIDE WAS ISSUED.

          LDDL   CMFUN
          LPC    T.PO
          ZJK    SELCX       IF PRIORITY OVERRIDE WAS NOT ISSUED

* PRIORITY OVERRIDE SEQUENCE --
* 1. SELECT WITH PRIORITY OVERRIDE.
* 2. ISSUE SELECTIVE RESET.
* 3. WAIT FOR RESET TO COMPLETE.
*    STATUS = PRIORITY OVERRIDE COMPLETE.
* 4. SELECT WITHOUT PRIORITY OVERRIDE.
*
* THE PP MUST RETAIN THE UNIT LOCK UNTIL THE SEQUENCE IS COMPLETE.

          RJM    RESET       ISSUE SELECTIVE RESET
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
          LDN    NOLOCK      MAKE SURE LOCK ISN'T CLEARED
          STDL   LOCKS
          RJM    SAVSS       SAVE SS ENTRY
          LJM    MAIN10      WAIT FOR ATTENTION

* INCORRECT CONTROLLER WAS SELECTED.
* WOULD ALSO GET HERE IF SELECT HOLD AND SELECT ACTIVE WERE SET
* AT THE BEGINNING OF SELCM AND WERE NOT CLEARED AS IT NOW IS.
* THIS IS THE REASON FOR THE CHECK AND CLEAR SELECT HOLD AT THE
* BEGINNING OF THIS ROUTINE.

 SELC38   BSS
          LDDL   BSR
          STML   RS+/RS/P.BSR  PUT INVALID BSR IN RESPONSE
          LDK    /RS/K.ICS   INCORRECT CONTROLLER WAS SELECTED
          UJK    SELC52


* SELECT ACTIVE DIDN'T GET SET.
* CHECK IF CONTROLLER HAS BUSY BIT SET.

 SELC40   BSS
          LDC    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
          LDN    20          TIMEOUT 1 MILLISECOND
          STML   SELTO       SET BUSY TIMEOUT VALUE
 SELC42   BSS
          LDC    F.RIS       REQUEST IDLE STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    P6,DC       READ BUSY / ATTENTION BITS
          RJM    INC         DEACTIVATE CHANNEL
          LDDL   P6
          STML   CHANT+/CH/P.ATTN,CH  BUSY / ATTENTION BITS
          SHN    -8
          LPML   ATTAB,CMOD
          ZJN    SELC44      IF NOT BUSY
          LDML   SELTO
          SBN    20
          NJN    SELC43      IF NOT THE FIRST TIME THROUGH LOOP
          AOML   SELC300+1   IF BUSY ON FIRST READ OF IDLE STATUS
          SHN    -16
          RAML   SELC300
 SELC43   BSS
          SOML   SELTO       DECREMENT BUSY TIMEOUT COUNTER
          NJK    SELC42      IF NOT TIMED OUT
          AOML   SELC400+1   STILL BUSY AFTER BUSY TIMEOUT
          SHN    -16
          RAML   SELC400
 SELC44   BSS
          LDML   SELTO
          SBN    20
          NJN    SELC46      IF NOT THE FIRST TIME THROUGH LOOP
          AOML   SELC200+1   IF NOT BUSY ON FIRST READ OF IDLE STATUS
          SHN    -16
          RAML   SELC200
 SELC46   BSS
          SOML   SELTRY
          SBN    3
          PJN    SELC48      RETRY THE SELECTION SEQUENCE
                             WITHOUT LOGGING AN ERROR
          LDML   CHANT+/CH/P.ATTN,CH  BUSY / ATTENTION BITS
          SHN    -8
          LPML   ATTAB,CMOD
          NJN    SELC60      IF BUSY
          AOML   SELC500+1   CANNOT SELECT THE CONTROLLER, LOG ERROR
          SHN    -16
          RAML   SELC500
          LDML   SELTRY
          ZJN    SELC50      IF TIMED OUT
          LDK    /RS/K.CSC   CANNOT SELECT THE CONTROLLER
          RJM    SDET        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
 SELC48   UJK    SELC10      RETRY TO SELECT


* GETS HERE IF NON-EXISTANT CONTROLLER.

 SELC50   BSS
          LDK    /RS/K.CSC   CANNOT SELECT THE CONTROLLER
 SELC52   BSS
          RJM    SDET        PUT ERROR ID IN RESPONSE
 SELC55   BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)

* ISSUE PRIORITY OVERRIDE.

 SELC60   BSS
          AOML   SELC700+1   SELC700 - SELC600 = NO. OF UNRECOVERED
                             CONTROLLER RESERVED ERRORS
          SHN    -16
          AOML   SELC700
          LDK    /RS/K.CRS   CONTROLLER RESERVED
          RJM    SERRID      PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDML   SELTRY
          NJK    SELC48      IF NOT TIMED OUT
          SOML   PRITRY      DECREMENT RETRY COUNTER
          ZJK    SELC55      IF UNRECOVERED ERROR
          AOML   SELC600+1   NUMBER OF ATTEMPTS TO ISSUE PRIORITY OVERRIDE
          SHN    -16
          RAML   SELC600
          LDC    T.SEL+T.PO  SELECT WITH PRIORITY OVERRIDE
          ADDL   CMOD        CONTROLLER NUMBER
          STDL   CMFUN
          LJM    SELC8

          SPACE  6
 SELTO    BSSZ   1           SELECT TIMEOUT VALUE
 SELTRY   BSSZ   1           SELECT RETRY COUNTER
 PRITRY   BSSZ   1           PRIORITY OVERRIDE RETRY COUNTER
 CSATRY   BSSZ   1           RETRY COUNTER TO CLEAR SELECT ACTIVE
 SELC100  BSSZ   2           SELECT TIMEOUT COUNTER
                             EACH TIME SELC100 IS INCREMENTED, THEN EITHER
                             SELC200 OR SELC300 IS INCREMENTED.
 SELC200  BSSZ   2           IF NOT BUSY ON FIRST READ OF IDLE STATUS
 SELC300  BSSZ   2           IF BUSY ON FIRST READ OF IDLE STATUS
 SELC400  BSSZ   2           STILL BUSY AFTER BUSY TIMEOUT
 SELC500  BSSZ   2           ALL SELECT RETRIES FAILED, LOG 'CANNOT SELECT'
 SELC600  BSSZ   2           NUMBER OF TIMES PRIORITY OVERRIDE WAS ISSUED
 SELC700  BSSZ   2           SELC700 - SELC600 IS THE NUMBER OF UNRECOVERED
                             'CONTROLLER RESERVED'
          EJECT
** NAME-- SELCK
*
** PURPOSE-- IF THE CONTROLLER IS NOT SELECTED, SELECT IT.
          SPACE  6
 SELCKX   LJM    **
 SELCK    EQU    *-1
          RJM    SELCM       SELECT THE CONTROLLER
          UJK    SELCKX
          EJECT
** NAME-- ROPS
*
** PURPOSE-- READ OPERATIONAL STATUS.
          SPACE  6
 ROPSX    LJM    **
 ROPS     EQU    *-1
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
 K13      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K13      ENDIF
          CFM    ROPSX,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

          UJK    ROPSX
          EJECT
** NAME-- WAITTR
*
** PURPOSE-- WAIT FOR TRANSFER IN PROGRESS TO CLEAR.
          SPACE  6
 WAIX     LJM    **
 WAITTR   EQU    *-1
 WAI10    BSS
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    WAI20,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 WAI20    BSS
 K14      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K14      ENDIF

          LDDL   OPSTAT
          SHN    17-0
          PJK    WAIX        IF TRANSFER NOT IN PROGRESS

* TEMPORARY, ADD A TIMEOUT.

          UJK    WAI10
          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
 K15      IFEQ   TRACE,1
          STML   FBUF,FI     SAVE HISTORY OF FUNCTIONS ISSUED
 K15      ENDIF
          AJM    FUN30,DC    IF CHANNEL ACTIVE
          FAN    DC          ISSUE THE FUNCTION
 K16      IFEQ   TRACE,1
          AODL   FI          INCREMENT FUNCTION BUFFER INDEX
          ADC    -FBUFL
          NJN    FUN4        IF NOT END OF BUFFER
          STDL   FI          INITIALIZE INDEX
 FUN4     BSS
 K16      ENDIF
          IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE

* TIMEOUT 500 MILLISECONDS ON ALL FUNCTIONS

          LDC    377777B
 FUN10    IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE
          SBN    1
          NJN    FUN10

          LDC    377777B
 FUN20    IJM    FUNX,DC     EXIT IF CHANNEL INACTIVE
          SBN    1
          NJN    FUN20

*
* 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-- FUNCB
*
** PURPOSE-- ISSUE FUNCTION TO DISK CONTROLLER.
*            DOES NOT CALL ADPTERR IF FUNCTION TIMEOUT.
*
** INPUT-- A REGISTER = FUNCTION CODE.
*
** OUTPUT-- CHANNEL IS INACTIVE.
          SPACE  6
 FUNBX    LJM    **
 FUNCB    EQU    *-1
          STDL   FUNCD       SAVE FUNCTION CODE
 K17      IFEQ   TRACE,1
          STML   FBUF,FI     SAVE HISTORY OF FUNCTIONS ISSUED
 K17      ENDIF
          DCN    40B+DC
          AJM    FUNB30,DC   IF CHANNEL ACTIVE
          FAN    DC          ISSUE THE FUNCTION
 K18      IFEQ   TRACE,1
          AODL   FI          INCREMENT FUNCTION BUFFER INDEX
          ADC    -FBUFL
          NJN    FUNB4       IF NOT END OF BUFFER
          STDL   FI          INITIALIZE INDEX
 FUNB4    BSS
 K18      ENDIF
          IJM    FUNBX,DC    EXIT IF CHANNEL INACTIVE

* TIMEOUT 500 MILLISECONDS ON ALL FUNCTIONS

          LDC    377777B
 FUNB10   IJM    FUNBX,DC    EXIT IF CHANNEL INACTIVE
          SBN    1
          NJN    FUNB10

          LDC    377777B
 FUNB20   IJM    FUNBX,DC    EXIT IF CHANNEL INACTIVE
          SBN    1
          NJN    FUNB20

*
* DISK CHANNEL ERROR.
*

 FUNB30   BSS
          LDK    /RS/K.FTO   SET FUNCTION TIMEOUT FLAG IN RESPONSE
          RJM    SERR        ERROR ID
          LDML   RS+/RS/P.FUNTO
          NJN    FUNB45      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
 FUNB45   BSS
          UJK    FUNBX
          EJECT
** NAME-- STATUS
*
** PURPOSE-- READ HYDRA STATUS BLOCK FROM CONTROLLER.
          SPACE  6
 STATX    LJM    **
 STATUS   EQU    *-1
          LDN    3
          STML   STAT200     RETRY COUNTER

* READ HYDRA STATUS BLOCK.

 STAT2    BSS
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
 K19      IFEQ   TRACE,1
          LDML   FW.STAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K19      ENDIF
          ACN    DC
          LDN    1
          OAM    FW.STAT,DC  SEND FUNCTION TO READ HYDRA STATUS
          RJM    DCN         DISCONNECT THE CHANNEL
          ACN    DC
          LDN    6
          IAM    CMSTAT,DC   READ HYDRA STATUS
          NJK    STAT90      IF INPUT DID NOT COMPLETE
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    STAT3,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 STAT3    BSS
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC

* SAVE STATUS IN TRACE BUFFER

 K20      IFEQ   TRACE,1
          LDML   CMSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K20      ENDIF
          LDML   CMSTAT
          LPC    177760B
          ADDL   UX
          STML   SBUF,SI     SAVE HISTORY OF STATUS
          AODL   SI          INCREMENT STATUS BUFFER INDEX
          SBN    SBUFL
          NJN    STAT4       IF NOT END OF BUFFER
          STDL   SI          INITIALIZE STATUS BUFFER INDEX

* CHECK IF SELECT ACTIVE DROPPED.

 STAT4    BSS
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    STAT6,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 STAT6    BSS
 K21      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K21      ENDIF

          LDDL   OPSTAT
          SHN    17-9        CHECK IF SELECT ACTIVE IS STILL SET
          PJK    STAT93      IF SELECT ACTIVE DROPPED WHEN READING STATUS

* IF EXECUTION STATUS IS 0, 3, OR 5, REREAD THE STATUS.

          LDML   CMSTAT      GET EXECUTION STATUS
          SHN    -11
          LPN    7
          ZJN    STAT12      IF BAD EXECUTION STATUS
          SBN    3
          ZJN    STAT12      IF BAD EXECUTION STATUS
          SBN    5-3
          NJN    STAT18      IF VALID EXECUTION STATUS
 STAT12   BSS
          LDK    /RS/K.IES   INVALID EXECUTION STATUS
          LJM    STAT92

* DON'T LOG STATUS IF DELAY STATUS = 81(16) OR 83(16).

 STAT18   BSS
          LDML   CMSTAT
          LPC    43400B      CHECK END, SYSTEM INTERVENTION STATUS,
                             MANUAL INTERVENTION STATUS, DELAY STATUS
          ZJN    STAT50
          LPC    43000B
          NJN    STAT60
          LDML   CMSTAT+3
          LPC    377B
          ADC    -203B
          NJN    STAT60      IF DELAY STATUS IS NOT 83(16),
                             RESET COMPLETED

* CLEAR ATTENTION.

 STAT50   BSS
          TIMER  TM18
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
          ACN    DC
          LDN    1
          OAM    FW.CA,DC    SEND FUNCTION TO CLEAR ATTENTION
          RJM    DCN         DISCONNECT THE CHANNEL
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          TIMER  TM19
          UJK    STATX

* READ DEVICE STATUS BLOCK.

 STAT60   BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE

* READ DEVICE STATUS BLOCK.

 STAT62   BSS
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
          LDK    W.DST       READ DEVICE STATUS BLOCK
          STDL   CMFUN
 K22      IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 K22      ENDIF
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    SEND FUNCTION TO CONTROLLER
          RJM    DCN         DISCONNECT THE CHANNEL
          ACN    DC
          LDN    4
          IAM    RS+/RS/P.DST2,DC  READ DEVICE STATUS
          NJK    STAT110     IF INPUT DID NOT COMPLETE
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
          LDK    /RS/K.DSP   SET FLAG FOR DEVICE STATUS PRESENT
          RJM    SDET        PUT IN RESPONSE
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC

* PUT CONTROLLER STATUS IN RESPONSE.

          RJM    STRS        PUT CONTROLLER STATUS IN RESPONSE
          UJK    STAT50

* CHANNEL DISCONNECTED WHEN READING CONTROLLER STATUS.

 STAT90   BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF PP WORDS NOT RECEIVED
          LDK    /RS/K.ISTT  INCOMPLETE CONTROLLER STATUS TRANSFER
 STAT92   BSS
          RJM    SID2        PUT ERROR ID IN RESPONSE
 STAT93   BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    STRS        PUT CONTROLLER STATUS IN RESPONSE
          RJM    ROPS        READ OPERATIONAL STATUS
          LDDL   OPSTAT      OPERATIONAL STATUS
          SHN    17-9        CHECK IF SELECT ACTIVE IS STILL SET
          MJN    STAT95      IF SELECT ACTIVE IS STILL SET
          LDK    /RS/K.SADST  SELECT ACTIVE DROPPED WHEN READING
                             CONTROLLER STATUS
          RJM    SID2        PUT ERROR ID IN RESPONSE
 STAT95   BSS
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          RJM    SELCM       SELECT THE CONTROLLER
          SOML   STAT200     DECREMENT RETRY COUNTER
          NJK    STAT2       IF RETRY IS NOT EXHAUSTED

* CLEAR ATTENTION.

 STAT100  BSS
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
          LDK    W.CA        CLEAR ATTENTION
          STDL   CMFUN
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    SEND FUNCTION TO CONTROLLER
          RJM    DCN         DISCONNECT THE CHANNEL
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC

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

* CHANNEL DISCONNECTED WHEN READING DEVICE STATUS.

 STAT110  BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF PP WORDS NOT TRANSFERRED
          LDK    /RS/K.IDS   INCOMPLETE DEVICE STATUS TRANSFER
          RJM    SID2        PUT ERROR ID IN RESPONSE
          RJM    STRS        PUT CONTROLLER STATUS IN RESPONSE
          RJM    ROPS        READ OPERATIONAL STATUS
          LDDL   OPSTAT      OPERATIONAL STATUS
          SHN    17-9        CHECK IF SELECT ACTIVE IS STILL SET
          MJN    STAT120     IF SELECT ACTIVE IS STILL SET
          LDK    /RS/K.SADDS  SELECT ACTIVE DROPPED WHEN READING
                             DEVICE STATUS
          RJM    SID2        PUT ERROR ID IN RESPONSE
 STAT120  BSS
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          RJM    SELCM       SELECT THE CONTROLLER
          SOML   STAT200     DECREMENT RETRY COUNTER
          NJK    STAT62      IF RETRY IS NOT EXHAUSTED
          UJK    STAT100
          SPACE  6
 STAT200  BSSZ   1           RETRY COUNTER
          EJECT
** NAME-- STRS
*
** PURPOSE-- PUT CONTROLLER STATUS IN RESPONSE
          SPACE  6
 STRSX    LJM    **
 STRS     EQU    *-1

* PUT STATUS BLOCK IN RESPONSE.

          LDN    6
          STDL   T1
 STRS10   BSS
          LDML   CMSTAT-1,T1  PUT STATUS IN RESPONSE
          STML   RS+/RS/P.CMST2-1,T1
          SODL   T1
          NJN    STRS10

          LDML   RS+/RS/P.DET  CHECK IF FIRST TIME FOR CONTROLLER STATUS
          LPK    /RS/K.CSP
          NJK    STRSX       IF NOT THE FIRST TIME FOR THIS ERROR
          LDK    /RS/K.CSP   SET FLAG FOR CONTROLLER STATUS PRESENT
          RJM    SDET        PUT ID IN RESPONSE
          LDN    10
          STDL   T1
 STRS20   BSS
          LDML   RS+/RS/P.CMST2-1,T1  MOVE STATUS FOR RESPONSE
          STML   RS+/RS/P.CMST1-1,T1
          SODL   T1
          NJK    STRS20
          UJK    STRSX
          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
          EJM    DCN50,DC    IF CHANNEL IS EMPTY
          LDK    31          SET TIMEOUT FOR 2 SECONDS
          STDL   T2
 DCN25    BSS
          LDC    100000B
          STDL   T1
 DCN30    BSS
          EJM    DCN50,DC    IF CHANNEL IS EMPTY
          SODL   T1
          NJN    DCN30
          SODL   T2
          NJK    DCN25
          AOML   DCNCNT
          LDK    /RS/K.CEMPT  CHANNEL DOESNT GO EMPTY
 DCN40    BSS
          RJM    SERRID      SAVE ERROR FLAG
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)

 DCN50    BSS
          DCN    DC+40B
          UJK    DCNX

 DCNCNT   BSSZ   1
          EJECT
** NAME-- INC
*
** PURPOSE-- CHECK FOR CHANNEL ERRORS AFTER INPUTING DATA.
          SPACE  6
 INCX     LJM    **
 INC      EQU    *-1
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    INCX,DC     CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

          UJK    INCX
          EJECT
** NAME-- TERMP
*
** PURPOSE-- TERMINATE PP REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE
          SPACE  6
 TERX     LJM    **
 TERMP    EQU    *-1
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    RESP        SEND RESPONSE TO CPU
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    TERX
          EJECT
** NAME-- TERMC.
*
** PURPOSE-- TERMINATE UNIT REQUEST.
*
** OUTPUT-- RS+/RS/P.RC = RESPONSE CODE.
*           SEKCNT.
          SPACE  6
 TERMC    CON    0           NORMAL TERMINATION
          TIMER  TM14

* NORMAL READ / WRITE TERMINATION.
* IF DELAY STATUS, READ THE ERROR LOG.

 M4       IFNE   CMSE,1
          LDML   CMSTAT      CONTROLLER STATUS
          SHN    17-8
          PJN    TERM20      IF DELAY STATUS IS NOT VALID
          RJM    ELOG        READ ERROR LOG
          LDN    12
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
 TERM10   BSS
          RJM    SAVSS       SAVE SS ENTRY
          LJM    MAIN10      WAIT FOR ATTENTION AND DATA AVAILABLE
 M4       ENDIF

* ENTRY WHEN DATA AVAILABLE FOR ERROR LOG.

 TERMD    CON    0
 M5       IFNE   CMSE,1
          RJM    ELA         READ ERROR LOG
          UJK    TERM10
 M5       ENDIF

* ENTRY WHEN READ ERROR LOG COMMAND COMPLETE.

 TERME    CON    0
 TERM20   BSS
          LDML   SS+/SS/P.TOTAL  MAKE SURE ALL BYTES WERE TRANSFERRED
          ADML   SS+/SS/P.TOTAL+1
          ADML   SS+/SS/P.LISTL
          ADML   SS+/SS/P.NUMCM
          ZJN    TERM30      IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

 TERM30   BSS
          LDML   RS+/RS/P.RESPL  CHECK IF THERE WAS A RECOVERED ERROR
          SBN    8
          ZJN    TERM        IF NO RECOVERED ERROR
          LDK    /RS/K.REC   SET RECOVERED ERROR
          STML   RCON        ADDITIONAL RESPONSE CONDITION
          UJN    TERM

 TERMA    CON    0
          LDK    /RS/K.ADPT  CONTROLLER INTERFACE ERROR
          RJM    SERRID      ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER ERROR
*         (NO RETURN FROM ADPTERR.)
          SPACE  6
 TERM     BSS
          RJM    PUTRC       PUT RESPONSE CODES IN RESPONSE
          RJM    SNDWRS      SEND WRITE RESPONSES
          RJM    RESP        SEND RESPONSE TO CPU
          LDML   NODEL
          NJN    TERM50      IF NO DELINK OF REQUEST
          TIMER  TM15
          RJM    DELRQ       DELETE COMPLETED REQUEST FROM QUEUE
                             AND SELECT NEW REQUEST.
          TIMER  TM16
 TERM50   BSS
          RJM    RESPIN      UPDATE 'IN' POINTER IN RESPONSE BUFFER
          SODL   SEKCNT      DECREMENT OUTSTANDING SEEK COUNT
          PJN    TERM80      IF VALID SEKCNT

* NOTE, A REQUEST CAN TERMINATE ABNORMALLY BEFORE SEKCNT IS
* INCREMENTED. THEREFORE, MAKE SURE SEKCNT IS NOT NEGATIVE.

          LDN    0
          STDL   SEKCNT      REINITIALIZE
 TERM80   BSS
 TERM90   BSS
          RJM    CFLGS       CLEAR FLAGS
          LDML   SS+/SS/P.SEEK  CLEAR SEEK ISSUED FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK
          LDML   CLEARL      NONZERO IF LOCK SHOULD BE CLEARED NOW
                             (UNIT WAS DISABLED)
          ADDL   PIDLE       IF PRE-IDLE FLAG IS SET, DON'T ISSUE A SEEK
          NJN    TERM93      IF UNIT WAS DISABLED, DON'T ISSUE ANOTHER SEEK
          LDML   SS+/SS/P.CUR  CHECK IF NEXT REQUEST HAS BEEN SELECTED
          SHN    /SS/L.CUR+2
          PJN    TERM92      IF CURRENT REQUEST WAS NOT SELECTED
          RJM    SEEKI       ISSUE INITIAL SEEK
 TERM92   BSS
          LDDL   UX          CLEAR LOCK ONLY IF A DIFFERENT LOCK IS SET
          STDL   LOCKS
          UJN    TERM95

 TERM93   BSS
          LDML   CHANT+/CH/P.DOWN,CH
          NJN    TERM94      IF CHANNEL DOWN, DON'T EXECUTE ON CHANNEL
          RJM    CSHOLD      CLEAR SELECT HOLD IF IT IS SET
 TERM94   BSS
          RJM    CLRLOCK     CLEAR LOCK ON UNIT
          LDN    0
          STML   CLEARL      CLEAR LOCK FLAG

 TERM95   BSS
          TIMER  TM17
          UJK    MAIN50
          EJECT
** NAME-- CFLGS
*
** PURPOSE-- CLEAR FLAGS WHEN TERMINATING A REQUEST OR
*            PROCESSING AN IDLE COMMAND.
          SPACE  6
 CFLGX    LJM    **
 CFLGS    EQU    *-1
          LDN    0
          STML   SS+/SS/P.RECOV  ZERO OUT ERROR RECOVERY INDEX
          STML   SS+/SS/P.MCTRY  MASTER CLEAR RETRY COUNTER
          ERRNZ  /SS/P.MCTRY-/SS/P.WTA
          ERRNZ  /SS/P.MCTRY-/SS/P.SRTRY
          ERRNZ  /SS/P.MCTRY-/SS/P.ERI
          ERRNZ  /SS/P.MCTRY-/SS/P.ELOG
          ERRNZ  /SS/P.MCTRY-/SS/P.NR
          STML   SS+/SS/P.RESET  CLEAR FLAG FOR RESET ISSUED
          ERRNZ  /SS/P.RESET-/SS/P.CONF
          ERRNZ  /SS/P.RESET-/SS/P.RVCNT
          STML   SS+/SS/P.NCOMW  ZERO OUT NUMBER OF RESPONSES TO SEND
          STML   RS+/RS/P.RTRY  ZERO OUT REQUEST RETRY COUNTER
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          UJK    CFLGX
          EJECT
** NAME-- PUTRC
*
** PURPOSE-- PUT RESPONSE CODES IN RESPONSE
          SPACE  6
 PUTRCX   LJM    **
 PUTRC    EQU    *-1
          LDDL   RESPC       RESPONSE CODE
          SHN    /RS/L.RCON-/RS/L.RC+/RS/N.RCON-/RS/N.RC
          ADML   RCON        RESPONSE CONDITION
          SHN    /RS/L.URC-/RS/L.RCON+/RS/N.URC-/RS/N.RCON
          ERRNZ  /RS/P.URC-/RS/P.RCON
          ERRNZ  /RS/P.RC-/RS/P.URC
          STML   RS+/RS/P.URC
          UJK    PUTRCX
          EJECT
** NAME-- RESP
*
** PURPOSE-- WRITE STATUS BUFFER TO CM RESPONSE BUFFER.
*
** INPUT-- CM.PIT, CM.RS, LIM, /PIT/IN, /PIT/OUT, RS+/RS/P.RESPL
*
** OUTPUT-- /PIT/IN, RESPONSE BUFFER
          SPACE  6
 INP      EQU    P4          IN POINTER
 OUTP     EQU    P5          OUT POINTER
          SPACE  6
 RESPX    LJM    **
 RESP     EQU    *-1

* CHECK IF RESPONSE SHOULD BE SENT TO CM.

          LDN    0
          STML   STORS       SET FLAG TO STORE RESPONSE
          LDML   CM+/CM/P.STOR  CHECK IF CALLER WANTS RESPONSE
          SHN    /CM/L.STOR+2
          MJN    RESP10      IF STORE RESPONSE FLAG IS SET
          LDDL   RESPC       CHECK FOR NORMAL RESPONSE
          SBN    R.NRM
          NJN    RESP10      IF NOT NORMAL RESPONSE, STORE RESPONSE
          AOML   STORS       NONZERO MEANS DO NOT STORE RESPONSE
 RESP5    UJK    RESPX

* READ IN AND OUT POINTERS OF RESPONSE BUFFER.

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

* CHECK IF A SHORT RESPONSE SHOULD BE SENT.

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

 RESP15   BSS
          LDML   RS+/RS/P.LU
          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.

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

* UPDATE THE 'IN' POINTER.

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

* INTERRUPT PROCESSOR. RESP ROUTINE SETS UP THIS INSTRUCTION.

          LOADC  CM.INT      CM ADDRESS OF INTERRUPT WORD
          CWDL   PPNO-3      SET LAST BYTE NONZERO
 INTPRC   INPN   1           INTERRUPT OR PSN
          UJK    RESNX
          EJECT
** NAME-- RECRS
*
** PURPOSE-- IF AN ERROR HAS BEEN RECOVERED, SEND AN INTERMEDIATE
*            RESPONSE TO CM.
          SPACE  6
 D10      IFEQ   T1,0
 RECRSX   LJM    **
 RECRS    EQU    *-1
          LDML   RS+/RS/P.RESPL  RESPONSE LENGTH
          ADC    -C.RS*8
          NJN    RECRSX      IF NO ERRORS
          LDN    1
          ERRNZ  16-/SS/N.RVCNT-/SS/L.RVCNT
          RAML   SS+/SS/P.RVCNT  COUNT OF RECOVERED ERRORS PER REQUEST
          LPK    /SS/M.RVCNT
          SBN    RVTRY       HAS LIMIT BEEN REACHED
          PJK    RECRSX      IF TOO MANY RECOVERED ERRORS ON THIS REQUEST
          LDK    /RS/K.REC   RECOVERED ERROR
          STML   RCON        ADDITIONAL RESPONSE CONDITION
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          UJK    RECRSX
 D10      ENDIF
          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
** NAME-- CHNERR
*
** PURPOSE-- RECORD INPUT CHANNEL ERROR.
          SPACE  6
 CHNX     LJM    **
 CHNERR   EQU    *-1
          LDML   IGNORE
          NJK    CHNX        IGNORE ERRORS
          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

* READ ERROR STATUS REGISTER.

          LDK    F.RDES      READ ERROR STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    RS+/RS/P.ESREG,DC  ERROR STATUS REGISTER
          DCN    40B+DC      DISCONNECT CHANNEL
 K23      IFEQ   TRACE,1
          LDML   RS+/RS/P.ESREG
          RJM    TBUF        PUT IN TRACE BUFFER
 K23      ENDIF
          CFM    CHER10,DC   CLEAR CHANNEL ERROR FLAG
 CHER10   BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR     RECOVER THE ERROR
*         (NO RETURN FROM ADPTERR.)
          EJECT
** NAME-- UNSOL
*
** PURPOSE-- PROCESS UNSOLICITED ATTENTION.
          SPACE  6
 UNSOL    CON    0
          LDML   CMSTAT      CHECK IF DELAY STATUS IS VALID
          SHN    17-8
          PJN    UNSOL10     IF DELAY STATUS NOT VALID
          LDML   CMSTAT+3    GET DELAY STATUS
          LPC    377B
          ADC    -203B       CHECK IF DELAY STATUS = 83,
                             RESET COMPLETED
          ZJN    UNSOL20     IF RESET COMPLETED
          LJM    RECD        ISSUE SELECTIVE RESET

 UNSOL10  BSS
          RJM    RECS        RECOVER ERROR
*         (NO RETURN FROM RECS.)

 UNSOL20  BSS
          LDML   SS+/SS/P.RESET
          SHN    /SS/L.RESET+2
          PJK    UNSOL10     IF RESET WAS NOT ISSUED
          SODL   CMNDS       DECREMENT COUNT OF OUTSTANDING COMMANDS
          LDML   SS+/SS/P.RESET  CLEAR RESET IN PROGRESS FLAG
          LPC    -/SS/K.RESET
          STML   SS+/SS/P.RESET
          LDK    /RS/K.SRS   SELECTIVE RESET WAS SUCCESSFUL
          RJM    SID         ERROR ID

* VERIFY SECTOR SIZE.

          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
 K24      IFEQ   TRACE,1
          LDML   FW.SEC
          RJM    TBUF        PUT IN TRACE BUFFER
 K24      ENDIF
          ACN    DC
          LDN    1
          OAM    FW.SEC,DC   SEND FUNCTION TO READ SECTOR SIZE
          RJM    DCN         DISCONNECT THE CHANNEL
          ACN    DC
          LDN    1
          IAM    P1,DC       READ HYDRA SECTOR SIZE
          NJN    UNSOL35     IF INPUT DID NOT COMPLETE, TEMPORARY HALT
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    UNSOL30,DC  CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 UNSOL30  BSS
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          LDDL   P1
          ADC    -4096
          ZJN    UNSOL40     IF SECTOR SIZE IS 4096
          LDK    /RS/K.SEC   NOT 4K SECTOR
          RJM    SDET        ERROR ID IN RESPONSE
          RJM    FAILAD      PUT THE FAILING ADDRESS IN RESPONSE
          RJM    UTERM       DISABLE THE UNIT
*         (NO RETURN FROM UTERM.)

 UNSOL35  BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)

* VERIFY THE HYDRA HOST ID.

 UNSOL40  BSS
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
 K25      IFEQ   TRACE,1
          LDML   FW.HOST
          RJM    TBUF        PUT IN TRACE BUFFER
 K25      ENDIF
          ACN    DC
          LDN    1
          OAM    FW.HOST,DC  SEND FUNCTION TO READ HOST ID
          RJM    DCN         DISCONNECT THE CHANNEL
          ACN    DC
          LDN    1
          IAM    P1,DC       READ HYDRA HOST ID
          NJK    UNSOL35     IF INPUT DID NOT COMPLETE, TEMPORARY HALT
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    UNSOL50,DC  CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 UNSOL50  BSS
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          LDDL   P1
          LPC    210B        BITS 3 AND 7 MUST BE EQUAL
          ZJN    UNSOL60     IF SAME HOST ID
          ADC    -210B
          ZJN    UNSOL60     IF SAME HOST ID
          LDK    /RS/K.HOST  NOT THE SAVE HOST ID
          RJM    SDET        ERROR ID IN RESPONSE
          RJM    FAILAD      PUT THE FAILING ADDRESS IN RESPONSE
          RJM    INTRS       SEND INTERMEDIATE RESPONSE

*         NOTE, DUAL ACCESS CAN'T RUN UNLESS BOTH PORTS HAVE THE SAME HOST ID.
*         BUT SINGLE ACCESS COULD RUN WITH DIFFERENT HOST IDS AS LONG AS
*         1 PORT IS DISABLED.  THEREFORE, THE UNIT IS NOT DISABLED.
*         DUAL ACCESS SHOULD GET AN TIMEOUT WAITING FOR THE NEXT ATTENTION.

* LOAD OPERATING MODE PARAMETERS.

 UNSOL60  BSS
          TIMER  TM20
          LDK    R.LOM       LOAD OPERATING MODE
          STML   SS+/SS/P.FUNC  PARAMETER IN COMMAND BLOCK
          LDN    0
          STML   SS+/SS/P.PCYL  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PTRK  SET COMMAND BLOCK PARAMETER = 0
          LDC    34403B+2000B  SELECT RECOVERY, WRITE BACKING FACTOR = 3
                             INHIBIT PARTIAL SECTOR TRANSFER (BIT 10)
          STML   SS+/SS/P.NSEC  SET OPERATING MODE PARAMETERS
          RJM    CMND        WRITE COMMAND BLOCK
          LDN    10          SET COMMAND PROCESSOR INDEX
          UJN    LOM10       SAVE SS ENTRY, GO TO MAIN
          SPACE  6
* ENTRY WHEN LOAD OPERATING MODE COMMAND IS COMPLETE.

 LOM      CON    0
          TIMER  TM21

* LOAD ATTENTION DELAY PARAMETERS.

          LDK    R.LAD       LOAD ATTENTION DELAY PARAMETERS
          STML   SS+/SS/P.FUNC  PARAMETER IN COMMAND BLOCK
          LDN    0
          STML   SS+/SS/P.PCYL  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PTRK  SET COMMAND BLOCK PARAMETER = 0
          LDC    401B        1 SECTOR BEFORE ATTENTION
          STML   SS+/SS/P.NSEC  SET ATTENTION DELAY PARAMETERS
          RJM    CMND        WRITE COMMAND BLOCK
          LDN    11
 LOM10    BSS
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJN    LAD20       SAVE SS ENTRY, GO TO MAIN
          SPACE  6
* ENTRY WHEN LOAD ATTENTION DELAY COMMAND IS COMPLETE.

 LAD      CON    0
          TIMER  TM22
          LDML   SS+/SS/P.SRTRY
          LPK    /SS/K.SRTRY
          ZJN    LAD10       IF RESET WAS NOT ISSUED IN RECOVERY
          RJM    RECE        CONTINUE IN ERROR RECOVERY
*         (NO RETURN FROM RECE.)

 LAD10    BSS
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
          LDML   SS+/SS/P.SEEK  CLEAR OUTSTANDING COMMAND FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK
          LDDL   UX          CLEAR THIS LOCK ONLY IF A NEW ONE IS SET
          STDL   LOCKS
          LDML   SS+/SS/P.CONF  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          PJN    LAD20       IF NOT DOING INITIAL CONFIDENCE TEST
          RJM    RSTRQ       RESTART CONFIDENCE TEST
 LAD20    BSS
          RJM    SAVSS       SAVE SS ENTRY
          LJM    MAIN10      GO TO MAIN LOOP
                             THIS ALLOWS THE INITIAL CONFIDENCE TEST TO BE RUN NEXT
          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
** NAME-- ATERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR INTERFACE ERRORS.
          SPACE  6
 ATERM    CON    0
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE
          RJM    RDOVL       READ OVERLAY
          LJM    ATERMA
          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
 SID2X    LJM    **
 SID2     EQU    *-1         SAVE ERROR ID
          STDL   T1
          LMC    -0
          STDL   T2
          LDML   RS+/RS/P.ID2  ERROR ID
          LPDL   T2
          ADDL   T1          ADD ERROR FLAG
          STML   RS+/RS/P.ID2
          UJK    SID2X
          EJECT
 SDETX    LJM    **
 SDET     EQU    *-1         SAVE 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
** NAME-- GETSS
*
** PURPOSE-- READ SS ENTRY FROM UNIT COMMUNICATION BUFFER IN
*            CM UNIT INTERFACE TABLE.
*
          SPACE  6
 GETSSX   LJM    **
 GETSS    EQU    *-1

* IF LOCKS = UX, THEN THE LOCK IS STILL SET, AND THE SS ENTRY IS STILL IN MEMORY.
* IF LOCKS = UX, RETURN.
* IF LOCKS = A DIFFERENT UX, CALL CSLOCK TO CLEAR THE OTHER LOCK.

          LDDL   LOCKS       CHECK IF LOCK IS STILL SET AND SS IN MEMORY
          SBDL   UX
          NJN    GETSS5      IF SS ENTRY IS NOT IN MEMORY
          LDML   UNITS+/UN/P.LUN,UX  VALIDATE LOGICAL UNIT NUMBER
          SBML   RS+/RS/P.LU
          ZJK    GETSSX      IF SS ENTRY IS IN MEMORY
          RJM    HALT        IF NOT THE CORRECT UNIT, TEMPORARY HALT
*         (NO RETURN FROM HALT.)

 GETSS5   BSS
          LDDL   LOCKS       CHECK IF A DIFFERENT LOCK IS SET
          SBN    NOLOCK
          ZJN    GETSS20     IF NO LOCK TO CLEAR
          LDML   SS+/SS/P.CONF  CHECK IF RUNNING INITIAL CONFIDENCE TEST
          LPK    /SS/K.CONF
          ADML   SS+/SS/P.RECOV  CHECK IF IN ERROR RECOVERY
          ZJN    GETSS10     IF NOT IN ERROR RECOVERY OR RUNNING CONFIDENCE TEST
          LDDL   UX          SAVE UX
          STDL   SAVUX
          LDDL   LOCKS       UX INDEX OF LOCK TO CLEAR
          STDL   UX
          RJM    SAVSS       SAVE SS ENTRY
          LDN    NOLOCK
          STDL   LOCKS       CLEAR LOCK FLAG
          LDDL   SAVUX       RESTORE UX
          STDL   UX
          UJN    GETSS20

 GETSS10  BSS
          RJM    CSLOCK      CLEAR THE OTHER LOCK

* READ SS ENTRY FROM UNIT COMMUNICATION BUFFER.

 GETSS20  BSS
          LDK    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
          LDML   UNITS+/UN/P.LUN,UX  VALIDATE LOGICAL UNIT NUMBER
          SBML   RS+/RS/P.LU
          ZJK    GETSSX      IF THE CORRECT UNIT
          RJM    HALT        IF NOT THE CORRECT UNIT, TEMPORARY HALT
*         (NO RETURN FROM HALT.)
          SPACE  6
          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   UNUML
          ZJK    SAVX        IF NO UNITS
          LDML   UNITS+/UN/P.LUN,UX  VALIDATE THE LOGICAL UNIT NUMBER
          SBML   RS+/RS/P.LU
          NJN    SAV10       IF NOT THE CORRECT UNIT, TEMPORARY HALT
          LDDL   UX
          SBDL   UNUML
          PJK    SAVX        IF INVALID SS TABLE

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

          LDK    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

 SAV10    BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)
          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
          STML   RCON        RESPONSE CONDITION
          STML   NODEL       DON'T DELINK REQUEST FLAG
          STML   RS+/RS/P.HDWR  ABNORMAL STATUS
          STML   RS+/RS/P.IEC  INTERFACE ERROR CODE

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

          LDN    8           SET RESPONSE LENGTH FOR NORMAL RESPONSE
          STML   RS+/RS/P.RESPL
          LDN    R.NRM       SET RESPONSE CODE = NORMAL
          STDL   RESPC
          SHN    16-/RS/N.RC-/RS/L.RC
          STML   RS+/RS/P.RC  PUT RESPONSE CODE IN RESPONSE
          UJK    ZREX
          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.

          LDML   UNITS+/UN/P.QSTRT,UX  SET CURRENT QUEUE POINTER TO START OF CHAIN
          STML   SS+/SS/P.QP
          LDML   UNITS+/UN/P.QSTRT+1,UX
          STML   SS+/SS/P.QP+1
          LOADF  SS+/SS/P.QP  LOAD CM ADDRESS OF UNIT QUEUE TABLE
          CRDL   T1          READ RMA OF FIRST REQUEST IN CHAIN
          ADN    1
          CRDL   T1+4
          LDML   SS+/SS/P.CUR  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-- 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
          STDL   TOTAL
          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
          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
          RADL   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
          LDDL   TOTAL
          SHN    9
          LPC    177000B
          STML   SS+/SS/P.TOTAL+1  TOTAL CM WORDS TO TRANSFER
          LDDL   TOTAL
          SHN    -7
          STML   SS+/SS/P.TOTAL
          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)
          STML   SS+/SS/P.CURRQ2  REQUEST TO BE RESTARTED DURING
                             ERROR RECOVERY
          LDML   SS+/SS/P.REQ+1
          STML   SS+/SS/P.FCOMRQ+1
          STML   SS+/SS/P.CURRQ+1
          STML   SS+/SS/P.CURRQ2+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
          LDML   CHANT,CH    CHANNEL NUMBER
          STML   RS+/RS/P.CHAN
          LDML   CHANT+/CH/P.PORT,CH  PORT B IF SET
          SHN    /CH/L.PORT-/RS/L.PORT
          RAML   RS+/RS/P.PORT

* 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    -16+/SS/L.TRACK+/SS/N.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
          UJK    SETADDX
          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
          LDN    1
          STDL   WC
          LOADF  SS+/SS/P.CURRQ2  GET PVA FOR NEXT RESPONSE
          CRML   RS,WC
          LDN    0
          STML   RS+/RS/P.XFER  TRANSFER COUNT
          STML   RS+/RS/P.XFER+1

          AOML   SS+/SS/P.NCOMRQ  INCREMENT NUMBER OF COMPLETED REQUESTS IN
                             WHICH RESPONSES HAVE BEEN SENT
          SOML   SS+/SS/P.NCOMW  DECREMENT NUMBER OF COMPLETED REQUESTS FOR
                             WHICH RESPONSES HAVE NOT BEEN SENT
          LDML   SS+/SS/P.CURRQ2  SAVE RMA OF REQUEST IN WHICH THE LAST
                             RESPONSE IS SENT
          STML   SS+/SS/P.PRERQ
          LDML   SS+/SS/P.CURRQ2+1
          STML   SS+/SS/P.PRERQ+1
          UJK    SNDX
          EJECT
** NAME-- SNDWRS
*
** PURPOSE-- SEND RESPONSES FOR REQUESTS THAT HAVE
*            BEEN SUCCESSFULLY STREAMED.
          SPACE  6
 SNDWX    LJM    **
 SNDWRS   EQU    *-1
          LDML   SS+/SS/P.NCOMW  NUMBER OF COMPLETED REQUESTS MINUS 1, FOR
                             WHICH A RESPONSE HAS NOT BEEN SENT
          ZJN    SNDWX       IF NO COMPLETED REQUESTS
          UJN    SNDW20

 SNDW10   BSS
          LDN    1
          STDL   WC
          LOADF  SS+/SS/P.CURRQ2  CM ADDRESS OF NEXT REQUEST
          ADN    /RQ/C.NEXT
          CRML   NRQ,WC      READ RMA OF NEXT REQUEST
          LDML   NRQ+2
          STML   SS+/SS/P.CURRQ2
          LDML   NRQ+3
          STML   SS+/SS/P.CURRQ2+1
 SNDW20   BSS
          RJM    SNDRSP      SEND RESPONSE TO CM
          LDML   SS+/SS/P.NCOMW  NUMBER OF RESPONSE LEFT TO SEND
          NJK    SNDW10      IF MORE RESPONSES TO SEND
          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
          UJK    SNDWX
          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
 DEL10    BSS
          RJM    SQLOCK      SET QUEUE LOCKWORD
          NJN    DEL10       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    DEL20       IF INVALID QUEUE COUNT
          LDDL   T1
          LMC    400000B
          CWDL   P1          WRITE QUEUE COUNT

* RE-READ RMA CHAIN POINTERS OF CURRENT REQUEST.

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

* DELINK REQUEST.
* (P3 = 2.)

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

* CHECK IF NEXT REQUEST IN CHAIN = COMPLETED REQUEST.

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

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

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

* CLEAR FLAGS IN SS ENTRY.

          LDML   SS+/SS/P.SEEK  CLEAR 'SEEK ISSUED', 'CURRENT REQUEST'
          LPC    -/SS/K.SEEK-/SS/K.CUR
          STML   SS+/SS/P.SEEK
          LDN    0
          STML   SS+/SS/P.NCOMRQ  CLEAR COMPLETED REQUEST COUNT

* SELECT NEXT REQUEST ON QUEUE.

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

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

* SET CURRENT REQUEST IN SS TO SELECTED REQUEST.

          RJM    UREQ        READ SELECTED REQUEST INTO RQ
          LDML   RQ+/RQ/P.CYL
          STML   SS+/SS/P.CYL  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
          UJK    DELX
          EJECT
** NAME-- CSLOCK
*
** PURPOSE-- CLEAR THE LOCK OF THE UNIT WHOSE UX INDEX IS IN LOCKS.
          SPACE  6
 CSLX     LJM    **
 CSLOCK   EQU    *-1
          LDDL   LOCKS       CHECK IF THERE IS A LOCK TO CLEAR
          SBN    NOLOCK
          ZJK    CSLX        IF NO LOCK TO CLEAR
          LDDL   UX          SAVE UX
          STDL   SAVUX
          LDDL   LOCKS       UX INDEX OF LOCK TO CLEAR
          STDL   UX
          RJM    CSHOLD      CLEAR SELECT HOLD IF IT IS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
          LDDL   SAVUX       RESTORE UX
          STDL   UX
          UJK    CSLX
          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
          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
          LDN    1
          STML   UNITS+/UN/P.LOCK,UX  SET UNIT LOCK FLAG
          RJM    GETSS       READ SS ENTRY FROM UNIT COMMUNICATION BUFFER
          RJM    SCLOCK      SET CHANNEL LOCK
          ZJK    SETLX       IF CHANNEL LOCK WAS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
          LDN    1           LOCK COULD NOT BE SET
          UJK    SETLX
          EJECT
** NAME-- 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-- 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   UNUML
          ZJK    SCLX        IF NO UNITS
          LDML   CHANT+/CH/P.LOCK,CH
          STDL   P3
          LDIL   P3
          ZJN    SCL20       IF CHANNEL LOCK IS NOT SET
 SCL10    BSS
          LDN    0           EXIT A REGISTER = 0
 SCL15    UJK    SCLX

 SCL20    BSS
          LDK    C.CHCNT
          STML   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
          LDML   CHANT,CH    CHANNEL NUMBER IS OFFSET IN TABLE
          STDL   T5
          RJM    LOCK        SET LOCKWORD
          NJN    SCL40       IF LOCK WAS NOT SET

* SET CHANNEL LOCK FLAG ON BOTH PORTS.

          AOIL   P3          SET CHANNEL LOCK FLAG
          UJK    SCL10       EXIT, LOCK WAS SET

 SCL40    BSS
          SODL   P1
          NJK    SCL30
          SODL   P2
          NJK    SCL30
          LDN    1           TIMEOUT ON TRYING TO GET CHANNEL LOCK
          UJK    SCL15       EXIT A REGISTER NONZERO
          EJECT
** NAME-- SPLOCK
*
** PURPOSE-- SETS THE PP REQUEST QUEUE LOCK IN THE
*            PP INTERFACE TABLE.
*
** EXIT-- A REGISTER = 0, IF LOCK WAS SUCCESSFULLY SET.
*                    .NE. 0, IF LOCK COULD NOT BE SET.
          SPACE  6
 SPLX     LJM    **
 SPLOCK   EQU    *-1
          LDK    CM.PIT      PP INTERFACE TABLE ADDRESS
          STDL   T7
          LDN    /PIT/C.LOCK  OFFSET OF PP QUEUE LOCKWORD
          STDL   T5
          RJM    LOCK        SET THE LOCKWORD
          UJK    SPLX
          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    LOCK30      EXIT, A REGISTER = 0
          EJECT
** NAME-- CLRLOCK
*
** PURPOSE-- CLEARS UNIT LOCK IN UNIT INTERFACE TABLE.
*
          SPACE  6
 CLRLX    LJM    **
 CLRLOCK  EQU    *-1
          RJM    SAVSS       WRITE SS ENTRY TO COMMUNICATION BUFFER
                               IN UNIT INTERFACE TABLE
          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
          LDN    0
          STML   UNITS+/UN/P.LOCK,UX  CLEAR UNIT LOCK FLAG
          LDN    NOLOCK
          STDL   LOCKS       CLEAR LOCK FLAG
          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-- CCLOCK
*
** PURPOSE-- CLEARS CHANNEL LOCK.
*
          SPACE  6
 CCLX     LJM    **
 CCLOCK   EQU    *-1
          LDML   CHANT+/CH/P.LOCK,CH
          STDL   P3
          LDIL   P3
          ZJK    CCLX        IF CHANNEL LOCK WAS NOT SET
          LDC    CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          STDL   T7
          LDML   CHANT,CH    CHANNEL NUMBER = OFFSET IN TABLE
          STDL   T5
          RJM    CLOCK       CLEAR CHANNEL LOCKWORD

* CLEAR CHANNEL LOCK FLAG IN BOTH PORTS.

          LDN    0
          STIL   P3          CLEAR CHANNEL LOCK FLAG
          UJK    CCLX
          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-- 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
 CLK25    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    CLK25       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
          STML   CHLCNT      NUMBER OF REQUESTS TO PROCESS BEFORE
                             GIVING UP THE CHANNEL
          LDN    0
          STDL   CH
          LDDL   UNUML
          ZJK    CKCX        IF NO UNITS
 CKC10    BSS
          LDML   CHANT+/CH/P.LOCK,CH
          STDL   T2
          LDIL   T2
          ZJN    CKC20       IF CHANNEL LOCK IS NOT SET
          LOADC  CM.CHAN     CM ADDRESS OF CHANNEL INTERLOCK TABLE
          ADML   CHANT,CH    CHANNEL NUMBER IS OFFSET IN TABLE
          CRDL   T1          READ CHANNEL LOCKWORD
          LDDL   T2
          SHN    17-0
          MJN    CKC30       IF MAINTENANCE PP WANTS THE CHANNEL

 CKC20    BSS
          LDN    P.CH
          RADL   CH
          SBDL   CNUML
          PJN    CKC35       IF END OF TABLE
          UJK    CKC10

* GIVE UP THE CHANNEL.

 CKC30    BSS
          RJM    RDOVL       READ OVERLAY
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          RJM    CSLOCK      CLEAR THE LAST UNIT LOCK, IF ANY
          RJM    CKCMND      CHECK IF OUTSTANDING COMMANDS
          LDDL   CMNDS
          NJN    CKC40       IF OUTSTANDING COMMANDS
          RJM    CLRUL       CLEAR ALL UNIT LOCKS
          LDN    0
          STDL   PIDLE       CLEAR PRE-IDLE FLAG
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          PAUSE  130000      DELAY 130 MILLISECONDS TO ALLOW
                             MAINTENANCE PP TO GET THE CHANNEL
 CKC35    UJK    CKCX

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

 CKC40    BSS
          LDN    1
          STDL   PIDLE       SET PRE-IDLE FLAG SO NO SEEKS WILL BE ISSUED
          UJK    CKC35
          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
 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
          RJM    RDOVL       READ OVERLAY
          LJM    PPR1

          EJECT
** NAME-- RCLOCK
*
** PURPOSE-- READ THE REAL TIME CLOCK.
          SPACE  6
 RCLX     LJM    **
 RCLOCK   EQU    *-1
          LDDL   UNUML
          ZJK    RCLX        IF NO UNITS
          LDML   LCLOCK      TIME WHEN CLOCK LAST READ
          STDL   T1
          IAN    14B         READ THE CLOCK
          STML   LCLOCK
          SBDL   T1          ELAPSED TIME
          PJN    RCL10       IF CLOCK HASN'T WRAPPED AROUND
          ADC    10000B      ADJUST FOR WRAPAROUND
 RCL10    BSS
          RAML   ELAPT+1     UPDATE ELAPSED TIME
          SHN    -16
 RCL20    BSS
          RAML   ELAPT
          SBN    17B
          MJK    RCLX        IF LESS THAN 1 SECOND HAS ELAPSED

* UPDATE ELAPSED TIME FOR EACH UNIT.

          LDN    0
          STDL   T1
 RCL30    BSS
          AOML   UNITS+/UN/P.ELAPT,T1  ADD 1 SECOND TO ELAPSED TIME
          LDN    P.UN        BUMP UNIT ENTRY
          RADL   T1
          SBDL   UNUML
          MJK    RCL30       IF MORE UNITS
          LDC    -41100B     SUBTRACT 1 SECOND FROM ELAPSED TIME
          RAML   ELAPT+1
          LDC    -17B
          UJK    RCL20
          EJECT
** NAME--CHGCH
*
** PURPOSE--REPLACE CHANNEL INSTRUCTIONS WITH A DIFFERENT CHANNEL NUMBER.
*
** INPUT--CHANT,CH = CHANNEL NUMBER
*
          SPACE  6
 CHGX     LJM    **
 CHGCH    EQU    *-1
          LDML   CHANT,CH    CHANNEL NUMBER
          SBML   CURCH       CURRENT CHANNEL NUMBER
          ZJN    CHG20       NO CHANGE NEEDED
          RAML   CURCH       SAVE NEW CHANNEL
          LDDL   BSR         CHECK IF A CONTROLLER IS SELECTED
          ZJN    CHG5        IF NO CONTROLLER IS SELECTED
          RJM    CSHOLD      CLEAR SELECT HOLD IF SET
 CHG5     BSS
          LDDL   CREG        SET CONTROL REGISTER WITH CORRECT PORT SETTING
          LPC    -40000B
          ADML   CHANT+/CH/P.PORT,CH
          STDL   CREG
          LDN    0
          STDL   BSR         CLEAR BSR FROM LAST SELECT
          STDL   T1          CHANGE DISK CHANNEL INSTRUCTIONS
 CHG10    LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHG40       END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMML   CURCH       CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CHG10

* CHECK IF CORRECT PORT IS SET.

 CHG20    BSS
          LDDL   CREG        CONTROL REGISTER
          LPC    /CH/K.PORT  PORT B IF SET
          SBML   CHANT+/CH/P.PORT,CH
          ZJN    CHG50       IF CORRECT PORT IS SET
          LDDL   BSR         CHECK IF A CONTROLLER IS SELECTED
          ZJN    CHG30       IF NO CONTROLLER IS SELECTED
          RJM    CSHOLD      CLEAR SELECT HOLD IF SET
 CHG30    BSS
          LDN    0
          STDL   BSR         CLEAR BSR FROM LAST SELECT
          LDDL   CREG        CHANGE TO OTHER PORT IN CONTROL REGISTER
          LMC    /CH/K.PORT
          STDL   CREG
 CHG40    BSS
          LDK    F.WTCR      WRITE CONTROL REGISTER
          RJM    FUNC
          ACN    DC
          LDN    1
          OAM    CREG,DC
          RJM    DCN         DISCONNECT CHANNEL
 CHG50    UJK    CHGX
          EJECT
** NAME--CHGCH2
*
** PURPOSE--REPLACE CHANNEL INSTRUCTIONS WITH A DIFFERENT CHANNEL NUMBER.
*           SAME AS CHGCH, ONLY IT DOESN'T SEND ANY FUNCTIONS.
*
** INPUT--CHANT,CH = CHANNEL NUMBER.
*
          SPACE  6
 CHGCX    LJM    **
 CHGCH2   EQU    *-1
          LDN    0
          STDL   BSR         CLEAR BSR FROM LAST SELECT
          LDML   CHANT+/CH/P.PORT,CH  SET CONTROL REGISTER WITH CORRECT PORT SETTING
          LPC    40000B
          STDL   CREG
          LDML   CHANT,CH    CHANNEL NUMBER
          SBML   CURCH       CURRENT CHANNEL NUMBER
          ZJN    CHGCX       NO CHANGE NEEDED
          RAML   CURCH       SAVE NEW CHANNEL
          LDN    0
          STDL   T1          CHANGE DISK CHANNEL INSTRUCTIONS
 CHGC10   LDML   CONCH,T1    ADDRESS OF CHANNEL INSTRUCTIONS
          ZJN    CHGCX       END OF LIST
          STDL   T2
          LDIL   T2
          SCN    37B
          LMML   CURCH       CHANNEL NUMBER
          STIL   T2
          AODL   T1
          UJK    CHGC10
          EJECT
** NAME-- RDOVL
*
** PURPOSE-- READ AN OVERLAY.
          SPACE  6
 RDOX     LJM    **
 RDOVL    EQU    *-1
          LDN    OVRLNC      OVERLAY LENGTH
          ZJK    RDOX
          STDL   WC
          LOADC  CM.CB       CM ADDRESS OF COMMUNICATION BUFFER
          ADK    /CB/C.OVR   CM ADDRESS OF OVERLAY
          CRML   BUFF,WC     READ OVERLAY
          UJK    RDOX
          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
          NJN    FOR10       RMA ADDRESS ERROR, TEMPORARY HALT
          LDIL   T1
          LPN    37B
          SHN    16
          LMML   1,T1
          SHN    9
          STD    CMADR+1
          SHN    6
          LPN    77B
          STDL   CMADR+2
          LDIL   T1
          SHN    -5
          STD    CMADR
          LRD    CMADR
          LDDL   CMADR+2
          LMC    400000B
          UJK    FORX

 FOR10    BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)
          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
 K26      IFEQ   HARDW,1
 PAUS10   SBN    1           EACH ITERATION OF THIS SBN-NJN LOOP
          NJN    PAUS10      UTILIZES 1 MICROSECOND
 K26      ENDIF
          UJK    PAUSX
          EJECT
 K27      IFEQ   TRACE,1
 TBUFX    LJM    **
 TBUF     EQU    *-1
          STML   FBUF,FI     SAVE HISTORY OF FUNCTIONS ISSUED
          AODL   FI          INCREMENT FUNCTION BUFFER INDEX
          ADC    -FBUFL
          NJN    TBUF10      IF NOT END OF BUFFER
          STDL   FI          INITIALIZE INDEX
 TBUF10   BSS
          UJK    TBUFX
 K27      ENDIF
          EJECT
** NAME-- PATCH
*
** PURPOSE-- PATCH THE PP.
*
** NOTES--
*    RMA OF PATCH AREA IS IN THE FIRST 32 BITS OF THE WORD CONTAINING THE
*    RESPONSE BUFFER RMA.
*    SET THE UPPER BIT IN THE 32-BIT RMA AS THE LAST THING.
*    (IF RMA = FC9008, THEN FIRST SET THE 32 BITS = 00FC 9008,
*    AND THEN SET THE 32 BITS = 80FC 9008
*    THE PP WILL CLEAR THE RMA AFTER IT HAS STORED THE PATCHES.
*
*    FORMAT OF PATCH AREA (EVERY 16 BITS).
*      ADDR, CONTENTS, ..., CONTENTS
*      F000, ADDR, CONTENTS, ..., CONTENTS
*      FFFF = END OF CONTENTS
*
*      ANY NUMBR OF F000 MAY SEPARATE CONTENTS FROM THE NEXT ADDRESS.
*      ZERO OR MORE F000 MAY SEPARATE CONTENTS FROM FFFF.
 K28      IFEQ   PAT,1
 PATX     LJM    **
 PATCH    EQU    *-1
          LDN    1
          STDL   WC
          LOADC  CM.PIT
          ADN    /PIT/C.RSBUF
          CRML   PCM,WC
          LDML   PCM
          LPC    100000B
          ZJN    PATX        IF NO PATCHES
          LMML   PCM         CLEAR UPPER BIT
          STML   PCM
          LOADF  PCM         RMA OF PATCH AREA
          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
          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
          UJN    PAT40

 PAT30    LDML   P1,P5
          STIL   PAD
          AODL   PAD
          RJM    PBUMP
 PAT40    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
 K28      ENDIF
          EJECT
* DEBUG TEST.
          SPACE  6
 Q11      IFEQ   ERRTST,1
 TESTX    LJM    **
 TEST     EQU    *-1
          LOADC  CM.PIT
          ADN    /PIT/C.CBUF  COMMUNICATION BUFFER
          STDL   P1
          CRDL   P2
          LDDL   P2
          ZJN    TESTX
          STML   TESTPAR     SAVE PARAMETER
          LDN    0
          STDL   P2
          LDDL   P1
          LMC    400000B
          CWDL   P2
          LDML   TESTPAR
          SBN    29
          MJN    TESTX
          SBN    34-29+1
          PJN    TESTX       IF NOT FORCE ERROR FUNCTION
          UJK    TESTX
          SPACE  6
 TESTPAR  BSSZ   1           TEST PARAMETER
 Q11      ENDIF
          EJECT
* TABLE FOR CONVERTING BUSY / ATTENTION BITS TO CONTROLLER NUMBERS.
          SPACE  6
 ATTAB    CON    200B        CONTROLLER 0
          CON    100B        CONTROLLER 1
          CON    40B         CONTROLLER 2
          CON    20B         CONTROLLER 3
          CON    10B         CONTROLLER 4
          CON    4           CONTROLLER 5
          CON    2           CONTROLLER 6
          CON    1           CONTROLLER 7
          EJECT
 ADPTERR  CON    0
          LDML   RDAT
          ZJN    ADPT3       IF NOT READING ATTENTIONS
          RJM    SETUX       SET A LOCK ON A UNIT WITH THIS CHANNEL NUMBER
          NJK    MAIN10      IF LOCK COULD NOT BE SET, IGNORE ERROR

* MASTER CLEAR THE CHANNEL.

 ADPT3    BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDN    1
          SHN    16-/SS/N.MCTRY-/SS/L.MCTRY
          RAML   SS+/SS/P.MCTRY  INCREMENT CHANNEL MASTER CLEAR RETRY COUNTER
          SHN    /SS/L.MCTRY+/SS/N.MCTRY+2
          LPK    /SS/M.MCTRY
          SBN    CNTRY+1
          MJN    ADPT5       IF MASTER CLEAR RETRY NOT EXHAUSTED
          RJM    OTERM       TURN OFF ALL UNITS ON CHANNEL
*         (NO RETURN FROM OTERM.)

 ADPT5    BSS
          RJM    CHREG       READ CHANNEL REGISTERS

          RJM    ICH         MASTER CLEAR THE CHANNEL

          LDML   RDAT
          NJK    REC3        IF ERROR DURING READING ATTENTIONS

          LDML   SS+/SS/P.MCTRY  CLEAR MASTER CLEAR RETRY COUNTER
          LPC    -/SS/K.MCTRY
          STML   SS+/SS/P.MCTRY

* WAIT FOR AN ATTENTION.

          LDML   SS+/SS/P.WTA
          SHN    /SS/L.WTA+2
          MJN    ADPT10      IF PREVIOUS ERROR WAITING FOR AN ATTENTION
          LDK    /SS/K.WTA
          RAML   SS+/SS/P.WTA  SET FLAG WHEN WAITING FOR ATTENTION
          RJM    WTATTN      WAIT 2 SECONDS FOR AN ATTENTION
          LDML   SS+/SS/P.WTA  ZERO OUT WAITING FOR ATTENTION FLAG
          LPC    -/SS/K.WTA
          STML   SS+/SS/P.WTA

 ADPT10   BSS
          LDML   SS+/SS/P.RESET
          SHN    /SS/L.RESET+2
          MJK    RECD        IF ERROR ON SELECTIVE RESET

          LDML   SS+/SS/P.NR  CHECK IF ERROR ON POWER UP SPINDLE
          LPK    /SS/K.NR
          ZJN    ADPT20      IF NOT TRYING TO POWER UP SPINDLE
          RJM    NOTRDY      RETRY TO POWER UP SPINDLE
*         (NO RETURN FROM NOTRDY.)

 ADPT20   BSS
          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
 ADPT30   BSS
          LDML   RS+/RS/P.CMST2
          SHN    17-10
          PJN    ADPT40      IF SYSTEM INTERVENTION STATUS NOT VALID
          LDML   RS+/RS/P.CMST2+1
          LPC    377B        SYSTEM INTERVENTION STATUS
          ADC    -150B       SI-68
          ZJN    ADPT50      IF TRANSFER COUNT ERROR
 ADPT40   BSS
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          RJM    SAVSS       SAVE SS ENTRY
          RJM    RCMRQ       RESTART THE REQUESTS
          LJM    MAIN10


* TRANSFER COUNT ERROR MEANS THAT THE CONTROLLER DID NOT END ON A SECTOR
* BOUNDARY.  THEREFORE, ALL OF THE DATA COULD BE BAD.
* RECOVERY WILL BE ATTEMPTED UNLESS THE DRIVER WAS STREAMING READ REQUESTS.
* IN THE CASE OF STREAMING READ REQUESTS, SINCE THE BAD DATA COULD HAVE
* BEEN IN A REQUEST IN WHICH A NORMAL RESPONSE HAS ALREADY BEEN SENT, THE
* CURRENT REQUEST WILL BE RETURNED AS UNRECOVERED, AND ERROR RECOVERY WILL
* NOT BE ATTEMPTED.  THIS WILL CAUSE THE JOB TO GET ABORTED.  THE EXCEPTION
* IS IF THE REQUEST THAT GOT THE BAD DATA WAS FOR A DIFFERENT FILE THAN THE
* CURRENT REQUEST.
* AN ERROR LOG MESSAGE OF AN UNRECOVERED -TRANSFER COUNT ERROR- SHOWS THAT
* BAD (OR SHIFTED) DATA MAY HAVE BEEN TRANSFERRED ON 1 OR MORE PREVIOUS
* REQUESTS.

 ADPT50   BSS
          LDML   SS+/SS/P.NCOMRQ  NUMBER OF RESPONSES - 1, WHICH HAVE BEEN SENT
          SBN    1
          ZJK    ADPT40      IF NO RESPONSES HAVE BEEN SENT, TRY TO RECOVER

* TRY TO RECOVER IF I4 CHANNEL ADAPTER STOPPED THE TRANSFER.

          LDML   RS+/RS/P.DET
          LPK    /RS/K.TIP+/RS/K.TOP
          NJK    ADPT40      TRY TO RECOVER
          LDML   RS+/RS/P.ID2
          LPK    /RS/K.XFER+/RS/K.XFRTO+/RS/K.TRTO
          NJK    ADPT40      TRY TO RECOVER
          LDML   RS+/RS/P.ESREG
          NJK    ADPT40      TRY TO RECOVER
          LDML   RS+/RS/P.ERRID
          LPK    /RS/K.IST+/RS/K.CEMPT+/RS/K.CINAC+/RS/K.ADPT
 ADPT54   NJK    ADPT40      TRY TO RECOVER
          LDML   RS+/RS/P.CHERR
          LPK    /RS/K.FTO
          NJK    ADPT54      TRY TO RECOVER
          LJM    REC25       ABORT THE REQUEST
          EJECT
 RECS     CON    0

          RJM    CHREG       READ CHANNEL REGISTERS

* READ ERROR REGISTER IMAGE.

          LDN    1
          SHN    16-/SS/N.ERI-/SS/L.ERI
          RAML   SS+/SS/P.ERI  INCREMENT READ ERROR REGISTER IMAGE RETRY COUNTER
          SHN    /SS/L.ERI+/SS/N.ERI+2
          LPK    /SS/M.ERI
          SBN    CNTRY+1
          PJN    REC2        IF READ ERROR REGISTER IMAGE RETRY IS EXHAUSTED
          RJM    RDERI       READ ERROR REGISTER IMAGE
          UJN    REC3        WAIT FOR ATTENTION AND DATA AVAILABLE
          SPACE  6
* ENTRY WHEN DATA AVAILABLE FOR ERROR REGISTER IMAGE.

 RDERA    CON    0
          RJM    ERA         READ ERROR REGISTER IMAGE
          UJN    REC3        WAIT FOR ATTENTION AND COMMAND COMPLETE
          SPACE  6
* ENTRY WHEN READ ERROR REGISTER IMAGE COMMAND COMPLETE.

 RDERC    CON    0

          LDML   SS+/SS/P.ERI  ZERO OUT READ ERROR REGISTER IMAGE
                               RETRY COUNTER
          LPC    -/SS/K.ERI
          STML   SS+/SS/P.ERI

* READ ERROR LOG.

 REC2     BSS
 M6       IFNE   CMSE,1
          LDN    1
          SHN    16-/SS/N.ELOG-/SS/L.ELOG
          RAML   SS+/SS/P.ELOG  INCREMENT READ ERROR LOG RETRY COUNTER
          SHN    /SS/L.ELOG+/SS/N.ELOG+2
          LPK    /SS/M.ELOG
          SBN    CNTRY+1
          PJN    REC4        IF READ ERROR LOG RETRY IS EXHAUSTED
          RJM    ELOG        READ ERROR LOG
 M6       ENDIF
 REC3     BSS
          RJM    SAVSS       SAVE SS ENTRY
          LJM    MAIN10      WAIT FOR ATTENTION AND DATA AVAILABLE
          SPACE  6
* ENTRY WHEN DATA AVAILABLE FOR ERROR LOG.

 ELOGA    CON    0
 M7       IFNE   CMSE,1
          RJM    ELA         READ ERROR LOG
          UJK    REC3        WAIT FOR ATTENTION AND COMMAND COMPLETION
          SPACE  6
* ENTRY WHEN READ ERROR LOG COMMAND COMPLETE.

 M7       ENDIF
 ELOGC    CON    0
 M8       IFNE   CMSE,1

          LDML   SS+/SS/P.ELOG  ZERO OUT READ ERROR LOG RETRY COUNTER
          LPC    -/SS/K.ELOG
          STML   SS+/SS/P.ELOG
 M8       ENDIF

 REC4     BSS
          UJK    ADPT10      RETRY THE REQUEST
          SPACE  6
* IF SI41 OR 43,
* EXECUTE CONTROLLER LEVEL II DIAGNOSTIC COMMAND 78, SUBTEST 6.

 RECA     BSS
          LDML   RS+/RS/P.CMST2
          SHN    17-10
          PJN    REC15       IF SYSTEM INTERVENTION STATUS NOT VALID
          LDML   RS+/RS/P.CMST2+1
          LPC    377B        SYSTEM INTERVENTION STATUS
          ADC    -101B       SI-41
          ZJN    REC5        IF MEDIA ERROR IN HEADER (READ OR WRITE)
          SBN    103B-101B   SI-43
          NJN    REC15       IF NOT MEDIA ERROR ON DATA (READ)
 REC5     BSS
          LDN    R40
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    DIAGSUB     EXECUTE CONTROLLER DIAGNOSTIC COMMAND 78, SUBTEST 6
 REC10    BSS
          UJK    REC3        WAIT FOR ATTENTION AND COMMAND COMPLETE

 REC15    UJK    REC30
          SPACE  6
* CONTROLLER DIAGNOSTIC COMMAND 78, SUBTEST 6, WAS SUCCESSFUL.
* EXECUTE CONTROLLER LEVEL II DIAGNOSTIC COMMAND 79, SUBTEST 5.

 DIAGSC   CON    0
          RJM    DIAGW       EXECUTE CONTROLLER DIAGNOSTIC COMMAND 79, SUBTEST 5
          UJK    REC10       WAIT FOR ATTENTION AND COMMAND COMPLETE
          SPACE  6
* CONTROLLER DIAGNOSTIC COMMAND 79, SUBTEST 5, WAS SUCCESSFUL.

 DIAGT    CON    0
          LDN    R30
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    SAVSS       SAVE SS ENTRY
          UJK    ADPT30      RETRY THE REQUEST
          SPACE  6
* UNRECOVERED MEDIA ERROR.

 RECC     BSS
          LDML   RS+/RS/P.CMST2
          SHN    17-10
          PJN    REC22       IF SYSTEM INTERVENTION STATUS NOT VALID
          LDML   RS+/RS/P.CMST2+1
          LPC    377B        SYSTEM INTERVENTION STATUS
          ADC    -101B       SI-41
          ZJN    REC20       IF MEDIA ERROR IN HEADER (READ OR WRITE)
          SBN    103B-101B   SI-43
          NJN    REC30       IF NOT MEDIA ERROR ON DATA (READ)
 REC20    BSS
          LDML   SS+/SS/P.CONF  CHECK IF DOING INITIAL CONFIDENCE TEST
          SHN    /SS/L.CONF+2
          PJN    REC23       IF NOT DOING INITIAL CONFIDENCE TEST
          LDN    0
          STML   SS+/SS/P.RECOV  START RECOVERY AT BEGINNING
          RJM    CREC        HANDLE CONFIDENCE TEST ERRORS
*         (RETURNS ONLY IF TOO MANY MEDIA ERRORS.)

 REC22    UJN    REC30       IF LIMIT OF MEDIA ERRORS HAS BEEN REACHED


 REC23    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

 REC25    BSS
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNCB
          RJM    HTERM       UNRECOVERED ERROR
*         (NO RETURN FROM HTERM.)
          SPACE  6
 RECI     BSS

* DETERMINE IF UNIT SHOULD BE DOWNED.

          LDML   RS+/RS/P.CMST2
          SHN    17-14
          MJK    REC25       IF HYDRA REPORTED THE ERROR ON THE FINAL RETRY
          LJM    RECH        DISABLE THE UNIT
          SPACE  6
 REC30    BSS
          LDN    R40
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          SPACE  6
* SELECTIVE RESET THE HYDRA.

 RECD     BSS
          LDN    1
          SHN    16-/SS/N.SRTRY-/SS/L.SRTRY
          RAML   SS+/SS/P.SRTRY  INCREMENT CHANNEL MASTER CLEAR RETRY COUNTER
          SHN    /SS/L.SRTRY+/SS/N.SRTRY+2
          LPK    /SS/M.SRTRY
          SBN    COSTRY+1
          MJN    REC40       IF SELECTIVE RESET RETRY NOT EXHAUSTED
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNCB
          RJM    OCTERM      TURN OFF ALL UNITS ON THE CONTROLLER
*         (NO RETURN FROM OCTERM.)

 REC40    BSS
          RJM    RESET       ISSUE SELECTIVE RESET
          UJN    REC50       WAIT FOR THE RESET COMPLETION
          SPACE  6
* ENTRY WHEN SELECTIVE RESET SUCCESSFULLY COMPLETES.

 RECE     CON    0
          LDML   SS+/SS/P.SRTRY  ZERO OUT SELECTIVE RESET RETRY COUNTER
          LPC    -/SS/K.SRTRY
          STML   SS+/SS/P.SRTRY
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          UJN    REC60       RETRY THE REQUEST
          SPACE  6
* EXECUTE CONTROLLER LEVEL I DIAGNOSTICS.

 RECF     BSS
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    DIAG        EXECUTE CONTROLLER LEVEL I DIAGNOSTICS
 REC50    UJK    REC10
          SPACE  6
* CONTROLLER LEVEL I DIAGNOSTICS PASSED.

 DIAGC    CON    0
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          LDK    /RS/K.XDP1  LEVEL I DIAGNOSTICS PASSED
          RJM    SID         ERROR ID
 REC60    UJK    ADPT30      RETRY THE REQUEST
          SPACE  6
* EXECUTE CONTROLLER LEVEL II DIAGNOSTICS.

 RECJ     BSS
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          RJM    DIAGG       EXECUTE CONTROLLER LEVEL II DIAGNOSTICS
          UJK    REC50
          SPACE  6
* CONTROLLER LEVEL II DIAGNOSTICS PASSED.

 DIAGD    CON    0
          AOML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          LDK    /RS/K.XDP   LEVEL II DIAGNOSTICS PASSED
          RJM    SID         ERROR ID
          UJK    REC60       RETRY THE REQUEST
          SPACE  6
* LEVEL I OR II DIAGNOSTICS FAILED.
* RETRY THE REQUEST.  IF IT IS STILL UNRECOVERED, DOWN THE UNIT.

 RECG     BSS
          LDN    R60
          STML   SS+/SS/P.RECOV  INDEX TO NEXT RECOVERY PROCEDURE
          UJK    REC60       RETRY THE REQUEST
          SPACE  6
* UNRECOVERED ERROR.  DOWN THE UNIT.

 RECH     BSS
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNCB
          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
          CON    ADPTA       RETRY THE REQUEST
          CON    ADPTA       RETRY THE REQUEST
          CON    RECA        EXECUTE CONTROLLER LEVEL II DIAGNOSTIC COMMAND 78, SUBTEST 6
 RP30     CON    RECC        UNRECOVERED MEDIA ERROR
 RP40     CON    RECD        SELECTIVE RESET
          CON    ADPTA       RETRY THE REQUEST
          CON    RECF        EXECUTE LEVEL I DIAGNOSTICS
          CON    RECG        LEVEL I DIAGNOSTICS FAILED
          CON    RECJ        EXECUTE LEVEL II DIAGNOSTICS
          CON    RECG        LEVEL II DIAGNOSTICS FAILED
          CON    RECI        UNRECOVERED ERROR, LEVEL II DIAGNOSTICS PASSED

 RP60     CON    RECH        UNRECOVERED ERROR, DOWN THE UNIT

 R30      EQU    RP30-RPROC
 R40      EQU    RP40-RPROC
 R60      EQU    RP60-RPROC
          EJECT
** NAME-- SETUX
*
** PURPOSE-- SET THE UNIT LOCK ON ANY UNIT WITH THE SAME CHANNEL AS CH.
*
** EXIT-- A REGISTER = 0 IF A LOCK WAS SET.
*         A REGISTER NONZERO IF NO LOCK WAS SET.
          SPACE  6
 SETUXX   LJM    **
 SETUX    EQU    *-1
          LDDL   UNUML
          ZJK    SETUXX      IF NO UNITS
          LDDL   LOCKS
          STDL   UX
          SBN    NOLOCK
          NJN    SETU50      IF A LOCK IS SET
 SETU5    BSS
          LDN    0
          STDL   UX
 SETU10   BSS
          LDML   UNITS+/UN/P.CHIX,UX  GET POINTER TO CHANT
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          SBDL   CH          COMPARE CHANNEL NUMBER
          ZJN    SETU30      IF THE SAME CHANNEL
 SETU20   BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    SETU10      IF NOT END OF TABLE
          LDN    1           COULD NOT SET A UNIT LOCK
 SETU25   UJK    SETUXX

 SETU30   BSS
          RJM    CDSABLE     CHECK IF UNIT IS DISABLED
          MJN    SETU20      IF UNIT IS DISABLED
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          RJM    SETLOCK     SET UNIT LOCK
          NJN    SETU20      IF LOCK COULD NOT BE SET
 SETU40   BSS
          LDN    0
          UJK    SETU25

* A LOCK IS ALREADY SET.  IF IT IS THE DESIRED CHANNEL, THEN IT IS OK.
* IF IT IS A DIFFERENT CHANNEL, SAVE SS ENTRY BUT LEAVE THE LOCK SET.
* DON'T ALLOW ANY ACTIVITY ON THE CHANNEL, BECAUSE THIS IS CALLED FROM
* ADPTERR.

 SETU50   BSS
          LDML   UNITS+/UN/P.CHIX,UX  GET POINTER TO CHANT
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          SBDL   CH          COMPARE CHANNEL NUMBER
          NJN    SETU60      IF NOT THE SAME CHANNEL
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          UJK    SETU40

 SETU60   BSS
          AOML   DEBUG1      SET FOR DEBUG PURPOSES ONLY
          LDN    NOLOCK
          STDL   LOCKS
          RJM    SAVSS       SAVE SS ENTRY
          UJK    SETU5       FIND A DIFFERENT UNIT ENTRY
          EJECT
** NAME-- CDSABLE
*
** PURPOSE-- CHECK THE UNIT DISABLE FLAG.
*
** EXIT-- A REGISTER IS NEGATIVE IF THE UNIT DISABLE FLAG IS SET
          SPACE  6
 CDSX     LJM    **
 CDSABLE  EQU    *-1
          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
          UJK    CDSX
          EJECT
** NAME-- CHREG
*
** PURPOSE-- READ CHANNEL REGISTERS AND PUT IN RESPONSE.
          SPACE  6
 CHRX     LJM    **
 CHREG    EQU    *-1
          CFM    CHR10,DC    CHECK CHANNEL ERROR

* READ ERROR STATUS REGISTER.

          LDK    F.RDES      READ ERROR STATUS
          RJM    FUNCB
          ACN    40B+DC
          LDN    1
          IAM    P1,DC       ERROR STATUS REGISTER
          DCN    40B+DC      DISCONNECT CHANNEL
          LDML   RS+/RS/P.ESREG
          NJN    CHR5        IF ERROR STATUS REGISTER IS ALREADY IN RESPONSE
          LDDL   P1
          STML   RS+/RS/P.ESREG  PUT ERROR STATUS REGISTER IN RESPONSE
 CHR5     BSS
 K29      IFEQ   TRACE,1
          LDDL   P1
          RJM    TBUF        PUT IN TRACE BUFFER
 K29      ENDIF

* CLEAR CHANNEL ERROR FLAG.

          CFM    CHR10,DC    CLEAR CHANNEL ERROR FLAG

* READ OPERATIONAL STATUS.

 CHR10    BSS
          LDML   RS+/RS/P.OPSTAT
          NJN    CHR20       IF OPERATIONAL STATUS IS ALREADY IN RESPONSE
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNCB
          ACN    40B+DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    40B+DC      DISCONNECT CHANNEL
          LDDL   OPSTAT
          STML   RS+/RS/P.OPSTAT  OPERATIONAL STATUS
 K30      IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 K30      ENDIF

* READ T REGISTER.

 CHR20    BSS
          LDML   RS+/RS/P.TREG
          ADML   RS+/RS/P.TREG+1
          ADML   RS+/RS/P.TREG+2
          NJN    CHR30       IF T REGISTER IS ALREADY IN RESPONSE
          LDK    F.RDT       READ T REGISTER
          RJM    FUNCB
          ACN    40B+DC
          LDN    3
          IAM    RS+/RS/P.TREG,DC  T REGISTER
          DCN    40B+DC

* READ CONTROL REGISTER.

 CHR30    BSS
          LDML   RS+/RS/P.CREG
          ADML   RS+/RS/P.FMREG
          NJN    CHR40       IF CONTROL AND MASK REGISTERS ARE ALREADY
                             IN RESPONSE
          LDK    F.RDCR      READ CONTROL REGISTER
          RJM    FUNCB
          ACN    40B+DC
          LDN    1
          IAM    RS+/RS/P.CREG,DC  CONTROL REGISTER
          DCN    40B+DC

* READ FLAG MASK REGISTER.

          LDK    F.RDMR      READ FLAG MASK REGISTER
          RJM    FUNCB
          ACN    40B+DC
          LDN    1
          IAM    RS+/RS/P.FMREG,DC  FLAG MASK REGISTER
          DCN    40B+DC

* PUT IDLE STATUS IN RESPONSE.

 CHR40    BSS
          LDML   RS+/RS/P.IDSTAT
          NJN    CHR50       IF IDLE STATUS IS ALREADY IN RESPONSE
          LDML   CHANT+/CH/P.ATTN,CH  BUSY / ATTENTION BITS
          STML   RS+/RS/P.IDSTAT
 CHR50    BSS
          UJK    CHRX
          EJECT
** CSHOLD
*
** PURPOSE-- CLEAR SELECT HOLD, IF IT IS SET
          SPACE  6
 CSHX     LJM    **
 CSHOLD   EQU    *-1
          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    DC+40B      DEACTIVATE CHANNEL
          CFM    CSH10,DC    CHECK AND CLEAR CHANNEL ERROR
          RJM    CHNERR      RECORD CHANNEL ERROR
*         (RETURNS IF ERRORS ARE TO BE IGNORED.)

 CSH10    BSS
 K31      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K31      ENDIF

          LDDL   OPSTAT      OPERATIONAL STATUS
          LPC    1400B       CHECK SELECT HOLD AND SELECT ACTIVE
          ZJK    CSHX        IF SELECT HOLD IS NOT SET
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
          UJK    CSHX
          EJECT
** WTATTN
*
** PURPOSE-- WAIT 2 SECONDS FOR AN ATTENTION.
          SPACE  6
 WTAX     LJM    **
 WTATTN   EQU    *-1
          LDN    3
          STML   WTA101      SET TIMEOUT FOR 2 SECONDS
          LDC    11788
          STML   WTA100
 WTA10    BSS
          LDK    F.RIS       REQUEST IDLE STATUS
          RJM    FUNCB
          ACN    40B+DC
          LDN    1
          IAM    P6,DC       READ ATTENTION BITS
          DCN    40B+DC
          LDDL   P6
          LPML   ATTAB,CMOD  ATTENTION BIT FOR THIS CONTROLLER
          ZJN    WTA20       IF NO ATTENTION
          RJM    SELCK       SELECT CONTROLLER IF IT IS NOT SELECTED
          RJM    STATUS      READ STATUS AND CLEAR ATTENTION
 WTA20    BSS
          SOML   WTA100
          NJK    WTA10       IF 2 SECONDS IS NOT UP
          SOML   WTA101
          NJN    WTA10
          UJK    WTAX
          SPACE  6
 WTA100   BSSZ   1           TIMEOUT COUNTER
 WTA101   BSSZ   1           TIMEOUT COUNTER
          EJECT
** NAME-- RDCMND
*
** PURPOSE-- READ WORD 7 OF COMMAND BLOCK 0 AND DETERMINE
*            IF THERE WILL BE AN ATTENTION.
*
** OUTPUT-- A REGISTER = 0 IF NO ATTENTION EXPECTED.
*           A REGISTER NONZERO IF ATTENTION IS EXPECTED.
          SPACE  6
 D9       IFEQ   T1,0
 RDCX     LJM    **
 RDCMND   EQU    *-1
          RJM    SELCK       SELECT THE CONTROLLER ONLY IF NOT SELECTED
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
          LDK    W.RCMND7    READ WORD 7 OF COMMAND BLOCK
          STDL   CMFUN
 D8       IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 D8       ENDIF
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    SEND FUNCTION TO HYDRA
          RJM    DCN         DISCONNECT THE CHANNEL
          ACN    DC
          LDN    1
          IAM    RDC100,DC   READ WORD 7 OF COMMAND BLOCK
          NJN    RDC5        IF INPUT DID NOT COMPLETE, TEMPORARY HALT
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          LDML   RDC100      WORD 7 OF COMMAND BLOCK
          SHN    17-15
          PJN    RDC10       IF -CMND EXEC REQ- IS NOT SET
          SHN    15-7        CHECK COMMAND COMPLETE FLAG
          PJN    RDC50       IF COMMAND EXISTS BUT HASN'T BEEN PROCESSED
 RDC5     BSS
          RJM    HALT        INVALID SETTING OF COMMAND BITS

 RDC10    BSS
          SHN    15-7        CHECK COMMAND COMPLETE FLAG
          PJN    RDC50       IF COMMAND IN PROGRESS

* COMMAND HAS COMPLETED.  IF ATTENTION ISN'T SET AT THIS TIME,
* IT WON'T GET SET.

          LDK    F.RIS       READ IDLE STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    P6,DC       READ ATTENTION BITS
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
          LDDL   P6
          STML   CHANT+/CH/P.ATTN,CH  ATTENTION BITS
          LPML   ATTAB,CMOD  ATTENTION BITS FOR THIS CONTROLLER
 RDC40    UJK    RDCX        EXIT A REGISTER = 0 IF NO ATTENTION,
                             NONZERO IF ATTENTION IS SET.

 RDC50    BSS
          LDN    1           COMMAND IN PROGRESS
          UJK    RDC40
          SPACE  6
 RDC100   BSSZ   1           WORD 7 OF COMMAND BLOCK 0
 D9       ENDIF
          EJECT
** NAME-- RDERI
*
** PURPOSE-- READ THE ERROR REGISTER IMAGE.
          SPACE  6
 RDERX    LJM    **
 RDERI    EQU    *-1
          RJM    SELCK       SELECT THE CONTROLLER ONLY IF NOT SELECTED

* WRITE COMMAND BLOCK TO READ THE ERROR REGISTER IMAGE.

          LDK    R.RERI      READ ERROR REGISTER IMAGE
          STML   SS+/SS/P.FUNC  PARAMETER IN COMMAND BLOCK
          LDN    0
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PCYL  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PTRK  SET COMMAND BLOCK PARAMETER = 0
          RJM    CMND        WRITE COMMAND BLOCK
          LDN    5
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    RDERX
          EJECT
** NAME-- ELOG
*
** PURPOSE-- READ THE ERROR LOG.
          SPACE  6
 M9       IFNE   CMSE,1
 ELOGX    LJM    **
 ELOG     EQU    *-1

* WRITE A COMMAND BLOCK TO READ THE ERROR LOG.

          LDN    0
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 0
          LDK    R.REL       READ ERROR LOG
          RJM    DIA         WRITE COMMAND BLOCK
          LDN    4
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    ELOGX
          EJECT
** NAME-- ELA
*
** PURPOSE-- READ THE DATA BUFFER WHICH CONTAINS THE
*            ERROR LOG IMAGE.
          SPACE  6
 ELAX     LJM    **
 ELA      EQU    *-1
          LDC    F.SCS       SET COMMAND SEQUUENCE
          RJM    FUNC
          LDK    W.RDI       FUNCTION WORD TO READ DATA BUFFER
          STDL   CMFUN
 K32      IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 K32      ENDIF
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    SEND FUNCTION TO CONTROLLER
          RJM    DCN         DISCONNECT CHANNEL
          ACN    DC
          LDN    48
          IAM    RS+/RS/P.ELOG,DC  READ ERROR LOG
          NJN    ELA10
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          LDK    /RS/K.ELP   SET FLAG FOR ERROR LOG PRESENT
          RJM    SDET        PUT ID IN RESPONSE
          UJK    ELAX

 ELA10    BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF PP WORDS NOT TRANSFERRED
          LDK    /RS/K.IEL   INCOMPLETE ERROR LOG
          RJM    SID2        ERROR ID
          RJM    ROPS        READ OPERATIONAL STATUS
          LDDL   OPSTAT      OPERATIONAL STATUS
          SHN    17-9        CHECK IF SELECT ACTIVE IS STILL SET
          MJN    ELA20       IF SELECT ACTIVE IS STILL SET
          LDK    /RS/K.SADEL  SELECT ACTIVE DROPPED WHEN READING ERROR LOG
          RJM    SID2        ERROR ID
 ELA20    BSS
          RJM    ADPTERR      ATTEMPT TO RECOVER
*         (NO RETURN FROM ADPTERR.)
 M9       ENDIF
          EJECT
** NAME-- ERA
*
** PURPOSE-- READ THE DATA BUFFER WHICH CONTAINS THE
*            REGISTER IMAGE.
          SPACE  6
 ERAX     LJM    **
 ERA      EQU    *-1
          LDC    F.SCS       SET COMMAND SEQUUENCE
          RJM    FUNC
          LDK    W.RDI       FUNCTION WORD TO READ DATA BUFFER
          STDL   CMFUN
 K33      IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 K33      ENDIF
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    SEND FUNCTION TO CONTROLLER
          RJM    DCN         DISCONNECT CHANNEL
          ACN    DC
          LDN    48
          IAM    RS+/RS/P.ERI,DC  READ ERROR REGISTER IMAGE
          NJN    ERA10
          RJM    INC         CHECK IF CHANNEL IS INACTIVE
          LDK    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          LDK    /RS/K.ERIP  SET FLAG FOR ERROR REGISTER IMAGE PRESENT
          RJM    SDET        PUT ID IN RESPONSE
          UJK    ERAX

 ERA10    BSS
          STML   RS+/RS/P.FUNTO  NUMBER OF PP WORDS NOT TRANSFERRED
          LDK    /RS/K.IER   INCOMPLETE ERROR REGISTER IMAGE
          RJM    SID2        ERROR ID
          RJM    ROPS        READ OPERATIONAL STATUS
          LDDL   OPSTAT      OPERATIONAL STATUS
          SHN    17-9        CHECK IF SELECT ACTIVE IS STILL SET
          MJN    ERA20       IF SELECT ACTIVE IS STILL SET
          LDK    /RS/K.SADER  SELECT ACTIVE DROPPED WHEN READING ERROR
                             REGISTER IMAGE
          RJM    SID2        ERROR ID
 ERA20    BSS
          RJM    ADPTERR      ATTEMPT TO RECOVER
*         (NO RETURN FROM ADPTERR.)
          EJECT
 NOTRDY   CON    0
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDN    1
          ERRNZ  16-/SS/N.NR-/SS/L.NR
          RAML   SS+/SS/P.NR  INCREMENT NOT READY FAILURE COUNTER
          LPK    /SS/M.NR
          SBN    NRTRY+1
          PJN    NOTR10      IF RETRY EXHAUSTED

* WRITE A COMMAND BLOCK TO POWER UP SPINDLE.

          LDK    R.PUP       POWER UP SPINDLE
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDN    0
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PCYL  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PTRK  SET COMMAND BLOCK PARAMETER = 0
          RJM    CMND        WRITE COMMAND BLOCK
          LDN    3
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          LDK    /RS/K.PU    POWER UP SPINDLE
          RJM    SID         ERROR ID
          LDML   SS+/SS/P.NR
          SHN    /SS/L.NR+/SS/N.NR+2
          LPK    /SS/M.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
          RJM    SAVSS       SAVE SS ENTRY
          LJM    MAIN10

 NOTR10   BSS
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNCB
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         NO RETURN FROM UTERM
          EJECT

* POWER UP SPINDLE COMPLETED NORMALLY.

 NOTRDC   CON    0
          LDML   SS+/SS/P.NR  CLEAR NOT READY RECOVERY FLAG
          LPC    -/SS/K.NR
          STML   SS+/SS/P.NR
          LDK    /RS/K.PUC   POWER UP SPINDLE COMPLETED
          RJM    SID         SAVE ERROR ID
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    INTRS       SEND AN INTERMEDIATE RESPONSE
          RJM    RSTRQ       RESTART REQUEST
          RJM    SAVSS       SAVE SS ENTRY
          UJK    MAIN10
          EJECT
** NAME-- IALCH
*
** PURPOSE-- INITIALIZE CHANNEL ADAPTER ON ALL CHANNELS.
          SPACE  6
 IALX     LJM    **
 IALCH    EQU    *-1
          LDDL   UNUML
          ZJK    IALX        IF NO UNITS
          LDN    0
          STDL   CH          CHANT TABLE INDEX
          STML   IAL100      RECALL FLAG
 IAL10    BSS
          LDML   CHANT+/CH/P.DOWN,CH  CHECK IF CHANNEL IS DOWN
          NJN    IAL25       IF CHANNEL IS DOWN
 IAL20    BSS
          RJM    SCLOCK      SET CHANNEL LOCK
          NJK    IAL20       IF CHANNEL LOCK COULD NOT BE SET

* SET THE UNIT LOCK ON ANY UNIT WITH THE SAME CHANNEL.
* THIS IS SO ERROR PROCESSING CAN ALWAYS ASSUME THAT A UNIT LOCK IS SET.

          LDN    0
          STDL   UX
 IAL22    BSS
          LDML   UNITS+/UN/P.CHIX,UX  GET POINTER TO CHANT
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          SBDL   CH          COMPARE CHANNEL NUMBER
          NJN    IAL23       IF NOT THE SAME CHANNEL
          RJM    CDSABLE     CHECK THE UNIT DISABLE FLAG
          MJN    IAL23       IF UNIT IS DISABLED
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          RJM    SETLOCK     SET UNIT LOCK
          ZJN    IAL27       IF LOCK WAS SET
 IAL23    BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    IAL22       IF NOT END OF TABLE
          AOML   IAL100      COULD NOT INITIALIZE THIS CHANNEL
 IAL25    UJN    IAL30

 IAL27    BSS
          RJM    CHGCH2      CHANGE CHANNEL INSTRUCTIONS
          LDML   CHANT,CH    CHANNEL NUMBER
          STML   RS+/RS/P.CHAN
          LDML   CHANT+/CH/P.PORT,CH  PORT B IF SET
          SHN    /CH/L.PORT-/RS/L.PORT
          RAML   RS+/RS/P.PORT

          RJM    ICH         INITIALIZE CHANNEL ADAPTER
          RJM    CLRLOCK     CLEAR UNIT LOCK
 IAL30    BSS
          LDN    P.CH        BUMP CHANNEL ENTRY
          RADL   CH
          SBDL   CNUML
          MJK    IAL10       IF MORE CHANNELS
          LDML   IAL100
          NJN    IAL40       IF NOT ALL CHANNEL WERE INITIALIZED, RECALL LATER
          LDDL   IALF        SET FLAG WHEN ALL CHANNELS HAVE BEEN INITIALIZED
          LPC    -1
          ADN    1
          STDL   IALF
 IAL40    BSS
          UJK    IALX
          SPACE  6
 IAL100   BSSZ   1           RECALL FLAG
          EJECT
** NAME-- ICH
*
** PURPOSE-- INITIALIZE CHANNEL ADAPTER.
*            WRITE CONTROL REGISTER.
*            SET FLAG MASK REGISTER.
          SPACE  6
 ICHX     LJM    **
 ICH      EQU    *-1

* MASTER CLEAR THE CHANNEL ADAPTER.

          DCN    40B+DC      DISCONNECT THE CHANNEL
          LDK    F.MC        MASTER CLEAR
          RJM    FUNC

* WRITE CONTROL REGISTER.

          LDK    F.WTCR      WRITE CONTROL REGISTER
          RJM    FUNC
          ACN    DC
          LDN    1
          OAM    CREG,DC
          RJM    DCN         DISCONNECT CHANNEL

* READ AND VERIFY CONTROL REGISTER.

          LDK    F.RDCR      READ CONTROL REGISTER
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    T1,DC
          RJM    INC         CHECK IF CHANNEL INACTIVE
          LDDL   T1
          SBDL   CREG
          NJN    ICH10       IF NOT CORRECT CONTROL REGISTER

* WRITE FLAG MASK REGISTER.

          LDK    F.WTMR      WRITE MASK REGISTER
          RJM    FUNC
          ACN    DC
          LDN    1
          OAM    FMREG,DC
          RJM    DCN         DISCONNECT CHANNEL

* READ AND VERIFY FLAG MASK REGISTER.

          LDK    F.RDMR      READ MASK REGISTER
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    T1,DC
          RJM    INC         CHECK IF CHANNEL INACTIVE
          LDDL   T1
          SBML   FMREG       FLAG MASK REGISTER
          ZJN    ICH20       IF FLAG MASK REGISTER OK
 ICH10    BSS
          LDK    /RS/K.ICA   ERROR IN INITIALIZE CHANNEL ADAPTER
          RJM    SDET        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    ADPTERR
*         (NO RETURN FROM ADPTERR.)

* READ OPERATIONAL STATUS.

 ICH20    BSS
          LDC    177777B
          STML   ICH200
 ICH22    BSS
          RJM    ROPS        READ OPERATIONAL STATUS
          LDDL   OPSTAT
          LPC    1403B
          SBN    2
          ZJN    ICH30       IF SELECT HOLD CLEAR, SELECT ACTIVE CLEAR,
                             T' REGISTER EMPTY, TRANSFER NOT IN PROGRESS
          SOML   ICH200      DECREMENT TIMEOUT COUNTER
          NJK    ICH22       IF NOT TIMED OUT
          LDK    /RS/K.MC    MASTER CLEAR DID NOT WORK
          RJM    SDET        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDDL   OPSTAT
          STML   RS+/RS/P.OPSTAT  PUT OPERATIONAL STATUS IN RESPONSE
 ICH30    BSS
          UJK    ICHX
          SPACE  6
 ICH200   BSSZ   1           TIMEOUT COUNTER FOR MASTER CLEAR
          EJECT
** NAME-- RESALL
*
** PURPOSE-- ISSUE SELECTIVE RESET TO ALL CONTROLLERS
*            WHEN THE PP IS FIRST LOADED.  FOR DUAL ACCESS,
*            JUST 1 PP DOES IT.
          SPACE  6
 RESALX   LJM    **
 RESALL   EQU    *-1
          LDDL   UNUML
          ZJK    RESALX      IF NO UNITS
          LDN    0
          STDL   UX
          STML   RESAL90     CLEAR FLAG FOR RESALL TO BE RECALLED LATER
 RESAL10  BSS
          LOADR  UNITS+/UN/P.CB,UX  ADDRESS OF COMMUNICATION BUFFER
          ADK    /SS/C.IRSET
          CRDL   T1
          LDDL   T1+/SS/P.IRSET-/SS/C.IRSET*4
          SHN    /SS/L.IRSET+2
          MJN    RESAL17     IF INITIAL SELECTIVE RESET HAS BEEN ISSUED

* DON'T ISSUE SELECTIVE RESET IF UNIT DISABLE FLAG IS SET.

          RJM    CDSABLE     CHECK THE UNIT DISABLE FLAG
          MJN    RESAL17     IF UNIT IS DISABLED

          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDML   UNITS+/UN/P.CHIX,UX  GET POINTER TO CHANT
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          RJM    SETLOCK     SET UNIT LOCK
          NJN    RESAL15     IF LOCK COULD NOT BE SET
          LDML   SS+/SS/P.IRSET  HAS INITIAL SELECTIVE RESET BEEN ISSUED
          SHN    /SS/L.IRSET+2
          MJN    RESAL30     IF INITIAL SELECTIVE RESET HAS BEEN ISSUED
          LDML   SS+/SS/P.SEEK  CHECK IF OUTSTANDING COMMAND
          SHN    /SS/L.SEEK+2
          PJN    RESAL20     IF NO OUTSTANDING COMMAND
          RJM    CLRLOCK     CLEAR UNIT LOCK
 RESAL15  BSS
          AOML   RESAL90     RECALL RESALL LATER
 RESAL17  UJN    RESAL40

 RESAL20  BSS
          LDML   SS+/SS/P.IRSET  SET FLAG FOR INITIAL SELECTIVE RESET ISSUED
          LPC    -/SS/K.IRSET
          ADK    /SS/K.IRSET
          STML   SS+/SS/P.IRSET
          LDML   SS+/SS/P.SRTRY  CLEAR FLAG FOR IF IN ERROR RECOVERY
          LPC    -/SS/K.SRTRY
          STML   SS+/SS/P.SRTRY
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          RJM    RESET       SEND SELECTIVE RESET
 RESAL30  BSS
          RJM    CSHOLD      CLEAR SELECT HOLD IF IT IS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
 RESAL40  BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    RESAL10     IF NOT END OF TABLE
          LDML   RESAL90
          NJN    RESAL50     NOT ALL CONTROLLERS WERE RESET,
                             COME BACK LATER
          LDDL   IALF        SET FLAG FOR INITIAL RESET ISSUED ON
                             ALL CONTROLLERS
          LPC    -2
          ADN    2
          STDL   IALF
 RESAL50  BSS
          UJK    RESALX
          SPACE  6
 RESAL90  BSSZ   1           RECALL FLAG
          EJECT
** NAME-- RESET
*
** PURPOSE-- ISSUE SELECTIVE RESET TO A CONTROLLER.
          SPACE  6
 RESETX   LJM    **
 RESET    EQU    *-1
          LDML   SS+/SS/P.RESET  SET SELECTIVE RESET ATTEMPT
          LPC    -/SS/K.RESET
          ADK    /SS/K.RESET
          STML   SS+/SS/P.RESET
          LDK    /RS/K.SR    SET -ATTEMPTED SELECTIVE RESET- FLAG IN RESPONSE
          RJM    SID         ERROR ID
          RJM    SELCK       SELECT THE CONTROLLER ONLY IF NOT SELECTED
          LDK    F.SCS       SET SELECT HOLD AND COMMAND SEQUENCE
          RJM    FUNC
          LDK    W.RESET     ISSUE SELECTIVE RESET
          STDL   CMFUN
 K34      IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 K34      ENDIF
          ACN    DC
          LDN    1
          OAM    CMFUN,DC    SEND FUNCTION TO CONTROLLER
          RJM    DCN         DISCONNECT THE CHANNEL

* TEMPORARY, THROUGH TEMPORARY END.
* HYDRA PROBLEM. HYDRA DROPS SELECT ACTIVE WHICH LATER RESULTS IN ISI TIMEOUT.

          LDK    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC
          DCN    40B+DC
 K35      IFEQ   TRACE,1
          LDDL   OPSTAT
          RJM    TBUF        PUT IN TRACE BUFFER
 K35      ENDIF
          CFM    RES20,DC
          AOML   RES100
          LDK    F.RDES      READ ERROR STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    RS+/RS/P.ESREG,DC  ERROR STATUS REGISTER
          DCN    40B+DC
          LDML   RS+/RS/P.ESREG
          STML   RES110
 K36      IFEQ   TRACE,1
          RJM    TBUF        PUT IN TRACE BUFFER
 K36      ENDIF
          CFM    RES20,DC    CLEAR CHANNEL ERROR FLAG
 RES20    BSS
          RJM    ICH         MASTER CLEAR I4 CHANNEL ADAPTER
          UJN    RES22

* TEMPORARY END.

          RJM    WAITTR      WAIT FOR TRANSFER IN PROGRESS TO CLEAR
 RES22    BSS
          AODL   CMNDS       INCREMENT COUNT OF OUTSTANDING CONTROLLER COMMANDS
          LDML   SS+/SS/P.SEEK  SET OUTSTANDING COMMAND FLAG
          LPC    -/SS/K.SEEK
          ADK    /SS/K.SEEK
          STML   SS+/SS/P.SEEK
          LDK    70+1        SET TIMEOUT VALUE TO 70 SECONDS
          STML   SS+/SS/P.TOVAL  TIMEOUT VALUE
          LDN    0
          STML   UNITS+/UN/P.ELAPT,UX  CLEAR ELAPSED TIME
          AOML   SS+/SS/P.RCNT  INCREMENT COMMAND ID
          STML   UNITS+/UN/P.RCNT,UX  KEEP COMMAND ID IN PP
          UJK    RESETX

 RES100   BSSZ   1
 RES110   BSSZ   1
          EJECT
** NAME-- CTEST
*
** PURPOSE-- RUN THE CONFIDENCE TEST ON ALL CONTROLLERS
*            WHEN THE PP IS FIRST LOADED.  FOR DUAL ACCESS,
*            JUST 1 PP DOES IT.
          SPACE  6
 CTESTX   LJM    **
 CTEST    EQU    *-1
 M11      IFNE   CMSE,1
          LDDL   UNUML
          ZJK    CTESTX      IF NO UNITS
          LDN    0
          STDL   UX
          STML   CTEST100    CLEAR FLAG FOR CONFIDENCE TEST TO BE RECALLED LATER
 CTEST10  BSS
          LDML   UNITS+/UN/P.CTST,UX  HAS THE CONFIDENCE TEST BEEN STARTED
          SHN    /UN/L.CTST+2
          MJK    CTEST40     IF THE CONFIDENCE TEST HAS BEEN STARTED
          LDDL   LOCKS       LAST UNIT LOCKED
          SBDL   UX
          NJN    CTEST11     IF THE UNIT IS NOT LOCKED AND THE SS TABLE
                             IN MEMORY
          LDML   SS+/SS/P.SEEK
          UJN    CTEST12

 CTEST11  BSS
          LOADR  UNITS+/UN/P.CB,UX  ADDRESS OF COMMUNICATION BUFFER
          ERRNZ  /SS/C.SEEK
          CRDL   T1
          LDDL   T1+/SS/P.SEEK-/SS/C.SEEK*4
 CTEST12  BSS
          SHN    /SS/L.SEEK+2
          MJN    CTEST15     IF THERE IS AN OUTSTANDING COMMAND

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

          RJM    CDSABLE     CHECK THE UNIT DISABLE FLAG
          MJN    CTEST17     IF UNIT IS DISABLED

          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDML   UNITS+/UN/P.CHIX,UX  GET POINTER TO CHANT
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          RJM    SETLOCK     SET UNIT LOCK
          NJN    CTEST15     IF LOCK COULD NOT BE SET
          LDML   SS+/SS/P.SEEK  CHECK IF OUTSTANDING COMMAND
          SHN    /SS/L.SEEK+2
          PJN    CTEST20     IF NO OUTSTANDING COMMANDS
          RJM    CLRLOCK     CLEAR UNIT LOCK
 CTEST15  BSS
          AOML   CTEST100    EXIT WITH IALF, BIT 2 = 0 TO BE RECALLED LATER
 CTEST17  UJK    CTEST40

 CTEST20  BSS
          LDML   UNITS+/UN/P.CTST,UX  SET FLAG FOR CONFIDENCE TEST STARTED
          LPC    -/UN/K.CTST
          ADK    /UN/K.CTST
          STML   UNITS+/UN/P.CTST,UX
          LDK    /RS/K.CT    SET FLAG FOR CONFIDENCE TEST STARTED
          RJM    SDET        PUT ID IN RESPONSE
          LDML   SS+/SS/P.CONF  SET CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          ADK    /SS/K.CONF
          STML   SS+/SS/P.CONF
          LDN    0
          STML   SS+/SS/P.CI  SECTORS TRANSFERRED
          STML   SS+/SS/P.NMED  NUMBER OF MEDIA ERRORS
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES OF DATA
          LPC    -/SS/K.STV
          STML   SS+/SS/P.STV
          RJM    CHGCH       CHANGE CHANNEL INSTRUCTIONS
          RJM    WBUF        SEND A COMMAND BLOCK TO WRITE TO CONTROLLER BUFFER
          RJM    SAVSS       SAVE SS ENTRY
          LDN    NOLOCK      MAKE SURE LOCK ISN'T CLEARED
          STDL   LOCKS

* LEAVE THE UNIT LOCKED.

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



 CTEST100 BSSZ   1           NONZERO IF CONFIDENCE TEST SHOULD BE ATTEMPTED LATER
          EJECT
** NAME-- WBUF
*
** PURPOSE-- SEND A COMMAND BLOCK TO WRITE TO THE CONTROLLER BUFFER.
          SPACE  6
 WBUFX    LJM    **
 WBUF     EQU    *-1
          LDML   SS+/SS/P.CWRITE  WRITE
          LPC    -/SS/K.CWRITE
          ADK    /SS/K.CWRITE
          STML   SS+/SS/P.CWRITE
* TEMPORARY, UNTIL ALL UNITS CAN READ/WRITE CONTROLLER BUFFER.
          RJM    CWR         SEND A COMMAND BLOCK TO WRITE TO DISK
*         RJM    CWRB        SEND A COMMAND BLOCK TO WRITE TO CONTROLLER BUFFER
          RJM    SETADD      SET STARTING DISK ADDRESS IN RESPONSE BUFFER
          UJK    WBUFX
          EJECT
* THE WRITE TO CONTROLLER BUFFER COMPLETED WITHOUT ERROR.

 CWBC     CON    0
          LDML   SS+/SS/P.CI  SECTORS TRANSFERRED
          ADC    -16
          ZJN    CWBC5       IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

* SEND A COMMAND BLOCK TO READ.

 CWBC5    BSS
          LDML   SS+/SS/P.CWRITE  READ
          LPC    -/SS/K.CWRITE
          STML   SS+/SS/P.CWRITE
          LDN    0
          STML   SS+/SS/P.CI  SECTORS TRANSFERRED
          LDML   SS+/SS/P.CPERR  COMPARE ERROR FLAG
          LPC    -/SS/K.CPERR
          STML   SS+/SS/P.CPERR
          RJM    CWRB        SEND A COMMAND BLOCK TO READ FROM CONTROLLER BUFFER
 CWBC10   BSS
          RJM    SETADD      SET STARTING DISK ADDRESS IN RESPONSE BUFFER
 CWBC20   BSS
          RJM    SAVSS       SAVE SS ENTRY
          LDN    NOLOCK      MAKE SURE LOCK ISN'T CLEARED
          STDL   LOCKS
          LJM    MAIN10
          SPACE  6
* THE READ FROM CONTROLLER BUFFER COMPLETED WITHOUT ERROR.

 CRBC     CON    0
          LDML   SS+/SS/P.CI  SECTORS TRANSFERRED
          ADC    -16
          ZJN    CRBC10      IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

 CRBC10   BSS
          LDML   SS+/SS/P.CPERR  CHECK IF THERE WAS A COMPARE ERROR
          SHN    /SS/L.CPERR+2
          MJN    CRBC40      IF COMPARE ERROR
          LDN    0
          STML   SS+/SS/P.CI  SECTORS TRANSFERRED
          LDML   SS+/SS/P.CWRITE  WRITE
          LPC    -/SS/K.CWRITE
          ADK    /SS/K.CWRITE
          STML   SS+/SS/P.CWRITE
          RJM    CWR         SEND A COMMAND BLOCK TO WRITE
          UJK    CWBC10
          SPACE  6

* DATA COMPARE ERROR.

CRBC40    BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDK    /RS/K.HIE   HOST INTERFACE INTEGRITY ERROR
          RJM    SDET        PUT ERROR ID IN RESPONSE
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         (NO RETURN FROM UTERM.)
          SPACE  6
* THE WRITE TO DISK COMPLETED WITHOUT ERROR.

 CWRC     CON    0
          LDML   SS+/SS/P.CI  SECTORS TRANSFERRED
          ADC    -152
          ZJN    CWRC5       IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

* SEND A COMMAND BLOCK TO READ FROM DISK.

 CWRC5    BSS
          LDML   SS+/SS/P.CWRITE  READ
          LPC    -/SS/K.CWRITE
          STML   SS+/SS/P.CWRITE
          LDN    0
          STML   SS+/SS/P.CI  SECTORS TRANSFERRED
          LDML   SS+/SS/P.CPERR  COMPARE ERROR FLAG
          LPC    -/SS/K.CPERR
          STML   SS+/SS/P.CPERR
          RJM    CWR         SEND A COMMAND BLOCK TO READ
          UJK    CWBC10
          SPACE  6
* THE READ FROM DISK COMPLETED WITHOUT ERROR.

 CRDC     CON    0
          LDML   SS+/SS/P.CI  SECTORS TRANSFERRED
          ADC    -152
          ZJN    CRDC10      IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

 CRDC10   BSS
          LDML   SS+/SS/P.CPERR  CHECK IF THERE WAS A COMPARE ERROR
          SHN    /SS/L.CPERR+2
          MJK    CRDC40      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    CRDC20      IF END OF STARTING VALUE TABLE
          LDN    0
          STML   SS+/SS/P.CI  SECTORS TRANSFERRED
          RJM    WBUF        SEND COMMAND BLOCK TO WRITE TO CONTROLLER BUFFER
 CRDC15   UJK    CWBC20

* END OF CONFIDENCE TEST.

 CRDC20   BSS
          LDML   SS+/SS/P.STV  ZERO OUT STARTING VALUES
          LPC    -/SS/K.STV
          STML   SS+/SS/P.STV
          LDML   SS+/SS/P.CONF  CLEAR CONFIDENCE TEST FLAG
          LPC    -/SS/K.CONF
          STML   SS+/SS/P.CONF
          LDML   SS+/SS/P.SEEK  CLEAR OUTSTANDING COMMAND FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK
          LDML   SS+/SS/P.RECOV
          NJK    CRDC15      IF IN ERROR RECOVERY
          RJM    CSHOLD      CLEAR SELECT HOLD IF IT IS SET
          RJM    CLRLOCK     CLEAR UNIT LOCK
          LJM    MAIN10

* DATA COMPARE ERROR.

CRDC40    BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          LDK    /RS/K.DIE   DRIVE INTERFACE INTEGRITY ERROR
          RJM    SDET        PUT ERROR ID IN RESPONSE
          RJM    UTERM       UNRECOVERED ERROR, TURN OFF UNIT
*         (NO RETURN FROM UTERM.)
          SPACE  6
          EJECT
** NAME-- CWRB
*
** PURPOSE-- SEND A READ / WRITE COMMAND BLOCK TO TRANSFER TO THE CONTROLLER BUFFER.
          SPACE  6
 CWRBX    LJM    **
 CWRB     EQU    *-1
          RJM    SELCK       SELECT THE CONTROLLER ONLY IF NOT SELECTED
          LDML   SS+/SS/P.CWRITE
          SHN    /SS/L.CWRITE+2
          PJN    CWRB10      IF READ
          LDK    R.WB        WRITE TO CONTROLLER BUFFER
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDN    17
          UJN    CWRB20

 CWRB10   BSS
          LDK    R.RB        READ FROM CONTROLLER BUFFER
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDN    18
 CWRB20   BSS
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX

          LDN    0
          STML   SS+/SS/P.PCYL  ZERO OUT PARAMETERS
          STML   SS+/SS/P.PTRK
          LDC    4096
          STML   SS+/SS/P.NSEC  STARTING WORD OFFSET IN CONTROLLER BUFFER
          RJM    CMND        WRITE THE COMMAND BLOCK
          LDML   SS+/SS/P.SEEK  SET SEEK ISSUED FLAG
          LPC    -/SS/K.SEEK
          ADK    /SS/K.SEEK
          STML   SS+/SS/P.SEEK

* SET UP THE RMA ADDRESS FOR THE WRITE.

          LDK    /CB/C.WRD   OFFSET FOR WRITE DATA
          ADML   SS+/SS/P.CI  ADVANCE 1 WORD FOR EACH SECTOR TRANSFERRED
          SHN    3           BYTE OFFSET
          ADML   CM.CBU+1    RMA OF COMMUNICATION BUFFER
          STML   SS+/SS/P.TOTAL+1
          SHN    -16
          ADML   CM.CBU
          STML   SS+/SS/P.TOTAL
          UJK    CWRBX
          EJECT
** NAME-- CWR
*
** PURPOSE-- SEND A READ / WRITE COMMAND BLOCK FOR THE CONFIDENCE TEST.
          SPACE  6
 CWRX     LJM    **
 CWR      EQU    *-1
          RJM    SELCK       SELECT THE CONTROLLER ONLY IF NOT SELECTED
          LDML   SS+/SS/P.CWRITE
          SHN    /SS/L.CWRITE+2
          PJN    CWR10       IF READ
          LDK    R.WRITE     SEEK AND WRITE
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDN    15
          UJN    CWR20

 CWR10    BSS
          LDK    R.READ      SEEK AND READ
          STML   SS+/SS/P.FUNC  PARAMETER IN LOAD COMMAND BLOCK
          LDN    16
 CWR20    BSS
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          LDC    881         CYLINDER ADDRESS
          STML   SS+/SS/P.CYL
          STML   SS+/SS/P.PCYL
          LDN    0
          STDL   T1
          LDML   SS+/SS/P.CI  SECTOR OFFSET
          STML   SS+/SS/P.SECTOR  SECTOR ADDRESS
 CWR30    BSS
          LDML   SS+/SS/P.SECTOR  COMPUTE TRACK AND SECTOR ADDRESS
          ADC    -38
          MJN    CWR40       IF END OF COMPUTATION
          STML   SS+/SS/P.SECTOR
          AODL   T1          INCREMENT TRACK ADDRESS
          UJN    CWR30

 CWR40    BSS
          LDDL   T1          TRACK ADDRESS
          SHN    8
          RAML   SS+/SS/P.SECTOR  TRACK AND SECTOR ADDRESS
          STML   SS+/SS/P.PTRK  TRACK AND SECTOR ADDRESS

          LDC    152
          SBML   SS+/SS/P.CI  SECTOR OFFSET
          STML   SS+/SS/P.NSEC  NUMBER OF SECTORS TO END OF CYLINDER
          LDML   SS+/SS/P.CUR  CLEAR CURRENT REQUEST FLAG
          LPC    -/SS/K.CUR
          STML   SS+/SS/P.CUR
          RJM    CMND        WRITE THE COMMAND BLOCK
          LDML   SS+/SS/P.SEEK  SET SEEK ISSUED FLAG
          LPC    -/SS/K.SEEK
          ADK    /SS/K.SEEK
          STML   SS+/SS/P.SEEK

* SET UP THE RMA ADDRESS FOR THE WRITE.

          LDK    /CB/C.WRD   OFFSET FOR WRITE DATA
          ADML   SS+/SS/P.CI  ADVANCE 1 WORD FOR EACH SECTOR TRANSFERRED
          SHN    3           BYTE OFFSET
          ADML   CM.CBU+1    RMA OF COMMUNICATION BUFFER
          STML   SS+/SS/P.TOTAL+1
          SHN    -16
          ADML   CM.CBU
          STML   SS+/SS/P.TOTAL
          UJK    CWRX
          EJECT
** NAME-- CREC
*
** PURPOSE-- HANDLE UNRECOVERED MEDIA ERRORS WHILE RUNNING THE CONFIDENCE TEST.
*            ACCEPT 3 MEDIA FAILURES BEFORE THE CONFIDENCE TEST FAILS.
          SPACE  6
 CREX     LJM    **
 CREC     EQU    *-1
          LDN    0
          STDL   T2
          LDML   RS+/RS/P.DST2+2  FAILING TRACK AND SECTOR
          SHN    -8
          STDL   T1          TRACK
          ZJN    CRE20       IF TRACK = 0
 CRE10    BSS
          LDK    38
          RADL   T2
          SODL   T1
          NJK    CRE10
 CRE20    BSS
          LDDL   T2
          ADML   RS+/RS/P.DST2+2  ADD SECTOR
          LPC    377B
          STDL   T3          SECTOR OFFSET
          LDML   SS+/SS/P.NMED  NUMBER OF MEDIA ERRORS SO FAR
          STDL   T2
          STDL   T1
          ZJN    CRE40       IF NO MEDIA ERRORS SO FAR
 CRE30    BSS
          LDML   SS+/SS/P.MEDERR-1,T1  SECTOR OFFSET OF PREVIOUS MEDIA ERROR
          SBDL   T3          SECTOR OFFSET OF CURRENT ERROR
          ZJN    CRE50       IF THIS ADDRESS IS ALREADY IN THE LIST OF MEDIA ERRORS
          SODL   T1          NUMBER OF MEDIA ERRORS SO FAR
          NJK    CRE30       IF MORE TO CHECK
 CRE40    BSS
          LDDL   T3
          STML   SS+/SS/P.MEDERR,T2   SAVE ADDRESS OF THIS MEDIA ERROR
          AOML   SS+/SS/P.NMED  INCREMENT NUMBER OF MEDIA ERRORS
          SBN    /SS/NMEDL+1 NUMBER OF MEDIA ERRORS ALLOWED
          PJK    CREX        TOO MANY MEDIA ERRORS DURING THE CONFIDENCE TEST
 CRE50    BSS
          AODL   T3          SECTOR OFFSET
          STML   SS+/SS/P.CI  START UP TRANSFER AT THIS SECTOR OFFSET
          ADC    -152
          ZJN    CRE60       IF END OF CYLINDER
          RJM    CWR         SEND A COMMAND BLOCK
 CRE55    BSS
          LJM    CWBC20


* CALL THE COMMAND PROCESSOR FOR NORMAL TERMINATION.

 CRE60    BSS
          LDML   SS+/SS/P.CMND  COMMAND PROCESSOR INDEX
          STDL   T1
          LDML   CMDPR3,T1   COMMAND PROCESSOR FOR NORMAL TERMINATION
          STML   CRE70
          RJM    **
 CRE70    EQU    *-1
*         (NO RETURN FROM COMMAND PROCESSOR.)

          UJK    CRE55
          EJECT
** NAME-- TDATA
*
** PURPOSE-- TRANSFER DATA TO / FROM THE CONTROLLER
*            FOR THE READ - WRITE CONFIDENCE TEST.
          SPACE  6
 TDATA    CON    0
          LDC    152         NUMBER OF SECTORS FOR DISK TRANSFER
          STML   TDA500
          LDML   SS+/SS/P.FUNC  COMMAND CODE
          LPC    377B
          ADC    -R.WB       WRITE TO CONTROLLER BUFFER
          MJN    TDA10       IF READ/WRITE TO DISK
          LDN    16          NUMBER OF SECTORS FOR BUFFER TRANSFER
          STML   TDA500
 TDA10    BSS
          LDML   SS+/SS/P.CI  SECTORS TRANSFERRED
          SBML   TDA500
          MJN    TDA20       IF NO ERROR
          RJM    TERMA       CONTROLLER INTERFACE ERROR
*         (NO RETURN FROM TERMA.)

 TDA20    BSS
          LDN    0
          STDL   FRSTSC      FIRST SECTOR FLAG
          LDK    W.READT     READ AND TERMINATE
          STDL   MOVFC       FUNCTION CODE
          LDML   SS+/SS/P.CWRITE
          SHN    /SS/L.CWRITE+2
          PJN    TDA30       IF READ
          RJM    INID        INITIALIZE THE WRITE DATA BUFFER
          LDK    T.OUT       IF WRITE
          RADL   MOVFC

* THE CONTROLLER IS ALREADY SELECTED.
* AN ATTENTION HAS BEEN RECEIVED SAYING READ DATA AVAILABLE
* OR WRITE BUFFER SPACE AVAILABLE.
* SEND A FUNCTION WORD TRANSFER TO SET UP FOR A READ DATA
* OR WRITE DATA OPERATION.

 TDA30    BSS
          LDC    F.SCS       SET COMMAND SEQUENCE
          RJM    FUNC
          ACN    DC
          LDN    1
          OAM    MOVFC,DC    READ / WRITE DATA FUNCTION WORD
          RJM    DCN         DISCONNECT CHANNEL
 K37      IFEQ   TRACE,1
          LDDL   MOVFC
          RJM    TBUF        PUT IN TRACE BUFFER
 K37      ENDIF
          RJM    WAITTR      WAIT FOR TRANSFER IN PROGRESS TO CLEAR

* ENABLE DMA MODE.

          LDC    F.SDM       SET DMA MODE
          RJM    FUNC

* PREPARE T REGISTER VALUES.

 TDA40    BSS
          LDML   SS+/SS/P.TOTAL  RMA TO LOAD INTO T REGISTER
          STML   TREG+/TR/P.RMA
          LDML   SS+/SS/P.TOTAL+1
          STML   TREG+/TR/P.RMA+1
          LDC    CMBTS       NUMBER OF BYTES TO TRANSFER
          STDL   WDS
          STML   TREG+/TR/P.LEN  CM BYTES TO TRANSFER

* UPDATE SECTOR POSITION.


* CHECK IF SELECT ACTIVE IS STILL SET AND T' REGISTER EMPTY.

          LDN    2
          STML   WRI201      SET TIMEOUT VALUE FOR 2 SECONDS
 TDA50    BSS
          LDK    177777B
          STML   WRI200      SET TIMEOUT VALUE WHEN CHECKING T' REGISTER EMPTY
 TDA60    BSS
          RJM    ROPS        READ OPERATIONAL STATUS
          CFM    TDA70,DC    CHECK CHANNEL ERROR FLAG
          AOML   WRI300
          LDK    /RS/K.XFER  I4 DETECTED ERROR DURING DATA TRANSFER
 TDA65    LJM    TDA150

 TDA70    BSS
          LDDL   OPSTAT
          SHN    17-9        CHECK SELECT ACTIVE STILL SET
          PJK    TDA190      IF SELECT ACTIVE IS NOT SET
          SHN    9-1
          MJN    TDA80       IF T' REGISTER EMPTY
          SOML   WRI200
          NJN    TDA60       IF NOT TIMED OUT
          SOML   WRI201
          NJK    TDA50       IF NOT TIMED OUT
          AOML   WRI301
          LDK    /RS/K.XFRTO  TIMEOUT ON T' NOT EMPTY OR TRANSFER IN PROGRESS
          UJK    TDA65


* WRITE T' REGISTER.

 TDA80    BSS
          LDC    F.WTT       WRITE T' REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          OAM    TREG,DC
          RJM    DCN         DISCONNECT CHANNEL
          LDML   SS+/SS/P.CWRITE
          SHN    /SS/L.CWRITE+2
          PJN    TDA100      IF READ
          AODL   FRSTSC
          SBN    1
          ZJN    TDA90       IF THE FIRST SECTOR TRANSFERRED FOR
                             THIS WRITE SEQUENCE
          SBN    2
          MJN    TDA90       IF THE SECOND SECTOR OF THIS TRANSFER

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

          AOML   SS+/SS/P.CURSEC  INCREMENT SECTOR ADDRESS
          SBN    DVSEC       COMPARE WITH NUMBER OF SECTORS PER TRACK
          MJN    TDA90       IF NOT END OF TRACK
          STML   SS+/SS/P.CURSEC  CURRENT SECTOR
          AOML   SS+/SS/P.CURTRK  INCREMENT TRACK ADDRESS

* PREPARE FOR NEXT T REGISTER VALUES.

 TDA90    BSS
          LDN    8           UPDATE RMA ADDRESS
          RAML   SS+/SS/P.TOTAL+1
          SHN    -16
          RAML   SS+/SS/P.TOTAL
          AOML   SS+/SS/P.CI  INCREMENT SECTOR COUNT
          SBML   TDA500
          MJK    TDA40       IF MORE TO TRANSFER

* TERMINATE.
* WAIT FOR T AND T' REGISTERS TO BECOME EMPTY.
* THEN CLEAR COMMAND SEQUENCE AND CLEAR SELECT HOLD.

 TDA100   BSS
          LDN    2
          STML   WRI201      SET TIMEOUT VALUE FOR 2 SECONDS
 TDA110   BSS
          LDC    177777B     SET TIMEOUT VALUE WHEN CHECKING T REGISTER
                             COMPLETION
          STML   WRI200
 TDA120   BSS
          LDC    F.RDOS      READ OPERATIONAL STATUS
          RJM    FUNC
          ACN    DC
          LDN    1
          IAM    OPSTAT,DC   READ OPERATIONAL STATUS
          RJM    DCN         DISCONNECT CHANNEL
          CFM    TDA130,DC   CHECK CHANNEL ERROR FLAG
          AOML   WRI302
          LDK    /RS/K.XFER  I4 DETECTED ERROR DURING DATA TRANSFER
          UJN    TDA138

 TDA130   BSS
          LDDL   OPSTAT
          SHN    17-9        CHECK SELECT ACTIVE STILL SET
          PJK    TDA190      IF SELECT ACTIVE IS NOT SET
          LDDL   OPSTAT
          LPN    3           CHECK T' REGISTER, AND TRANSFER IN PROGRESS
          SBN    2
          ZJN    TDA140      IF T' REGISTER EMPTY, AND TRANSFER NOT IN PROGRESS
          SOML   WRI200      DECREMENT TIMEOUT COUNTER
 TDA135   NJK    TDA120      IF NOT TIMED OUT
          SOML   WRI201
 TDA137   NJK    TDA110      IF NOT TIMED OUT
          AOML   WRI303
          LDK    /RS/K.XFRTO  TIMEOUT ON T' NOT EMPTY OR TRANSFER IN PROGRESS
 TDA138   UJN    TDA150

* READ T REGISTER AND CHECK BYTE COUNT = 0.

 TDA140   BSS
          LDK    F.RDT       READ T REGISTER
          RJM    FUNC
          ACN    DC
          LDN    3
          IAM    RS+/RS/P.TREG,DC  T REGISTER
          DCN    40B+DC
          LDML   RS+/RS/P.TREG
          ZJN    TDA160      IF ALL WORDS HAVE BEEN TRANSFERRED
          SOML   WRI200      DECREMENT TIMEOUT COUNTER
          NJK    TDA135      IF NOT TIMED OUT
          SOML   WRI201
          NJK    TDA137      IF NOT TIMED OUT

* TRY TO RECOVER.

          AOML   WRI304
          LDK    /RS/K.TRTO  TIMEOUT ON T REGISTER BYTE COUNT NONZERO
 TDA150   BSS
          RJM    SID2        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    CHREG       SAVE CHANNEL REGISTERS
          LDK    F.CSH       CLEAR SELECT HOLD
          RJM    FUNC
          RJM    ADPTERR     RECOVER
*         (NO RETURN FROM ADPTERR.)

 TDA160   BSS
          LDML   SS+/SS/P.CWRITE
          SHN    /SS/L.CWRITE+2
          MJK    TDA180      IF WRITE
          LDML   SS+/SS/P.NMED  NUMBER OF MEDIA ERRORS SO FAR
          ZJN    TDA164      IF NO MEDIA ERRORS SO FAR
          STDL   T1
 TDA162   BSS
          LDML   SS+/SS/P.MEDERR-1,T1  SECTOR OFFSET OF PREVIOUS MEDIA ERROR
          SBML   SS+/SS/P.CI
          ZJN    TDA166      IF THIS ADDRESS COULD NOT BE WRITTEN
          SODL   T1
          NJK    TDA162      IF MORE TO CHECK
 TDA164   BSS
          RJM    CKD         CHECK THE DATA
          LDML   SS+/SS/P.CPERR  CHECK IF DATA MISCOMPARE
          SHN    /SS/L.CPERR+2
          MJN    TDA180      IF DATA MISCOMPARE
 TDA166   BSS
          AODL   FRSTSC

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

          AOML   SS+/SS/P.CURSEC  INCREMENT SECTOR ADDRESS
          SBN    DVSEC       COMPARE WITH NUMBER OF SECTORS PER TRACK
          MJN    TDA170      IF NOT END OF TRACK
          STML   SS+/SS/P.CURSEC  CURRENT SECTOR
          AOML   SS+/SS/P.CURTRK  INCREMENT TRACK ADDRESS
 TDA170   BSS
          AOML   SS+/SS/P.CI  INCREMENT SECTOR COUNT
          SBML   TDA500
          MJK    TDA40       IF MORE TO TRANSFER


* CLEAR COMMAND SEQUENCE.

 TDA180   BSS
          LDC    F.CCS       CLEAR COMMAND SEQUENCE
          RJM    FUNC
          UJN    TDA200

* SELECT ACTIVE IS CLEAR.

 TDA190   BSS
          LDK    /RS/K.SADAT  SELECT ACTIVE DROPPED WHEN TRANSFERRING DATA
          RJM    SID2        PUT ERROR ID IN RESPONSE
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    CHREG       SAVE CHANNEL REGISTERS IN RESPONSE
          RJM    ICH         MASTER CLEAR THE I4 CHANNEL ADAPTER

 TDA200   BSS
          RJM    SAVSS       SAVE SS ENTRY
          LDN    NOLOCK      MAKE SURE LOCK ISN'T CLEARED
          STDL   LOCKS
          LJM    MAIN10
          SPACE  6
 TDA500   BSSZ   1           NUMBER OF SECTORS TO TRANSFER
          EJECT
** NAME-- INID
*
** PURPOSE-- INITIALIZE DATA FOR THE READ / WRITE CONFIDENCE TEST.
          SPACE  6
 INIX     LJM    **
 INID     EQU    *-1
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES
          ERRNZ  16-/SS/L.STV-/SS/N.STV
          LPK    /SS/M.STV
          STDL   T1
          LDML   STVAL,T1    INITIALIZE STARTING VALUE
          STDL   P1
          ADN    1           EACH 16 BITS IS INCREMENTED BY 1
          STDL   P2
          ADN    1
          STDL   P3
          ADN    1
          STDL   P4
          LDC    /CB/WRDL    NUMBER OF CM WORDS TO INITIALIZE
          STDL   T1
          LOADC  CM.CB
          ADK    /CB/C.WRD   ADDRESS OF WRITE DATA
          STDL   T2
          UJN    INI30

 INI20    BSS
          AODL   T2          ADDRESS OF NEXT CM WORD
          LMC    400000B
 INI30    BSS
          CWDL   P1          WRITE THE NEXT CM WORD
          LDN    4
          STDL   T3
 INI40    BSS
          LDN    4
          RAML   P1-1,T3     CREATE NEXT CM WORD VALUE
          SODL   T3
          NJN    INI40       IF NOT END OF CM WORD
          SODL   T1          DECREMENT CM WORD COUNT
          NJK    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
          LDML   SS+/SS/P.STV  INDEX TO TABLE OF STARTING VALUES
          ERRNZ  16-/SS/L.STV-/SS/N.STV
          LPK    /SS/M.STV
          STDL   T1
          LDML   SS+/SS/P.CI  SECTOR OFFSET
          SHN    2           SECTOR OFFSET * 4
          ADML   STVAL,T1    STARTING VALUE OF SECTOR
          STDL   T5
          ADN    1
          STDL   T6
          ADN    1
          STDL   T7
          ADN    1
          STDL   T8
          LDC    /CB/RDDL    NUMBER OF WORDS TO COMPARE
          STDL   T1
          LOADC  CM.CB
          ADK    /CB/C.WRD   ADDRESS OF READ DATA
          STDL   T2
          UJN    CK20

 CK10     BSS
          AODL   T2          ADDRESS OF NEXT CM WORD
          LMC    400000B
 CK20     BSS
          CRDL   P1          DATA THAT WAS READ
          LDN    4
          STDL   T4
 CK30     BSS
          LDML   P1-1,T4     COMPARE THE DATA
          SBML   T5-1,T4
          NJN    CK40        IF COMPARE ERROR
          LDN    4
          RAML   T5-1,T4     CREATE NEXT CM WORD THAT WAS WRITTEN
          SODL   T4
          NJK    CK30        IF NOT END OF CM WORD
          SODL   T1
          NJK    CK10        IF NOT END OF SECTOR
 CK35     UJK    CKX

* DATA COMPARE ERROR.

 CK40     BSS
          LDML   SS+/SS/P.CPERR  SET COMPARE ERROR
          LPC    -/SS/K.CPERR
          ADK    /SS/K.CPERR
          STML   SS+/SS/P.CPERR
          UJK    CK35

 M12      ELSE
 CWBC     CON    0
 CRBC     EQU    CWBC
 CWRC     EQU    CWBC
 CRDC     EQU    CWBC
 TDATA    EQU    CWBC
          RJM    HALT
 M12      ENDIF
          EJECT

 M18      IFNE   CMSE,1
 BUFF     EQU    17470B
 M18      ELSE
 BUFF     EQU    17100B
 M18      ENDIF
          SPACE  6
 BUFFERS  BSS
          SPACE  4
 NODEL    BSSZ   1           DON'T DELINK REQUEST FLAG
 UDL      BSSZ   1           LENGTH OF UNIT DESCRIPTORS (CM WORDS)
 RALL     BSSZ   1           SET NONZERO TO RESTART ALL REQUESTS
 STUX     BSSZ   1           UNIT INDEX USED BY GETUD
 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
 RCON     BSSZ   1           ADDITIONAL RESPONSE CONDITION
 SAVE     BSSZ   1           USED TO SAVE UX VALUE
 SAVE2    BSSZ   1           USED TO SAVE CHANNEL INDEX
 CHLCNT   BSSZ   1           NUMBER OF REQUESTS TO PROCESS BEFORE
                             CLEARING CHANNEL LOCK
 LCLOCK   BSSZ   1           LAST CLOCK READ
 ELAPT    BSSZ   2           ELAPSED TIME IN MICROSECONDS
 IDLE     BSSZ   1           NONZERO IF IDLE COMMAND RECEIVED,
                               RESUME COMMAND RESETS IT TO 0
 RDAT     BSSZ   1           NONZERO IF READING ATTENTIONS
 CLEARL   BSSZ   1           NONZERO IF UNIT LOCK IS TO BE CLEARED IN TERM
 CSTREAM  BSSZ   1           CONTINUE STREAMING FLAG
 DEBUG1   BSSZ   1           USED FOR DEBUG PURPOSES
 DEBUG2   BSSZ   1           USED FOR DEBUG PURPOSES
 IGNORE   BSSZ   1           NONZERO, IF ERRORS ARE TO BE IGNORED
 RSP      BSSZ   1           IF SET, PROCESSING RESPONSE FLAG
          SPACE  6
 CHNUM    EQU    4           MAXIMUM NUMBER OF CHANNELS SUPPORTED
 CHANT    BSSZ   CHNUM*P.CH  CHANNEL TABLE
 CHFLG    BSSZ   CHNUM       CHANNEL LOCK FLAGS


 NTL      EQU    4*3         LENGTH OF TREG TABLE
 TREG     BSSZ   NTL         T REGISTER VALUES
          SPACE  6
 UNUM     EQU    32          SUPPORT 32 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
 CMWORK   EQU    SS+/SS/P.CMWORK  INDIRECT RMA WORKING LIST
 RS       EQU    SS+/SS/P.RS  RESPONSE BUFFER
          BSSZ   3           NEED AFTER RS BECAUSE OF HOW IT IS ZEROED OUT
          SPACE  6
 CMSTAT   BSSZ   6           HYDRA STATUS BLOCK
 CB       BSSZ   4           COMMAND BUFFER (UNUSED PORTION)
 FBUF     BSSZ   200B        FUNCTION HISTORY BUFFER
 FBUFL    EQU    *-FBUF      LENGTH OF FUNCTION BUFFER
 SBUF     BSSZ   16          STATUS HISTORY BUFFER
 SBUFL    EQU    *-SBUF      LENGTH OF STATUS BUFFER

 UBUF     BSSZ   C.UIT*4     UNIT INTERFACE TABLE BUFFER
 IBUF     BSSZ   C.UD*4      UNIT DESCRIPTOR BUFFER

 K38      IFEQ   TIMES,1
 TM1      BSSZ   4           ATTENTION RECEIVED IN GETUD
 TM2      BSSZ   4           ATTENTION HAS BEEN PROCESSED IN GETUD
 TM3      BSSZ   4           GETUD, BEFORE ISSUEING SEEK
 TM4      BSSZ   4           GETUD, AFTER SEEK WAS ISSUED
 TM5      BSSZ   4           CMND, BEFORE WRITING COMMAND BLOCK
 TM6      BSSZ   4           CMND, WHEN ATTENTION RECEIVED (INSERTED WAIT FOR ATTENTION)
 TM7      BSSZ   4           PROC, BEFORE SELECTING HYDRA
 TM8      BSSZ   4           PROC, AFTER SELECTING, BEFORE READING STATUS
 TM9      BSSZ   4           PROC, AFTER READING STATUS
 TM10     BSSZ   4           PROC, AFTER PROCESSING ATTENTION
 K38      ENDIF
 K39      IFEQ   TIMES2,1
 TM11     BSSZ   4           WRITE, AFTER SETTING DMA
 TM12     BSSZ   4           WRITE, AFTER T' EMPTY ON LAST TRANSFER
 TM13     BSSZ   4           WRITE, AFTER ATTENTION RECEIVED (INSERTED WAIT FOR ATTENTION)
 K39      ENDIF
 K40      IFEQ   TIMES,1
 TM14     BSSZ   4           TERM, BEGINNING
 TM15     BSSZ   4           TERM, AFTER SENDING RESPONSE, BEFORE DELRQ
 TM16     BSSZ   4           TERM, AFTER DELRQ
 TM17     BSSZ   4           TERM, BEFORE EXITING
 TM18     BSSZ   4           STATUS, BEFORE CLEAR ATTENTION
 TM19     BSSZ   4           STATUS, AFTER CLEAR ATTENTION
 TM20     BSSZ   4           UNSOL, BEFORE SETTING OPERATING MODE
 TM21     BSSZ   4           UNSOL, AFTER SETTING OPERATING MODE, BEFORE SETTING ATTENTION DELAY
 TM22     BSSZ   4           UNSOL, AFTER SETTING ATTENTION DELAY PARAMETERS
 TM23     BSSZ   4           WRITE, START OF LAST SECTOR LOOP
 TM24     BSSZ   4           WRITE, BEFORE CHECKING T' REGISTER EMPTY
 TM25     BSSZ   4           WRITE, WHEN T' REGISTER EMPTY
 TM26     BSSZ   4           WRITE, END OF LAST SECTOR LOOP
 K40      ENDIF
 K41      IFEQ   TIMES2,1
 TM50     BSSZ   12          LAST 12 TRANSFER TIMES
 TM51     BSSZ   12          LAST 12 ENDING ATTENTION TIMES
 K41      ENDIF
          SPACE  6
 R        ERRPL  *-BUFF      IF > 0, RESIDENT PORTION IS TOO LARGE
 BUFFERL  EQU    *-BUFFERS
          EJECT
 CODE     BSS
          ORG    BUFFERS
          LOC    CODE
          EJECT
** NAME-- OCTERM
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROLLER.
          SPACE  6
 OCTERM   CON    0
          LDK    /RS/K.CMDN  CONTROLLER DOWN
          RJM    SID         ERROR ID
          RJM    OFFUN       SET UNIT DISABLE FLAG
          RJM    OFFCM       TURN OFF ALL UNITS ON A CONTROLLER
          LJM    LTERM       LEAVE THE REQUEST ON THE UNIT QUEUE
          EJECT
** NAME-- HTERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR HARDWARE ERRORS.
          SPACE  6
 HTERM    CON    0
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE

          LDML   RS+/RS/P.PVA
          ADML   RS+/RS/P.PVA+1
          ADML   RS+/RS/P.PVA+2
          NJN    HTERM10     IF UNRECOVERED REQUEST
          RJM    SNMSG       SEND UNSOLICITED MESSAGE
          LJM    TERM90

 HTERM10  BSS
          LDN    R.ABN       ABNORMAL TERMINATION
          STDL   RESPC       RESPONSE CODE
          LJM    TERM        SEND TERMINATION RESPONSE
          EJECT
** NAME-- UTERM
*
** PURPOSE-- ABNORMAL TERMINATION FOR HARDWARE ERRORS.
*            TURN OFF THE UNIT.
          SPACE  6
 UTERM    CON    0

* SET UNIT DISABLE BIT.

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

 LTERM    BSS
          RJM    FAILAD      PUT FAILING ADDRESS IN RESPONSE
          RJM    DELCM       DELINK ANY COMPLETED REQUESTS
          LDN    0           UNSOLICITED MESSAGE
          STDL   RESPC       RESPONSE CODE
          AOML   NODEL       SET NO DELINK FLAG, SO REQUEST IS NOT DELINKED
          AOML   CLEARL      SET FLAG SO UNIT LOCK WILL BE CLEARED
          LDML   SS+/SS/P.SEEK  RESET FLAGS
          LPC    -/SS/K.CUR-/SS/K.SEEK
          STML   SS+/SS/P.SEEK
          LJM    TERM        TERMINATE REQUEST
          EJECT
** NAME-- DIAG
*
** PURPOSE-- EXECUTE CONTROLLER LEVEL I DIAGNOSTICS.
          SPACE  6
 DIAGX    LJM    **
 DIAG     EQU    *-1
          LDK    /RS/K.XD1   SET -EXECUTING DIAGNOSTICS- IN RESPONSE
          RJM    SID         ERROR ID

* WRITE COMMAND BLOCK TO RUN LEVEL I DIAGNOSTICS.

          LDN    0
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 0
          LDK    R.DIAG      RUN LEVEL I DIAGNOSTICS
          RJM    DIA         WRITE COMMAND BLOCK
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    6
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    DIAGX
          EJECT
** NAME-- DIAGG
*
** PURPOSE-- EXECUTE CONTROLLER LEVEL II DIAGNOSTICS.
          SPACE  6
 DIAGGX   LJM    **
 DIAGG    EQU    *-1
          LDK    /RS/K.XD    SET -EXECUTING DIAGNOSTICS- IN RESPONSE
          RJM    SID         ERROR ID

* WRITE COMMAND BLOCK TO RUN LEVEL II DIAGNOSTICS.

          LDN    0
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 0
          LDK    R.DIAG2     RUN LEVEL II DIAGNOSTICS
          RJM    DIA         WRITE COMMAND BLOCK
          RJM    INTRS       SEND INTERMEDIATE RESPONSE
          LDN    14
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    DIAGGX
          EJECT
** NAME-- DIAGSUB
*
** PURPOSE-- EXECUTE CONTROLLER LEVEL II DIAGNOSTIC COMMAND 78,
*            SUBTEST 6.
          SPACE  6
 DIAGSX   LJM    **
 DIAGSUB  EQU    *-1
          LDN    6
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 6
          LDK    R.DIAGS     RUN DIAGNOSTIC COMMAND 78
          RJM    DIA         WRITE COMMAND BLOCK
          LDN    7
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    DIAGSX
          EJECT
** NAME-- DIAGW
*
** PURPOSE-- EXECUTE CONTROLLER LEVEL II DIAGNOSTIC COMMAND 79,
*            SUBTEST 5.
          SPACE  6
 DIAGWX   LJM    **
 DIAGW    EQU    *-1
          LDN    5
          STML   SS+/SS/P.NSEC  SET COMMAND BLOCK PARAMETER = 5
          LDK    R.DIAGW     RUN DIAGNOSTIC COMMAND 79
          RJM    DIA         WRITE COMMAND BLOCK
          LDN    13
          STML   SS+/SS/P.CMND  SET COMMAND PROCESSOR INDEX
          UJK    DIAGWX
          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
          LDN    0
          STML   SS+/SS/P.PCYL  SET COMMAND BLOCK PARAMETER = 0
          STML   SS+/SS/P.PTRK  SET COMMAND BLOCK PARAMETER = 0
          RJM    SELCK       SELECT THE CONTROLLER ONLY IF NOT SELECTED
          RJM    CMND        WRITE COMMAND BLOCK
          UJK    DIAX
          EJECT
** NAME-- RCMRQ
*
** PURPOSE-- RESTART ALL THE REQUESTS ON A CONTROLLER.
          SPACE  6
 RCMX     LJM    **
 RCMRQ    EQU    *-1
          LDDL   UNUML
          ZJK    RCMX        IF NO UNITS
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDDL   UX          SAVE UX
          STML   SAVE
          LDDL   CH          SAVE CHANNEL INDEX
          STML   SAVE2
          LDML   UNITS+/UN/P.CHIX,UX  GET CHANNEL INDEX
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          LDN    0
          STDL   UX
          STDL   CMNDS       RECOMPUTE NUMBER OF OUTSTANDING COMMANDS
 RCM10    BSS
          RJM    GETSS       GET SS ENTRY
          LDML   SS+/SS/P.SEEK  CHECK IF SEEK WAS ISSUED
          SHN    /SS/L.SEEK+2
          PJN    RCM16       IF SEEK WAS NOT ISSUED
          AODL   CMNDS       NUMBER OF OUTSTANDING CONTROLLER COMMANDS
          LDML   RALL
          NJN    RCM15       IF ALL REQUESTS ARE TO BE RESTARTED
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          SBDL   CMOD
          NJN    RCM20       IF NOT THE SAME CONTROLLER
          LDML   UNITS+/UN/P.CHIX,UX  GET CHANNEL INDEX
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          SBDL   CH
          NJN    RCM20       IF NOT THE SAME CHANNEL
 RCM15    BSS
          SODL   CMNDS       NO OUTSTANDING COMMAND ON THIS UNIT
          LDML   UNITS+/UN/P.LOCK,UX  GET LOCK FLAG
          ZJN    RCM19       IF THIS PP DOES NOT HAVE THE LOCK SET
          RJM    RSTRQ       RESTART REQUEST
          RJM    SAVSS       SAVE SS ENTRY
 RCM16    UJN    RCM20       LEAVE THE UNIT LOCK SET

 RCM18    BSS
          RJM    HALT        HALT THE PP
*         (NO RETURN FROM HALT.)

 RCM19    BSS
          RJM    SETLOCK     GET SS ENTRY AND SET UNIT LOCK
* TEMPORARY
          NJN    RCM18       IF LOCK COULD NOT BE SET, TEMPORARY HALT
          RJM    RSTRQ       RESTART REQUEST
 RCM20    BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    RCM10       IF NOT END OF TABLE
          LDML   RALL
          ZJN    RCM40       IF REQUESTS ON ONLY 1 CONTROLLER
          LDN    0
          STML   RALL        ZERO OUT -RESTART ALL REQUESTS- FLAG
 RCM40    BSS
          LDML   SAVE        RESTORE UX
          STDL   UX
          LDML   SAVE2       RESTORE CHANNEL INDEX
          STDL   CH
          UJK    RCMX
          EJECT
** NAME-- TERAC
*
** PURPOSE-- TERMINATE ACTIVE COMMANDS.
          SPACE  6
 K42      IFEQ   T1,0
 TERACX   LJM    **
 TERAC    EQU    *-1
          UJK    TERACX
 K42      ENDIF
          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   RS+/RS/P.RTRY  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.CURRQ2  RESTORE RMA OF CURRENT REQUEST
          STML   SS+/SS/P.REQ
          LDML   SS+/SS/P.CURRQ2+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   SS+/SS/P.SEEK  CLEAR SEEK ISSUED FLAG
          LPC    -/SS/K.SEEK
          STML   SS+/SS/P.SEEK
          SODL   SEKCNT      DECREMENT SEEK COUNT
          PJN    RST30
          LDN    0
          STDL   SEKCNT
 RST30    BSS
          RJM    DELCM       DELINK ANY COMPLETED REQUESTS
          RJM    SAVSS       SAVE SS ENTRY
          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 REQUESTS FOR WHICH
                             A RESPONSE WAS NOT SENT
          LDML   SS+/SS/P.NCOMRQ  NUMBER OF COMPLETED REQUESTS WHICH HAVE
                             SENT RESPONSES
          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-- CKCMND
*
** PURPOSE-- COUNT THE NUMBER OF OUTSTANDING COMMANDS.
*
** NOTES-- IF THE OTHER ACCESS HAS THE UNIT LOCK SET,
*          DON'T LOOK AT THAT UNIT BECAUSE THE SEEK FLAG
*          IS INVALID.
          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.LOCK,T1
          NJN    CKCM15      IF THIS PP HAS THE LOCK SET
          LOADR  UNITS+/UN/P.UIT,T1
          ADN    /UIT/C.ULOCK
          CRDL   T2          READ UNIT LOCKWORD
          LDDL   T2
          NJN    CKCM20      IF OTHER ACCESS HAS THE LOCK SET
 CKCM15   BSS
          LOADR  UNITS+/UN/P.CB,T1  ADDRESS OF UNIT COMMUNICATION BUFFER
          CRDL   P1          CHECK IF SEEK WAS ISSUED
          ERRNZ  /SS/P.SEEK
          LDDL   LOCKS       UNIT INDEX FOR SS TABLE
          SBDL   T1
          NJN    CKCM17      IF SS TABLE NOT IN MEMORY
          LDML   SS+/SS/P.SEEK  GET SEEK FLAG FROM SS TABLE
          STDL   P1
 CKCM17   LDDL   P1
          SHN    /SS/L.SEEK+2
          PJN    CKCM20      IF SEEK WAS NOT ISSUED
          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
          UJK    CKCMX
          EJECT
** NAME-- CLRUL
*
** PURPOSE-- CLEAR ALL THE UNIT LOCKS.
          SPACE  6
 CLRX     LJM    **
 CLRUL    EQU    *-1
          LDDL   UNUML
          ZJK    CLRX        IF NO UNITS
          LDDL   UX          SAVE UX
          STDL   SAVUX
          LDN    0
          STDL   UX
 CLR10    BSS
          LDML   UNITS+/UN/P.LOCK,UX
          ZJN    CLR20       IF THIS PP DOES NOT HAVE THE LOCK SET
          RJM    SETLOCK     GET SS ENTRY
          NJN    CLR20       IF LOCK REALLY WASN'T SET, SHOULD NEVER HAPPEN
          RJM    CSHOLD      CLEAR SELECT HOLD IF IT IS SET
          RJM    CLRLOCK     CLEAR THE UNIT LOCK
 CLR20    BSS
          LDN    P.UN
          RADL   UX          BUMP UNIT ENTRY
          SBDL   UNUML
          MJK    CLR10       IF NOT END OF TABLE
          LDDL   SAVUX       RESTORE UX
          STDL   UX
          UJK    CLRX
          EJECT
** NAME-- PPR
*
** PURPOSE-- CHECK FOR IDLE OR RESUME REQUESTS.
          SPACE  6
 PPR1     BSS
 M30      IFNE   CMSE,1
          AOML   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.

          LDML   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
          LJM    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    SAVSS       SAVE SS ENTRY
          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
          STDL   PIDLE       SET PRE-IDLE FLAG
          UJK    PPR40

 PPR25    BSS
          RJM    CSLOCK      CLEAR THE LAST UNIT LOCK, IF ANY
          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    MAIN15
 M30      ENDIF
          EJECT
 MM1      IFEQ   T1,0
 PPRQ10   BSS
 M19      IFNE   CMSE,1
          RJM    CSLOCK      CLEAR THE LAST UNIT LOCK, IF ANY
          RJM    CLRUL       CLEAR ALL UNIT LOCKS

* SET PP QUEUE LOCKWORD.

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

 PPRQ15   BSS
          LDN    0
          UJK    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.

          LDML   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
          STDL   PIDLE       SET PRE-IDLE FLAG
          RJM    CPLOCK      CLEAR PP QUEUE LOCKWORD
          UJK    PPRQ15

 PPRQ25   BSS
          RJM    CLRUT       CLEAR UNIT FLAGS
          UJN    PPRQ40


* IF AN RESUME REQUEST, INITIALIZE THE UNIT TABLES.

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

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

 PPRQ40   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
          LDML   SS+/SS/P.FRST  SET FLAG WHEN REQUEST IS READ
          LPC    -/SS/K.FRST
          STML   SS+/SS/P.FRST

* 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

          AOML   PPRQ        SET PP REQUEST FLAG
          UJK    PPRQX       EXIT, A REGISTER NONZERO
 M19      ENDIF
 MM1      ENDIF
          EJECT
** NAME-- IDLEP
*
** PURPOSE-- PROCESS IDLE COMMAND.
          SPACE  6
 IDLX     LJM    **
 IDLEP    EQU    *-1
 M20      IFNE   CMSE,1
          AOML   IDLE        SET IDLE FLAG
          LDN    0
          STDL   CH
 IDL10    BSS
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          LDN    P.CH
          RADL   CH
          SBDL   CNUML
          MJK    IDL10       IF NOT END OF TABLE
 M20      ENDIF
          UJK    IDLX
          EJECT
** NAME-- RESUME
*
** PURPOSE-- PROCESS RESUME COMMAND.
          SPACE  6
 RESUX    LJM    **
 RESUME   EQU    *-1
 M21      IFNE   CMSE,1
          LDN    0
          STML   IDLE        CLEAR IDLE FLAG
          STDL   PIDLE       CLEAR PRE-IDLE FLAG
 M21      ENDIF
          UJK    RESUX
          EJECT
** NAME-- STOP
*
** PURPOSE-- SET THE UNIT DISABLE FLAG IN THE UNIT INTERFACE TABLE.
          SPACE  6
 K43      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
 K43      ENDIF
          EJECT
** NAME-- CLRUT
*
** PURPOSE-- CLEAR UNIT TABLES.
*
** NOTE-- IF THE UNIT LOCK CAN NOT BE SET, IT SKIPS THAT UNIT.
*         THIS ROUTINE SHOULD BE CALLED ONLY WHEN PROCESSING AN IDLE REQUEST,
*         AND AFTER ALL OUTSTANDING I/O IS COMPLETE AND ALL OF ITS OWN UNIT
*         LOCKS ARE CLEAR.
*         IF A UNIT IS BEING DISABLED AND THE REQUESTS DELINKED, THE OTHER
*         ACCESS WILL ALSO GET AN IDLE REQUEST AND WILL BE ABLE TO CLEAR
*         THAT UNIT.
*         IF A CHANNEL IS MANUALLY DOWNED, ONLY 1 PP WILL GET AN IDLE REQUEST.
          SPACE  6
 CLRUX    LJM    **
 CLRUT    EQU    *-1
          LDN    0
          STDL   UX          UNITS TABLE INDEX
          STDL   IALF        CLEAR INITIALIZE FLAG SO EVERYTHING
                             WILL GET INITIALIZED
          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
          LDML   UNITS+/UN/P.CM,UX  GET CONTROLLER NUMBER
          SHN    -3
          LPN    /UN/M.CM
          STDL   CMOD        CONTROLLER NUMBER
          LDML   UNITS+/UN/P.CHIX,UX  GET CHANNEL INDEX
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          STDL   CH
          RJM    SETLOCK     SET THE UNIT LOCK
          NJN    CLRU20      IF THE LOCK COULD NOT BE SET
          LDML   SS+/SS/P.SEEK
          SHN    /SS/L.SEEK+2
          MJN    CLRU18      IF OUTSTANDING COMMAND, LET OTHER ACCESS
                             PROCESS IT AND CLEAR THIS UNIT.
                             (OTHER ACCESS MUST HAVE SET THIS FLAG OR
                             CLEARED ITS LOCK AFTER CKCMND WAS EXECUTED.)
          LDML   SS+/SS/P.SEEK  RESET FLAGS
          LPC    -/SS/K.CUR-/SS/K.SEEK-/SS/K.INIT
          STML   SS+/SS/P.SEEK
          ERRNZ  /SS/P.CUR-/SS/P.SEEK
          ERRNZ  /SS/P.SEEK-/SS/P.INIT
          LDML   SS+/SS/P.IRSET  CLEAR FLAG THAT INITIAL SELECTIVE
                             RESET WAS DONE
          LPC    -/SS/K.IRSET
          STML   SS+/SS/P.IRSET
          RJM    CFLGS       CLEAR FLAGS
 CLRU18   BSS
          RJM    CSHOLD      CLEAR SELECT HOLD IF IT IS SET
          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-- OFFCH
*
** PURPOSE-- TURN OFF ALL UNITS ON A CHANNEL.
          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   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
          RJM    CCLOCK      CLEAR CHANNEL LOCK
          AOML   CHANT+/CH/P.DOWN,CH  SET CHANNEL DOWN FLAG
          UJK    OFCX
          EJECT
** NAME-- OFFCM
*
** PURPOSE-- TURN OFF ALL UNITS ON A CONTROLLER.
          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.
*
** NOTE-- IF THE LOCK CAN NOT BE SET, JUST SET THE UNIT DISABLE
*         FLAG.  AN IDLE REQUEST WHICH GOES TO ALL PPS WHENEVER
*         A UNIT IS DISABLED WILL CLEAR THE OTHER FLAGS.
          SPACE  6
 OFFX     LJM    **
 OFF      EQU    *-1
          LDML   UNITS+/UN/P.CHIX,UX  GET CHANNEL INDEX
          SHN    /UN/L.CHIX+/UN/N.CHIX+2
          LPK    /UN/M.CHIX
          SBDL   CH
          NJK    OFFX        IF NOT THE SAME CHANNEL

* IF UNIT IS DISABLED, DO NOT SETLOCK.
* THIS INSURES THE FAILING UNIT'S RESPONSE IS NOT CLEARED AT
* THIS TIME.

          RJM    CDSABLE     CHECK THE UNIT DISABLE FLAG
          MJN    OFFX        IF UNIT IS ALREADY DISABLED

          RJM    OFFUN       SET UNIT DISABLE FLAG
          RJM    SETLOCK     SET THE UNIT LOCK
          NJK    OFFX        IF LOCK WAS NOT SET

          LDML   SS+/SS/P.SEEK  RESET FLAGS
          LPC    -/SS/K.CUR-/SS/K.SEEK
          STML   SS+/SS/P.SEEK
          RJM    ZRESP       ZERO OUT RESPONSE BUFFER
          RJM    CLRLOCK     CLEAR UNIT LOCK
          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
 K44      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
 K44      ENDIF
          EJECT
 CONCH    BSS                DISK CHANNEL REFERENCES
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0           END OF TABLE
          EJECT
** NAME-- ICOM
*
** PURPOSE-- INITIALIZE THE UNIT COMMUNICATION BUFFER IN ALL THE UNIT
*            INTERFACE TABLES.
*            INITIALIZE ALL STATIC VARIABLES IN THE COMMUNICATION
*            BUFFER:  CHANNEL NUMBER, SEEK FUNCTION,
*            UNIT NUMBER, COMMUNICATION BUFFER (RMA), UNIT INTERFACE
*            TABLE (RMA).
          SPACE  6
 ICOMX    LJM    **
 ICOM     EQU    *-1

* INITILIZE VARIABLES.

          LDN    0
          STDL   LUX         LAST UNIT SELECTED
          STDL   CNUML       END OF CHANNEL TABLE
          STDL   UNUML       END OF ACTIVE UNIT TABLE

          LDML   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

          LDN    0
          STDL   P5          NUMBER OF CONFIGURED UNITS
          STDL   P6          INDEX TO UNIT DESCRIPTORS
          STDL   UX          CONFIGURED UNIT TABLE INDEX
          LDC    CHFLG
          STDL   P4          ADDRESS OF CHANNEL LOCK FLAG
 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
 K45      IFEQ   VALID,1
          RJM    CHKUD       CHECK FOR VALID UNIT DESCRIPTOR
 K45      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    UNUM*P.UN   TEMPORARY SETTING
          STDL   UNUML       END OF ACTIVE UNIT TABLE (TEMPORARY SETTING FOR NOW)
          LDK    /SS/P.RQ
          STDL   T1
 ICOM20   BSS
          LDN    0
          STML   SS-1,T1     ZERO OUT SS ENTRY
          SODL   T1
          NJN    ICOM20
          LDML   IBUF+/UD/P.UQT+1  INITIALIZE START OF QUEUE CHAIN
          ADN    4*8
          STML   UNITS+/UN/P.QSTRT+1,UX
          SHN    -16
          ADML   IBUF+/UD/P.UQT
          STML   UNITS+/UN/P.QSTRT,UX
          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

 K46      IFEQ   VALID,1
          RJM    CHKUIT      CHECK FOR VALID UNIT INTERFACE TABLE
 K46      ENDIF

* GET DEVICE TYPE AND TRANSLATE TO INTERNAL DEVICE TYPE.

          LDML   UBUF+/UIT/P.UTYPE  CHECK DEVICE TYPE
          ADC    -406B       CHECK FOR HYDRA
          ZJN    ICOM50      IF  HYDRA
          RJM    HALT        INVALID DEVICE TYPE

 ICOM50   BSS
          LDN    DHYDRA
          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
          LPK    /UD/M.CHAN
          STDL   T1          CHANNEL NUMBER
          LDDL   P4          ADDRESS OF CHANNEL LOCK FLAG
          STDL   T3
          LDDL   CNUML
          ZJN    ICOM66      IF NO ENTRIES IN CHANNEL TABLE
          LDN    0
          STDL   CH
 ICOM62   BSS
          LDML   CHANT,CH    CHECK IF SAME CHANNEL NUMBER
          SBDL   T1
          NJN    ICOM64      IF NOT THE SAME CHANNEL NUMBER
          LDML   CHANT+/CH/P.LOCK,CH  ADDRESS OF CHANNEL LOCK FLAG
          STDL   T3
          LDML   IBUF+/UD/P.PORT  GET PORT NUMBER
          SHN    8
          LPK    /CH/K.PORT
          SBML   CHANT+/CH/P.PORT,CH
          ZJN    ICOM68      IF ALREADY AN ENTRY FOR THE CHANNEL
 ICOM64   BSS
          LDN    P.CH
          RADL   CH
          SBDL   CNUML
          MJK    ICOM62      IF NOT END OF TABLE
 ICOM66   BSS
          LDDL   CNUML
          STDL   CH
          LDDL   T1          CHANNEL NUMBER
          STML   CHANT+/CH/P.CHAN,CH
          LDML   IBUF+/UD/P.PORT
          SHN    8
          LPK    /CH/K.PORT  PORT
          STML   CHANT+/CH/P.PORT,CH
          LDDL   T3          ADDRESS OF CHANNEL LOCK FLAG
          STML   CHANT+/CH/P.LOCK,CH
          LDN    0
          STML   CHANT+/CH/P.ATTN,CH  ATTENTION BITS
          LDN    1
          STML   CHANT+/CH/P.DOWN,CH  CHANNEL DOWN FLAG WILL BE SET IF ALL UNITS
                             ON A CHANNEL ARE DISABLED
          LDN    P.CH
          RADL   CNUML       END OF CHANNEL TABLE
          AODL   P4          BUMP TO NEXT CHANNEL LOCK FLAG
 ICOM68   BSS
          LDDL   CH          PUT OFFSET OF CHANNEL TABLE IN UNITS TABLE
          SHN    15-/UN/L.CHIX-/UN/N.CHIX+1
          RAML   UNITS+/UN/P.CHIX,UX

* IF UNIT IS NOT DISABLED, CLEAR CHANNEL DOWN FLAG.

          LDML   UBUF+/UIT/P.DSABLE
          SHN    /UIT/L.DSABLE+2  CHECK UNIT DISABLE FLAG                                                                          C
          MJN    ICOM69      IF UNIT IS DISABLED
          LDN    0
          STML   CHANT+/CH/P.DOWN,CH  CLEAR CHANNEL DOWN FLAG

* PUT PHYSICAL UNIT NUMBER IN SEEK FUNCTION.

 ICOM69   BSS
          LDML   IBUF+/UD/P.UNIT
          ERRNZ  /UD/L.UNIT
          ERRNZ  /UD/N.UNIT-16
          LPN    7
          STML   RS+/RS/P.UNIT
          LPK    /UN/K.UNIT
          RAML   UNITS+/UN/P.UNIT,UX
          LDML   IBUF+/UD/P.CNTRLR
          LPN    77B
          SHN    3
          RAML   RS+/RS/P.UNIT
          LPK    /UN/K.CM
          RAML   UNITS+/UN/P.CM,UX
          LDML   IBUF+/UD/P.LU  PUT LOGICAL UNIT IN RESPONSE BUFFER
          STML   RS+/RS/P.LU
          STML   UNITS+/UN/P.LUN,UX
          LDML   CHANT,CH    CHANNEL NUMBER
          STML   RS+/RS/P.CHAN
          LDML   CHANT+/CH/P.PORT,CH  PORT B IF SET
          SHN    /CH/L.PORT-/RS/L.PORT
          RAML   RS+/RS/P.PORT

* 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
          ADC    -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
          LDK    /SS/K.INIT  SET SS ENTRY INITIALIZED FLAG
          RAML   SS+/SS/P.INIT

          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
          NJN    ICOM80      IF LOCK COULD NOT BE SET
          LDN    1
          STML   UNITS+/UN/P.LOCK,UX  SET UNIT LOCK FLAG

          LOADR  UNITS+/UN/P.CB,UX  LOAD ADDRESS OF COMMUNICATION BUFFER
          CRDL   T2          READ SS ENTRY
          LDDL   T2
          SHN    /SS/L.INIT+2
          PJN    ICOM75      IF SS ENTRY HAS NOT BEEN INITIALIZED
          RJM    GETSS       GET SS ENTRY

 ICOM75   BSS
          RJM    CLRLOCK     CLEAR UNIT LOCK

* 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
          SBML   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
          UJK    ICOMX       EXIT
          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
 M22      IFNE   CMSE,1
          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
 M22      ENDIF
          RJM    HALT
          EJECT
 T11      IFNE   HARDW,1
 CHG2X    LJM    **
 CHGCH2   EQU    *-1
          RJM    CHGCH
          LDN    0
          STDL   T1
 CHG210   LDML   CONCH2,T1
          ZJN    CHG2X
          STDL   T2
          LDIL   T2
          SCN    37B
          LMDL   CHAN
          STIL   T2
          AODL   T1
          UJK    CHG210
          EJECT
 CONCH2   BSS
 TDC+40B  HERE
 T40B+DC  HERE
 TDC      HERE
          CON    0
 T11      ENDIF
          EJECT
 M23      IFNE   CMSE,1
 ENDMEM   EQU    17775B      END OF MEMORY
 M23      ELSE
 ENDMEM   EQU    17374B      END OF MEMORY FOR CMSE
 M23      ENDIF

 NRQ      BSS                NEXT REQUEST ON QUEUE
 NRQL     EQU    4
 R3       ERRPL  *+NRQL-ENDMEM    IF .GT. 0, OVERLAY IS TOO LONG
          EJECT
 CODELN   EQU    BUFF-CODE   LENGTH OF PERMANENT CODE TO BE MOVED
 OVRORG   EQU    BUFFERS+CODELN  ORG FOR OVERLAY (AFTER ASSEMBLY)
 K47      IFLE   BUFF,*
 OVRLN    EQU    *-BUFF      OVERLAY LENGTH
          ELSE
 OVRLN    EQU    0
 K47      ENDIF
 OVRNDO   EQU    *O          ORG END OF OVERLAY
 OVREND   BSS                LOC END OF OVERLAY (EXECUTION END)
                             BUFF = BEGINNING EXECUTION LOCATION OF OVERLAY
 OVRLN1   EQU    OVRLN+3
 OVRLNC   EQU    OVRLN1/4    OVERLAY LENGTH IN CM WORDS
          ERRPL  OVRLNC-C.CB+/CB/C.OVR  CHECK IF ENOUGH ROOM IN COMMUNICATION
                             BUFFER FOR OVERLAY
          EJECT
 INI      EQU    BUFF

 IPIT     EQU    INI         PP INTERFACE TABLE
 IPITN    EQU    IPIT+P.PIT

          ERRPL  OVRNDO-IPITN  IF > 0, INCREASE INI LOCATION
                             NUMBER OF LOCATIONS LEFT IN RESIDENT + OVERLAY

          ORG    IPITN
          EJECT
** NAME-- INIT
*
** PURPOSE-- INITIALIZE THE DRIVER AFTER DEADSTART.
*
** INPUT-- DSRTP = CM BYTE-ADDRESS OF THE PP INTERFACE TABLE.
          SPACE  6
 INIT1    BSS


 INIT     BSS

          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
          LDDL   P3          SAVE 2-WORD ADDRESS OF COMMUNICATION BUFFER
          STML   CM.CBU
          LDDL   P4
          STML   CM.CBU+1
          REFAD  P3,CM.CB    REFORMAT CM ADDRESS OF PP COMMUNICATION BUFFER
          LDDL   P2          GET LENGTH OF PP COMMUNICATION BUFFER
          SHN    -3
          ADC    -C.CB
          MJN    *           IF NOT ENOUGH ROOM IN COMMUNICATION BUFFER, TEMPORARY HALT

* WRITE OVERLAY TO PP COMMUNICATION BUFFER.

          LDN    OVRLNC     LENGTH OF OVERLAY
          ZJN    INIT60
          STDL   WC
          LDDL   CMADR+2     CM ADDRESS OF COMMUNICATION BUFFER
          LMC    400000B
          ADK    /CB/C.OVR   OFFSET OF OVERLAY
          CWML   OVRORG,WC   WRITE OVERLAY TO COMMUNICATION BUFFER

* MOVE 'CODELN' WORDS FROM BUFFERS TO CODE.

 INIT60   BSS
          ERRPL  CODE+CODELN-*

          LDK    CODELN      LENGTH OF CODE TO BE MOVED
          ZJN    INIT97
          STDL   T1
 INIT94   BSS
          LDML   BUFFERS-1,T1  MOVE CODE TO PROPER EXECUTION PLACE
          STML   CODE-1,T1
          SODL   T1
          NJN    INIT94      IF MORE CODE TO MOVE

* ZERO OUT BUFFERS.

          LDK    BUFFERL     LENGTH OF BUFFERS
          STDL   T1
 INIT96   BSS
          LDN    0
          STML   BUFFERS-1,T1  ZERO OUT BUFFERS
          SODL   T1
          NJN    INIT96

* NOTE, DO NOT USE BUFFERS BEFORE THIS POINT, UNLESS THE PP IS
* HALTED AFTERWARD.

 INIT97   BSS
          LDK    P.RS        ZERO OUT FULL RESPONSE BUFFER
          STDL   T1
 INIT98   BSS
          LDN    0
          STML   RS-1,T1     ZERO OUT RESPONSE BUFFER
          SODL   T1
          NJN    INIT98

* 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

          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
 K48      IFEQ   VALID,1
          RJM    CHKRS       CHECK FOR VALIDITY OF PP RESPONSE BUFFER
 K48      ENDIF
          LDML   IPIT+/PIT/P.PPNO  GET PP NUMBER
          STDL   PPNO

* INITIALIZE UDL, LUDL.

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

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

          REFAD  IPIT+/PIT/P.RSBUF,CM.RS  REFORMAT CM ADDRESS OF RESPONSE
                             BUFFER
          LDML   IPIT+/PIT/P.LIMIT  GET LIMIT OF RESPONSE BUFFER
          STDL   LIM
 K49      IFEQ   VALID,1
          RJM    CHKPIT      CHECK FOR VALIDITY OF PP INTERFACE TABLE
 K49      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

          LJM    DISK
          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
 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
          EJECT
* INTERFACE ERROR.
          SPACE  6
 INTERR2  CON    0
 M24      IFNE   CMSE,1
          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
 M24      ENDIF
          RJM    HALT
 D2       ENDIF
          EJECT
 R2       ERRPL  *-ENDMEM-1  IF > 0, DECREASE INI.  OR ELSE INIT
                             IS TOO LONG
                             NUMBER OF LOCATIONS LEFT IN INIT.
          EJECT
          END    HYD
/EOR
