1XD 
          IDENT  1XD,CM3D 
          TITLE  1XD - NOS XMD (9853) DRIVER. 
          CIPPU  ,S 
          MEMSEL 8
          BASE   M
          SST 
*COMMENT  1XD - CM3/XMD3 (9853) DRIVER. 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          SPACE  4,10 
***       1XD - CM3/XMD3 (9853) DRIVER. 
* 
*         P. D. HAAS.        88/02/26.
          SPACE  4,10 
***       *1XD* IS THE DRIVER FOR THE XMD (9853) DISK STORAGE SUBSYSTEM.
* 
*         THE XMD DISK DRIVES ARE SUPPORTED AS BUFFERED I/O 
*         DEVICES.  REQUESTS TO BE PROCESSED BY *1XD* ARE POSTED
*         BY *CPUMTR* IN THE BUFFERED I/O TABLES IN *CMR*.
*         *1XD* INTERLOCKS UNITS, DELINKS BUFFERS, AND COMPLETES
*         SAID REQUESTS BY ISSUING APPROPRIATE *BIOM* FUNCTIONS.
* 
*         EACH COPY OF *1XD* WILL SUPPORT ONE CONCURRENT CHANNEL
*         CONFIGURED WITH THE INTELLIGENT PERIPHERAL INTERFACE (IPI)
*         AND IS THE SOLE DRIVER FOR ALL XMD DISKS ON THAT CHANNEL. 
*         *1XD* MUST BE LOADED INTO A CONCURRENT PP, IN THE SAME
*         BANK AS THE CHANNEL IT IS TO SERVICE. 
* 
*         EACH COPY OF THE DRIVER CAN SERVICE UP TO SIXTEEN XMD 
*         UNITS IN ANY CONFIGURATION MIX OF CONTROL MODULES AND 
*         DRIVES COUPLED TO EITHER PORT OF THE IPI ADAPTOR. 
* 
*         *1XD* SCANS THROUGH THE *PUT* ENTRIES IN A CIRCULAR FASHION 
*         LOOKING FOR REQUESTS TO PROCESS.  ONCE A REQUEST IS FOUND,
*         *1XD* USES THE PHYSICAL DISK AND UEM ADDRESSES IN THE 
*         CORRESPONDING *CBT* ENTRY TO DETERMINE THE ACTION TO BE 
*         TAKEN.  *1XD* WILL ATTEMPT TO PROCESS CONSECUTIVE REQUESTS
*         ON THE CURRENT UNIT UNTIL THE END OF THE UNIT I/O QUEUE,
*         OR A CONSECUTIVE REQUEST WAS NOT FOUND.  AT THIS POINT
*         *1XD* WILL RESUME ITS SEARCH THROUGH THE *PUT* WITH THE 
*         *PUT* ENTRY IMMEDIATELY FOLLOWING THE ONE JUST PROCESSED. 
          SPACE  4,10 
***       ORGANIZATION OF THE 9853 (MEASUREMENTS IN DECIMAL). 
* 
*         EQUIPMENT TYPE                    *DN*
* 
*         UNITS/LOGICAL DEVICE                 1
* 
*         PHYSICAL ORGANIZATION:  
* 
*           WORDS/PHYSICAL SECTOR            256
*           PHYSICAL SECTORS/TRACK            21
*           PHYSICAL TRACKS/CYLINDER          19
*           CYLINDERS/DEVICE                1409
*           WORDS/DEVICE             143,861,760
* 
*         LOGICAL ORGANIZATION: 
* 
*           WORDS/LOGICAL SECTOR              64
*           LOGICAL SECTORS/PHYSICAL SECTOR    4
*           LOGICAL SECTORS/LOGICAL TRACK   1120
*           LOGICAL TRACKS/DEVICE           2007
* 
*         MAXIMUM SUSTAINED DATA RATE        312 K WORDS/SECOND 
          SPACE  4,10 
***       CALL. 
* 
*T        18/ DRN, 6/ CP, 6/ CO, 18/, 7/ 1, 5/ CH 
* 
*         DRN    DRIVER NAME. 
*         CP     CONTROL POINT NUMBER (MUST BE SYSTEM CP).
*         CO     CHANNEL TABLE ORDINAL (SET BY *CPUMTR*). 
*         CH     CHANNEL NUMBER BEING SERVICED BY THIS PP.
          SPACE  4,10 
***       DAYFILE MESSAGES. 
* 
*         DRN - UNAUTHORIZED CALL.
* 
*         THE DRIVER (NAMED *DRN*) WILL ISSUE THIS MESSAGE AND ABORT
*         IF NOT ASSIGNED TO THE SYSTEM CONTROL POINT.
          SPACE  4,10 
***       ERRLOG MESSAGES.
* 
*         EQORD,TKNNNN, MEDIA DEFECT ENCOUNTERED. 
* 
*         A MEDIA DEFECT HAS BEEN ENCOUNTERED ON EQUIPMENT WITH EST 
*         ORDINAL ORD, LOGICAL TRACK NNNN.  A REQUEST HAS BEEN ISSUED 
*         TO AUTOMATICALLY FLAW THIS TRACK WHEN IT IS DROPPED.
* 
* 
*         CHCC MH426-DXX,CMN. 
* 
*         CONTROL MODULE N ON CHANNEL CC IS RUNNING MICROCODE REVISION
*         LEVEL XX. 
* 
* 
*         DNEEE, UNN,PS=XXXXXX. 
* 
*         UNIT NN OF THE 9853 DEVICE WITH EST ORDINAL EEE HAS THE PACK
*         SERIAL NUMBER XXXXXX. 
          SPACE  4,10 
***       OPERATOR MESSAGES.
* 
*         EQORD, DIAGNOSTICS RUNNING. 
* 
*         EQORD, SPIN UP PENDING. 
* 
*         CM3 BEING RESET ON CCHNN. 
* 
*         CM3 RESET FAILURE ON CCHNN. 
* 
*         MR ERROR. 
          SPACE  4,10 
***       DISK ERROR PROCESSING.
* 
*         THE DRIVER MAINTAINS A COUNTER OF THE NUMBER OF RETRIES 
*         NECESSARY TO SUCCESSFULLY PROCESS A REQUEST.  IF THE
*         ERROR COUNT IS NON-ZERO WHEN A REQUEST IS COMPLETED, THE
*         DRIVER WILL LOG A BML MESSAGE AND INCREMENT THE RECOVERED 
*         ERROR COUNT IN THE MST. 
* 
*         IF THE ERROR COUNT REACHES *MERC* BEFORE THE REQUEST IS 
*         SUCCESSFULLY COMPLETED, THE DRIVER WILL SET AN ERROR CODE 
*         IN THE *CBT*, LOG A FATAL ERROR IN THE BML, AND INCREMENT 
*         THE UNRECOVERED ERROR COUNT IN THE MST. 
          SPACE  4,10 
***       CONFIGURATION NOTES.
* 
*         IN A DUAL ACCESS ENVIRONMENT, THE SAME EQUIPMENT NUMBER MUST
*         BE DIALED INTO THE PORT IN USE ON EACH CONTROL MODULE.
          SPACE  4,10 
***       SPECIAL PROGRAMMING NOTES.
* 
*         THE FOLLOWING IS A LIST OF SPECIAL NOTES THAT SHOULD BE 
*         READ AND UNDERSTOOD BEFORE ANY MODIFICATIONS ARE MADE TO
*         THIS PROGRAM. 
* 
* 
*         1)  WHERE POSSIBLE, *CMR* POINTERS HAVE BEEN PLUGGED BY THE 
*             PRESET ROUTINE TO IMPROVE THE EXECUTION SPEED OF THE
*             PROGRAM AND TO MINIMIZE THE AMOUNT OF CODE. 
* 
*         2)  THIS PROGRAM EXCHANGES *CPUMTR* WITHOUT WAITING FOR 
*             THE REQUEST TO COMPLETE.  ROUTINE *CMC* SHOULD BE CALLED
*             IF THE *MONITOR* MACRO IS TO BE USED WHILE THERE IS A 
*             POSSIBILITY OF AN OUTSTANDING MONITOR REQUEST.
* 
*         3)  THE DEVICE STATE TABLE IS BUILT AT LOCATION *EXR* IN
*             PP RESIDENT, THEREFORE IT IS NOT POSSIBLE TO USE THE
*             *EXR* AND *SMS* ROUTINES. 
          SPACE  4,10 
  
**        COMMON DECKS. 
  
  
*CALL     COMPMAC 
 RICHI$   EQU    1           SELECT DEFERRED INSTRUCTION MODIFICATION 
 LCHI$    EQU    1           SELECT *CONL* FOR CHANNEL ADDRESS TABLE
*CALL     COMPCHI 
*CALL     COMSCPS 
 QUAL$S   SET    0           REMOVE QUALIFICATION OF COMSDFS CONSTANTS
*CALL     COMSDFS 
*CALL     COMSEVT 
          LIST   X
*CALL     COMSHIO 
          LIST   *
          QUAL   IOU
*CALL     COMSIOU 
          QUAL   *
*CALL     COMSLSD 
*CALL     COMSMSC 
*CALL     COMSMSP 
*CALL     COMSPIM 
*CALL     COMS1DS 
          SPACE  4,10 
**        INTERFACE SPECIFICATIONS. 
  
  
          IF     -MIC,DM,2
 DM       MICRO  1,2,*DN*    DEFAULT DEVICE MNEMONIC
 DN       MICRO  1,3,*1XD*   DEFAULT DRIVER NAME
  
 .1       SET    0
 .A       ECHO   ,TY=(DN),MI=(RM0124) 
 .B       IFC    EQ,*TY*"DM"* 
 .1       SET    1
 BMID     EQU    MI          BML ERROR MESSAGE ID 
          STOPDUP 
 .B       ENDIF 
 .A       ENDD
          IFEQ   .1,0,1 
          ERR    UNKNOWN DEVICE TYPE - "DM" 
  
 CYUN     EQU    CYUN"DM"    CYLINDERS / UNIT 
 PSBF     EQU    PSBF"DM"    PHYSICAL SECTORS / CONTROL BUFFER
 PTCY     EQU    PTCY"DM"    PHYSICAL TRACKS / CYLINDER 
 PSPT     EQU    PSPT"DM"    PHYSICAL SECTORS / PHYSICAL TRACK
 CFLP     EQU    CFS"DM"     LOGICAL - PHYSICAL CONVERSION FACTOR 
 LSCY     EQU    PSPT*PTCY*LSPS"DM"  LOGICAL SECTORS / CYLINDER 
 LSLT     EQU    SL"DM"+GS"DM"  LOGICAL SECTORS / LOGICAL TRACK 
 LSPT     EQU    LSPT"DM"    LOGICAL SECTORS / PHYSICAL TRACK 
 MCLT     EQU    MCLT"DM"    MAINTENANCE CYLINDER LOGICAL TRACK 
          TITLE  CONSTANTS AND DEFINITIONS. 
          SPACE  4,10 
****      DIRECT CELL ALLOCATION. 
  
  
 NR       EQU    15 - 21     NEXT REQUEST 
 WB       EQU    22 - 26     CM WORD BUFFER 
  
*         THE NEXT FIVE LOCATIONS ARE ORDER DEPENDENT.
  
 PB       EQU    27          PREVIOUS CONTROL BUFFER ORDINAL
 CB       EQU    30          CURRENT CONTROL BUFFER ORDINAL 
 NB       EQU    31          NEXT CONTROL BUFFER ORDINAL
 UA       EQU    32 - 33     UEM ADDRESS / 100
  
 EO       EQU    34          EST ORDINAL
 DN       EQU    35          DRIVE NUMBER 
 RC       EQU    36          REQUEST COUNT
 CN       EQU    37          CONTROLLER NUMBER
 MS       EQU    40          MAJOR STATUS (RESPONSE PACKET) 
 RT       EQU    41          STATUS RESPONSE TYPE 
 TO       EQU    42          COMMAND TIMEOUT
 SF       EQU    43          DEVICE SELECTED FLAG 
 UC       EQU    44          UNIT ACTIVITY COUNT
          ERRNZ  SF+1-UC     CODE DEPENDS ON VALUE
 RW       EQU    45          READ / WRITE FLAG
 PA       EQU    46          PROCESSOR ADDRESS
 DI       EQU    47          DEVICE INDEX 
 CR       EQU    57          CHANNEL RESERVED STATUS
 RF       EQU    60          RESET IN PROGRESS FLAG 
 LF       EQU    61          LAST FUNCTION
 TA       EQU    62          DEVICE STATE TABLE ADDRESS 
 CW       EQU    63 - 67     CM WORD BUFFER 
  
****
          SPACE  4,10 
**        IPI ADAPTOR FUNCTION CODES. 
  
  
 F0000    EQU    0#0000      MASTER CLEAR 
 F0200    EQU    0#0200      READ CONTROL REGISTER
 F0300    EQU    0#0300      WRITE CONTROL REGISTER 
 F0600    EQU    0#0600      READ ERROR REGISTER
 F0700    EQU    0#0700      READ OPERATIONAL STATUS
 F0800    EQU    0#0800      DMA TERMINATE
 F0A00    EQU    0#0A00      READ *T* REGISTER
 F0B00    EQU    0#0B00      WRITE *T* PRIME REGISTER 
 F0C00    EQU    0#0C00      DMA READ FROM ADAPTOR
 F0D00    EQU    0#0D00      DMA WRITE TO ADAPTOR 
 F0E00    EQU    0#0E00      CLEAR *T* REGISTERS
  
 F0062    EQU    0#0062      PORT A SELECT
 F0862    EQU    0#0862      PORT B SELECT
 F7E42    EQU    0#7E42      CHANNEL TRANSFER RATE
          SPACE  4,10 
**        IPI CHANNEL FUNCTION CODES. 
  
  
 F00F1    EQU    0#00F1      READ ERROR REGISTER
  
*         BUS CONTROL FUNCTIONS.
  
 F0029    EQU    0#0029      SELECT CONTROLLER (SET SELECT OUT) 
 F005B    EQU    0#005B      DEFINE INFORMATION TRANSFER (SET SYNC OUT) 
 F0071    EQU    0#0071      DESELECT CONTROLLER (CLEAR SELECT OUT) 
 F0711    EQU    0#0711      CLEAR MASTER OUT 
 F0715    EQU    0#0715      ENABLE INTERRUPTS (SET MASTER OUT) 
 F8025    EQU    0#8025      REQUEST TRANSFER MODE (SET MASTER OUT) 
 F8039    EQU    0#8039      MASTER STATUS (CLEAR MASTER OUT) 
 F8215    EQU    0#8215      RESET LOGICAL INTERFACE (SET MASTER OUT) 
 F8415    EQU    0#8415      RESET SLAVE (SET MASTER OUT) 
 F9213    EQU    0#9213      MASTER RESET SLAVES (SET SYNC OUT) 
  
*         DATA TRANSFER FUNCTIONS.
  
 F0081    EQU    0#0081      READ INTERLOCKED 
 F0181    EQU    0#0181      WRITE INTERLOCKED
 F0281    EQU    0#0281      READ STREAMING 
 F0381    EQU    0#0381      WRITE STREAMING
          SPACE  4,10 
**        COMMAND / RESPONSE PACKET DEFINITIONS.
  
  
 PLN      EQU    0           PACKET LENGTH
 CRN      EQU    1           COMMAND REFERENCE NUMBER 
 OPC      EQU    2           OPERATION CODE 
 CUN      EQU    3           CONTROLLER + UNIT NUMBER 
 FCP      EQU    4           FIRST COMMAND PARAMETER
  
 MST      EQU    4           MAJOR STATUS 
  
*         MAJOR STATUS RESPONSE TYPES.
  
 CMCT     EQU    1           COMMAND COMPLETE 
 ASRT     EQU    4           ASYNCHRONOUS RESPONSE
 XFNT     EQU    5           TRANSFER NOTIFICATION
  
*         MAJOR STATUS CODES. 
  
 CMCS     EQU    0#12        COMMAND COMPLETE (CONDITIONAL SUCCESS) 
 CMSS     EQU    0#18        COMMAND COMPLETE (SUCCESSFUL)
 ASRS     EQU    0#40        ASYNCHRONOUS RESPONSE
 XFNS     EQU    0#50        TRANSFER NOTIFICATION
  
 BCPL     EQU    06          BASIC COMMAND PACKET LENGTH
 BRPL     EQU    10          BASIC RESPONSE PACKET LENGTH 
 IOPL     EQU    20          I/O COMMAND PACKET LENGTH
  
 CPBFL    EQU    32          COMMAND PACKET BUFFER LENGTH 
 RPBFL    EQU    77          RESPONSE PACKET BUFFER LENGTH
          SPACE  4,10 
**        COMMAND PACKET OPERATION CODES. 
  
  
 C0200    EQU    0#0200      REPORT ATTRIBUTES
 C0209    EQU    0#0209      LOAD ATTRIBUTES
 C020A    EQU    0#020A      SAVE ATTRIBUTES
 C0301    EQU    0#0301      REPORT ADDRESSEE STATUS
 C0401    EQU    0#0401      RELEASE RESERVE
 C0402    EQU    0#0402      PRIORITY RESERVE 
 C0700    EQU    0#0700      SET OPERATING MODE 
 C0800    EQU    0#0800      ABORT COMMAND
 C1005    EQU    0#1005      BLOCK READ 
 C2005    EQU    0#2005      BLOCK WRITE
 C8100    EQU    0#8100      DRIVE DIAGNOSTICS
          SPACE  4,10 
**        COMMAND PACKET PARAMETER ID-S.
  
  
 P01D1    EQU    0#01D1      PERFORMANCE LOG
 P0254    EQU    0#0254      DRIVE RESET
 P02D2    EQU    0#02D2      MASTER TERMINATE 
 P02D3    EQU    0#02D3      EXTENT RESPONSE
 P0351    EQU    0#0351      DISK MODES 
 P036C    EQU    0#036C      REQUEST ATTRIBUTE
 P0551    EQU    0#0551      DISK DATA BLOCK SIZE 
 P0931    EQU    0#0931      COMMAND EXTENT 
 P0951    EQU    0#0951      TRANSFER SIZE OVERRIDE 
          SPACE  4,10 
**        SUBSTATUS PARAMETER ID CODES. 
  
  
 ID16     EQU    0#16        MACHINE EXCEPTION FOR CONTROLLER 
 ID17     EQU    0#17        COMMAND EXCEPTION FOR CONTROLLER 
 ID19     EQU    0#19        CONDITIONAL SUCCESS FOR CONTROLLER 
 ID24     EQU    0#24        INTERVENTION REQUIRED FOR DRIVE
 ID26     EQU    0#26        MACHINE EXCEPTION FOR DRIVE
 ID32     EQU    0#32        RESPONSE EXTENT (COMMON) 
          SPACE  4,10 
**        INFORMATION TRANSFER DEFINITIONS. 
  
  
 CIOT     EQU    0           COMMAND - INFORMATION OUT
 RIIN     EQU    1           RESPONSE - INFORMATION IN
 DAOT     EQU    2           DATA - INFORMATION OUT 
 DAIN     EQU    3           DATA - INFORMATION IN
          SPACE  4,10 
**        MAINTENANCE REGISTER REQUEST CODE SYMBOLS.
  
  
 MR       EQU    /IOU/MR     MAINTENANCE CHANNEL
 IOUC     EQU    /IOU/IOUC+/IOU/MRRD   READ CONNECT CODE
 RMRF     EQU    /IOU/MRRD-/IOU/MRRD   READ REGISTER
 WMRF     EQU    /IOU/MRWT-/IOU/MRRD   WRITE REGISTER 
  
 RFMR     EQU    RMRF*10000+/IOU/FMCR  READ FAULT MASK REGISTER 
 RCSR     EQU    RMRF*10000+/IOU/C0CR  READ CHANNEL STATUS REGISTER 
 WFMR     EQU    WMRF*10000+/IOU/FMCR  WRITE FAULT MASK REGISTER
          SPACE  4,10 
**        FAULT ANALYSIS CODES. 
  
  
 ECPE     EQU    1           CHANNEL PARITY ERROR          (CHPE) 
 ECIE     EQU    2           IPI CHANNEL ERROR
  
 ECER     EQU    4           CHANNEL DETECTED ERROR        (CHFE) 
 ECCM     EQU    5           CHANNEL DETECTED CM ERROR
 ECHF     EQU    7           CHANNEL HUNG FULL
  
 ETIT     EQU    10          INTERRUPT TIMEOUT             (FTOE) 
 ETFN     EQU    11          CHANNEL FUNCTION TIMEOUT 
  
 EDPE     EQU    14          DATA PARITY ERROR             (PARE) 
  
 EDNR     EQU    20          DEVICE NOT READY              (NRDE) 
  
 EIDT     EQU    24          INCOMPLETE DATA TRANSFER      (IDTE) 
  
 ERSS     EQU    30          RESERVED SUBSTATUS            (DSTE) 
 EDFM     EQU    31          DEFECT MANAGEMENT ERROR
 EMME     EQU    32          MESSAGE/MICROCODE EXCEPTION
 ETSL     EQU    33          SELECT TIMEOUT 
  
 ESUF     EQU    34          SPIN-UP FAILURE               (DSTE) 
 ESDF     EQU    35          SPIN-DOWN FAILURE
 ETTC     EQU    36          TRANSFER COMPLETE TIMEOUT
 EIVR     EQU    37          INTERVENTION REQUIRED
  
 EAPR     EQU    40          ALTERNATE PORT EXCEPTION      (DSTE) 
 EMEX     EQU    41          MACHINE EXCEPTION ERROR
 ECEX     EQU    42          COMMAND EXCEPTION ERROR
  
 EIOS     EQU    44          I/O INITIATION ERROR          (DSTE) 
 ERPE     EQU    45          REGISTER PARITY ERROR
 ERDS     EQU    46          REPORT DRIVE STATUS ERROR
  
 ECMA     EQU    50          COMMAND ABORTED ERROR         (DSTE) 
 ECCS     EQU    51          CONDITIONAL SUCCESS
 ECIC     EQU    52          COMMAND INCOMPLETE 
 EUST     EQU    53          TRANSFER UNSUCCESSFUL
  
 EDTF     EQU    54          DIAGNOSTIC FAULT              (DDFE) 
 EDRS     EQU    55          DRIVE RESET FAILURE
  
 ECNR     EQU    60          SLAVE IN DID NOT DROP         (RAME) 
 ELCA     EQU    61          LOAD CONTROLLER ATTRIBUTES FAILURE 
 ESRE     EQU    62          SELECTIVE RESET ERROR
 ERDA     EQU    63          REPORT DEVICE ATTRIBUTES ERROR 
  
 EBAE     EQU    64          BUS ACKNOWLEDGE ERROR         (CHFE) 
 ECOT     EQU    65          CONTROLLER OVER TEMPERATURE
  
 EDRE     EQU    70          DRIVE RESERVE ERROR           (DRVE) 
  
 ECRE     EQU    74          CONTROLLER RESET ERROR        (RAME) 
 ECMD     EQU    75          CONTROL MODULE DEAD
          SPACE  4,10 
**        DEVICE STATE TABLE DEFINITIONS. 
  
  
          LOC    0
 PUTO     BSS    1           *PUT* ORDINAL
 PNUN     BSS    1           PORT/EQUIPMENT/UNIT NUMBERS (3/P,3/E,6/U)
 ADDR     BSS    1           PROCESSOR ADDRESS
 RADD     BSS    1           RETURN ADDRESS 
 ATTN     BSS    1           ATTENTION RETURN 
 EEST     BSS    1           EXPECTED EXECUTION STATUS
 RWST     BSS    1           READ / WRITE STATUS
 RQLN     BSS    1           REQUEST QUEUE LENGTH 
 CBCT     BSS    1           CUMULATIVE BUFFER COUNT
 CYLN     BSS    1           CYLINDER ON SEEK 
 TKSN     BSS    1           TRACK + SECTOR ON SEEK 
 ERCT     BSS    1           ERROR COUNT
 SREQ     BSS    1           SPECIAL REQUEST
*         IPPS - I/O PREPROCESSING STATUS.
*                BIT 15 = DRIVE DIAGNOSTICS IN PROGRESS.
*                BIT 14 = *SET DRIVE ATTRIBUTES* REQUIRED.
*                BIT 13 = *BREAK OPPOSITE RESERVE* REQUIRED.
*                BITS 11-0 = CBT ORDINAL FOR CURRENT I/O REQUEST. 
 IPPS     BSS    1           I/O PREPROCESSING STATUS 
 LCMD     BSS    1           LAST COMMAND OP CODE 
 ESAD     BSS    1           ERROR STEP ADDRESS 
 ENAD     BSS    1           ERROR NEXT ADDRESS 
 RPST     BSS    1           RESPONSE PACKET STATUS 
 IOST     BSS    1           READ/WRITE STATUS
 ERAD     BSS    1           ERROR RETURN ADDRESS 
 FTOC     BSS    2           FUNCTION TIMEOUT CLOCK VALUE 
  
 DSTBE    BSS    0           LENGTH OF STATE TABLE ENTRY
          LOC    0
          SPACE  4,15 
****      ASSEMBLY CONSTANTS. 
  
  
 CH       EQU    16          CHANNEL NUMBER 
 NRAP     EQU    2           NUMBER OF IPI ADAPTOR PORTS
 MXCN     EQU    10          MAXIMUM NUMBER OF CONTROLLERS / PORT 
 MXDC     EQU    10          MAXIMUM NUMBER OF DRIVES / CONTROLLER
 MXND     EQU    10*2        MAXIMUM NUMBER OF UNITS / DRIVER 
 DSTB     EQU    EXR         START OF DEVICE STATE TABLES 
 DSTBL    EQU    DSTB+DSTBE*MXND  LWA+1 OF DEVICE STATE TABLES
  
*         CSTB - CONTROLLER STATUS BLOCK. 
*         ONE ENTRY PER CONTROLLER NUMBER PER PORT. 
* 
*         BIT 15             SLAVE RESET IN PROGRESS
*         BIT 14             LOGICAL RESET PENDING
*         BITS 0-11          DEVICE INDEX OF FIRST DRIVE ON CONTROLLER
  
 CSTB     EQU    DSTBL       CONTROLLER STATUS BLOCK
 CSTBS    EQU    10*2        LENGTH OF CONTROLLER STATUS BLOCK
 OCMD     MAX    PPFW,CSTB+CSTBS  DRIVER ORIGIN 
  
 MNCS     EQU    1           MINIMUM NUMBER OF CYLINDERS / STREAM 
 MXCS     EQU    2           MAXIMUM NUMBER OF CYLINDERS / STREAM 
 MNSS     EQU    MNCS*PSPT*PTCY  MINIMUM SECTORS / STREAM 
 MXSS     EQU    MXCS*PSPT*PTCY  MAXIMUM SECTORS / STREAM 
 MNBS     EQU    MNSS/PSBF-1  MINIMUM NUMBER OF BUFFERS / STREAM
 MXBS     EQU    MXSS/PSBF-1  MAXIMUM NUMBER OF BUFFERS / STREAM
 DRFM     EQU    1000        DIRECTION FLAG MASK
 ILFM     EQU    4000        INTERLOCK FLAG MASK
 CSRC     EQU    4           CHANNEL SWITCH RETRY COUNT 
 MERC     EQU    CSRC*2      ERROR PROCESSING RETRY COUNT 
  
*         LAYOUT OF ERROR DATA BUFFERS. 
  
 BEGIN    BSSN   0           REAL TIME ERROR DATA 
 EXST     BSSN   1           ENDING STATUS
          BSSN   2           RESERVED 
 LSCC     BSSN   1           LAST SLAVE COMMAND 
 LCFN     BSSN   1           LAST CHANNEL FUNCTION
 CREG     BSSN   4           CHANNEL REGISTER DATA
          BSSN   3           RESERVED 
 TREG     BSSN   3           CONTENTS OF *T* REGISTER 
 RTEDL    EQU    *
  
 EMBF     BSSN   0           ERROR MESSAGE BUFFER 
          BSSN   3*5         BML MESSAGE PREFIX AND HEADER
 CODE     BSSN   1           INITIAL FAULT CODE 
 FCS1     BSSN   1           FAULT CODE - ERROR STEP 1
 FCS2     BSSN   1           FAULT CODE - ERROR STEP 2
 FCS3     BSSN   1           FAULT CODE - ERROR STEP 3
 FALT     BSSN   1           FINAL FAULT CODE 
          BSSN   1           RESERVED 
 RBCT     BSSN   1           RESIDUAL BYTE COUNT
 STCT     BSSN   1           SECTORS TRANSFERED COUNT 
 ICYL     BSSN   1           CYLINDER ON INITIAL SEEK 
 ITAS     BSSN   1           TRACK + SECTOR ON INITIAL SEEK 
 .3       SET    *-EMBF+4 
 EMBFS    EQU    .3/5 
 EMBF1    EQU    EMBFS*5+EMBF 
 .1       SET    RTEDL*4
 .2       SET    .1-.1/3*3+2
 .3       SET    .1/3+.2/3+4
 EMBF2    EQU    .3/5*5+EMBF1 
 .1       SET    RPBFL*4
 .2       SET    .1-.1/3*3+2
 .3       SET    .1/3+.2/3+4
 EMBFL    EQU    .3/5*5+EMBF2 
  
 END      BSSN
 EDBFL    EQU    RTEDL+EMBFL
  
****
          TITLE  MACROS.
          SPACE  4,10 
**        MACRO DEFINITIONS.
 TBLM     SPACE  4,10 
**        TBLM - CREATE TABLE ENTRY MACRO.
* 
*NAM      TBLM
* 
*         ENTRY  NAM = TABLE NAME.
* 
*         EXIT   NAM_E MACRO DEFINED. 
  
  
          PURGMAC  TBLM 
  
          MACRO  TBLM,NAM 
          PURGMAC  NAM_E
 NAM_E    MACRO  ADDR 
          LOCAL  A
          MACREF NAM_E
          NOREF  A
 A        EQU    ADDR 
 T_NAM    RMT 
          CONL   A
          RMT 
 TBLM     ENDM
 CBTE     SPACE  4,10 
**        CBTE - CONTROL BUFFER TABLE ENTRY.
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TCBT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE CONTROL BUFFER TABLE. 
* 
*         CBTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TCBT*. 
  
  
 CBT      TBLM
 CCTE     SPACE  4,10 
**        CCTE - CHANNEL CONTROL TABLE ENTRY. 
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TCCT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE CHANNEL CONTROL TABLE.
* 
*         CCTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TCCT*. 
  
  
 CCT      TBLM
 CHTE     SPACE  4,10 
**        CHTE - CHANNEL TABLE ENTRY. 
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TCHT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE CHANNEL TABLE.
* 
*         CHTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TCHT*. 
  
  
 CHT      TBLM
 EMBE     SPACE  4,10 
**        EMBE - ERROR MESSAGE TABLE ENTRY. 
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TEMB* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE ERROR MESSAGE TABLE.
* 
*         EMBE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TEMB*. 
  
  
 EMB      TBLM
 EXPE     SPACE  4,10 
**        EXPE - EXCHANGE PACKAGE ADDRESS ENTRY.
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TEXP* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE PP EXCHANGE PACKAGE.
* 
*         EXPE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TEXP*. 
  
  
 EXP      TBLM
 PUTE     SPACE  4,10 
**        PUTE - PHYSICAL UNIT TABLE ENTRY. 
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TPUT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE PHYSICAL UNIT TABLE.
* 
*         PUTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TPUT*. 
  
  
 PUT      TBLM
 MONITOR  SPACE  4,10 
**        MONITOR - REQUEST MONITOR FUNCTION. 
* 
*         MONITOR  F
* 
*         ENTRY  F = MONITOR FUNCTION.
*                (CM+1 - CM+4) = PARAMETERS.
* 
*         CALLS  IMF. 
  
  
          PURGMAC MONITOR 
  
 MONITOR  MACRO  F
          MACREF MONITOR
          LDK    F
          RJM    IMF
          ENDM
 WAIT     SPACE  4,10 
**        WAIT - DO NOTHING FOR SPECIFIED TIME. 
* 
*         WAIT   N
* 
*                N = MICROSECOND COUNT. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   T0.
  
  
          PURGMAC  WAIT 
  
 WAIT     MACRO  N
          MACREF WAIT 
          NOREF  .2 
          BASE   D
 .2       SET    N 1
          IFEQ   N,64,2 
          LDD    HN 
          SKIP   4
          IFEQ   N,512,2
          LDD    TH 
          SKIP   1
          LDK    .2 
          BASE   *
          SBN    1
          STD    T0 
          NJN    *-2
          ENDM
          TITLE  MAIN PROGRAM.
 XMD      SPACE  4,10 
**        XMD - MAIN PROGRAM. 
  
  
          ORG    OCMD 
          RICHI              BEGIN CHANNEL INSTRUCTION MODIFICATION 
  
 CM3D     LJM    PRS         PRESET DRIVER
 XMD      EQU    *-1
          LDM    XMD         PRESERVE RETURN ADDRESS
          STM    ADDR,DI
 XMD1     RJM    DCM         DESELECT CONTROLLER
 XMD2     LDD    TA 
          LMC    DSTBL       (ADJUSTED BY *IST*)
 XMDA     EQU    *-1
          NJN    XMD5        IF NOT END OF DEVICE STATE TABLE 
          RJM    CCR
          ZJN    XMD7        IF CHANNEL DOWN
          LCN    0
          RJM    IOM         REFRESH OPERATOR MESSAGE 
 XMD4     LDC    DSTB 
          STD    TA          RESTART STATE TABLE SCAN 
 XMD5     LDD    TA 
          STD    DI          SET DEVICE INDEX 
          ADN    DSTBE
          STD    TA          ADVANCE TABLE ADDRESS
          RJM    CFR
          UJN    XMD2        CHECK NEXT DEVICE
  
 XMD7     UJN    *+2         FIRST PASS 
 XMDB     EQU    XMD7 
          UJN    XMD8        DROP PP ON SECOND PASS 
          SOM    XMDB 
          LDC    CMP8        CHANGE PATH THRU *CFR* 
          STM    CFRA 
          UJN    XMD4        LOOP THRU DEVICE STATE TABLE 
  
 XMD8     MONITOR  DPPM      DROP PP
          LJM    PPR         EXIT TO PPR
  
 MSG1     DATA   C* "DN" - UNAUTHORIZED CALL.*
          TITLE  READ / WRITE PROCESSING. 
 PIO      SPACE  4,10 
**        PIO - READ / WRITE PROCESSING.
  
  
 PIO      BSS    0
          LDML   PIOB,RW     SETUP SEEK COMMAND 
          STML   CPBF+OPC 
          LDD    CN          MERGE CONTROLLER + DRIVE NUMBERS 
          SHN    10 
          LMD    DN          SET FACILITY ADDRESS 
          STM    CPBF+CUN 
          LDC    P0931       COMMAND EXTENT PARAMETER 
          STM    CPBF+FCP 
          LDN    0           UPPER SECTOR COUNT 
          STM    CPBF+FCP+1 
  
*         SET UP COMMAND PARAMETERS.
*         NOTE THAT PARAMETERS CPBF+FCP+2 - CPBF+FCP+4 HAVE ALREADY 
*         BEEN SET BY SUBROUTINE *IIO*. 
  
          LDC    P0951       TRANSFER SIZE OVERRIDE PARAMETER 
          STM    CPBF+FCP+5 
          LDC    40000       CHANGE BURST SIZE
          STML   CPBF+FCP+11
          STML   CPBF+FCP+7  CHANGE INTERRUPT SIZE
          SHN    0-20 
          STM    CPBF+FCP+10 SET LEADING DIGITS 
          STM    CPBF+FCP+6 
          LDN    40D         SEEK TIMEOUT = 40 SECONDS
          STD    TO 
          LDN    IOPL+12     WRITE COMMAND BLOCK
          RJM    WCB
  
*         WAIT UNTIL CONTROLLER RETURNS TRANSFER NOTIFICATION.
  
 PIO1     LDD    CB          SET I/O IN PROGRESS
          STM    IPPS,DI
          LDN    XFNT        PROCESS ATTENTION
          RJM    ATT
          ZJN    PIO2        IF EXPECTED STATUS 
          LCN    EIOS 
          RJM    ERR         PROCESS ERROR
  
 PIO2     LDN    1           SET CHANNEL ACTIVE FOR *CPD* 
          RJM    SCD
          LDM    IPPS,DI     RESTORE CURRENT BUFFER ORDINAL 
 PIO3     STD    CB 
          LDDL   T7          CHECK ENDING STATUS
          LPN    0#30 
          NJN    PIO1        IF PAUSE / TIME DEPENDENT OPERATION
  
*         INITIATE DATA TRANSFER. 
  
          LDN    DAIN        DEFINE TRANSFER DIRECTION
          SBD    RW 
          ERRNZ  DAOT+1-DAIN CODE DEPENDS ON VALUE
          RJM    BCS
          LDML   PIOD,RW     SET DMA MODE 
          RJM    FCN
          RJM    WTR         WRITE *T* REGISTER 
          LDD    CB 
          RJM    SFR         SEARCH FOR CONSECUTIVE REQUEST 
  
*         WAIT UNTIL ONE BURST DMA TRANSFER COMPLETE. 
  
          LDN    2           TIMEOUT = 2 SECONDS
          RJM    STO
          RJM    CTC         CHECK TRANSFER COMPLETE
*         LDN    0
          STD    T1          CLEAR RESIDUAL BYTE COUNT
          LDD    NB 
          ZJN    PIO5        IF NO MORE CONSECUTIVE REQUESTS
          LDN    0#A
 PIO5     LMN    0#A         CHECK ENDING STATUS
          RJM    GSS
          RJM    EIO         ENTER BUFFER IN I/O REQUEST QUEUE
          LDD    NB 
          NJP    PIO3        IF CONSECUTIVE REQUEST PRESENT 
  
*         COMPLETE READ / WRITE OPERATIONS. 
  
*         LDN    0           CLEAR CHANNEL ACTIVE FOR *CPD* 
          RJM    SCD
          LDN    40D         TIMEOUT = 40 SECONDS 
          RJM    STO
          LDN    CMSS        WAIT ON INTERRUPT
          RJM    ATT
          NJN    PIO7        IF ERROR 
          LDDL   MS 
          LMN    CMCS 
          NJN    PIO6        IF NOT CONDITIONAL SUCCESS 
          LDML   RPBF+5 
          LPC    377
          LMN    ID19 
          NJN    PIO7        IF RESPONSE NOT DUE TO MASTER TERMINATE
          LDML   RPBF 
          SBN    17 
          PJN    PIO7        IF RESPONSE TOO LONG 
          LDML   RPBF+7 
          SHN    21-10
          PJN    PIO7        IF NOT MASTER TERMINATE
 PIO6     LJM    CMP         COMPLETE PROCESSING
  
 PIO7     LCN    EIOS 
          RJM    ERR         PROCESS ERROR
  
  
 PIOB     BSS    0           COMMAND CODES
          CONL   C1005
          CONL   C2005
  
 PIOD     BSS    0           DATA TRANSFER FUNCTIONS
          CONL   F0281
          CONL   F0381
          TITLE  LIST DEVICE ATTRIBUTE. 
 LDA      SPACE  4,10 
**        LDA - LIST DEVICE ATTRIBUTE IN DAYFILE. 
  
  
 LDA      BSS    0
          LDC    C0200       SETUP REPORT ATTRIBUTES COMMAND
          STM    CPBF+OPC 
          LDD    CN          MERGE CONTROLLER + UNIT NUMBERS
          SHN    10 
          LMD    DN          SET FACILITY ADDRESS 
          STM    CPBF+CUN 
          LDC    P036C       REQUEST ATTRIBUTE PARAMETER
          STM    CPBF+FCP 
          LDC    0#4050      RETURN ATTRIBUTE ID 50 IN RESPONSE 
          STML   CPBF+FCP+1 
          LDN    2           TIMEOUT = 2 SECONDS
          STD    TO 
          LDN    BCPL+4      WRITE COMMAND BLOCK
          RJM    WCB
  
*         WAIT UNTIL CONTROLLER HAS RETURNED INTERRUPT. 
  
          LDN    CMSS        WAIT ON INTERRUPT
          RJM    ATT
          ZJN    LDA1        IF COMMAND COMPLETE
          LCN    ERDA 
          RJM    ERR         PROCESS ERROR
  
 LDA1     LDD    RW          CHECK REQUEST INDEX
          SBN    LDIF-ECAF
          ZJN    LDA2        IF FOR DRIVE SERIAL NUMBER 
  
*         GENERATE MICROCODE REVISION ERRLOG MESSAGE. 
  
          LDD    CN          SET CONTROL MODULE NUMBER IN BML MESSAGE 
          STD    NR+3 
          ADC    2RM0        CONVERT FOR ERRLOG MESSAGE 
          STM    LDAB+6 
          LDC    LDAB+4      LOCATION FOR REVISION LEVEL
          STD    T3 
          SBN    LDAB+4-LDAA SET MESSAGE ADDRESS
          STML   MAD1 
          LDM    RPBF+6+0#1B/2  CONVERT REVISION LEVEL
          RJM    CHD
          RJM    IDM         ISSUE MESSAGE TO ERRLOG
  
*         GENERATE MICROCODE REVISION BML MESSAGE.
  
          LDD    MA          MOVE MICROCODE REVISION LEVEL
          CWM    LDAB,ON
          SBN    1           COPY TO BML MESSAGE
          CRD    WB 
          LDD    IR+4        SET CHANNEL NUMBER 
          STD    NR+2 
          LDN    HI0104-HI0100
          LJM    LDA4        COMPLETE BML MESSAGE 
  
*         GENERATE PACK SERIAL NUMBER ERRLOG MESSAGE. 
  
 LDA2     LDN    0
          STD    T2 
          LDC    LDAE+2      SET ADDRESS FOR CONVERSION 
          STD    T3 
          SBN    -LDAD+LDAE+2  DEFINE MESSAGE ADDRESS 
          STML   MAD1 
  
*         CONVERT RIGHTMOST 6 DIGITS OF 8 DIGIT PACK SERIAL NUMBER. 
  
 LDA3     LDML   RPBF+FCP+1+0#1E,T2 
          SHN    -10
          ZJN    LDA3.1      IF SERIAL NUMBER NOT PRESENT 
          SBN    60          CONVERT ASCII TO DISPLAY CODE
 LDA3.1   ADN    1R0
          SHN    6
          STD    T0          UPPER CHARACTER OF WORD
          LDML   RPBF+FCP+1+0#1E,T2 
          LPN    77 
          ZJN    LDA3.2      IF SERIAL NUMBER NOT PRESENT 
          SBN    60          CONVERT ASCII TO DISPLAY CODE
 LDA3.2   ADN    1R0
          LMD    T0 
          STI    T3          LOWER CHARACTER OF WORD
          AOD    T2 
          AOD    T3 
          LMC    LDAE+2+3 
          NJN    LDA3        IF MORE CHARACTERS TO CONVERT
          LDM    PNUN,DI
          LPN    77          PUT UNIT NUMBER IN BML MESSAGE 
          STD    NR+3 
          RJM    C2D         CONVERT FOR ERRLOG MESSAGE 
          STM    LDAD+11
          LDD    EO          CONVERT EST ORDINAL
          SHN    -3 
          RJM    C2D
          STM    LDAD+6      INSERT IN ERRLOG MESSAGE 
          LDD    EO 
          LPN    7           CONVERT LOWER DIGIT
          SHN    6
          ADC    2R0,        ADD TO ERRLOG MESSAGE
          STM    LDAD+7 
          RJM    IDM         ISSUE MESSAGE TO ERRLOG
  
*         GENERATE PACK SERIAL NUMBER BML MESSAGE.
  
          LDD    MA          MOVE DRIVE SERIAL NUMBER 
          CWM    LDAE,ON
          SBN    1           COPY TO BML MESSAGE
          CRD    WB 
          LDD    EO          INSERT EST ORDINAL 
          STD    WB 
          LDC    2R"DM"      SET DEVICE MNEMONIC
          STD    NR+2 
          LDN    0           CLEAR UNUSED FIELD 
          STD    WB+1 
 LDA4     ADD    HN          INSERT SYMPTOM CODE
          ERRNZ  HI0100-100  CODE DEPENDS ON VALUE
          STD    NR+1 
          LDC    DM0401      DEFINE MESSAGE ID
          STD    NR 
          LDN    ZERL        CLEAR HEADER WORD
          CRD    CM 
          LDN    3           WORD COUNT OF MESSAGE
          STD    CM+3 
          ADK    MLDY-3      DIRECT MESSAGE TO BML
          STD    CM+4 
          LDC    SBUF        SET MESSAGE ADDRESS
          STML   MAD1 
          LDD    MA          MOVE MESSAGE DATA
          CWM    CM,TR
          ERRNZ  CM+5-NR     CODE DEPENDS ON VALUE
          SBN    3
          ERRNZ  NR+5-WB     CODE DEPENDS ON VALUE
          CRM    SBUF,TR
          ERRNG  SBUFL-3*5   CODE DEPENDS ON VALUE
          LDN    0
          STD    RW          ISSUE BML MESSAGE
          RJM    IDM
          LJM    CSR         CLEAR SPECIAL REQUEST FLAG 
  
  
 LDAA     CON    0,0,0,4,ELDY    MICROCODE REVSION ERRLOG MESSAGE 
          DATA   4HCH** 
 LDAB     DATA   10H MH426-D**
          DATA   C+,CM0.+ 
  
 LDAD     CON    0,0,0,4,ELDY    PACK SERIAL NUMBER ERRLOG MESSAGE
          DATA   10H"DM"***, U**
 LDAE     DATA   C+,PS=******.+ 
          TITLE  DIAGNOSTIC PROCESSING. 
 RND      SPACE  4,10 
**        RND - RUN DIAGNOSTICS.
  
  
 RND      SUBR               ENTRY/EXIT 
          LDM    ENAD,DI
          NJN    RNDX        IF DRIVE DISABLED (SLAVE RESET FAILURE)
          LDC    C8100       SETUP DRIVE DIAGNOSTIC COMMAND 
          STML   CPBF+OPC 
          LDD    CN          MERGE CONTROLLER + DRIVE NUMBERS 
          SHN    10 
          LMD    DN          SET FACILITY ADDRESS 
          STM    CPBF+CUN 
          LDN    60D         TIMEOUT VALUE = 1 MINUTE 
          STD    TO 
          LDN    BCPL        WRITE COMMAND BLOCK
          RJM    WCB
          LDML   IPPS,DI     FLAG DIAGNOSTICS INITIATED 
          LPC    -1S15
          LMC    1S15 
          STML   IPPS,DI
  
*         WAIT UNTIL CONTROLLER HAS RETURNED INTERRUPT. 
  
          LDN    CMSS        PROCESS ATTENTION
          RJM    ATT
          ZJN    RND1        IF DIAGNOSTICS COMPLETED SUCCESSFULLY
          LDN    0           CLEAR ERROR STEP ADDRESS 
          STM    ESAD,DI
          LCN    EDTF 
          RJM    ERR         PROCESS ERROR
  
 RND1     LDML   IPPS,DI     CLEAR DIAGNOSTICS FLAG 
          LPC    -1S15
          STML   IPPS,DI
          UJP    RNDX        RETURN 
          TITLE  SELECTIVE RESET PROCESSING.
 SRS      SPACE  4,20 
**        SRS - SELECTIVE RESET PROCESSING. 
* 
*         ENTRY  (A) = 6/FLAG,12/RADD.
*                      (FLAG) = 0 FOR SLAVE RESET.
*                      (FLAG) = 1 FOR LOGICAL RESET.
*                      (RADD) = RETURN ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (ADDR,DI) = 0 FOR ALL DRIVES ON CONTROL MODULE.
* 
*         EXIT   TO *ERR* IF ERROR. 
*                TO *CMP9* FOR NON-CONTROLLING DRIVES ON SLAVE RESET. 
* 
*         USES   PA, RF, RW, T1, T5.
* 
*         CALLS  ATT, C2D, IOM, LND, RIF, SCA, SRP, STO, XMD. 
  
  
 SRS      BSS    0           ENTRY
          STM    ERAD,DI     SET RETURN ADDRESS 
          SHN    -14
          STD    RW          SAVE RESET OPTION
          STM    RWST,DI
 SRS2     LDC    0           CHECK RESET ACTIVITY 
 SRSA     EQU    *-1
          ZJN    SRS4        IF NONE IN PROGRESS
 SRS3     RJM    XMD         RETURN TO MAIN LOOP
          UJN    SRS2        CHECK RESET IN PROGRESS
  
 SRS4     LDD    DI 
          STM    SRSA        SET LOCAL RESET IN PROGRESS
          LDN    0
 SRS5     RJM    LND         LOCATE NEXT DRIVE
          ZJN    SRS7        IF NO MORE DRIVES ON CONTROLLER
          LDM    SRSE,RW
          STM    ADDR,T7     SET DRIVE PROCESSING ADDRESS 
          STM    SRSC 
          LDN    1
          UJN    SRS5        CHECK FOR NEXT DRIVE 
  
 SRS7     LDM    PNUN,DI
          SHN    -6          CONTROLLER BLOCK INDEX 
          STD    T5 
          LDD    RW 
          LMN    1
          SHN    17-0        BIT 15 SET IF SLAVE RESET
          STDL   T1 
          LDML   CSTB,T5     SET / CLEAR SLAVE RESET IN PROGRESS FLAG 
          LPC    -1S15
          LMDL   T1 
          STML   CSTB,T5
          RJM    RIF         RESET SLAVE / LOGICAL INTERFACE
          LDN    60D         RESET TIMEOUT = 1 MINUTE 
          RJM    STO
          LDD    CN          CONVERT CONTROL MODULE NUMBER
          RJM    C2D
          SHN    6           INSERT IN MESSAGE
          LMN    1R 
          STM    SRSH+1      INSERT IN FAILURE MESSAGE
          STM    SRSG+1 
          LDD    RW 
          NJN    SRS7.1      IF LOGICAL RESET 
          LDC    SRSG        ACTIVATE OPERATOR MESSAGE
          STM    IOMA 
          LCN    1
          RJM    IOM
 SRS7.1   LDN    ASRT        WAIT ON ASYNC INTERRUPT
          RJM    ATT
          NJN    SRS8        IF ERROR 
  
*         SEARCH RESPONSE PACKET FOR MACHINE EXCEPTION PARAMETER. 
  
          LDN    ID16        LOOK FOR MACHINE EXCEPTION 
          RJM    SRP
          MJN    SRS8        IF PARAMETER NOT FOUND 
          LDML   RPBF+6,T3
          LPC    0#FEE0      CHECK OPERATIONAL + READY TRANSITION 
          LMC    0#6000 
          ZJN    SRS9        IF CONTROLLER RESET SUCCESSFUL 
 SRS8     LCN    ESRE 
          RJM    ERR         PROCESS ERROR
  
 SRS9     RJM    SCA         SET CONTROLLER ATTRIBUTES
*         LDN    0           CLEAR RESET INTERLOCK
          STM    SRSA 
          STD    RF          CLEAR RESET IN PROGRESS FLAG 
          RJM    IOM         CLEAR OPERATOR MESSAGE 
          LDM    PNUN,DI
          SHN    -6          CONTROLLER BLOCK INDEX 
          STD    T5 
          LDML   CSTB,T5     ENABLE CONTROLLER ACTIVITY 
          LPC    -1S14-1S15 
          STML   CSTB,T5
  
*         SLAVE RESET - WAIT FOR ASYNC INTERRUPT ON CONTROLLING UNIT. 
*         IF THE DRIVE INTERRUPT FOR THE CONTROLLING UNIT IS RECEIVED 
*         BEFORE THE CONTROLLER INTERRUPT, *IHD* WILL CLEAR *SRSC*
*         AND THROW AWAY THE INTERRUPT. 
  
 SRS10    LDC    0           CHECK RESET COMPLETION 
*         LDC    (NONZERO)   (SLAVE RESET - MAY BE CLEARED BY *IHD*)
 SRSC     EQU    *-1
          ZJN    SRS11       IF CONTROLLING DRIVE COMPLETE
          LDC    7*60D       TIMEOUT = 7 MINUTES
          RJM    STO
          LDN    ASRT        WAIT ON ASYNC INTERRUPT
          RJM    ATT         (RETURN TO *SRS11* IF INTERRUPT TIMEOUT) 
  
*         COMPLETE RESET PROCESSING.
  
 SRS11    LDN    0           REENABLE ACCESS TO CONTROLLING DEVICE
          STM    ADDR,DI
          STM    ATTN,DI
          RJM    IOM         CLEAR OPERATOR MESSAGE 
          LDM    ERAD,DI
          STD    PA 
          LJM    0,PA        RETURN TO CALLER 
  
*         SLAVE RESET - WAIT FOR ASYNC INTERRUPTS ON OTHER UNITS. 
*         ENTRY TO THIS CODE IS FORCED BY CODE AT *SRS5*. 
*         IF A DRIVE INTERRUPT FOR A NONCONTROLLING UNIT IS RECEIVED
*         BEFORE ENTRY AT *SRS12*, *VIS* WILL CLEAR *ADDR* FOR THE
*         DRIVE AND THROW AWAY THE INTERRUPT. 
  
 SRS12    LDC    8D*60D      TIMEOUT = 8 MINUTES
          RJM    STO
          LDN    ASRT        WAIT FOR ASYNC INTERRUPT 
          RJM    ATT         (RETURN TO *SRS13* IF INTERRUPT TIMEOUT) 
 SRS13    LDN    0
          RJM    IOM         CLEAR OPERATOR MESSAGE 
          LJM    CMP9        REENABLE ACCESS TO DRIVE 
  
  
 SRSE     BSS    0           DRIVE PROCESSING ADDRESSES 
          CON    SRS12       SLAVE RESET
          CON    0           LOGICAL RESET
  
 SRSG     DATA   C*CM3 BEING RESET ON CCHNN.* 
  
 SRSH     DATA   C*CM3 RESET FAILURE ON CCHNN.* 
          TITLE  INTERRUPT DRIVEN SUBROUTINES.
 BOR      SPACE  4,20 
**        BOR - BREAK OPPOSITE RESERVE. 
* 
*         EXECUTE A DRIVE RESET FOR THE SPECIFIED DRIVE.  THIS IS DONE
*         FOR EACH DRIVE AT DRIVER INITIALIZATION TIME TO BREAK ANY 
*         DRIVE RESERVES WHICH MAY BE HELD BY THE OPPOSITE ACCESS.
*         ALSO CLEAR CONTROLLER OVER TEMPERATURE STATUS IN MST WORD 
*         *BDLL*. 
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   TO *CMP*.
* 
*         USES   CM+2, T7.
* 
*         CALLS  EDR, UBP.
  
  
 BOR      BSS    0           ENTRY
          LDN    0           CLEAR CONTROLLER OVER TEMPERATURE FLAG 
          STD    CM+2 
          LDC    63*100      LOW ORDER BIT TO CHANGE TIMES 100
          STD    T7 
          LDC    BDLL*100+1  6/WORD, 6/BITS TO CHANGE 
          RJM    UBP         UPDATE *BDLL* PARAMETER
          RJM    EDR         EXECUTE DRIVE RESET
          LDML   IPPS,DI     CLEAR *BREAK OPPOSITE RESERVE* FLAG
          LPC    -1S13
          STML   IPPS,DI
          LJM    CMP         COMPLETE REQUEST 
 EDR      SPACE  4,15 
**        EDR - EXECUTE DRIVE (POWER ON) RESET. 
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   (A) = 0 IF COMMAND COMPLETED.
*                TO CALLER VIA *RTC*. 
* 
*         ERROR  TO *ERR* IF NOT COMMAND COMPLETED. 
* 
*         USES   TO.
* 
*         CALLS  ATT, WCB.
  
  
 EDR      CON    0
          LDM    EDR         SET RETURN ADDRESS 
          STM    RADD,DI
          LDC    C0800       SETUP ABORT COMMAND
          STM    CPBF+OPC 
          LDD    CN          CONTROLLER NUMBER
          SHN    10 
          LMD    DN          APPEND FACILITY ADDRESS
          STM    CPBF+CUN 
          LDC    P0254       PARAMETER ID = DRIVE RESET 
          STM    CPBF+FCP 
          LDC    0#400       SELECT POWER ON RESET
          STM    CPBF+FCP+1 
          LDN    30D         TIMEOUT = 30 SECONDS 
          STD    TO 
          LDN    BCPL+3      WRITE COMMAND BLOCK
          RJM    WCB
          LDN    CMSS        WAIT ON INTERRUPT
          RJM    ATT
          ZJP    RTC         IF COMMAND COMPLETE
          LCN    EDRS 
          RJM    ERR         PROCESS ERROR
 GDS      SPACE  4,15 
**        GDS - GET DRIVE STATUS. 
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   (A) = DRIVE CONDITION FLAGS. 
*                TO CALLER VIA *RTC*. 
* 
*         ERROR  TO *ERR* IF COMMAND COMPLETE NOT RECEIVED. 
* 
*         USES   TO.
* 
*         CALLS  ATT, WCB.
  
  
 GDS      CON    0
          LDM    GDS         SET RETURN ADDRESS 
          STM    RADD,DI
          LDC    C0301       SETUP REPORT STATUS COMMAND
          STML   CPBF+OPC 
          LDD    CN          CONTROLLER NUMBER
          SHN    10 
          LMD    DN          FORM FACILITY ADDRESS
          STM    CPBF+CUN 
          LDN    2           TIMEOUT = 2 SECONDS
          STD    TO 
          LDN    BCPL        WRITE COMMAND BLOCK
          RJM    WCB
          LDN    CMSS        WAIT ON INTERRUPT
          RJM    ATT
          ZJN    GDS2        IF COMMAND COMPLETE
          LCN    ERDS 
          RJM    ERR         PROCESS ERROR
  
 GDS2     LDML   RPBF+6      RETURN DRIVE CONDITION TO CALLER 
*         LJM    RTC
 RTC      SPACE  4,10 
**        RTC - RETURN TO CALLER. 
* 
*         USES   PA.
  
  
 RTC      STD    T0          SAVE 12 BITS OF *A* REGISTER 
          LMD    T0 
          LMM    RADD,DI     SET RETURN ADDRESS 
          STD    PA 
          LMD    PA          RESTORE *A* REGISTER 
          LMD    T0 
          LJM    0,PA        RETURN TO CALLER 
 SCA      SPACE  4,15 
**        SCA - SET CONTROLLER ATTRIBUTES.
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
* 
*         EXIT   (A) = 0 IF COMMAND COMPLETED.
*                TO CALLER VIA *RTC*. 
* 
*         ERROR  TO *ERR* IF NOT COMMAND COMPLETED. 
* 
*         USES   TO.
* 
*         CALLS  ATT, WCB.
  
  
 SCA      CON    0
          LDM    SCA         SET RETURN ADDRESS 
          STM    RADD,DI
          LDC    C0209       SETUP LOAD ATTRIBUTES COMMAND
          STM    CPBF+OPC 
          LDD    CN          CONTROLLER NUMBER
          SHN    10 
          LMC    0#FF        APPEND FACILITY ADDRESS
          STM    CPBF+CUN 
          LDC    P01D1       DISABLE PERFORMANCE LOG
          STM    CPBF+FCP 
          ADK    P02D2-P01D1 ENABLE MASTER TERMINATE
          STM    CPBF+FCP+1 
          ADK    P02D3-P02D2 DISABLE EXTENT RESPONSE
          STM    CPBF+FCP+3 
          LDC    0#100       SET PARAMETERS 
          STM    CPBF+FCP+2 
          STM    CPBF+FCP+4 
          LDN    2           TIMEOUT = 2 SECONDS
          STD    TO 
          LDN    BCPL+11     WRITE COMMAND BLOCK
          RJM    WCB
          LDN    CMSS        WAIT ON INTERRUPT
          RJM    ATT
          ZJP    RTC         IF COMMAND COMPLETE
          LCN    ELCA 
          RJM    ERR         PROCESS ERROR
 SDA      SPACE  4,20 
**        SDA - SET DRIVE ATTRIBUTES. 
* 
*         SET THE FACILITY BUSY TIMEOUT FOR THE SPECIFIED DRIVE TO
*         15 SECONDS.  THIS IS DONE TO PREVENT ERRORS WHEN ANOTHER
*         CONTROL MODULE ACCESSES A DRIVE TO PERFORM SWEEP CYCLING, 
*         OR WHEN A DRIVE IS TIED UP RUNNING DIAGNOSTICS AFTER A
*         SLAVE RESET FROM THE OTHER ACCESS.
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   TO *CMP* IF COMMAND COMPLETED. 
* 
*         ERROR  TO *ERR* IF ERROR. 
* 
*         USES   TO.
* 
*         CALLS  ATT, WCB.
  
  
 SDA      BSS    0           ENTRY
  
*         REPORT DEVICE ATTRIBUTES. 
  
          LDC    C0200       SETUP REPORT ATTRIBUTES COMMAND
          STML   CPBF+OPC 
          LDD    CN          SET FACILITY ADDRESS 
          SHN    10 
          LMD    DN 
          STM    CPBF+CUN 
          LDC    P036C       REQUEST ATTRIBUTE PARAMETER
          STML   CPBF+FCP 
          LDC    0#406F      REQUEST ATTRIBUTE 6F 
          STML   CPBF+FCP+1 
          LDN    40D         TIMEOUT = 40 SECONDS 
          STD    TO 
          LDN    BCPL+4      WRITE COMMAND BLOCK
          RJM    WCB
          LDN    CMSS        WAIT FOR INTERRUPT 
          RJM    ATT
          NJP    SDA2        IF ERROR 
  
*         SET FACILITY BUSY TIMEOUT TO 15 SECONDS.
  
          LDML   RPBF+25     CHECK CURRENT TIMEOUT VALUE
          LMC    0#E4 
          NJN    SDA1        IF TIMEOUT VALUE NOT CORRECT 
          LDML   RPBF+26
          LMC    0#E1C0 
          ZJP    SDA4        IF TIMEOUT VALUE ALREADY CORRECT 
 SDA1     LDC    0#E4        SET TIMEOUT VALUE TO 15 SECONDS
          STML   RPBF+25
          LDC    0#E1C0 
          STML   RPBF+26
  
*         LOAD DEVICE ATTRIBUTES. 
  
          LDC    C0209       SETUP LOAD ATTRIBUTES COMMAND
          STML   CPBF+OPC 
          LDD    CN          SET FACILITY ADDRESS 
          SHN    10 
          LMD    DN 
          STM    CPBF+CUN 
          LDN    40D         TIMEOUT = 40 SECONDS 
          STD    TO 
          LDN    BCPL+50     WRITE COMMAND BLOCK
          RJM    WCB
          LDN    CMSS        WAIT FOR INTERRUPT 
          RJM    ATT
          ZJN    SDA3        IF COMMAND COMPLETE
 SDA2     LCN    ERDA 
          RJM    ERR         PROCESS ERROR
  
*         SAVE NEW ATTRIBUTES IN EEPROM.
  
 SDA3     LDC    C020A       SETUP SAVE ATTRIBUTES COMMAND
          STML   CPBF+OPC 
          LDD    CN          SET FACILITY ADDRESS 
          SHN    10 
          LMC    0#FF 
          STM    CPBF+CUN 
          LDN    40D         TIMEOUT = 40 SECONDS 
          STD    TO 
          LDN    BCPL        WRITE COMMAND BLOCK
          RJM    WCB
          LDN    CMSS        WAIT FOR INTERRUPT 
          RJM    ATT
          NJN    SDA2        IF ERROR 
 SDA4     LDML   IPPS,DI     CLEAR *SET DRIVE ATTRIBUTES* FLAG
          LPC    -1S14
          STML   IPPS,DI
          LJM    CMP         COMPLETE REQUEST 
          TITLE  SUBROUTINES. 
 ACE      SPACE  4,10 
**        ACE - ANALYZE CHANNEL ERROR.
* 
*         ENTRY  (RBUF) = CHANNEL STATUS REGISTER.
* 
*         EXIT   (A) = 0 IF NO CHANNEL ERROR. 
*                    = CHANNEL ERROR FAULT CODE.
  
  
 ACE3     LDN    ECCM        SET CHANNEL DETECTED CM ERROR
  
 ACE      SUBR               ENTRY/EXIT 
          LDM    RBUF+5 
          LPN    2
          ZJN    ACEX        IF NO CHANNEL ERROR
          LDM    RBUF 
          LPN    76 
          NJN    ACE3        IF ERROR IN MEMORY 
          LDM    RBUF+1 
          SHN    -5 
          ZJN    ACE2        IF NOT PARITY / IPI CHANNEL ERROR
          LPN    2
          ZJN    ACE1        IF NOT PARITY ERROR
          LDN    ECPE&ECIE
 ACE1     LMN    ECIE&ECER   FAULT ANALYSIS CODE
 ACE2     LMN    ECER 
          UJN    ACEX        RETURN 
 AME      SPACE  4,10 
**        AME - ATTEMPT MONITOR EXCHANGE. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   CW - CW+4. 
* 
*         MACROS EXPE.
  
  
 AME      SUBR               ENTRY/EXIT 
          EXPE   *
 AME1     LDC    6           CHECK FOR (MA) NON-ZERO
          CRD    CW 
          LDD    CW+1 
          ADD    CW 
          NJN    AME1        IF EXCHANGE PACKAGE NOT READY
          EXPE   *
 AME2     LDC    0           SET (B0) NON-ZERO
          CWM    AMEA,ON
          SBN    1           EXCHANGE MONITOR 
          MXN    0
          CRD    CW 
          LDD    CW+4 
          ZJN    AMEX        IF EXCHANGE TAKEN
          LDN    28D
          SBN    1
          NJN    *-1         IF NOT 20 MICROSECONDS ELAPSED 
          UJN    AME2        RETRY EXCHANGE 
  
  
 AMEA     VFD    24/0        (P)
          VFD    18/0        (A0) 
          VFD    18/0        (B0) 
 ATT      SPACE  4,10 
**        ATT - PROCESS ATTENTION.
* 
*         ENTRY  (A) = EXPECTED STATUS RESPONSE TYPE. 
*                (DI) = DEVICE STATUS BLOCK ADDRESS.
* 
*         EXIT   VIA ROUTINE *ECI*. 
* 
*         ERROR  TO *ERR* IF INTERRUPT TIMEOUT. 
*                TO *SRS11* IF TIMEOUT OF SLAVE RESET INTERRUPT FOR 
*                              CONTROLLING DRIVE. 
*                TO *SRS13* IF TIMEOUT OF SLAVE RESET INTERRUPT FOR 
*                              NON-CONTROLLING DRIVE. 
* 
*         USES   T5.
* 
*         CALLS  CTO, IOM, XMD. 
  
  
 ATT      CON    0           ENTRY
          STM    EEST,DI
          LDM    ATT         SAVE RETURN ADDRESS
          STM    ATTN,DI
 ATT1     RJM    XMD         RETURN TO MAIN LOOP
 ATT2     RJM    CTO         CHECK FOR TIMEOUT
          PJP    ATT5        IF TIMEOUT 
          LDM    PNUN,DI     CHECK FOR SLAVE RESET
          SHN    -6 
          STD    T5 
          LDML   CSTB,T5
          SHN    21-17
          PJN    ATT2.1      IF NO SLAVE RESET IN PROGRESS
          LDC    SRSG        *CM3 BEING RESET ON CCHNN.*
          STM    IOMA 
          LCN    1
          UJN    ATT4        ISSUE OPERATOR MESSAGE 
  
 ATT2.1   LDM    ATTN,DI     CHECK INTERRUPT RETURN ADDRESS 
          LMC    SRS13
          ZJN    ATT3        IF WAITING FOR ASYNCH AFTER RESET
          LMC    SRS11&SRS13
          ZJN    ATT3        IF WAITING FOR ASYNCH AFTER RESET
          UJN    ATT1        RETURN TO MAIN LOOP
  
 ATT3     LDC    SPDA        SPIN UP PENDING MESSAGE
 ATT4     RJM    IOM         ISSUE OPERATOR MESSAGE 
          UJP    ATT1        RETURN TO MAIN LOOP
  
 ATT5     LDM    ATTN,DI
          LMC    SRS13
          ZJP    SRS13       IF WAITING FOR SLAVE RESET INTERRUPT 
          LMC    SRS11&SRS13
          ZJP    SRS11       IF WAITING FOR SLAVE RESET INTERRUPT 
          LDN    0           CLEAR INTERRUPT AND REENTRY ADDRESSES
          STM    ATTN,DI
          STM    ADDR,DI
          LDN    ETIT 
          RJM    ERR         PROCESS ERROR
  
  
 SPDA     DATA   C* EQ000, SPIN UP PENDING.*
 CCO      SPACE  4,20 
**        CCO - CHECK FOR CONTROLLER OVER TEMPERATURE.
* 
*         THIS ROUTINE SEARCHES THE RESPONSE PACKET FOR STATUS
*         INDICATING AN OVER TEMPERATURE CONDITION.  IF THERE IS
*         AN OVER TEMPERATURE CONDITION, AN ERROR IS OPTIONALLY 
*         LOGGED TO THE BML, A BIT INDICATING OVER TEMPERATURE IS 
*         SET IN *BDLL*, AND AN OPERATOR ACTION MESSAGE IS GENERATED. 
* 
*         ENTRY  (A) = 0 IF BML MESSAGE SHOULD NOT BE ISSUED. 
* 
*         USES   CM+1 - CM+4, T7. 
* 
*         CALLS  IDM, SRP, UBP. 
* 
*         MACROS MONITOR. 
  
  
 CCO      SUBR               ENTRY/EXIT 
          STD    T7 
          LDN    ID16 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    CCOX        IF PARAMETER 16 NOT FOUND
          LDML   RPBF+6,T3
          SHN    21-11
          PJN    CCOX        IF NOT CONTROLLER OVER TEMPERATURE 
          LDM    EDBF+FALT
          STM    CCOA        SAVE VALUES FROM CURRENT MESSAGE 
          LDM    EDBF+FCS2
          STM    CCOA+1 
          LDM    MSGL+1 
          STM    CCOA+2 
          LDN    ECOT 
          STM    EDBF+FALT   FINAL FAULT CODE 
          LDD    T7 
          ZJN    CCO1        IF NOT ISSUING MESSAGE TO BML
  
*         HPA DOES NOT DISPLAY THE DATA WITH SYMPTOM 0111 WHEN THE
*         ERROR IS RECOVERABLE, SO TWO MESSAGES ARE ISSUED TO THE BML.
  
          LCN    0
          STM    EDBF+FCS2   SET NO STATUS FOR *HPA*
          LDN    5
          STM    MSGL+1      MESSAGE LENGTH 
          LDD    HN 
          ERRNZ  HD0100-100  CODE DEPENDS ON VALUE
          RJM    IDM         ISSUE INITIAL BML MESSAGE
          LDN    3
          STM    MSGL+1      MESSAGE LENGTH 
          LDC    HD0111 
          RJM    IDM         ISSUE FINAL BML MESSAGE
          LDM    CCOA 
          STM    EDBF+FALT   RESTORE VALUES IN MESSAGE
          LDM    CCOA+1 
          STM    EDBF+FCS2
          LDM    CCOA+2 
          STM    MSGL+1 
  
*         SET OVER TEMPERATURE BIT IN *BDLL*. 
  
 CCO1     LDN    1           NEW VALUE
          STD    CM+2 
          LDC    63*100      LOW ORDER BIT TO CHANGE TIMES 100
          STD    T7 
          LDC    BDLL*100+1  6/WORD, 6/BITS TO CHANGE 
          RJM    UBP         UPDATE *BDLL* PARAMETER
          LDN    EEVS 
          STD    CM+1        ENTER EVENT
          LDN    0
          STD    CM+3 
          LDN    CEDE        *CHECK E,E DISPLAY* EVENT
          STD    CM+4 
          MONITOR  EATM 
          UJP    CCOX        RETURN 
  
  
 CCOA     BSS    3           SAVE AREA FOR VALUES FROM CURRENT MESSAGE
 CCR      SPACE  4,15 
**        CCR - CHECK FOR CHANNEL REQUEST.
* 
*         ENTRY  (UC) = UNIT ACTIVITY COUNT.
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   (A) = 0 IF CHANNEL DOWN. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  DCR, RCT, SRF. 
* 
*         MACROS DELAY, MONITOR.
  
  
 CCR3     RJM    SRF         SET DRIVER RELOAD FLAG 
 CCR4     LDD    CR 
  
 CCR      SUBR   PRS3        ENTRY/EXIT 
          RJM    RCT         READ CHANNEL TABLE 
          SHN    21-5 
          MJN    CCR3        IF CHANNEL GLOBALLY DOWN 
          LPN    40 
          ZJN    CCR4        IF CHANNEL NOT REQUESTED 
          STM    CHRQ        DISABLE NEW ACTIVITY 
          LDD    UC 
          NJN    CCRX        IF CURRENT ACTIVITY
          RJM    DCR         DROP CHANNEL RESERVATION 
*         LDN    0
          STM    CHRQ        ENABLE NEW ACTIVITY
 CCR1     LDD    CR 
          NJN    CCRX        IF CHANNEL RESERVED
  
*         ENTERED HERE FROM *PRS*.
  
 CCR2     DELAY              WAIT AWHILE
          LDD    IR+4 
          STD    CM+1        ATTEMPT TO RESERVE CHANNEL 
          MONITOR  CCHM 
          LDD    CM+2        SET RESERVATION STATUS 
          STD    CR 
          RJM    RCT         READ CHANNEL TABLE 
          LPN    40 
          ZJN    CCR1        IF CHANNEL NOT DOWN
          LJM    CCR3        SET DRIVER RELOAD FLAG 
 CDA      SPACE  4,10 
**        CDA - CONVERT PHYSICAL TO LOGICAL DISK ADDRESS. 
* 
*         ENTRY  (T4) = CYLINDER NUMBER.
*                (T5) = PHYSICAL TRACK + SECTOR.
* 
*         EXIT   (T6) = LOGICAL TRACK.
*                (T7) = LOGICAL SECTOR. 
* 
*         USES   T3, T4, T5.
  
  
*         MULTIPLY THE CYLINDER VALUE BY THE NUMBER OF LOGICAL
*         SECTORS PER CYLINDER. 
  
 CDA2     LDK    LSCY 
          RAD    T7          ADVANCE LOGICAL SECTOR COUNT 
          SHN    -14
          RAD    T3 
 CDA3     SOD    T4 
          PJN    CDA2        IF NOT END OF CONVERSION 
  
*         DIVIDE THE ACCUMULATED LOGICAL SECTOR COUNT BY THE
*         SUM OF (LOGICAL + GAP) SECTORS PER LOGICAL TRACK. 
  
 CDA4     AOD    T6          ADVANCE LOGICAL TRACK NUMBER 
          LDK    -LSLT
          RAD    T7 
          PJN    CDA4        IF NO UNDERFLOW
          AOD    T7 
          SOD    T3 
          PJN    CDA4        IF DIVISION INCOMPLETE 
  
 CDA      SUBR               ENTRY/EXIT 
          LDD    T5 
          SHN    14          EXTRACT PHYSICAL TRACK 
          STD    T5 
          SHN    CFLP-14     CONVERT PHYSICAL TO LOGICAL SECTOR 
          STD    T7 
          LDN    0           CLEAR SECTOR COUNT ACCUMULATOR 
          STD    T3 
          LDC    4000-1      INITIALIZE LOGICAL TRACK CALCULATION 
          STD    T6 
  
*         MULTIPLY THE TRACK VALUE BY THE NUMBER OF LOGICAL 
*         SECTORS PER PHYSICAL TRACK. 
  
 CDA1     SOD    T5 
          MJN    CDA3        IF END OF CONVERSION 
          LDK    LSPT 
          RAD    T7          ADVANCE LOGICAL SECTOR COUNT 
          SHN    -14
          RAD    T3 
          UJN    CDA1        LOOP ON CONVERSION 
 CEA      SPACE  4,15 
**        CEA - CLEAR *ENABLE CONTROLLER ACTIVITY* REQUEST. 
* 
*         ENTRY  (EO) = EST ORDINAL FOR DEVICE. 
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   CHANNEL ENABLE BIT CLEARED IN *MST* WORD *BDLL*. 
*                SPECIAL REQUEST BIT CLEARED IF BOTH CHANNELS ENABLED.
* 
*         USES   CM - CM+4, T1 - T1+4, T7.
* 
*         CALLS  CPF, UBP.
* 
*         MACROS SFA. 
  
  
 CEA      SUBR               ENTRY/EXIT 
          SFA    EST,EO 
          ADK    EQDE 
          CRD    T1          READ *EQDE* WORD 
          LDD    T1+1 
          LMD    IR+4 
          LPN    77 
          ZJN    CEA1        IF THIS IS THE FIRST CHANNEL 
          LDN    1
 CEA1     ADN    49D
          SHN    6           LOW ORDER BIT TO CHANGE TIMES 100
          STD    T7 
          LDN    0           NEW VALUE
          STD    CM+2 
          LDC    BDLL*100+1  6/WORD, 6/BITS TO CHANGE 
          RJM    UBP         CLEAR ENABLE CHANNEL BIT IN *BDLL* 
          LDD    T1+4 
          SHN    3
          ADN    BDLL 
          CRD    CM 
          LDD    CM 
          LPN    6
          NJN    CEAX        IF OTHER CHANNEL STILL NOT ENABLED 
          LDN    ECAF        CLEAR SPECIAL REQUEST IN *PUT* 
          RJM    CPF
          UJN    CEAX        RETURN 
 CFR      SPACE  4,10 
**        CFR - CHECK *PUT* FOR REQUEST.
* 
*         ENTRY  (DI) = DEVICE STATUS BLOCK ADDRESS.
* 
*         ERROR  TO *ERR*.
* 
*         USES   CM+3.
* 
*         CALLS  CMP8, ECI, IDU, IIO, ISR.
  
  
 CFR5     LDD    CB          INITIATE I/O 
          RJM    IIO
          ZJN    CFRX        IF I/O NOT ENABLED ON THIS ACCESS
          RJM    IDU         INTERLOCK DISK UNIT
          NJN    CFRX        IF INTERLOCK NOT AVAILABLE 
          LDM    ENAD,DI
          ZJN    CFR6        IF CONTROLLER FUNCTIONAL 
          LDN    ECMD 
          RJM    ERR         PROCESS ERROR
  
*         EXIT TO PROCESSOR AS APPLICABLE WITH -
*                (PO) = *PUT* ORDINAL.
*                (CB) = *CBT* ORDINAL.
*                (EO) = EST ORDINAL.
*                (RW) = READ / WRITE FLAG.
*                (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
*                (WB - WB+4) = *UNCT* WORD OF *PUT* ENTRY.
  
 CFR6     LJM    0,PA        EXIT TO PROCESSOR
  
 CFR      SUBR               ENTRY/EXIT 
          RJM    ECI         EXAMINE CONTROLLER INTERRUPTS
*         RJM    CMP8        (TERMINATION PROCESSING) 
 CFRA     EQU    *-1
          NJN    CFRX        IF RESET OR ERROR IN PROGRESS
          LDML   IPPS,DI     CHECK FOR INTERNAL SPECIAL REQUESTS
          SHN    6-15 
          LPC    300
          ZJN    CFR1        IF ALL INTERNAL SPECIAL REQUESTS PROCESSED 
          STD    CM+3        SET INTERNAL SPECIAL REQUESTS
 CFR1     LDD    CM+3        CHECK FOR SPECIAL REQUEST
          NJN    CFR2        IF SPECIAL REQUEST PRESENT 
          ADD    WB+3 
          ZJN    CFRX        IF NO I/O REQUEST
 CFR2     LDD    CM+4 
          ZJN    CFR3        IF UNIT NOT INTERLOCKED
          LMD    OA 
          NJN    CFRX        IF UNIT INTERLOCKED BY OTHER DRIVER
 CFR3     LDD    CM+3        CHECK FOR SPECIAL REQUEST
          ZJP    CFR5        IF NO SPECIAL REQUEST
          RJM    ISR         IDENTIFY AND PROCESS SPECIAL REQUEST 
          UJP    CFR1        CHECK FOR ANOTHER REQUEST
 CMC      SPACE  4,10 
**        CMC - CHECK MONITOR COMPLETE. 
* 
*         EXIT   (A) = (CW) = 0.
* 
*         USES   CW - CW+4. 
* 
*         CALLS  AME. 
* 
*         MACROS DELAY. 
  
  
 CMC      SUBR               ENTRY/EXIT 
 CMC1     LDD    OA 
          CRD    CW 
          LDD    CW 
          ZJN    CMCX        IF NO REQUEST WAITING FOR RESPONSE 
          SHN    21-13
          PJN    CMC2        IF NOT TO RETRY REQUEST
          SHN    13-21
          LPC    177         CLEAR FLAGS
          STD    CW 
          LDD    OA          UPDATE OUTPUT REGISTER 
          CWD    CW 
          RJM    AME         REISSUE REQUEST
 CMC2     DELAY 
          UJN    CMC1        RECHECK OUTPUT REGISTER
 CMP      SPACE  4,15 
**        CMP - COMPLETE PROCESSING.
* 
*         ENTRY  (SF) = DEVICE SELECTED STATUS. 
*                (UC) = UNIT ACTIVITY COUNT.
*                (RW) = READ / WRITE STATUS.
* 
*         EXIT   TO *XMD2*. 
*                (UC) = UNIT ACTIVITY COUNT DECREMENTED.
* 
*         USES   UC, WB+3, WB+4.
* 
*         CALLS  CMC, DCM, IDM, IMR.
  
  
 CMP      LDM    ERCT,DI
          ZJN    CMP4        IF NO ERRORS 
          LDN    3
          STM    MSGL+1      SET BASIC MESSAGE LENGTH 
 CMP1     AOM    ERCT,DI
          LDC    HD0111      ISSUE FINAL BML MESSAGE
          RJM    IDM
 CMP2     LDN    0           FORCE CLEAR OF ERROR COUNT / ERROR FLAG
          STM    CMPA 
 CMP4     RJM    DCM         DESELECT CONTROLLER
  
*         INCLUDE *PROBE* DATA IN FINAL *BIOM* REQUEST. 
  
          LDD    RW          SET DATA TRANSFER DIRECTION
          SHN    13-0 
          LMM    CBCT,DI     APPEND CUMULATIVE BUFFER COUNT 
          STD    WB+4 
          LDM    RQLN,DI
 CMP5     ZJN    CMP6        IF UNIT NOT INTERLOCKED
          STD    WB+3 
          LDN    DCBS        DELINK BUFFERS / RELEASE UNIT INTERLOCK
          RJM    IMR
          RJM    CMC         CHECK FOR MONITOR COMPLETE 
*         LDN    0           CLEAR UNIT INTERLOCKED 
          STM    RQLN,DI
          SOD    UC          ADJUST UNIT ACTIVITY COUNT 
 CMP6     LDC    1
 CMPA     EQU    *-1
          NJN    CMP7        IF ERCT/ERFL SHOULD NOT BE CLEARED 
          STM    ERCT,DI     CLEAR ERROR COUNT
          AOM    CMPA 
          LDM    ERFL        CHECK ERROR PROCESSING 
          LMD    DI 
          NJN    CMP7        IF NOT ON THIS UNIT
          STM    ERFL 
 CMP7     RJM    CMC         CHECK FOR MONITOR COMPLETE 
*         LDN    0
          STM    ADDR,DI     CLEAR REQUEST IN PROGRESS
          STM    ATTN,DI
          STM    SREQ,DI
          STM    CBCT,DI
          STM    ESAD,DI     ENABLE NEXT PASS THROUGH ERROR PROCESSOR 
          LDML   IPPS,DI     CLEAR I/O IN PROGRESS
          LPC    170000 
          STML   IPPS,DI
          LJM    XMD2        RETURN 
  
*         TERMINATION PROCESSING. 
  
 CMP8     CON    0
 CMP9     LDN    0           CLEAR *PROBE* DATA 
          STD    WB+4 
          LDM    RQLN,DI     SET REQUEST QUEUE EMPTY
          SCN    77 
          UJP    CMP5        RELEASE UNIT INTERLOCK 
 CPF      SPACE  4,10 
**        CPF - CLEAR *PUT* FLAG IN *PILL*. 
* 
*         ENTRY  (A) = 6/N, 6/B.
*                      N = NUMBER OF BITS - 1 TO CLEAR. 
*                      B = LOW ORDER BIT NUMBER TO CLEAR. 
* 
*         USES   T6, T7, CM+1 - CM+4. 
* 
*         MACROS MONITOR, PUTE. 
  
  
 CPF      SUBR               ENTRY/EXIT 
          SHN    6
          STD    T7          SET BIT NUMBER 
          SHN    -14
          ADC    PILL*100+1  WORD OFFSET + FIELD WIDTH
          STD    T6 
          LDN    0           NEW VALUE
          STD    CM+2 
          LDD    MA 
          CWD    T6          STORE MESSAGE BUFFER PARAMETERS
          LDN    1
          STD    CM+1        PARAMETER WORD COUNT 
          LDI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          SHN    PUTLS
          PUTE   *
          ADC    0           SET BASE *PUT* ENTRY ADDRESS 
          STD    CM+4 
          SHN    -14
          STD    CM+3 
          MONITOR  UTEM      CLEAR *PUT* FLAG 
          UJN    CPFX        RETURN 
 CSR      SPACE  4,10 
**        CSR - CLEAR SPECIAL REQUEST.
* 
*         ENTRY  (DI) = DEVICE STATUS BLOCK ADDRESS.
* 
*         EXIT   TO *CMP*.
* 
*         CALLS  CPF. 
  
  
 CSR      BSS    0           ENTRY
          LDM    SREQ,DI
          ZJN    CSR1        IF NO SPECIAL REQUEST IN PROGRESS
          LPN    77 
          SBN    ECAF+ISRB-ISRA 
          PJN    CSR1        IF INTERNAL SPECIAL REQUEST
          LDM    SREQ,DI
          RJM    CPF         CLEAR *PUT* FLAG 
 CSR1     LJM    CMP         COMPLETE PROCESSING
 CTO      SPACE  4,10 
**        CTO - CHECK TIMEOUT.
* 
*         EXIT   (A) .LT. 0 IF NOT TIMEOUT. 
* 
*         USES   CM - CM+4. 
  
  
 CTO      SUBR               ENTRY/EXIT 
          LDC    RTCL        FETCH CURRENT CLOCK VALUE
          CRD    CM 
          LDD    CM          CHECK ELAPSED TIME 
          SBM    FTOC,DI
          NJN    CTOX        IF TIMEOUT PASSED OR NOT REACHED 
          LDD    CM+1 
          SBM    FTOC+1,DI
          UJN    CTOX        RETURN 
 DCR      SPACE  4,10 
**        DCR - DROP CHANNEL RESERVATION. 
* 
*         ENTRY  (CR) = 1 IF CHANNEL RESERVED.
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   (A) = (CR) = 0.
* 
*         USES   CM - CM+4. 
* 
*         MACROS MONITOR. 
  
  
 DCR      SUBR               ENTRY/EXIT 
          LDD    CR 
          ZJN    DCRX        IF CHANNEL NOT RESERVED
          LDD    IR+4 
          STD    CM+1        DROP CHANNEL 
          MONITOR  DCHM 
*         LDN    0           SET CHANNEL NOT RESERVED 
          STD    CR 
          UJN    DCRX        RETURN 
 ECA      SPACE  4,20 
**        ECA - ENABLE CONTROLLER ACTIVITY. 
* 
*         THIS SPECIAL REQUEST CLEARS THE CONTROLLER DEAD FLAGS IN
*         THE CONTROLLER STATE TABLE, AND IN THE DEVICE STATE TABLE 
*         ENTRIES FOR ALL DEVICES ON THIS CONTROLLER.  THIS FUNCTION IS 
*         ISSUED BY *1MV* WHEN THE STATE OF A 9853 DRIVE IS CHANGED 
*         TO *ON* OR *IDLE*.
* 
*         ENTRY  (EO) = EST ORDINAL.
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   TO *CMP7* WHEN FUNCTION COMPLETE.
* 
*         CALLS  CEA, LND.
  
  
 ECA      BSS    0           ENTRY
          LDN    0           LOCATE FIRST DRIVE 
 ECA1     RJM    LND         LOCATE DRIVE 
          ZJN    ECA2        IF NO MORE DRIVES ON CONTROLLER
          LDN    0           CLEAR CONTROLLER DEAD FLAG 
          STM    ENAD,T7
          LDN    1           LOCATE NEXT DRIVE
          UJN    ECA1        LOCATE DRIVE 
  
 ECA2     LDM    CSTB,T5     ENABLE CONTROLLER ACTIVITY 
          STM    CSTB,T5     (CLEAR BITS 15 - 12) 
          RJM    CEA         CLEAR ENABLE ACTIVITY REQUEST
          LJM    CMP7        COMPLETE FUNCTION
 EIO      SPACE  4,10 
**        EIO - ENTER I/O REQUEST QUEUE.
* 
*         ENTRY  (RW) = READ / WRITE STATUS.
*                (CB) = CURRENT BUFFER ORDINAL. 
* 
*         USES   WB+3, CM - CM+4. 
* 
*         CALLS  IMR, SLB.
  
  
 EIO2     LDD    OA 
          CRD    CM          CHECK OUTPUT REGISTER
          LDD    CM 
          NJN    EIOX        IF MONITOR REQUEST IN PROGRESS 
 EIO3     LDN    DCBS 
          RJM    IMR         INITIATE MONITOR REQUEST 
*         LDN    0
          SBD    WB+3        ADJUST QUEUE ENTRY COUNT 
          RAM    RQLN,DI
  
 EIO      SUBR               ENTRY/EXIT 
          LDD    RW 
          NJN    EIO1        IF WRITE OPERATION 
          LDD    CB 
          RJM    SLB         SET LINKAGE BITS 
 EIO1     AOM    CBCT,DI
          AOM    RQLN,DI     ADVANCE ENTRY COUNT
          LPN    77 
          SBM    EIOA,RW
          MJN    EIOX        IF QUEUE NOT FULL
          ADN    1
          STD    WB+3        NUMBER OF BUFFERS TO DELINK
          SBN    14 
          MJN    EIO2        IF NOT TIME TO FORCE DELINK
          UJN    EIO3        DELINK BUFFERS 
  
  
 EIOA     BSS    0           DELINKING CRITERIA 
          CON    1
          CON    10 
 ERR      SPACE  4,45 
**        ERR - PROCESS ERRORS. 
* 
*         ERROR PROCESSING FLOW IS CONTROLLED BY THE RETRY COUNT, ERCT. 
*         EXAMPLE FLOW THROUGH RECOVERY FOR DRIVE ERROR - 
* 
*      ERCT,DI          COMMENT 
*      -------   ------------------------------------------------------ 
*         0      ENTER, LOGICAL RESET 
*         1      ISSUE BML MESSAGE, EXIT
*         1      ENTER, LOGICAL RESET, DRIVE RESET
*         2      ISSUE BML MESSAGE, EXIT
*         2      ENTER, SLAVE RESET 
*         3      ISSUE BML MESSAGE, EXIT
*         3      ENTER, LOGICAL RESET 
*         4      ISSUE BML MESSAGE, SET SUSPECT STATE, EXIT 
* 
*         THE REQUEST IS NOW CHANNEL SPECIFIC, AND IF DUAL ACCESS IS
*         DEFINED, WILL BE FOR THE OTHER CHANNEL. 
* 
*         4      ENTER, LOGICAL RESET 
*         5      ISSUE BML MESSAGE, EXIT
*         5      ENTER, LOGICAL RESET, DRIVE RESET
*         6      ISSUE BML MESSAGE, EXIT
*         6      ENTER, LOGICAL RESET 
*         7      ISSUE BML MESSAGE, RUN DRIVE DIAGNOSTICS, EXIT 
*         7      ENTER, LOGICAL RESET 
*         8      SET MISCELLANEOUS AND ISSUE THE FINAL BML MESSAGE. 
* 
*         NOTE - IF THE REQUEST STARTS OUT AS A CHANNEL-SPECIFIC
*                REQUEST (E.G. A *1MV* I/O REQUEST), ALL RETRIES WILL 
*                BE DONE ON THIS CHANNEL. 
* 
*         ENTRY  (A) = FAULT ANALYSIS CODE. 
*                (RF) = RESET IN PROGRESS STATUS. 
* 
*         EXIT   TO *CMP*.
*                (RF) = 0.
* 
*         USES   DI, PA, RF, RW, WB+3, CM+1 - CM+3, CW - CW+4, T1 - T5. 
* 
*         CALLS  ACE, CCO, DCM, EDR, ICR, IDM, IMR, LDP, LND, RCR, RMR, 
*                RND, RTR, SCD, SEC, SMC, SRP, STF, UHD.
* 
*         MACROS CBTE, MONITOR, SFA.
  
  
 ERR      CON    0           ENTRY
          PJN    ERR1        IF NO RESPONSE PACKET
          LMC    767777 
 ERR1     STD    T4          SAVE FAULT CODE
          SHN    0-14 
          STD    T3 
          LDM    RQLN,DI
          SCN    77 
          NJN    ERR1.4      IF DEVICE INTERLOCKED
  
*         IF DEVICE NOT INTERLOCKED, THIS MAY BE AN ERROR ENCOUNTERED 
*         WHEN READING A RESPONSE PACKET FOR AN UNSOLICITED ASYNC 
*         INTERRUPT.  IN THIS CASE, FIND ANY DEVICE ON THIS CONTROL 
*         MODULE WHICH IS INTERLOCKED, AND PROCESS THE ERROR AS IF IT 
*         WAS FROM THAT DEVICE.  IF NO DEVICE ON THIS CONTROL MODULE
*         IS INTERLOCKED, RESET THE CHANNEL AND DISCARD THE ERROR,
*         REENTERING *ECI* AT *ECI3*. 
  
          LDN    0           LOCATE FIRST DRIVE 
 ERR1.1   RJM    LND
          ZJN    ERR1.2      IF NO MORE DEVICES 
          LDM    RQLN,T7     CHECK NEXT DEVICE
          SCN    77 
          NJN    ERR1.3      IF DEVICE INTERLOCKED
          LDN    1
          UJN    ERR1.1      LOCATE NEXT DEVICE 
  
 ERR1.2   RJM    RCR         RESET CHANNEL REGISTERS
          LJM    ECI3        DISCARD ERROR AND LOOK FOR I/O REQUEST 
  
 ERR1.3   LDD    T7          SET DEVICE PARAMETERS
          STD    DI 
          RJM    LDP
 ERR1.4   LDD    T3 
          STM    RPST,DI     SET RESPONSE PACKET STATUS 
          LDM    SRSA 
          ZJN    ERR3        IF NO RESET IN PROGRESS
          LMD    DI 
 ERR2     ZJN    ERR2.1      IF THIS UNIT CONTROLLING RESET 
          RJM    RCR         RESET CHANNEL REGISTERS
          LDN    0           CLEAR BUFFER COUNTS
          STM    CBCT,DI
          LDC    4000 
          STM    RQLN,DI
          LJM    CMP         RELEASE DRIVE INTERLOCK
  
 ERR2.1   STM    SRSA        CLEAR RESET INTERLOCK
 ERR3     LDM    ESAD,DI
          ZJN    ERR4        IF NEW PASS THRU PROCESSOR 
          STD    PA 
          LJM    0,PA        CONTINUE 
  
*ERR4     LDN    0           CLEAR CHANNEL ACTIVE 
 ERR4     RJM    SCD
          LDC    0           CHECK ERROR FLAG 
 ERFL     EQU    *-1
          ZJN    ERR5        IF NO ERROR IN PROGRESS
          LMD    DI 
          NJN    ERR2        IF ERROR ON DIFFERENT DEVICE 
 ERR5     LDD    DI 
          STM    ERFL        SET ERROR IN PROGRESS
          LDC    ERR79
          STM    ESAD,DI     INITIAL ERROR STEP ADDRESS 
          LDM    RWST,DI
          STM    IOST,DI     SAVE READ/WRITE STATUS 
  
*         GENERATE BML ERROR MESSAGE. 
  
          LCN    0           SET NO STATUS FOR *HPA*
          STM    EDBF+FCS2
          LDD    T4          INSERT INITIAL FAULT CODE
          STML   EDBF+CODE
          STML   EDBF+FALT   PRESET FINAL FAULT CODE
          LDM    CBCT,DI
          SHN    LSLBS-CFLP  SECTORS TRANSFERED COUNT 
          STML   EDBF+STCT
          LDM    CYLN,DI     SET SEEK ADDRESS - CYLINDER
          STML   EDBF+ICYL
          LDM    TKSN,DI     SEEK ADDRESS - TRACK AND SECTOR
          STML   EDBF+ITAS
          LDML   LCMD,DI     SET LAST COMMAND 
          STML   EDBF+LSCC
          LDML   GSSA        EXECUTION (ENDING) STATUS
          STML   EDBF+EXST
          LDM    ERR         RETAIN ENTRY ADDRESS 
          STML   EDBF+FALT+1
 ERR6     LDDL   LF          SAVE LAST CHANNEL FUNCTION 
          STML   EDBF+LCFN
          SCF.   ERR6,MR     ACQUIRE MAINTENANCE CHANNEL ACCESS 
          LDN    ZERL 
          CRML   RBUF,ON     CLEAR BUFFER IN CASE OF ERROR
          SBN    1
          CRML   RBUF+4,ON
          RJM    RMR         READ CHANNEL STATUS REGISTER 
          DCN.   MR+40
          CCF.   *+2,MR      CLEAR MAINTENANCE CHANNEL FLAG 
          LDN    0
          STD    T2          INITIALIZE INDEX 
          STML   EDBF+TREG
          STML   EDBF+TREG+1 CLEAR *T* REGISTER BUFFER
          STML   EDBF+TREG+2
          RJM    ACE         ANALYZE CHANNEL ERROR
          DCN    CH+40
          STML   EDBF+FCS1   SAVE CHANNEL STATUS
          LDC    EDBF+CREG
          STDL   T5          SET ERROR BUFFER ADDRESS 
 ERR7     LDM    RBUF,T2
          SHN    10          PACK 8-BIT DATA
          LMM    RBUF+1,T2
          STIL   T5 
          AODL   T5          ADVANCE ADDRESS
          LDN    2
          RAD    T2          INCREMENT INDEX
          LMN    RBUFL
          NJN    ERR7        IF MORE REGISTER DATA
          LDM    IPPS,DI
          ZJN    ERR8        IF NOT I/O REQUEST 
          RJM    RTR         READ *T* REGISTER
 ERR8     LDK    RTEDL
          STD    T4          SET LENGTH OF DATA 
          LDC    EDBF 
          STDL   T2          SOURCE DATA ADDRESS
          ADK    EMBF1
          RJM    UHD         UNPACK HEX DATA
          ADN    EMBFS
          STM    MSGL+1      MESSAGE LENGTH INCLUDING NON-HEX DATA
          LDM    RPST,DI
          ZJN    ERR13       IF NO RESPONSE PACKET PRESENT
          LDC    RPBF 
          STDL   T2          SET SOURCE DATA ADDRESS
          LDI    T2 
          ADN    3           CALCULATE STATUS BLOCK LENGTH
          SHN    -1 
          STD    T4 
          LDC    EDBF+EMBF2  CONVERT STATUS TO 12 BIT DATA
          RJM    UHD
          RAM    MSGL+1      APPEND TO MESSAGE
          LDN    0
          STM    EDBF+FCS2   INDICATE STATUS PRESENT FOR *HPA*
  
*         CONVERT MAJOR STATUS TO INDEX.
  
          LDDL   MS          UNPACK BUS A FLAGS 
          SHN    -10
          STD    T2 
          LDD    MS          BUS B SUBSTATUS FLAGS
          LPN    7
          SHN    10          COMBINE FLAGS IN ORDER 
          RAD    T2 
 ERR13    ZJP    ERR71       IF NO SUBSTATUS
          LCN    0
          STD    T3 
 ERR14    AOD    T3          ADVANCE INDEX
          LDD    T2 
          SHN    21-0        CONVERT FLAG POSITION TO INDEX 
          STD    T2 
          PJN    ERR14       IF BIT NOT SET 
          LDM    ERRB,T3
          STD    PA          SET PROCESSOR ADDRESS
          LDD    T3 
          LJM    0,PA        EXIT TO PROCESSOR
  
*         RESERVED SUBSTATUS (PID = X0 AND X1). 
  
 ERR20    LDN    ERSS 
          LJM    ERR70       SET FINAL FAULT CODE 
  
*         DEFECT MANAGEMENT (PID = X2). 
  
 ERR24    LDN    EDFM 
          LJM    ERR70       SET FINAL FAULT CODE 
  
*         MESSAGE / MICROCODE EXCEPTION (PID = X3). 
  
 ERR26    LDN    EMME 
          LJM    ERR70       SET FINAL FAULT CODE 
  
*         INTERVENTION REQUIRED (PID = X4). 
  
*ERR30    LDN    4           SEARCH FOR SUBSTATUS 
 ERR30    RJM    SMC
          PJN    ERR32       IF SUBSTATUS FOUND 
 ERR31    LDN    EIVR 
          UJN    ERR39       SET FINAL FAULT CODE 
  
 ERR32    SHN    21-11
          PJN    ERR31       IF NOT FACILITY BUSY 
          LJM    ERR51       PROCESS FACILITY BUSY ERROR
  
*         ALTERNATE PORT EXCEPTION (PID = X5).
  
 ERR38    LDN    EAPR 
 ERR39    LJM    ERR70       SET FINAL FAULT CODE 
  
*         MACHINE EXCEPTION (PID = X6). 
  
 ERR40    LDN    ID26        SEARCH FOR DRIVE SUBSTATUS 
          RJM    SRP
          ZJN    ERR42       IF SUBSTATUS FOUND 
 ERR41    LDN    EMEX 
          STM    EDBF+FALT   SET FINAL FAULT CODE 
          LDN    0           DO NOT ISSUE BML MESSAGE 
          RJM    CCO         CHECK FOR CONTROLLER OVER TEMPERATURE
          LJM    ERR71       COMPLETE ERROR PROCESSING
  
 ERR42    LDML   RPBF+5,T3   CHECK LENGTH OF PARAMETER
          SHN    -10
          SBN    0#0A+1 
          MJN    ERR41       IF NO EXTENDED SUBSTATUS 
          LDM    RPBF+12,T3 
          LPN    77          EXAMINE COMMAND ENDING STATUS
          SBN    0#11 
          ZJN    ERR43       IF ECC ERROR 
          SBN    0#13-0#11
          ZJN    ERR43       IF MISSING SYNC
          SBN    0#19-0#13
          NJN    ERR41       IF NOT SECTOR NOT FOUND ERROR
 ERR43    LDN    ID32        SEARCH FOR RESPONSE EXTENT 
          RJM    SRP
          NJN    ERR41       IF NOT MEDIA ERROR 
          LDM    ERCT,DI
          LMN    1
          NJN    ERR45       IF NOT SECOND RETRY
          LDM    RPBF+10,T3 
          STD    T4          SET CYLINDER IN ERROR
          LDML   RPBF+11,T3 
          STD    T0          REPACK TRACK + SECTOR
          LPN    77 
          STD    T5          PHYSICAL SECTOR
          LMD    T0 
          SHN    6-10        APPEND PHYSICAL TRACK
          RAD    T5 
          RJM    STF         INSERT TRACK FLAW IN MST 
 ERR45    LDN    EDPE 
          LJM    ERR70       SET FINAL FAULT CODE 
  
*         COMMAND EXCEPTION (PID = X7). 
  
 ERR48    LDN    ID17        SEARCH FOR SUBSTATUS 
          RJM    SRP
          ZJN    ERR50       IF SUBSTATUS FOUND 
 ERR49    LDN    ECEX 
          UJN    ERR54       SET FINAL FAULT CODE 
  
 ERR50    LDML   RPBF+5,T3   CHECK LENGTH OF PARAMETER
          SHN    -10
          SBN    5+1
          MJN    ERR49       IF NO EXTENDED SUBSTATUS 
          LDML   RPBF+10,T3 
          SHN    21-13
          PJN    ERR49       IF NOT RESERVED TO ALTERNATE ACCESS
 ERR51    LDN    EDRE 
 ERR54    UJN    ERR70       SET FINAL FAULT CODE 
  
*         COMMAND ABORTED (PID = X8). 
  
 ERR58    LDN    ECMA 
          UJN    ERR70       SET FINAL FAULT CODE 
  
*         COMMAND CONDITIONALLY SUCCESSFUL (PID = X9).
  
 ERR60    LDN    ECCS        SET FINAL FAULT CODE 
          STML   EDBF+FALT
          LDM    IOST,DI     RESTORE READ/WRITE STATUS
          STD    RW 
          AOM    ERCT,DI     INCREMENT ERROR COUNT
          LDD    HN 
          ERRNZ  HD0100-100  CODE DEPENDS ON VALUE
          RJM    IDM         ISSUE MESSAGE
          LJM    CMP         COMPLETE REQUEST 
  
*         COMMAND INCOMPLETE (PID = XA).
  
 ERR64    LDN    ECIC 
*         UJN    ERR70       SET FINAL FAULT CODE 
  
*         COMPLETE ERROR PROCESSING.
  
 ERR70    STML   EDBF+FALT   SET FINAL FAULT CODE 
 ERR71    LDML   IPPS,DI
          SHN    -17
          NJP    ERR76       IF ERROR FROM DIAGNOSTICS
          LDM    ENAD,DI
          NJP    ERR82       IF DRIVE DISABLED (SLAVE RESET FAILURE)
          RJM    RCR         RESET CHANNEL REGISTERS
          LDC    ERR72
          STM    ADDR,DI     SET RETURN ADDRESS 
  
*         ALLOW ACTIVITY ON OTHER DRIVES TO COMPLETE BEFORE ISSUING 
*         CONTROLLER RESET. 
  
 ERR72    LDN    0           LOCATE FIRST DRIVE 
          RJM    LND
 ERR73    LDM    ADDR,T7
          ZJN    ERR74       IF NO ACTIVITY ON DEVICE 
          LDD    T7 
          LMD    DI 
          ZJN    ERR74       IF ERROR PROCESSING FOR THIS DRIVE 
          LDD    T7          LOAD DEVICE PARAMETERS 
          STD    DI 
          RJM    LDP
          LDM    ADDR,DI
          STD    T2 
          LJM    0,T2        CONTINUE PROCESSING ON ACTIVE DRIVE
  
 ERR74    LDN    1           LOCATE NEXT DRIVE
          RJM    LND
          NJN    ERR73       IF ANOTHER DRIVE PRESENT 
          RJM    ICR         ISSUE CONTROLLER RESET 
*         UJN    ERR81       (IF RESET SUCCESSFUL)
          NJN    ERR82       IF LOGICAL RESET FAILED
 ERR76    LDM    EDBF+CODE
          UJN    ERR83       PROCESS SLAVE RESET FAILURE
  
*         REENTER HERE IF ERROR WHILE ATTEMPTING HARDWARE RECOVERY. 
  
 ERR79    RJM    RCR         RESET CHANNEL REGISTERS
          UJN    ERR82       SET RECOVERY FAULT CODE
  
 ERR81    LDM    ERCT,DI     CHECK RETRY COUNT
          SBN    1
          ZJN    ERR81.1     IF DRIVE RESET IN ORDER
          SBN    MERC-CSRC
          NJN    ERR82       IF NOT TIME FOR DRIVE RESET
 ERR81.1  RJM    EDR         EXECUTE DRIVE RESET
 ERR82    LDN    0
 ERR83    STM    EDBF+FCS3   SET RECOVERY FAULT CODE
          LDN    0
          STD    RF          CLEAR RESET IN PROGRESS FLAG 
          LDM    IOST,DI
          STM    RWST,DI     RESTORE READ/WRITE STATUS
          STD    RW 
          LDM    EDBF+FCS3
          ZJN    ERR85       IF NOT HARDWARE RECOVERY ERROR 
 ERR84    RJM    SEC         SET ERROR CODE 
          AOM    MISC        MARK ERROR UNRECOVERED 
          LJM    CMP1        COMPLETE PROCESSING
  
 ERR85    LDM    ERCT,DI     CHECK ERROR COUNT
          SBN    MERC-1 
          PJN    ERR84       IF ERROR LIMIT 
          AOM    ERCT,DI
          LDD    HN 
          ERRNZ  HD0100-100  CODE DEPENDS ON VALUE
          RJM    IDM         ISSUE MESSAGE
          LDM    ERCT,DI
          SBN    MERC-1 
          NJN    ERR86       IF NOT TIME TO RUN DRIVE DIAGNOSTICS 
          RJM    RND         RUN DRIVE DIAGNOSTICS
 ERR86    LDM    RQLN,DI
          LPN    77          EXTRACT REQUEST QUEUE COUNT
          STD    WB+3 
          LMM    RQLN,DI     CLEAR BUFFER COUNT 
          STM    RQLN,DI
          LDM    SREQ,DI
          NJN    ERR87       IF NOT I/O PROCESSING
          LDM    ERCT,DI
          LMN    CSRC 
          ZJN    ERR89       IF TIME FOR CHANNEL SWAP 
          LMN    1&CSRC 
          NJN    ERR87       IF NOT FIRST RETRY 
          LDD    WB+3 
          ZJN    ERR87       IF NO PROCESSED BUFFERS
          LDN    IDSS 
          RJM    IMR         INHIBIT DATA STREAMING 
 ERR87    RJM    DCM         DESELECT CONTROL MODULE
          LJM    CMP7        RETRY REQUEST
  
 ERR89    LDD    CB 
          ZJN    ERR89.1     IF NO I/O BUFFER 
          SHN    CBTLS
          CBTE   *
          ADC    HSLK        GET CHANNEL SELECT STATUS
          CRD    T1 
          LDD    T1 
          SHN    0-12 
          LMN    1
          ZJP    ERR87       IF REQUEST ALREADY CHANNEL-SPECIFIC
 ERR89.1  LDD    EO 
          STD    CM+1        SET EST ORDINAL
          SFA    EST
          ADK    EQDE        FETCH *EQDE* WORD OF EST ENTRY 
          CRD    CW 
          LDD    CW          CHECK DEVICE STATUS
          LPN    2
          NJN    ERR90       IF DEVICE *OFF* OR *DOWN*
          LDD    IR+4 
          STD    CM+3        INSERT CHANNEL NUMBER
          LDN    SSES 
          STD    CM+2        SET SUSPECT STATE ON DEVICE
          MONITOR  SEQM 
 ERR90    RJM    SEC         SET ERROR CODE IN *CBT*
          LJM    CMP2        COMPLETE PROCESSING
  
  
 ERRB     BSS    0           SUBSTATUS PROCESSORS 
          CON    ERR20       RESERVED 
          CON    ERR20       RESERVED 
          CON    ERR24       DEFECT MANAGEMENT
          CON    ERR26       MESSAGE / MICROCODE EXCEPTION
          CON    ERR30       INTERVENTION REQUIRED
          CON    ERR38       ALTERNATE PORT EXCEPTION 
          CON    ERR40       MACHINE EXCEPTION
          CON    ERR48       COMMAND EXCEPTION
          CON    ERR58       COMMAND ABORTED
          CON    ERR60       COMMAND CONDITIONALLY SUCCESSFUL 
          CON    ERR64       COMMAND INCOMPLETE 
 ICR      SPACE  4,10 
**        ICR - ISSUE CONTROLLER RESET. 
* 
*         ENTRY  (RF) .NE. 0 IF PREVIOUS RESET FAILED.
* 
*         EXIT   (A) = 0 IF SLAVE RESET FAILED. 
*                (A) = 1 IF LOGICAL RESET FAILED. 
*                TO *ERR81* IF RESET SUCCESSFUL.
* 
*         CALLS  SRS. 
  
  
 ICR4     LDM    RWST,DI
          ZJN    ICRX        IF SLAVE RESET FAILED
          LDM    ERCT,DI
          SBN    CSRC-2 
          ZJN    ICR2        IF TIME TO TRY SLAVE RESET 
  
 ICR      SUBR               ENTRY/EXIT 
          LDD    RF 
          NJN    ICR4        IF PREVIOUS RESET FAILED 
          LDM    ERCT,DI
          SBN    CSRC-2 
          NJN    ICR1        IF NOT TIME TO TRY SLAVE RESET 
  
*         DO NOT PERFORM SLAVE RESET IF CHANNEL ERROR, MEDIA ERROR, 
*         RESET ERROR OR CONTROLLER DEAD. 
  
          LDML   EDBF+FALT
          SBN    ETIT 
          ZJN    ICR2        IF INTERRUPT TIMEOUT 
          SBN    EDPE+1-ETIT
          MJN    ICR1        IF CHANNEL / MEDIA ERROR 
          SBN    ECRE-EDPE-1
          MJN    ICR2        IF NOT RESET ERROR / CONTROLLER DEAD 
  
*         PERFORM LOGICAL RESET.
  
 ICR1     LDC    1S12+ERR81  ISSUE LOGICAL RESET
          UJN    ICR3        RESET CONTROL MODULE 
  
*         PERFORM SLAVE RESET.
  
 ICR2     LDN    0           FORCE LOGGING OF ERROR RESPONSE
          STM    ESAD,DI
          LDC    ERR81       ISSUE SLAVE RESET
 ICR3     LJM    SRS         RESET CONTROL MODULE 
 IDM      SPACE  4,20 
**        IDM - ISSUE DAYFILE MESSAGE.
* 
*         ENTRY  (A) = BML MESSAGE SYMPTOM CODE.
*                (RW) = READ / WRITE FLAG.
*                (EO) = EST ORDINAL.
*                (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
*                (MISC) = 1 IF UNRECOVERED ERROR. 
* 
*         EXIT   (A) = (MISC) = 0.
* 
*         USES   T2, T3, CM - CM+4, WB - WB+4.
* 
*         CALLS  IMB, UEC.
  
  
 IDM      SUBR               ENTRY/EXIT 
          LMC    D"DN"*400
          STM    BMLM+1      INSERT SYMPTOM CODE IN MESSAGE 
          LDM    PNUN,DI
          LPC    777         INSERT CONTROLLER AND UNIT NUMBERS 
          STM    UNIT 
          LMM    PNUN,DI     SET PORT NUMBER
          SHN    -3 
          STM    PORT 
          LDD    EO          INCLUDE EST ORDINAL
          STM    ESTO 
          LDM    ERCT,DI     SET RETRY COUNT
          SHN    5
          LMD    RW          MERGE READ / WRITE FLAG
          SHN    1
          RAM    MISC        APPEND TO RECOVERED/UNRECOVERED STATUS 
          LDML   MAD1 
          RJM    IMB         ISSUE MESSAGE TO BUFFER
          RJM    UEC         UPDATE MST ERROR COUNT 
          LDC    MSGP 
          STML   MAD1        RESTORE BML ERROR MESSAGE ADDRESS
          LDN    0
          STM    MISC        CLEAR UNRECOVERED ERROR STATUS 
*         LDN    0
          LJM    IDMX        RETURN 
  
  
 MAD1     CONL   MSGP        MESSAGE ADDRESS (MAY BE SET BY CALLER) 
 IDU      SPACE  4,15 
**        IDU - INTERLOCK DISK UNIT.
* 
*         ENTRY  (CB) = *CBT* ORDINAL IF I/O REQUEST. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (A) = 0 IF UNIT INTERLOCKED. 
* 
*         USES   T2, CM - CM+4, T7 - T7+4.
* 
*         CALLS  SUI. 
* 
*         MACROS CBTE, SFA. 
  
  
 IDU6     RJM    SUI         SET UNIT INTERLOCK 
  
 IDU      SUBR               ENTRY/EXIT 
          LDM    RQLN,DI
          SHN    0-13        CHECK UNIT RESERVED
          LMN    1
          ZJN    IDUX        IF UNIT INTERLOCKED
          LDC    0
 CHRQ     EQU    *-1
          NJN    IDUX        IF CHANNEL REQUESTED 
          STM    LCMD,DI
          SFA    EST,EO      CALCULATE EST ADDRESS
          ADK    EQDE 
          CRD    CM          READ *EQDE* WORD 
  
*         CHECK EST ENTRY FOR CHANNEL DOWN. 
  
          LDD    CM+1        EXTRACT CHANNEL
          LMD    IR+4 
          LPN    77 
          ZJN    IDU1        IF PATH SERVICED BY THIS DRIVER
          LDN    1
 IDU1     ADN    CM+1        SET CHANNEL BYTE ADDRESS 
          STD    T2 
          LDI    T2          CHECK CHANNEL STATE
          SHN    -11
          LMN    4
 IDU2     ZJN    IDU6        IF CHANNEL UP AND AVAILABLE
          SCN    1
 IDU3     NJN    IDUX        IF CHANNEL DOWN OR NOT ENABLED 
          LDD    CB 
          ZJP    IDU6        IF NOT I/O REQUEST 
          SHN    CBTLS
          CBTE   *
          ADC    PAD4        GET CHANNEL FROM CBT ENTRY 
          CRD    T7 
          ADN    HSLK-PAD4   GET CHANNEL SELECT STATUS
          CRD    CM 
          LDD    CM          CHECK ERROR FLAGS
          SHN    0-12 
          ZJN    IDU4        IF NOT CHANNEL SPECIFIC REQUEST
          LDD    T7 
          SHN    -6          CHECK CHANNEL
          LMD    IR+4 
          ZJN    IDU2        IF REQUEST FOR THIS DRIVER 
 IDU4     LDN    1
          UJN    IDU3        RETURN 
 IIO      SPACE  4,15 
**        IIO - INITIATE I/O. 
* 
*         ENTRY  (A) = (CB) = *CBT* ORDINAL.
* 
*         EXIT   (A) = 0 IF I/O DISABLED ON THIS CHANNEL. 
*                (RW) = READ / WRITE STATUS.
*                (PA) = PROCESSOR ADDRESS.
*                (NR - NR+4) = PHYSICAL ADDRESS OF REQUEST. 
* 
*         USES   PA, RW, NR - NR+4, T1 - T7.
* 
*         CALLS  PEF. 
* 
*         MACROS CBTE.
  
  
 IIO4     STD    PA 
          SCN    77          SET I/O DISABLED STATUS
  
 IIO      SUBR               ENTRY/EXIT 
          SHN    CBTLS
          CBTE   *
          ADC    PAD1        FETCH SEEK PARAMETERS FROM *CBT* 
          CRD    NR 
          ADN    PAD4-PAD1   GET CHANNEL FROM CBT ENTRY 
          CRD    T1 
          ADN    HSLK-PAD4   GET CHANNEL SELECT STATUS
          CRD    T2 
          SBN    HSLK-IOLK   GET READ / WRITE FLAG
          CRD    T3 
          LDD    T2          CHECK ERROR FLAGS
          SHN    0-12 
          ZJN    IIO1        IF NO FLAGS
          SHN    -1 
          STD    RW          PROCESS ERROR FLAGS
          RJM    PEF
          NJN    IIO4        IF I/O PREPROCESSING INDICATED 
 IIO1     LDD    NR+1 
          STM    CPBF+FCP+3  SET CYLINDER IN COMMAND PACKET 
          STM    CYLN,DI
          ADN    2
          SBK    CYUN 
          PJN    IIO2        IF WITHIN LAST TWO CYLINDERS OF DEVICE 
          LDK    MXSS        MAXIMUM SECTOR COUNT TO STREAM 
          UJN    IIO3        SET SECTOR COUNT 
  
 IIO2     LDK    MNSS        MINIMUM SECTOR COUNT TO STREAM 
 IIO3     STML   CPBF+FCP+2  SECTOR COUNT / STREAM LIMIT
          LDD    NR+2 
          STM    TKSN,DI     TRACK + SECTOR 
          SCN    77 
          SHN    2
          LMD    NR+2        SEPARATE INTO 8 BIT FIELDS 
          SCN    77 
          LMD    NR+2        SET IN COMMAND PACKET
          STML   CPBF+FCP+4 
          LDD    T3 
          SHN    22-11       EXTRACT WRITE DATA FLAG
          LPN    1
          STM    RWST,DI     SET READ / WRITE STATUS
          STD    RW 
          LDC    PIO
          LJM    IIO4        SET PROCESSOR ADDRESS
 IMF      SPACE  4,10 
**        IMF - ISSUE MONITOR FUNCTION. 
* 
*         ENTRY  (A) = FUNCTION.
* 
*         EXIT   (A) = 0. 
* 
*         USES   CM.
* 
*         CALLS  CMC, FTN.
  
  
 IMF1     RJM    CMC         WAIT MONITOR COMPLETE
          LDD    CM 
          RJM    FTN         ISSUE MONITOR FUNCTION 
  
 IMF      SUBR               ENTRY/EXIT 
          STD    CM 
          UJN    IMF1        CHECK OUTPUT REGISTER
 IMR      SPACE  4,15 
**        IMR - INITIATE MONITOR REQUEST. 
* 
*         ENTRY  (A) = *BIOM* SUBFUNCTION.
*                (WB+3 - WB+4) = *BIOM* PARAMETERS. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   WB - WB+2. 
* 
*         CALLS  AME, CMC.
  
  
 IMR2     RJM    AME         ATTEMPT MONITOR EXCHANGE 
*         LDN    0
  
 IMR      SUBR               ENTRY/EXIT 
          STD    WB+1 
          LDI    DI          SET *PUT* ORDINAL
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          STD    WB+2 
          LDN    BIOM        SET MONITOR FUNCTION 
          STD    WB 
          RJM    CMC         CHECK MONITOR COMPLETE 
          LDD    OA 
          CWD    WB 
          UJN    IMR2        ATTEMPT EXCHANGE 
IOM       SPACE  4,10 
**        IOM - ISSUE OPERATOR MESSAGE. 
* 
*         ENTRY  (A) = ADDRESS OF MESSAGE.
*                    = 0 TO CLEAR MESSAGE.
*                    = - TO REFRESH MESSAGE.
*                (EO) = EST ORDINAL.
* 
*         USES   T1.
* 
*         CALLS  C2D. 
  
  
 IOM2     LDD    CP          SYSTEM CP ADDRESS
          ADN    MS2W 
          CWD    T1          CLEAR THE MESSAGE
 IOM3     LDM    IOMA 
          NJN    IOM1        IF MESSAGE PRESENT 
  
 IOM      SUBR               ENTRY/EXIT 
          STD    T1 
          MJN    IOM3        IF MESSAGE REFRESH 
          STM    IOMA 
          ZJN    IOM2        IF CLEAR MESSAGE CALL
          LDD    EO 
          RJM    C2D         CONVERT EST ORDINAL
          STM    2,T1 
          LDD    EO 
          SHN    -6          SET ORDINAL IN MESSAGE 
          ADC    2RQ0 
          STM    1,T1 
 IOM1     LDD    CP          SYSTEM CP ADDRESS
          ADN    MS2W 
          CWM    **,TR       STORE OPERATOR MESSAGE 
 IOMA     EQU    *-1
          UJN    IOMX        RETURN 
 ISR      SPACE  4,25 
**        ISR - IDENTIFY AND PROCESS SPECIAL REQUEST. 
* 
*         ENTRY  (CM+3) = SPECIAL REQUEST FLAGS.
*                (DI) = DEVICE STATUS BLOCK ADDRESS.
*                (EO) = EST ORDINAL.
* 
*         EXIT   (CM+3) UPDATED - BITS FOR *ECAF* AND/OR *LMLF* CLEARED 
*                   IF REQUEST IS FOR THE ALTERNATE CHANNEL.
*                TO *XMD2* IF UNIT INTERLOCK NOT OBTAINED.
*                TO *ERR* IF CONTROLLER FAILURE.
*                TO *ECA* IF ENABLE CONTROLLER ACTIVITY AND *BDLL*
*                   BIT NOT CLEAR.
*                TO SPECIAL REQUEST PROCESSOR (ADDRESS IN TABLE *ISRA*) 
*                   IF SPECIAL REQUEST FOUND WITH - 
*                    (RW) = INDEX FOR SPECIAL REQUEST.
* 
*         USES   CM, CM+3, PA, RW, T1 - T7. 
* 
*         CALLS  CPF, IDU.
* 
*         MACROS SFA. 
  
  
 ISR      SUBR               ENTRY/EXIT 
  
*         CHECK FOR *ENABLE CONTROLLER ACTIVITY* (*ECAF*) REQUEST.
*         IF REQUEST IS FOR OTHER CHANNEL, LOOK FOR DIFFERENT REQUEST.
*         IF ALREADY ENABLED ON BOTH CHANNELS, EXIT TO *CSR*. 
  
          LDD    CM+3 
          SHN    21-ECAF+ECAF/12D*12D 
          PJN    ISR3        IF *ECAF* REQUEST NOT SET
          SFA    EST,EO      CHECK EST ENTRY
          ADK    EQDE 
          CRD    T1 
          LDD    T1+4 
          SHN    3
          ADK    BDLL        CHECK WHICH CHANNEL TO ENABLE
          CRD    T4 
          LDD    T4 
          SHN    -1 
          LPN    3
          STD    T4 
          ZJN    ISR3        IF ALREADY ENABLED ON BOTH CHANNELS
          SBN    3
          PJN    ISR1        IF NEITHER CHANNEL IS ALREADY ENABLED
          LDM    T1,T4
          LMD    IR+4 
          LPN    77 
          NJN    ISR2        IF THIS CHANNEL ALREADY ENABLED
 ISR1     LJM    ECA         ENABLE CONTROLLER ACTIVITY 
  
 ISR2     LDD    CM+3        LOOK FOR A DIFFERENT REQUEST TO PROCESS
          SCN    1
          ERRNZ  ECAF-12D    CODE DEPENDS ON VALUE
          STD    CM+3 
  
*         CHECK FOR *LIST FIRMWARE REVISION* (*LMLF*) REQUEST.
*         IF REQUEST IS FOR OTHER CHANNEL, LOOK FOR DIFFERENT REQUEST.
  
 ISR3     LDD    CM+3 
          SHN    21-LMLF+LMLF/12D*12D 
          PJN    ISR4        IF *LMLF* REQUEST NOT SET
          LPN    77          ISOLATE CHANNEL NUMBER 
          LMD    IR+4 
          ZJN    ISR6        IF REQUEST FOR THIS DRIVER 
          LDD    CM+3        LOOK FOR A DIFFERENT REQUEST TO PROCESS
          LPN    37 
          ERRNZ  LMLF-17D    CODE DEPENDS ON VALUE
          STD    CM+3 
  
*         SEARCH FOR OTHER SPECIAL REQUEST. 
  
 ISR4     LDD    CM+3        ISOLATE SPECIAL REQUEST FLAGS
          STD    T0 
          ZJP    ISRX        IF NO SPECIAL REQUEST TO PROCESS 
          LDN    ECAF-1 
          STD    RW 
 ISR5     AOD    RW          ADVANCE INDEX
          LDD    T0 
          SHN    21-0        CHECK NEXT FLAG
          STD    T0 
          PJN    ISR5        IF NOT SET 
          LDD    RW 
          UJN    ISR7        SET SPECIAL REQUEST FLAG 
  
*         PROCESS SPECIAL REQUEST.
  
 ISR6     LDC    6S6+LMLF    BITS - 1 TO CLEAR / STARTING BIT 
 ISR7     STM    SREQ,DI     SET SPECIAL REQUEST FLAG 
          LPN    77 
          SBN    ECAF        CALCULATE INDEX
          STD    RW 
          STM    RWST,DI     SAVE INDEX 
          LDML   ISRA,RW
          STDL   PA          SET PROCESSOR ADDRESS
          RJM    IDU         INTERLOCK DISK UNIT
          MJN    ISR8        IF CHANNEL DOWN OR NOT ENABLED 
          NJN    ISR9        IF INTERLOCK NOT AVAILABLE 
          LDM    ENAD,DI
          NJN    ISR10       IF CONTROLLER FAILURE
          LJM    0,PA        EXIT TO SPECIAL REQUEST
  
*         CHANNEL DOWN OR NOT ENABLED.
  
 ISR8     LDM    SREQ,DI
          LMC    6S6+LMLF 
          NJN    ISR9        IF NOT LIST MICROCODE REVISION 
          LDC    6S6+LMLF    BITS - 1 TO CLEAR / STARTING BIT 
          RJM    CPF         CLEAR SPECIAL REQUEST BIT IN *PUT* 
  
*         INTERLOCK NOT AVAILABLE.
  
 ISR9     LDN    0
          STM    SREQ,DI
          LJM    XMD2        RETURN TO MAIN LOOP
  
*         CONTROLLER FAILURE. 
  
 ISR10    LDN    ECMD 
          RJM    ERR         PROCESS ERROR
  
  
 ISRA     BSS    0           SPECIAL REQUEST PROCESSORS 
          CON    CSR         CLEAR FLAG (ENABLE CONTROLLER ACTIVITY)
          CON    CSR         CLEAR FLAG (RESERVED)
          CON    CSR         CLEAR FLAG (RESERVED)
          CON    LDA         LIST DRIVE SERIAL NUMBER 
          CON    CSR         CLEAR FLAG (RESERVED)
          CON    LDA         LIST MICROCODE REVISION LEVEL
 ISRB     BSS    0           INTERNAL SPECIAL REQUEST PROCESSORS
          CON    BOR         BREAK OPPOSITE RESERVE (INTERNAL REQUEST)
          CON    SDA         SET DRIVE ATTRIBUTES (INTERNAL REQUEST)
 LDP      SPACE  4,20 
**        LDP - LOAD DEVICE PARAMETERS. 
* 
*         ENTRY  (DI) = DEVICE STATUS BLOCK ADDRESS.
* 
*         EXIT   (A) = (EO) = EST ORDINAL.
*                (CB) = *CBT* ORDINAL.
*                (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
*                (EO) = EST ORDINAL.
*                (PA) = REQUEST IN PROGRESS ADDRESS.
*                (RW) = READ / WRITE FLAG.
*                (CM - CM+4) = *PILL* WORD OF *PUT* ENTRY.
*                (WB - WB+4) = *UNCT* WORD OF *PUT* ENTRY.
* 
*         USES   CB, CN, DN, EO, PA, RW, CM - CM+4, WB - WB+4.
* 
*         MACROS PUTE.
  
  
 LDP      SUBR               ENTRY/EXIT 
          LDI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          SHN    PUTLS
          PUTE   *
          ADC    PILL        GET INTERLOCK STATUS 
          CRD    CM 
          SBN    PILL-UNCT   FETCH UNIT CONTROL WORD
          CRD    WB 
          LDD    WB          GET CONTROLLER AND UNIT NUMBERS
          LPC    777
          SHN    21-5        EXTRACT CONTROLLER NUMBER
          STD    CN 
          SHN    5-21        ISOLATE DRIVE NUMBER 
          STD    DN 
          LDD    WB+3        *CBT* ORDINAL
          STD    CB 
          LDM    RWST,DI     RESTORE READ / WRITE STATUS
          STD    RW 
          LDM    ADDR,DI     CURRENT PROCESSING ADDRESS 
          STD    PA 
          LDD    WB+1        SET EST ORDINAL
          STD    EO 
          UJN    LDPX        RETURN 
 LND      SPACE  4,10 
**        LND - LOCATE NEXT DRIVE (ON SPECIFIED CONTROLLER).
* 
*         ENTRY  (A) = 0 TO LOCATE FIRST DRIVE OF STRING. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (T5) = CONTROLLER STATUS BLOCK INDEX, IF (A) = 0.
*                (T7) = CURRENT DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = (T7) = STATE TABLE ADDRESS OF NEXT DRIVE.
*                (A) = 0 IF NO MORE DRIVES (ON CONTROLLER). 
*                (T5) = CONTROLLER STATUS BLOCK INDEX.
* 
*         USES   T5, T7.
  
  
 LND2     LDM    PNUN,DI     EXTRACT CONTROLLER BLOCK INDEX 
          SHN    -6 
          STD    T5 
          LDM    CSTB,T5     ADDRESS OF FIRST DRIVE IN STRING 
          STD    T7 
 LND3     LDM    PNUN,T7     FORM *CSTB* INDEX
          SHN    -6 
          LMD    T5 
          NJN    LND1        IF NOT SPECIFIED CONTROLLER
          LDD    T7 
  
 LND      SUBR               ENTRY/EXIT 
          ZJN    LND2        IF INITIAL CALL
 LND1     LDN    DSTBE
          RAD    T7          ADVANCE DEVICE STATE TABLE ADDRESS 
          LMM    XMDA 
          NJN    LND3        IF NOT END OF BLOCK
*         LDN    0
          UJN    LNDX        RETURN 
 LSD      SPACE  4,15 
**        LSD - LOCATE SELECTED DRIVE IN *DSTB*.
* 
*         ENTRY  (T4) = DRIVE NUMBER. 
* 
*         EXIT   (A) = 0 IF UNKNOWN DRIVE ON SPECIFIED CONTROLLER.
*                    = DEVICE STATE TABLE ADDRESS FOR DRIVE.
* 
*         CALLS  LND. 
  
  
 LSD1     LDN    0           LOCATE FIRST DRIVE 
 LSD2     RJM    LND
          ZJN    LSDX        IF END OF DRIVE STRING 
          LDM    PNUN,T7
          LPN    77          CHECK DRIVE NUMBER 
          LMD    T4 
          NJN    LSD2        IF NOT SPECIFIED DRIVE 
          LDM    ADDR,T7
          ZJN    LSDX        IF DRIVE NOT ACTIVE
          LDD    T7 
  
 LSD      SUBR               ENTRY/EXIT 
          LDD    T4 
          SBN    10 
          MJN    LSD1        IF VALID DRIVE NUMBER
          LDN    0
          UJN    LSDX        RETURN 
 PEF      SPACE  4,15 
**        PEF - PROCESS ERROR FLAGS.
* 
*         ENTRY  (RW) = ERROR INDEX.
*                (CB) = *CBT* ORDINAL.
*                (T1) = BYTE 0 OF *PAD4* WORD OF CBT ENTRY. 
*                (T2) = BYTE 0 OF *HSLK* WORD OF CBT ENTRY. 
*                (NR - NR+4) = *PAD1* WORD OF *CBT* ENTRY.
* 
*         EXIT   (A) = 0 IF OK TO INITIATE I/O. 
*                TO PROCESSOR IF I/O INITIATED. 
* 
*         CALLS  IDU, IIO.
  
  
 PEF7     LDN    0           INDICATE I/O IN ORDER
  
 PEF      SUBR               ENTRY/EXIT 
          LDD    T1 
          SHN    -6          CHECK CHANNEL NUMBER 
          LMD    IR+4 
 PEF1     NJN    PEFX        IF I/O DISABLED ON THIS ACCESS 
          LDD    RW 
          ZJN    PEFX        IF *1MV* DEVICE VERIFICATION 
          LDML   ERCT,DI
          NJN    PEF7        IF I/O INITIATED 
          RJM    IDU         INTERLOCK DISK UNIT
          NJN    PEFX        IF INTERLOCK NOT AVAILABLE 
          LDN    CSRC 
          STM    ERCT,DI     SET INITIAL ERROR COUNT
          LDM    ENAD,DI
          NJN    PEF7        IF CONTROLLER DEAD 
          LDD    CB          INITIATE I/O 
          RJM    IIO
          LJM    0,PA        EXIT TO PROCESSOR
 RCS      SPACE  4,10 
**        RCS - REMOVE CHANNEL FROM SYSTEM USE. 
* 
*         ENTRY  (A) = EST ORDINAL IF CHANNEL TO BE DOWNED ON DEVICE. 
*                    = 0 IF CHANNEL TO BE GLOBALLY DOWNED.
* 
*         USES   CM - CM+4. 
* 
*         MACROS DELAY, EXECUTE, MONITOR. 
  
  
 RCS      SUBR               ENTRY/EXIT 
          LMC    4000 
          STM    RCSA+4      SET DRIVER CALL FLAG, EST ORDINAL
          LDD    MA 
          CWM    RCSA,ON     STORE *1DS* CALL IN MESSAGE BUFFER 
 RCS1     LDN    0
          STD    CM+1        SET NON-PRIORITY REQUEST 
          EXECUTE  1DS,=
          MONITOR  RPPM      REQUEST PP 
          LDD    CM+1 
          NJN    RCSX        IF *1DS* STARTED 
          DELAY 
          UJN    RCS1        RETRY CALL 
  
  
 RCSA     VFD    18/3L1DS,6/,12/DWNF,12/0,12/4000 
 RCT      SPACE  4,10 
**        RCT - READ CHANNEL TABLE. 
* 
*         EXIT   (A) = CHANNEL TABLE STATUS BYTE. 
* 
*         USES   NR - NR+4. 
* 
*         MACROS CHTE.
  
  
 RCT      SUBR               ENTRY/EXIT 
          CHTE   *
          LDC    0           READ CHANNEL TABLE ENTRY 
          CRD    NR 
 RCTA     LDD    NR+0 
          UJN    RCTX        RETURN 
 RLB      SPACE  4,15 
**        RLB - READ LINKAGE BITS.
* 
*         ENTRY  (A) = (T6) = ADDRESS FOR LINKAGE IN (CM - CM+4). 
*                (PB) = CONTROL BUFFER ORDINAL. 
*                (T1) = DATA BUFFER ADDRESS.
*                (T2) = CONTROL BUFFER WORD NUMBER. 
*                (CM - CM+4) = *PAD* WORD OF *CBT* ENTRY. 
* 
*         EXIT   SECTOR LINKAGE SET IN *CBT* ENTRY. 
* 
*         USES   T1, T6.
* 
*         MACROS CBTE.
  
  
 RLB1     LDN    10+4        ADVANCE BUFFER ADDRESS 
          RADL   T1 
          LDIL   T1          EXTRACT LINKAGE FROM BUFFER
 RLB2     SHN    -14
          SHN    10          POSITION FOR *CBT* ENTRY 
          STI    T6 
          LDML   4,T1        EXTRACT LINKAGE FROM BUFFER
          SHN    -14
          SHN    4           POSITION FOR *CBT* ENTRY 
          RAI    T6 
          LDML   10,T1       EXTRACT LINKAGE FROM BUFFER
          SHN    -14
*         SHN    0           POSITION FOR *CBT* ENTRY 
          RAI    T6 
          AOD    T6          ADVANCE *CBT* WORD ADDRESS 
          LMN    CM+5 
          NJN    RLB1        IF MORE LINKAGE
          LDD    PB 
          SHN    CBTLS
          CBTE   *
          ADC    0           FWA OF *CBT* 
          ADD    T2 
          CWD    CM          UPDATE CONTROL BUFFER ENTRY
  
 RLB      SUBR               ENTRY/EXIT 
*         LDD    T6 
          UJN    RLB2        MOVE SECTOR LINKAGE
 RMR      SPACE  4,10 
**        RMR - READ CHANNEL STATUS REGISTER. 
* 
*         EXIT   (A) = 0 IF NO CHANNEL ERROR. 
*                (RBUF) = REGISTER CONTENTS.
* 
*         CALLS  WMC. 
  
  
 RMR      SUBR               ENTRY/EXIT 
          FNC.   IOUC,MR
          ACN.   MR          ACTIVATE MAINTENANCE CHANNEL 
          LDN    0
          OAN.   MR          OUTPUT NULL PARAMETER
          CON    LDCI 
          IAN    CH          (FORCE CHANNEL TABLE ENTRY)
          ORG    *-1
          CON    RCSR+CH     TRANSMIT REGISTER NUMBER 
          OAN.   MR 
          RJM    WMC         WAIT CHANNEL EMPTY 
          DCN.   MR+40
          NJN    RMRX        IF CHANNEL HUNG FULL 
          ACN.   MR 
          LDN    RBUFL       READ CHANNEL STATUS REGISTER 
          IAM.   RBUF,MR
          UJN    RMRX        RETURN 
 SCD      SPACE  4,15 
**        SCD - STORE *CPD* DATA. 
* 
*         ENTRY  (A) = 0 TO INDICATE CHANNEL INACTIVE.
*                    = 1 TO INDICATE CHANNEL ACTIVE.
*                (UC) = UNIT ACTIVITY COUNT.
* 
*         EXIT   (T7) = 0.
* 
*         USES   T5, T6, CM - CM+2. 
* 
*         MACROS CCTE.
  
  
 SCD      SUBR               ENTRY/EXIT 
          STD    T5 
          LDN    ZERL        CLEAR UNUSED BYTES 
          CRD    T6 
          LDD    UC          INSERT UNIT COUNT
          STD    T6 
          CCTE   *
          LDC    CREQ        STORE *CPD* DATA 
          CWD    T5 
          UJN    SCDX        RETURN 
 SEC      SPACE  4,15 
**        SEC - SET ERROR CODE. 
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   TO *CSR* IF PROCESSING SPECIAL REQUEST.
* 
*         USES   T5, UC, CW - CW+4, WB+3 - WB+4.
* 
*         CALLS  DCM, IMR, IOM, LDP, RCS, SES.
* 
*         MACROS CBTE.
  
  
 SEC5     LDN    1           BUFFER COUNT TO BE DELINKED
          STD    WB+3 
  
*         THE *SETS* MONITOR REQUEST IS USED TO MOVE THE I/O REQUEST
*         TO AN ALTERNATE CHANNEL.  THE I/O BUFFER IS ONLY DELINKED 
*         IF THE REQUEST IS CHANNEL SPECIFIC. 
  
          LDN    SETS        INSERT CODE IN *CBT* 
          RJM    IMR
*         LDN    0           SET INTERLOCK RELEASED (FOR *CMP*) 
          STM    RQLN,DI
          SOD    UC          DECREMENT UNIT ACTIVITY COUNT
  
 SEC      SUBR               ENTRY/EXIT 
          LDN    0
          RJM    IOM
          RJM    DCM         ENSURE CONTROLLER DESELECTED 
          RJM    LDP
          LDML   IPPS,DI     CHECK DIAGNOSTIC FLAG
          SHN    -17
          ZJN    SEC1        IF NOT ERROR FROM DIAGNOSTIC 
          LDD    CB 
          SHN    CBTLS       CONVERT CBT ORDINAL
          CBTE   *
          ADC    HSLK        FETCH ERROR STATUS 
          CRD    CW 
          LDD    CW          CHECK PREVIOUS ERROR 
          LPN    77 
          NJN    SEC2        IF PREVIOUS ERROR
 SEC1     LDML   EDBF+FALT
          SHN    -2          CREATE INDEX FROM FAULT CODE 
          STD    T5 
          LDM    TMSE,T5
 SEC2     STD    WB+4        SET MASS STORAGE ERROR CODE
          LDML   IPPS,DI     CLEAR *RND*, *SDA* AND *BOR* FLAGS 
          LPC    -1S15-1S14-1S13
          STML   IPPS,DI
          LDD    WB+4        CHECK ERROR CODE 
          LMN    NRDE 
          ZJN    SEC3        IF NOT-READY CONDITION 
          LDN    STDE&STNR
 SEC3     LMN    STNR 
          RJM    SES         SET ERROR STATUS IN MST
          LDD    CB 
          ZJN    SEC4        IF SPECIAL REQUEST OR NO BUFFER
          LDM    SREQ,DI
          ZJP    SEC5        IF I/O PROCESSING
 SEC4     LDD    EO          DOWN CHANNEL ON THIS DEVICE
          RJM    RCS
          AOM    MISC        MARK ERROR UNRECOVERED 
          LJM    CSR         CLEAR SPECIAL REQUEST
 SFR      SPACE  4,15 
**        SFR - SEARCH FOR CONSECUTIVE REQUEST. 
* 
*         ENTRY  (A) = CURRENT *CBT* ORDINAL. 
* 
*         EXIT   (A) = (NB) = 0 IF NO CONSECUTIVE REQUEST FOUND.
*                           = *CBT* ORDINAL OF NEXT REQUEST.
*                (NR - NR+4) = PHYSICAL ADDRESS OF NEXT REQUEST.
* 
*         USES   NB, CM - CM+4, NR - NR+4, T1 - T6. 
* 
*         MACROS CBTE.
  
  
 SFR      SUBR               ENTRY/EXIT 
          SHN    CBTLS
          CBTE   *
          ADC    PAD1        FETCH SEEK PARAMETERS FROM *CBT* 
          CRD    CM 
          ADN    IOLK-PAD1   (T1) = I/O LINK-UP FLAGS 
          CRD    T1 
          LDD    T1          CHECK STREAMING ENABLED
          LPN    40 
          NJN    SFR1        IF DATA STREAMING DISABLED 
          LDM    CYLN,DI
          ADN    2
          SBK    CYUN 
          PJN    SFR0        IF WITHIN LAST TWO CYLINDERS OF DEVICE 
          LDK    MXBS        MAXIMUM BUFFER COUNT TO STREAM 
          UJN    SFR0.1      CHECK BUFFER COUNT 
  
 SFR0     LDK    MNBS        MINIMUM BUFFER COUNT TO STREAM 
 SFR0.1   SBM    CBCT,DI
          ZJN    SFR2        IF TIME TO CURTAIL STREAMING 
          LDD    T1+2 
          STD    NB 
          ZJN    SFRX        IF NO REQUEST AVAILABLE
          SHN    CBTLS
          CBTE   *
          ADC    PAD1        PHYSICAL ADDRESS OF NEXT REQUEST 
          CRD    NR 
          ADN    IOLK-PAD1   I/O LINK-UP WORD OF NEXT REQUEST 
          CRD    T2 
          LDD    T2          COMPARE LINK-UP FLAGS
          LMD    T1 
          LPC    DRFM+ILFM
          ZJN    SFR4        IF SAME DIRECTION AND INTERLOCKED
 SFR1     LDN    0
 SFR2     STD    NB 
 SFR3     UJP    SFRX        RETURN 
  
 SFR4     LDD    NR+1        CHECK SEEK PARAMETERS
          SBD    CM+1 
          ZJN    SFR5        IF SAME CYLINDER 
          SBN    1
          NJN    SFR1        IF NOT NEXT CYLINDER 
          LDD    CM+2 
          SBK    PTCY*100 
          UJN    SFR6        CHECK NEXT TRACK / SECTOR
  
 SFR5     LDD    CM+2        CHECK NEXT SECTOR
          ADN    PSBFDN 
          LMD    NR+2 
          ZJN    SFR7        IF NEXT SECTOR ON SAME TRACK 
          LDD    CM+2 
 SFR6     ADD    HN          SET NEXT TRACK 
          SBK    PSPT-PSBF
          LMD    NR+2 
          NJN    SFR1        IF NOT NEXT SECTOR ON CONSECUTIVE TRACKS 
 SFR7     LDD    NB 
          UJN    SFR3        RETURN 
 SLB      SPACE  4,15 
**        SLB - SET LINKAGE BITS. 
* 
*         ENTRY  (A) = *CBT* ORDINAL. 
*                (RW) = READ / WRITE STATUS.
* 
*         EXIT   LINKAGE BITS SET IN *CBT* ENTRY / UEM BUFFER.
* 
*         USES   PB, CM - CM+4, T1 - T6, UA - UA+1. 
* 
*         CALLS  RLB, SUA, WLB. 
* 
*         MACROS CBTE.
  
  
 SLB      SUBR               ENTRY/EXIT 
          STD    PB 
          RJM    SUA         SET UEM ADDRESS
          LDN    PAD1 
          STD    T2 
          SRD    T3 
          LDN    5           UEM WORD COUNT 
          STD    T5 
          LDM    SLBB,RW     SET PROCESSOR ADDRESS
          STM    SLBA 
 SLB1     LRD    UA          LOAD *R* REGISTER
          LDD    PB 
          SHN    CBTLS       READ CONTROL BUFFER WORD 
          CBTE   *
          ADC    0           FWA OF *CBT* 
          ADD    T2 
          CRD    CM 
          LDC    SBUF-4      SET BUFFER ADDRESS 
          STDL   T1 
          LDC    1S17        READ START OF BUFFER SEGMENT 
          CRML   SBUF,T5
          LDN    CM+3        SET *CBT* ENTRY ADDRESS
          STD    T6 
          RJM    0           MOVE LINKAGE BITS
 SLBA     EQU    *-1
          LDN    10          ADVANCE *R* REGISTER IMAGE 
          RAD    UA+1 
          SHN    -14
          RAD    UA 
          AOD    T2          ADVANCE CONTROL BUFFER WORD
          LMN    PAD4+1 
          NJN    SLB1        IF NOT COMPLETE
          LRD    T3 
          UJP    SLBX        RETURN 
  
  
 SLBB     CON    RLB         READ LINKAGE BITS
          CON    WLB         WRITE LINKAGE BITS 
 SMC      SPACE  4,10 
**        SMC - SEARCH FOR MAJOR CATEGORY SUBSTATUS.
* 
*         ENTRY  (A) = MAJOR STATUS CATEGORY. 
* 
*         EXIT   (A) = FIRST TWO OCTETS OF SUBSTATUS. 
*                    .LT. 0 IF SUBSTATUS NOT PRESENT. 
*                (T4) = SUBSTATUS PARAMETER ID CODE.
* 
*         CALLS  SRP. 
  
  
 SMC1     LDML   RPBF+6,T3   RETURN FIRST BYTE OF SUBSTATUS 
  
 SMC      SUBR               ENTRY/EXIT 
          LMN    0#10 
          STD    T4          SEARCH FOR CONTROLLER SUBSTATUS
          RJM    SRP
          ZJN    SMC1        IF SUBSTATUS FOUND 
          LDN    0#20-0#10
          RAD    T4          SEARCH FOR DRIVE SUBSTATUS 
          RJM    SRP
          ZJN    SMC1        IF SUBSTATUS FOUND 
*         LCN    0
          UJN    SMCX        RETURN 
 SRF      SPACE  4,10 
**        SRF - SET DRIVER RELOAD FLAG. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  DCR. 
* 
*         MACROS MONITOR. 
  
  
 SRF      SUBR               ENTRY/EXIT 
          RJM    DCR         DROP CHANNEL RESERVATION 
*         LDN    0
          STD    CM+2        CLEAR UNUSED BYTE
          CHTE   *
          LDC    CTALL*2     ADDRESS OF CHANNEL CONTROLWARE TABLE ENTRY 
          STD    CM+4 
          SHN    -14
          STD    CM+3 
          LDN    1           SET NUMBER OF REQUESTS 
          STD    CM+1 
          LDD    MA          STORE REQUEST IN MESSAGE BUFFER
          CWM    SRFA,CM+1
          MONITOR  UTEM      SET RELOAD FLAG
*         LDN    0
          UJN    SRFX        RETURN 
  
  
 SRFA     VFD    1/0,5/0,6/1,6/,42/1
 SRP      SPACE  4,10 
**        SRP - SEARCH RESPONSE PACKET. 
* 
*         ENTRY  (A) = PARAMETER ID TO SEARCH FOR.
* 
*         EXIT   (A) = 0 IF ID FOUND. 
*                    .LT. 0 IF ID NOT FOUND.
*                (T3) = *RPBF* INDEX - 5 OF PARAMETER BLOCK.
* 
*         USES   T1, T2.
  
  
 SRP1     LDML   RPBF+5,T3   EXTRACT PARAMETER BLOCK LENGTH 
          SHN    -10-1
          ADN    1           CONVERT OCTET COUNT TO BYTE COUNT
          STD    T0 
          RAD    T3          ADVANCE BUFFER INDEX 
          LDD    T2 
          SBD    T0 
 SRP2     MJN    SRPX        IF END OF RESPONSE PACKET
          STD    T2 
          LDM    RPBF+5,T3   CHECK NEXT PARAMETER BLOCK 
          LMD    T1 
          LPC    377
          NJN    SRP1        IF NOT REQUESTED ID
  
 SRP      SUBR               ENTRY/EXIT 
          STD    T1 
          LDN    0           INITIALIZE INDEX 
          STD    T3 
          LDM    RPBF+PLN    PACKET LENGTH
          ADN    1
          SHN    -1          CONVERT TO PP WORD COUNT 
          SBN    5
          UJN    SRP2        CHECK MINIMUM PACKET LENGTH
 STF      SPACE  4,15 
**        STF - SET TRACK FLAW, IF TRACK WITHIN USER AREA.
* 
*         ENTRY  (CB) = CURRENT *CBT* ORDINAL.
*                (EO) = EST ORDINAL.
*                (T3+1) = CYLINDER NUMBER.
*                (T3+2) = PHYSICAL TRACK + SECTOR.
* 
*         USES   CM+1 - CM+3. 
* 
*         CALLS  CDA, C2D, IDM. 
* 
*         MACROS MONITOR. 
  
  
 STF      SUBR               ENTRY/EXIT 
          LDD    EO 
          SHN    -3          CONVERT EST ORDINAL
          RJM    C2D
          STM    STFB+1      SET ORDINAL IN MESSAGE 
          LDD    EO 
          STD    CM+1 
          LPN    7
          SHN    6           CONVERT LOW ORDER DIGIT
          ADC    2R0, 
          STM    STFB+2 
          RJM    CDA         CONVERT DISK ADDRESS 
          LDD    T6          SET TRACK TO FLAW
          STD    CM+2 
          SBK    MCLT 
          PJN    STFX        IF TRACK NOT WITHIN USER AREA
          LDD    T6 
          RJM    C2D         SET TRACK NUMBER IN MESSAGE
          STM    STFB+5 
          LDD    T6 
          SHN    -6 
          RJM    C2D         SET TRACK NUMBER IN MESSAGE
          STM    STFB+4 
          LDK    SFTS        INSERT SUBFUNCTION 
          STD    CM+3 
          MONITOR  SMDM      SET TRACK FLAW REQUEST IN MST
          LDD    CM+1 
          NJN    STF2        IF THIS FLAW ALREADY REQUESTED 
          LDC    STFA 
          STML   MAD1        ISSUE ERROR LOG MESSAGE
          RJM    IDM
 STF2     LJM    STFX        RETURN 
  
  
 STFA     VFD    24/0        RESERVED 
          VFD    12/1        ERRLOG ALERT FLAG
          VFD    12/STFAL    MESSAGE LENGTH 
          VFD    12/ELDY     ERRLOG DAYFILE 
  
 STFB     DATA   C*EQXXX,TKNNNN, MEDIA DEFECT ENCOUNTERED.* 
  
 .1       SET    *-STFA+4 
 STFAL    EQU    .1/5 
 STO      SPACE  4,10 
**        STO - SET TIMEOUT.
* 
*         ENTRY  (A) = TIMEOUT VALUE (IN SECONDS).
* 
*         USES   T6, CM - CM+4. 
  
  
 STO      SUBR               ENTRY/EXIT 
          STD    T6 
          LDC    RTCL        FETCH CURRENT TIME 
          CRD    CM 
          LDD    T6 
          ADD    CM+1        SET TIME LIMIT 
          STM    FTOC+1,DI
          SHN    -14
          ADD    CM 
          STM    FTOC,DI
          UJN    STOX        RETURN 
 SUA      SPACE  4,10 
**        SUA - SET UEM ADDRESS.
* 
*         ENTRY  (A) = *CBT* ORDINAL. 
* 
*         EXIT   (UA - UA+1) = UEM ADDRESS / 100. 
* 
*         USES   CM - CM+4. 
* 
*         MACROS CBTE.
  
  
 SUA      SUBR               ENTRY/EXIT 
          SHN    CBTLS
          CBTE   *
          ADC    IOLK        READ *CBT* ENTRY 
          CRD    CM 
          LDD    CM+4        EXTRACT RELATIVE UEM ADDRESS 
          ADC    0
 SUAA     EQU    *-1
          SHN    -6 
          STD    UA+1        SET ABSOLUTE ADDRESS / 100 
          LDD    CM+3 
          ADC    0
 SUAB     EQU    *-1
          SHN    6
          RAD    UA+1 
          SHN    -14
          STD    UA 
          UJN    SUAX        RETURN 
 SUI      SPACE  4,15 
**        SUI - SET UNIT INTERLOCK. 
* 
*         ENTRY  (DI) = DEVICE STATUS BLOCK INDEX.
* 
*         EXIT   (A) = 0 IF *PUT* ENTRY INTERLOCKED.
*                (UC) = UNIT ACTIVITY COUNT INCREMENTED.
*                (CM+1) = *BIOM* STATUS.
* 
*         USES   CM+1, CM+2, UC.
* 
*         MACROS MONITOR. 
  
  
 SUI1     AOD    UC          ADVANCE UNIT ASSIGNED COUNT
          LDC    4000 
 SUI2     STM    RQLN,DI     SET UNIT INTERLOCKED 
          LDN    0
  
 SUI      SUBR               ENTRY/EXIT 
          LDM    RQLN,DI
          SCN    77 
          NJN    SUI2        IF UNIT ALREADY INTERLOCKED
          LDI    DI          SET *PUT* ORDINAL
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          STD    CM+2 
          LDN    SUIS        SET SUBFUNCTION
          STD    CM+1 
          MONITOR  BIOM      INTERLOCK DEVICE 
          LDD    CM+1 
          ZJN    SUI1        IF INTERLOCK ACQUIRED
          LDN    1
          UJN    SUIX        RETURN 
 TMSE     SPACE  4,10 
**        TMSE - TABLE OF MASS STORAGE ERROR CODES. 
* 
*         INDEXED BY FAULT CODE / 4.
  
  
 TMSE     BSS    0
          LOC    0
  
          CON    CHPE        CHANNEL PARITY 
          CON    CHFE        CHANNEL FAILURE
          CON    FTOE        FUNCTION TIMEOUT 
          CON    PARE        DATA PARITY (MEDIA)
          CON    NRDE        DEVICE NOT READY 
          CON    IDTE        DATA TRANSFER
          CON    DSTE        DEVICE STATUS
          CON    DSTE        DEVICE STATUS
          CON    DSTE        DEVICE STATUS
          CON    DSTE        DEVICE STATUS
          CON    DSTE        DEVICE STATUS
          CON    DDFE        DIAGNOSTIC FAILURE 
          CON    RAME        CONTROLLER MEMORY
          CON    CHFE        CHANNEL FAILURE
          CON    DRVE        DRIVE RESERVE
          CON    RAME        CONTROLLER MEMORY
          LOC    *O 
 TMSK     SPACE  4,10 
**        TMSK - TABLE OF UNIT MASKS. 
* 
*         INDEXED BY UNIT NUMBER. 
  
  
 TMSK     BSS    0
          LOC    0
  
          CON    001
          CON    002
          CON    004
          CON    010
          CON    020
          CON    040
          CON    100
          CON    200
          LOC    *O 
 UBP      SPACE  4,20 
**        UBP - UPDATE *BDLL* PARAMETER.
* 
*         THIS ROUTINE CHANGES A BIT/FIELD IN WORD *BDLL* OF THE MST. 
* 
*         ENTRY  (A) = 6/WORD, 6/BITS TO CHANGE.
*                (EO) = EST ORDINAL.
*                (CM+2) = NEW VALUE.
*                (T7) = LOW ORDER BIT TO CHANGE TIMES 100.
* 
*         USES   T6, CM - CM+4. 
* 
*         MACROS MONITOR, SFA.
  
  
 UBP      SUBR               ENTRY/EXIT 
          STD    T6 
          LDD    MA 
          CWD    T6          STORE MESSAGE BUFFER PARAMETERS
          SFA    EST,EO      CALCULATE EST ADDRESS
          ADK    EQDE 
          CRD    CM 
          LDD    CM+4 
          SHN    3
          STD    CM+4        SET BASE *MST* ENTRY ADDRESS 
          SHN    -14
          STD    CM+3 
          LDN    1
          STD    CM+1        PARAMETER WORD COUNT 
          MONITOR  UTEM 
          UJN    UBPX        RETURN 
 UEC      SPACE  4,15 
**        UEC - UPDATE MST ERROR COUNT. 
* 
*         ENTRY  (EO) = EST ORDINAL.
*                (BMLM+1) = BML MESSAGE SYMPTOM CODE. 
*                (MISC - BIT 0) = 1 IF UNRECOVERED ERROR. 
* 
*         USES   CM+1 - CM+3. 
* 
*         MACROS MONITOR. 
  
  
 UEC      SUBR               ENTRY/EXIT 
          LDM    BMLM+1 
          LMC    D"DN"*400+HD0111 
          NJN    UECX        IF NOT COMPLETION MESSAGE
          LDD    EO 
          STD    CM+1        SET EST ORDINAL
          LDM    MISC 
          LPN    1           SET BYTE NUMBER
          ADN    3
          STD    CM+2 
          LDN    ICTS        INCREMENT ERROR COUNT
          STD    CM+3 
          MONITOR  SMDM 
          UJN    UECX        RETURN 
 UHD      SPACE  4,15 
**        UHD - UNPACK HEX DATA.
* 
*         ENTRY  (A) = DESTINATION DATA ADDRESS.
*                (T2) = SOURCE DATA ADDRESS.
*                (T4) = BYTE COUNT OF HEX DATA. 
* 
*         EXIT   (A) = CM WORD COUNT OF 12 BIT DATA.
* 
*         USES   T2, T3, T4, T5.
* 
*         CALLS  DV5. 
  
  
 UHD3     AODL   T3          SET END OF 12 BIT DATA 
          STML   UHDA 
          LDN    ZERL        ENSURE ZERO FILL TO CM WORD BOUNDARY 
          CRM    *,ON 
 UHDA     EQU    *-1
          LDDL   T3          SET BYTE COUNT OF 12 BIT DATA
          SBDL   T5 
          RJM    DV5         CONVERT TO CM WORD COUNT 
  
 UHD      SUBR               ENTRY/EXIT 
          STDL   T3 
          STDL   T5          PRESERVE DESTINATION BUFFER ADDRESS
 UHD1     LDIL   T2 
          SHN    16 
          STI    T3          UNPACK N+3RD BYTE
          SHN    -6 
          SCN    77 
          STM    1,T3 
          AODL   T3 
          SOD    T4 
 UHD2     ZJN    UHD3        IF END OF HEX DATA 
          AODL   T2 
          LDIL   T2 
          SHN    -10
          RAI    T3          UNPACK N+4TH BYTE
          AODL   T3 
          LDIL   T2 
          SHN    4
          SCN    17 
          STI    T3 
          SOD    T4 
          ZJN    UHD2        IF END OF HEX DATA 
          AODL   T2 
          LDIL   T2 
          STM    1,T3 
          SHN    -14
          RAI    T3          UNPACK N+5TH BYTE
          AODL   T3 
          SOD    T4 
          ZJN    UHD2        IF END OF HEX DATA 
          AODL   T2 
          AODL   T3 
          UJP    UHD1        CONTINUE UNPACK
 VIS      SPACE  4,15 
**        VIS - VERIFY INTERRUPT SOURCE.
* 
*         ENTRY  (A) .LT. 0 IF ASYNC INTERRUPT. 
*                (DI) = DEVICE STATUS BLOCK ADDRESS.
*                (PA) = REQUEST IN PROGRESS ADDRESS.
* 
*         EXIT   (A) = 0 IF INTERRUPT FOR INACTIVE DRIVE. 
*                    = RETURN ADDRESS TO PROCESSOR. 
* 
*         USES   DI, T4.
* 
*         CALLS  LDP. 
  
  
 VIS3     LDM    ATTN,DI     PROCESS ASYNC INTERRUPT
          ZJN    VIS3.1      IF NOT WAITING FOR INTERRUPT 
          LDM    EEST,DI
          LMN    ASRT 
          ZJN    VIS6        IF WAITING FOR ASYNC INTERRUPT 
 VIS3.1   LDM    ADDR,DI
          LMC    SRS12
          NJN    VIS3.2      IF NOT NONCONTROLLING DRIVE ON SLAVE RESET 
          STM    ADDR,DI     CLEAR REENTRY ADDRESS
 VIS3.2   LDN    0
          UJN    VISX        DISCARD UNSOLICITED ASYNC INTERRUPT
  
 VIS4     LDD    T4          CHANGE ADDRESS TO CORRECT DEVICE 
          STD    DI 
          RJM    LDP         LOAD DEVICE PARAMETERS 
 VIS5     LDM    RQLN,DI
          SCN    77 
          ZJN    VISX        IF UNIT NOT INTERLOCKED
 VIS6     LDD    PA 
          LMC    ATT2 
          NJN    VIS2        IF NOT SOLICITED INTERRUPT 
          LDM    ATTN,DI
  
 VIS      SUBR               ENTRY/EXIT 
          MJP    VIS3        IF ASYNC INTERRUPT 
          LDM    RPBF+CRN    CHECK COMMAND NUMBER 
          LMD    DI 
          ZJN    VIS5        IF INTERRUPT FROM CURRENT DEVICE 
          LDC    DSTB 
          STD    T4 
 VIS1     LDM    RPBF+CRN    COMPARE COMMAND NUMBER 
          LMD    T4 
          ZJN    VIS4        IF DEVICE FOUND
          LDN    DSTBE
          RAD    T4          ADVANCE TABLE ADDRESS
          LMM    XMDA 
          NJN    VIS1        IF NOT END OF DEVICE STATE TABLE 
 VIS2     LDN    0
          UJN    VISX        RETURN 
 WLB      SPACE  4,10 
**        WLB - WRITE LINKAGE BITS. 
* 
*         ENTRY  (A) = (T6) = ADDRESS FOR LINKAGE IN (CM - CM+4). 
*                (T1) = DATA BUFFER ADDRESS.
*                (T5) = NUMBER OF WORDS TO WRITE. 
*                (CM - CM+4) = *PAD* WORD OF *CBT* ENTRY. 
* 
*         EXIT   SECTOR LINKAGE SET IN DATA BUFFER. 
* 
*         USES   T1, T6.
  
  
 WLB1     LDN    10+4        ADVANCE BUFFER ADDRESS 
          RADL   T1 
          LDI    T6          EXTRACT LINKAGE FROM *CBT* ENTRY 
          SHN    -10
*         LPN    17 
          SHN    14          POSITION FOR DATA BUFFER 
          LMI    T1 
          STIL   T1 
 WLB2     LDI    T6          EXTRACT LINKAGE FROM *CBT* ENTRY 
          SHN    -4 
          LPN    17 
          SHN    14          POSITION FOR DATA BUFFER 
          LMM    4,T1 
          STML   4,T1 
          LDI    T6          EXTRACT LINKAGE FROM *CBT* ENTRY 
*         SHN    0
          LPN    17 
          SHN    14          POSITION FOR DATA BUFFER 
          LMM    10,T1
          STML   10,T1
          AOD    T6          ADVANCE *CBT* WORD ADDRESS 
          LMN    CM+5 
          NJN    WLB1        IF MORE LINKAGE
          LDC    1S17 
          CWML   SBUF,T5     UPDATE DATA BUFFER 
  
 WLB      SUBR               ENTRY/EXIT 
*         LDD    T6 
          UJN    WLB2        MOVE SECTOR LINKAGE
 WMC      SPACE  4,10 
**        WMC - WAIT MAINTENANCE CHANNEL EMPTY. 
* 
*         EXIT   (A) = 0 IF CHANNEL EMPTY.
*                    .NE. 0 IF CHANNEL HUNG FULL. 
  
  
 WMC3     LDN    0           INDICATE CHANNEL EMPTY 
  
 WMC      SUBR               ENTRY/EXIT 
          LDD    TH 
 WMC1     EJM.   WMC3,MR     IF TRANSMISSION COMPLETE 
          SBN    1
          NJN    WMC1        IF NOT TIMED OUT 
 WMC2     DCN.   MR+40
          CCF.   *+2,MR      CLEAR CHANNEL FLAG 
          LDD    CP 
          ADN    MS2W        STORE CP MESSAGE 
          CWM    WMCA,TR
          UJN    WMCX        RETURN 
  
  
 WMCA     DATA   C*MR ERROR.* 
 WTC      SPACE  4,10 
**        WTC - WAIT TRANSMISSION COMPLETE. 
* 
*         ERROR  TO *ERR*.
* 
*         USES   T1.
* 
*         CALLS  CFE. 
  
  
 WTC3     LDD    T1          CHECK FOR I/O ERROR
          RJM    CFE
          DCN    CH+40       DEACTIVATE CHANNEL 
  
 WTC      SUBR               ENTRY/EXIT 
          STD    T1 
          LDN    5           SET TIMEOUT = 5*262 MILLISECONDS 
          STD    T0 
 WTC1     LDN    0
 WTC2     EJM    WTC3,CH     IF LAST BYTE TAKEN OFF CHANNEL 
          SBN    1
          NJN    WTC2        IF NOT TIMED OUT 
          SOD    T0 
          NJN    WTC1        IF NOT TIMEOUT 
          LDN    ECHF 
          RJM    ERR         PROCESS CHANNEL ERROR
          TITLE  CHANNEL SUBROUTINES. 
 BCS      SPACE  4,10 
**        BCS - DEFINE INFORMATION TRANSFER.
* 
*         ENTRY  (A) = BUS *A* BITS 7 AND 6.
* 
*         ERROR  TO *ERR*.
* 
*         CALLS  FCN, RSR.
  
  
 BCS2     LDDL   LF          FETCH LAST FUNCTION
          LMN    0#32 
          RJM    FCN         DROP SYNC OUT (NO PARITY CHECK)
          LDN    77 
          RJM    RSR         READ SLAVE RESPONSE
  
 BCS      SUBR               ENTRY/EXIT 
          SHN    17-1 
          ADC    F005B       SET SYNC OUT 
          RJM    FCN
          LDN    77          READ SLAVE RESPONSE
          RJM    RSR
          LPC    377
          ZJN    BCS2        IF BUS ACKNOWLEDGE CORRECT 
          LDN    EBAE 
          RJM    ERR         PROCESS ERROR
 CFE      SPACE  4,10 
**        CFE - CHECK FOR I/O ERROR.
* 
*         ENTRY  (A) = RESIDUAL WORD COUNT. 
* 
*         EXIT   (A) = 0. 
* 
*         ERROR  TO *ERR*.
  
  
 CFE5     NJN    CFE3        IF INCOMPLETE DATA TRANSFER
  
 CFE      SUBR               ENTRY/EXIT 
          CFM    CFE5,CH     IF CHANNEL ERROR FLAG CLEAR
 CFE1     LDN    ECIE 
 CFE2     RJM    ERR         PROCESS CHANNEL ERROR
  
 CFE3     LDN    EIDT 
          UJN    CFE2        PROCESS ERROR
 CTC      SPACE  4,10 
**        CTC - CHECK TRANSFER COMPLETE.
* 
*         EXIT   (A) = 0. 
* 
*         ERROR  TO *ERR*.
* 
*         CALLS  CTO. 
  
  
 CTC      SUBR               ENTRY/EXIT 
 CTC1     LDC    F0700
          RJM    FCN         REQUEST OPERATIONAL STATUS 
          ACN    CH 
          IAN    CH          READ STATUS
          SFM    CFE1,CH     IF CHANNEL ERROR FLAG SET
          LPC    176001 
          ZJN    CTCX        IF TRANSFER COMPLETE 
          SCN    1
          NJN    CTC4        IF REGISTER PARITY ERROR 
          RJM    CTO         CHECK ELAPSED TIME 
          MJN    CTC1        IF NOT TIMEOUT 
          LDN    ETTC 
 CTC3     RJM    ERR         PROCESS ERROR
  
 CTC4     LDN    ERPE 
          UJN    CTC3        PROCESS ERROR
 DCM      SPACE  4,10 
**        DCM - DESELECT CONTROL MODULE.
* 
*         ENTRY  (SF) = 0 IF CONTROLLER NOT SELECTED. 
* 
*         EXIT   (A) = (SF) = 0.
* 
*         USES   SF.
* 
*         ERROR  TO *ERR*.
* 
*         CALLS  FCN. 
  
  
 DCM2     IAN    CH+40       READ CONTROLLER RESPONSE 
          LDN    0
          STD    SF          CLEAR SELECT FLAG
  
 DCM      SUBR               ENTRY/EXIT 
          LDD    SF 
          ZJN    DCMX        IF CONTROLLER NOT SELECTED 
          LDC    F0071
          RJM    FCN         CLEAR SELECT OUT 
          LDC    2000 
          ACN    CH 
 DCM1     FJM    DCM2,CH     IF SLAVE IN DROPPED
          SBN    1
          NJN    DCM1        IF NOT TIMED OUT 
          LDM    ESAD,DI
          NJN    DCM2        IF ERROR PROCESSING
          LDN    ECNR 
          RJM    ERR         PROCESS ERROR
 DTM      SPACE  4,10 
**        DTM - DETERMINE TRANSFER MODE.
* 
*         ENTRY  (A) = CONTROLLER NUMBER. 
* 
*         EXIT   (A) = CONTROLLER NUMBER + TRANSFER MODE CHANGE.
* 
*         USES   T4.
* 
*         CALLS  FCN, RSR.
  
  
 DTM      SUBR               ENTRY/EXIT 
          SHN    14 
          STDL   T4          SET CONTROLLER NUMBER IN RESPONSE
          LMC    F8025
          RJM    FCN         REQUEST TRANSFER MODE (SET MASTER OUT) 
          LDN    77 
          RJM    RSR         READ SLAVE RESPONSE
          LPN    0#10 
          LMN    0#10        COMPLEMENT TRANSFER MODE 
          SHN    13-4 
          RADL   T4          APPEND TRANSFER MODE TO RESPONSE 
          LDDL   LF 
          LMC    0#54        DROP MASTER OUT
          RJM    FCN
          LDN    77          READ SLAVE RESPONSE
          RJM    RSR
          LDDL   T4 
          UJP    DTMX        RETURN 
 ECI      SPACE  4,20 
**        ECI - EXAMINE CONTROLLER INTERRUPTS.
* 
*         ENTRY  (DI) = DEVICE STATUS BLOCK ADDRESS.
* 
*         EXIT   (A) .NE. 0, IF RESET OR ERROR IN PROGRESS. 
*                (PA) = 0 IF NO REQUEST IN PROGRESS.
*                (CM - CM+4) = *PILL* WORD OF *PUT* ENTRY.
*                (WB - WB+4) = *UNCT* WORD OF *PUT* ENTRY.
*                TO (ATTN) IF INTERRUPT RECEIVED. 
*                TO *SRS* IF LOGICAL RESET NOT YET PERFORMED. 
* 
*         USES   PA, T5.
* 
*         CALLS  FCN, GIS, IHD, LDP, SAP, SUI.
  
  
 ECI      SUBR               ENTRY/EXIT 
 ECI1     RJM    SAP         SELECT ADAPTOR PORT
          LDC    F0715       ENABLE INTERRUPTS
          RJM    FCN
          RJM    LDP         LOAD DEVICE PARAMETERS 
          RJM    GIS         GET INTERRUPT STATUS 
          LPML   TMSK,CN
          ZJN    ECI3        IF NO INTERRUPT FROM THIS CONTROLLER 
  
*         CHECK THAT INTERRUPT BELONGS TO CURRENT DRIVE.
  
          RJM    IHD
          ZJN    ECI3        IF RESPONSE FROM INACTIVE DRIVE
*         LDM    ATTN,DI
          STD    PA          SET RETURN ADDRESS 
          LDN    0
          STM    ATTN,DI     DEACTIVATE RETURN
          STM    ADDR,DI     CLEAR REENTRY ADDRESS
  
*         RETURN TO CALLER WITH STATUS FROM RESPONSE PACKET.
  
          LDM    EEST,DI     EXPECTED RESPONSE TYPE 
          LMD    RT 
          ZJN    ECI2        IF EXPECTED RESPONSE 
          LMD    RT 
          LMD    MS 
          ZJN    ECI2        IF EXPECTED STATUS 
          LMK    CMCS&CMSS
 ECI2     LJM    0,PA        RETURN TO CALLER 
  
 ECI3     LDD    PA 
          NJN    ECI2        IF REQUEST IN PROGRESS 
          LDM    ERFL 
          ZJN    ECI4        IF DRIVER NOT IN ERROR PROCESSING
          LMD    DI 
          NJN    ECI7        IF ERROR ON DIFFERENT DEVICE 
 ECI4     LDM    SRSA 
          NJN    ECI7        IF RESET IN PROGRESS 
          LDM    PNUN,DI
          SHN    -6          SET CONTROLLER BLOCK INDEX 
          STD    T5 
          LDML   CSTB,T5     CHECK CONTROLLER STATUS
          SHN    -16
          ZJN    ECI7        IF AVAILABLE 
          SHN    -1 
          ZJN    ECI8        IF NOT SLAVE RESET FAILURE 
          LDM    ENAD,DI
          NJN    ECI6        IF DRIVE ALREADY DISABLED
          LDC    SRSH 
          STM    IOMA        SET ERROR MESSAGE
          STM    ENAD,DI     DISABLE DRIVE
 ECI6     LDN    0
 ECI7     LJM    ECIX        RETURN 
  
*         AT DRIVER INITIATION, PERFORM LOGICAL RESET ON CONTROLLING
*         DRIVE OF EACH CONTROL MODULE.  NO ACTIVITY ON OTHER DRIVES
*         ON THE CONTROL MODULE WILL BE ALLOWED UNTIL THE RESET IS
*         COMPLETE. 
  
 ECI8     LDM    CSTB,T5     CHECK CONTROLLING DRIVE INDEX
          LMD    DI 
          NJN    ECI7        IF NOT THIS DRIVE
          RJM    SUI         SET UNIT INTERLOCK 
          NJN    ECI7        IF DEVICE ASSIGNED ELSEWHERE 
          LDC    1S12+CMP 
          LJM    SRS         INITIATE LOGICAL RESET 
 FCN      SPACE  4,10 
**        FCN - ISSUE FUNCTION. 
* 
*         ENTRY  (A) = FUNCTION CODE. 
* 
*         EXIT   (A) .NE. 0.
*                (LF) = FUNCTION CODE.
* 
*         USES   LF.
* 
*         ERROR  TO *ERR*.
  
  
 FCN2     DCN    CH+40       LEAVE CHANNEL INACTIVE 
  
 FCN      SUBR               ENTRY/EXIT 
          DCN    CH+40
          STDL   LF 
          FAN    CH          ISSUE FUNCTION 
          LDN    20D
 FCN1     IJM    FCNX,CH     IF FUNCTION ACCEPTED 
          SBN    1
          NJN    FCN1        IF NOT TIMED OUT 
          LDM    ESAD,DI
          NJN    FCN2        IF ERROR IN PROGRESS 
          LDN    ETFN 
          RJM    ERR         PROCESS ERROR
 GIS      SPACE  4,10 
**        GIS - GET INTERRUPT STATUS. 
* 
*         EXIT   (A) = (GISA) = INTERRUPT STATUS. 
* 
*         CALLS  FCN, RSR.
  
  
 GIS2     IAN    CH          READ INTERRUPT STATUS
 GIS3     STML   GISA 
          LDC    F0711       NEGATE MASTER OUT
          RJM    FCN
          LDN    20D         READ SLAVE RESPONSE
          RJM    RSR
          LDML   GISA        RETURN WITH (A) = STATUS 
  
 GIS      SUBR               ENTRY/EXIT 
          LDN    20D
          ACN    CH+40
 GIS1     FJM    GIS2,CH     IF SLAVE IN
          SBN    1
          NJN    GIS1        IF NOT TIMED OUT 
*         LDN    0
          UJP    GIS3        SET NULL STATUS
  
  
 GISA     CON    0
 GSS      SPACE  4,15 
**        GSS - GET SLAVE STATUS. 
* 
*         ENTRY  (A) = 0 IF STATUS W/O MASTER TERMINATE.
*                    = MASTER TERMINATE OPTION. 
*                (T1) = RESIDUAL BYTE COUNT.
* 
*         EXIT   (A) = (T7) = SLAVE STATUS IF TRANSFER SUCCESSFUL.
*                (GSSA) = SLAVE STATUS AS READ FROM CONTROLLER. 
* 
*         ERROR  TO *ERR* IF STATUS ERROR.
* 
*         USES   T7.
* 
*         CALLS  FCN, RRP, RSR. 
  
  
 GSS5     LDML   GSSA        ENDING STATUS
          STDL   T7 
  
 GSS      SUBR               ENTRY/EXIT 
          SHN    10 
          ADC    F8039       INDICATE TRANSFER SUCCESSFUL 
          RJM    FCN
          LDC    2000        READ SLAVE RESPONSE
          RJM    RSR
          STML   GSSA 
          SFM    GSS3,CH     IF ERROR FLAG SET
          SHN    21-7 
          PJN    GSS1        IF TRANSFER NOT SUCCESSFUL 
          LDD    T1 
          ZJN    GSS5        IF ALL WORDS TRANSFERRED 
          LDN    EIDT 
          UJN    GSS4        PROCESS ERROR
  
 GSS1     SHN    10 
          LPC    117
          LMN    3
          NJN    GSS2        IF NOT COMMAND REJECT
  
*         IF CONTROLLER OVER TEMPERATURE OCCURS BEFORE THE COMMAND IS 
*         ISSUED, A COMMAND REJECT ERROR COULD OCCUR.  A LOGICAL RESET
*         WOULD CAUSE THE OVER TEMPERATURE STATUS TO BE LOST. 
  
          RJM    RRP         READ RESPONSE PACKET 
          LCN    EUST 
          UJN    GSS4        PROCESS ERROR
  
 GSS2     LDN    EUST 
          UJN    GSS4        PROCESS ERROR
  
 GSS3     LDN    ECIE 
 GSS4     RJM    ERR         PROCESS ERROR
  
  
 GSSA     CON    0           ENDING STATUS
 IHD      SPACE  4,15 
**        IHD - INTERRUPT HANDLER.
* 
*         ENTRY  (DI) = *DSTB* ADDRESS. 
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   (A) = EXIT CONDITION FROM ROUTINE *VIS*. 
*                    = 0 IF INTERRUPT FOR INACTIVE DRIVE. 
*                    = RETURN ADDRESS TO PROCESSOR. 
*                (MS) = MAJOR STATUS FROM RESPONSE PACKET.
*                (RT) = RESPONSE TYPE FROM STATUS BLOCK.
* 
*         USES   DI, MS, RT, T4.
* 
*         CALLS  CCO, DCM, LDP, LSD, RRP, SCM, VIS. 
  
  
 IHD4     LCN    0           INDICATE ASYNC INTERRUPT 
 IHD5     RJM    VIS         VERIFY INTERRUPT SOURCE
  
 IHD      SUBR               ENTRY/EXIT 
          RJM    SCM         SELECT CONTROL MODULE
          RJM    RRP         READ RESPONSE PACKET 
          LDML   RPBF+MST 
          STDL   MS          SAVE MAJOR STATUS
          SHN    -4 
          LPN    17          EXTRACT RESPONSE TYPE
          STD    RT 
          LMN    XFNT 
          ZJN    IHD5        IF TRANSFER NOTIFICATION 
          RJM    DCM         DESELECT CONTROL MODULE
          LDD    RT          CHECK RESPONSE TYPE
          LMN    ASRT 
          NJN    IHD5        IF NOT ASYNC (UNSOLICITED) RESPONSE
          LDM    RPBF+CUN 
          LPC    377
          STD    T4          SAVE DRIVE NUMBER
          LMC    0#FF 
          NJN    IHD1        IF NOT RESPONSE FROM CONTROLLER
          LDN    1           ISSUE BML MESSAGE IF OVER TEMPERATURE
          RJM    CCO         CHECK FOR CONTROLLER OVER TEMPERATURE
          LDM    SRSA 
          ZJN    IHD3        IF RESET NOT IN PROGRESS 
          STD    DI          SET DEVICE INDEX 
          RJM    LDP
 IHD0     LJM    IHD4        PROCESS ASYNC INTERRUPT
  
*         ON SLAVE RESET, IF DRIVE INTERRUPT FOR THE CONTROLLING DRIVE
*         IS RECEIVED BEFORE THE CONTROLLER INTERRUPT, CLEAR *SRSC* 
*         AND DISCARD DRIVE INTERRUPT.
  
 IHD1     LDD    T4          CHECK FACILITY ADDRESS 
          LMD    DN 
          ZJN    IHD2        IF INTERRUPT FROM CURRENT DRIVE
          RJM    LSD         LOCATE SELECTED DRIVE
          ZJN    IHD3        IF DRIVE UNKNOWN ON THIS CONTROLLER
          STD    DI          SET DEVICE INDEX 
          RJM    LDP
 IHD2     LDM    SRSA        CHECK RESET IN PROGRESS
          LMD    DI 
          NJN    IHD0        IF NOT DRIVE CONTROLLING RESET 
          STM    SRSC        INDICATE DRIVE INTERRUPT RECEIVED
 IHD3     LJM    XMD2        RETURN TO MAIN LOOP
 RCR      SPACE  4,10 
**        RCR - RESET CHANNEL REGISTERS.
* 
*         ENTRY  (CR) = CHANNEL RESERVATION STATUS. 
* 
*         EXIT   (SF) = 0 (DEVICE NOT SELECTED).
* 
*         CALLS  FCN. 
* 
*         MACROS WAIT.
  
  
 RCR      SUBR               ENTRY/EXIT 
          LDD    CR 
          ZJN    RCRX        IF CHANNEL NOT RESERVED
          LDN    F0000
          RJM    FCN         MASTER CLEAR THE ADAPTOR 
          WAIT   100
*         LDN    0           SET DEVICE NOT SELECTED
          STD    SF 
          ADK    F0000-0     ENSURE NO SEQUENCE ERROR 
          RJM    FCN
          LDC    F7E42       FIX CHANNEL TRANSFER RATE AT 10 MB 
          RJM    FCN
          UJN    RCRX        RETURN 
 RIF      SPACE  4,15 
**        RIF - RESET INTERFACE.
* 
*         ENTRY  (RW) = 0 TO RESET SLAVE INTERFACE. 
*                (RW) = 1 TO RESET LOGICAL INTERFACE. 
*                (CN) = CONTROLLER NUMBER.
* 
*         EXIT   (RF) = 1.
* 
*         USES   RF.
* 
*         CALLS  FCN, RCR, SAP. 
* 
*         MACROS WAIT.
  
  
 RIF      SUBR               ENTRY/EXIT 
          AOD    RF          FLAG RESET IN PROGRESS 
          RJM    RCR         RESET CHANNEL REGISTERS
          RJM    SAP         SELECT ADAPTOR PORT
          LDD    CN 
          SHN    14          FORM RESET FUNCTION
          LMML   RIFA,RW
          RJM    FCN         ISSUE LOGICAL RESET
          WAIT   20 
          LDDL   LF 
          LMN    2           SET SYNC OUT 
          RJM    FCN
          WAIT   10 
          LDDL   LF          NEGATE SYNC OUT
          SCN    2
          RJM    FCN
          LDDL   LF          CLEAR MASTER OUT 
          SCN    4
          RJM    FCN
          UJP    RIFX        RETURN 
  
  
 RIFA     BSS    0           RESET FUNCTION CODES 
          CONL   F8415
          CONL   F8215
 RRP      SPACE  4,10 
**        RRP - READ RESPONSE PACKET. 
* 
*         USES   T1.
* 
*         CALLS  BCS, FCN, GSS. 
  
  
 RRP5     LDN    0           GET ENDING STATUS
          RJM    GSS
  
 RRP      SUBR               ENTRY/EXIT 
          LDN    RIIN 
          RJM    BCS         INITIATE BUS EXCHANGE (RESPONSE IN)
          LDC    F0281
          RJM    FCN         READ STREAMING 
          ACN    CH 
          LDN    RPBFL       TRANSFER RESPONSE PACKET 
          IAM    RPBF,CH
          STD    T0          SAVE RESIDUE 
          SBN    RPBFL-4
          PJN    RRP2        IF INVALID PACKET LENGTH 
          LDM    RPBF+PLN 
          ADN    3           CONVERT OCTET COUNT TO BYTE COUNT
          SHN    -1 
          RAD    T0 
 RRP2     LDK    RPBFL       COMPARE LENGTH WITH DATA READ
          SBD    T0 
          STD    T1          SET RESIDUAL BYTE COUNT
          LDC    50000D 
 RRP3     IJM    RRP5,CH     IF SLAVE IN
          SBN    1
          NJN    RRP3        IF NOT TIMED OUT 
          LCN    ECNR 
          RJM    ERR         PROCESS ERROR
 RSR      SPACE  4,10 
**        RSR - READ SLAVE RESPONSE.
* 
*         ENTRY  (A) = TIMEOUT VALUE (MICROSECONDS).
* 
*         EXIT   (A) = SLAVE RESPONSE.
* 
*         ERROR  TO *ERR* IF SLAVE NOT RESPONDING.
  
  
 RSR4     IAN    CH          READ SLAVE RESPONSE
  
 RSR      SUBR               ENTRY/EXIT 
          ACN    CH 
 RSR1     FJM    RSR4,CH     IF SLAVE IN DROPPED
          SBN    1
          NJN    RSR1        IF NOT TIMED OUT 
          LDN    ECNR 
          RJM    ERR         PROCESS ERROR
 RTR      SPACE  4,10 
**        RTR - READ *T* REGISTER.
  
  
 RTR2     ACN    CH          ACTIVATE CHANNEL 
          LDN    3
          IAM    EDBF+TREG,CH  INPUT REGISTER CONTENTS
  
 RTR      SUBR               ENTRY/EXIT 
          FNC    F0A00,CH 
 RTR1     IJM    RTR2,CH     IF FUNCTION ACCEPTED 
          SBN    77 
          PJN    RTR1        IF NOT TIMED OUT 
          DCN    CH+40
          UJN    RTRX        RETURN 
 SAP      SPACE  4,10 
**        SAP - SELECT ADAPTOR PORT.
* 
*         CALLS  FCN. 
  
  
 SAP      SUBR               ENTRY/EXIT 
          LDM    PNUN,DI
          SHN    0-11        ISOLATE PORT NUMBER
          SHN    13-0 
          ERRNZ  F0062+4000-F0862  CODE DEPENDS ON VALUE
          ADC    F0062
          RJM    FCN
          UJN    SAPX        RETURN 
 SCM      SPACE  4,10 
**        SCM - SELECT CONTROL MODULE.
* 
*         ENTRY  (SF) = 1 IF DEVICE PREVIOUSLY SELECTED.
*                (CN) = CONTROLLER (CM3) NUMBER.
* 
*         EXIT   (A) = (SF) = 1 = DEVICE SELECTED.
* 
*         ERROR  TO *ERR* IF SELECT REJECT. 
* 
*         CALLS  DTM, FCN, RSR, SAP.
  
  
 SCM3     AOD    SF          SET DEVICE SELECTED
  
 SCM      SUBR               ENTRY/EXIT 
          LDD    SF 
          NJN    SCMX        IF DEVICE PREVIOUSLY SELECTED
          STM    GSSA 
          RJM    SAP         SELECT ADAPTOR PORT
          LDD    CN 
          RJM    DTM         DETERMINE TRANSFER MODE
          LMN    F0029
          RJM    FCN         SET SELECT OUT 
          LDN    77 
          RJM    RSR         READ SLAVE RESPONSE
          LPML   TMSK,CN
          NJN    SCM3        IF CORRECT CONTROLLER
          LDN    ETSL 
          RJM    ERR         PROCESS ERROR
 WCB      SPACE  4,15 
**        WCB - WRITE COMMAND BLOCK (PACKET). 
* 
*         ENTRY  (A) = COMMAND BLOCK LENGTH.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (TO) = TIMEOUT VALUE.
* 
*         ERROR  TO *ERR*.
* 
*         USES   T1.
* 
*         CALLS  BCS, DCM, FCN, GSS, SCM, STO.
  
  
 WCB3     LDN    0           GET STATUS 
          RJM    GSS
          RJM    DCM         DESELECT CONTROL MODULE
          LDD    TO 
          RJM    STO         SET TIMEOUT
  
 WCB      SUBR               ENTRY/EXIT 
          STM    CPBF+PLN 
          LDD    DI          SET COMMAND REFERENCE NUMBER 
          STM    CPBF+CRN 
          RJM    SCM         SELECT CONTROL MODULE
          LDN    CIOT 
          RJM    BCS         INITIATE BUS EXCHANGE (COMMAND OUT)
          LDML   CPBF+OPC 
          STML   LCMD,DI     SAVE LAST COMMAND
          LDC    F0381
          RJM    FCN         WRITE STREAMING
          ACN    CH 
          LDM    CPBF+PLN    CONVERT OCTET COUNT TO BYTE COUNT
          ADN    3
          SHN    -1          TRANSFER COMMAND PACKET
          OAM    CPBF,CH
          STD    T1          SAVE RESIDUAL BYTE COUNT 
          LDC    50000D 
 WCB2     IJM    WCB3,CH     IF SLAVE IN
          SBN    1
          NJN    WCB2        IF NOT TIMED OUT 
          LDN    ECNR 
          RJM    ERR         PROCESS ERROR
 WTR      SPACE  4,10 
**        WTR - WRITE *T* PRIME REGISTER. 
* 
*         ENTRY  (CB) = *CBT* ORDINAL.
*                (RW) = READ / WRITE STATUS.
* 
*         CALLS  FCN, STO, SLB, SUA, WTC. 
  
  
 WTR      SUBR               ENTRY/EXIT 
          LDD    RW 
          ZJN    WTR1        IF READ REQUEST
          LDD    CB 
          RJM    SLB         SET LINKAGE BITS 
 WTR1     LDD    CB 
          RJM    SUA         GET UEM BUFFER ADDRESS 
          LDD    UA+1 
          SHN    11          FORMAT ADDRESS 
          SCN    7
          STML   WTRA+2      SET ABSOLUTE ADDRESS 
          LDD    UA 
          SHN    14          COMPLETE BUFFER ADDRESS
          LMD    UA+1 
          SHN    11-20       INSERT IN REGISTER IMAGE 
          STM    WTRA+1 
          LDML   WTRB,RW     ISSUE DMA FUNCTION 
          RJM    FCN
          LDN    3           SET BLOCK LENGTH 
          ACN    CH 
          OAM    WTRA,CH     OUTPUT BUFFER PARAMETERS 
          RJM    WTC
          LDN    3           SET REQUEST TIMEOUT
          RJM    STO
          UJP    WTRX        RETURN 
  
  
 WTRA     BSS    0           *T* REGISTER BUFFER
          CONL   40000       BYTE LENGTH OF I/O TRANSFER
          CONL   0,0         UEM ADDRESS OF BUFFER
  
 WTRB     BSS    0           DMA I/O FUNCTIONS
          CONL   F0C00
          CONL   F0D00
          TITLE  MISCELLANEOUS. 
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMPCHD 
*CALL     COMPC2D 
 RND$     EQU    0           DEFINE ROUNDING FOR *COMPDV5*
*CALL     COMPDV5 
 M8K$     EQU    1           USE LONG INSTRUCTIONS
*CALL     COMPIMB 
          QUAL   SES
 QUAL$    EQU    0           DONT FURTHER QUALIFY *SES* 
 T5       EQU    EO 
*CALL     COMPSES 
          QUAL   *
 SES      EQU    /SES/SES 
          SPACE  4,10 
*         BUFFERS.
  
  
 RPBF     BSS    0           RESPONSE PACKET BUFFER 
  
 CPBF     EQU    RPBF+1      COMMAND PACKET BUFFER
  
 RBUF     EQU    RPBF+RPBFL  REGISTER BUFFER
 RBUFL    EQU    2*4
  
 SBUF     EQU    RBUF+RBUFL  SCRATCH BUFFER 
 SBUFL    EQU    3*5
          SPACE  4,10 
 EDBF     EQU    20000-400-RTEDL  ERROR DATA BUFFER 
          ERRNG  400-EDBFL+RTEDL  CODE DEPENDS ON VALUE 
          ERRPL  SBUF+SBUFL-EDBF  BUFFER OVERLAP
  
 MSGP     EQU    EDBF+EMBF   MESSAGE PREFIX 
 MSGL     EQU    MSGP+2      MESSAGE LENGTH 
 MSGT     EQU    MSGL+2      MESSAGE TYPE 
  
 BMLM     EQU    MSGT+1      BML MESSAGE HEADER 
 MSID     EQU    BMLM        MESSAGE ID 
 UNIT     EQU    MSID+3      UNIT NUMBER
 PORT     EQU    UNIT+1      PORT NUMBER
 ESTO     EQU    PORT+1      EST ORDINAL
 MISC     EQU    ESTO+1      RETRY COUNT / WRITE + RECOVERY FLAGS 
 MFID     EQU    MISC+2      MAINFRAME ID 
          TITLE  INSTRUCTION MODIFICATION TABLES. 
 TCHA     SPACE  4,10 
**        TABLE OF CHANNEL INSTRUCTIONS ADDRESSES.
  
  
 TCHA     CHTB
          CON    0           END OF TABLE 
  
          RSTC               RESTORE CHANNEL INSTRUCTIONS 
 TCBT     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING FWA OF *CBT*. 
  
  
 TCBT     BSS    0
 TCBT     HERE
          CON    0           TERMINATE TABLE
 TCCT     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING ADDRESS OF *CCT* ENTRY. 
  
  
 TCCT     BSS    0
 TCCT     HERE
          CON    0           TERMINATE TABLE
 TCHT     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING FWA OF CHANNEL TABLE. 
  
  
 TCHT     BSS    0
 TCHT     HERE
          CON    0           TERMINATE TABLE
 TEMB     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING FWA OF *EMB*. 
  
  
 TEMB     BSS    0
          QUAL   COMPIMB
 TEMB     HERE
          QUAL   *
          CON    0           TERMINATE TABLE
 TEXP     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING FWA OF PP EXCHANGE PACKAGE. 
  
  
 TEXP     BSS    0
 TEXP     HERE
          CON    0           TERMINATE TABLE
 TPUT     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING FWA OF *PUT*. 
  
  
 TPUT     BSS    0
 TPUT     HERE
          CON    0           TERMINATE TABLE
          TITLE  PRESET.
 PRS      SPACE  4,20 
**        PRS - PRESET DRIVER FOR PROCESSING. 
* 
*         EXIT   (UC) = 0.
*                TO *MRS*.
*                TO *XMD8* IF CHANNEL DOWN OR NO DEVICES FOR DRIVER.
* 
*         CALLS  CCP, CCR2, IST, MCI, SCT, SPA, STA.
  
  
 PRS      BSS    0           ENTRY
          RJM    CCP         CHECK CALLING PROGRAM
*         LDN    0
          STD    UC          SET NO UNITS RESERVED
          LDC    EDBF 
          ERRPL  ENDD-EDBF   CODE DEPENDS ON VALUE
          STDL   T4 
          RJM    MCI         MODIFY CHANNEL INSTRUCTIONS
*         LDN    0
          STD    CR          SET CHANNEL NOT RESERVED 
  
*         PRESET BML ERROR MESSAGE BUFFER.
  
 PRS1     STI    T4 
          AODL   T4          ADVANCE BUFFER ADDRESS 
          SHN    0-15 
          ZJN    PRS1        IF NOT END OF BUFFER 
          LDN    MLDY 
          STM    MSGT 
          LDC    BMID        ERROR MESSAGE ID 
          STM    MSID 
          RJM    SPA         SET PP EXCHANGE PACKAGE ADDRESSES
          RJM    SCT         SET CHANNEL TABLE ADDRESSES
          LDK    BIOL 
          CRD    CM          READ BUFFERED I/O POINTERS 
          LDD    CM+1 
          SHN    14 
          LMD    CM+2 
          ADN    CCTP        READ *CCT* POINTER 
          CRD    T4 
          ADN    CBTP-CCTP   READ *CBT* POINTER 
          CRD    WB 
          SBN    -PUTP+CBTP  READ *PUT* POINTER 
          CRD    T2 
          LDD    T2+3        SET ADDRESS OF *PUT* 
          LPN    77 
          RAM    ISTA 
          LDD    T2+4 
          RAM    ISTA+1 
          AOD    T2          SET NUMBER OF *PUT* ENTRIES
          STD    RC 
          LDC    T5*20000+TPUT  SET *PUT* ADDRESSES 
          RJM    STA
          LDD    IR+2        ADJUST CHANNEL CONTROL TABLE POINTER 
          SHN    CCTLS-6
          RAD    CM 
          SHN    -14
          RAD    T7 
          LDC    T7*20000+TCCT  SET *CCT* ADDRESSES 
          RJM    STA
 .WB3     EQU    WB+3 
          LDC    .WB3*20000+TCBT  SET *CBT* ADDRESSES 
          RJM    STA
          LDN    EMBP        FETCH *EMB* POINTER
          CRD    CM 
 .CM1     EQU    CM+1 
          LDC    .CM1*20000+TEMB  SET *EMB* ADDRESSES 
          RJM    STA
          LDK    UEML 
          CRD    CM          READ UEM POINTERS
          LDD    CM 
 PRSA     SHN    11 
*         SHN    11+EMSC
          SCN    77 
          STM    SUAA        SET FWA OF UEM 
          LDD    CM 
 PRSB     SHN    -3 
*         SHN    EMSC-3 
          STM    SUAB 
          LDK    MMFL        FETCH MACHINE ID 
          CRD    CM 
          LDD    CM          SET MAINFRAME ID FOR BML MESSAGES
          STM    MFID 
          RJM    IST         INITIALIZE DEVICE STATE TABLE
          ZJN    PRS4        IF NO DEVICES FOR THIS DRIVER
          LJM    CCR2        RESERVE CHANNEL (RETURN TO *PRS3*) 
  
 PRS3     NJP    MRS         IF CHANNEL NOT DOWN
 PRS4     LJM    XMD8        DROP CPP 
          TITLE  PRESET SUBROUTINES.
 CCP      SPACE  4,10 
**        CCP - CHECK CALLING PROGRAM.
* 
*         EXIT   (A) = 0. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  DFM. 
* 
*         MACROS MONITOR. 
  
  
 CCP      SUBR               ENTRY/EXIT 
          LDK    NCPL 
          CRD    CM          GET NUMBER OF CONTROL POINTS 
          AOD    CM+1 
          SHN    7
          LMD    CP 
          ZJN    CCPX        IF DRIVER AT SYSTEM CP 
          LDC    MSG1 
          RJM    DFM         ISSUE DAYFILE MESSAGE
          MONITOR  ABTM 
          LJM    PPR         EXIT TO PP RESIDENT
 IST      SPACE  4,15 
**        IST - INITIALIZE DEVICE STATE TABLE.
* 
*         ENTRY  (RC) = NUMBER OF *PUT* ENTRIES.
* 
*         EXIT   (A) = 0 IF NO DEVICES FOR THIS DRIVER. 
*                (DI) = DEVICE INDEX FOR FIRST DEVICE, IF PRESENT.
*                DEVICE PARAMETERS SET FOR FIRST DEVICE, IF PRESENT.
* 
*         USES   DI, TA, T5, CM - CM+4, WB - WB+4.
* 
*         CALLS  LDP. 
* 
*         MACROS SFA. 
  
  
 IST7     LDD    DI          DEFINE END OF DEVICES
          STM    XMDA 
          LMC    DSTB        SET EXIT CONDITION 
          ZJN    ISTX        IF NO DEVICES FOR THIS DRIVER
          LDC    DSTB        SET DEVICE INDEX FOR FIRST DEVICE
          STD    DI 
          STD    TA 
          RJM    LDP         LOAD DEVICE PARAMETERS 
  
 IST      SUBR               ENTRY/EXIT 
          LDC    OCMD-1 
          STD    DI 
 IST1     LDN    0           CLEAR DEVICE STATE TABLE 
          STI    DI 
          SOD    DI 
          LMC    DSTB 
          NJN    IST1        IF MORE TO CLEAR 
*         LDN    0
          STD    T5          INITIALIZE *PUT* ORDINAL 
 IST2     AOD    T5 
          LMD    RC 
          ZJN    IST7        IF END OF PHYSICAL UNIT TABLE
          LDD    T5 
          SHN    PUTLS       READ *PUT* ENTRY 
 ISTA     ADC    UNCT+**     GET UNIT CONTROL WORD
          CRD    WB 
          SFA    EST,WB+1    FETCH EST ENTRY
          ADK    EQDE 
          CRD    CM 
          LDN    CM          INITIALIZE CHANNEL BYTE ADDRESS
          STD    CM 
 IST3     AOD    CM          ADVANCE PATH DESCRIPTOR ADDRESS
          LMN    CM+3 
          ZJN    IST2        IF TWO POSSIBLE CHANNELS CHECKED 
          LDI    CM 
          ZJN    IST3        IF NULL ACCESS 
          LMD    IR+4 
          LPN    77 
          NJN    IST3        IF NOT THIS DRIVERS CHANNEL
          LDD    T5          SET *PUT* ORDINAL IN STATE TABLE 
          STI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          LDC    1S14+1S13   SET INTERNAL SPECIAL REQUEST FLAGS 
          STML   IPPS,DI
          LDI    CM 
          LPC    200         SET PORT NUMBER
          SHN    11-7 
          STM    PNUN,DI
          LDD    WB          GET CONTROLLER AND UNIT NUMBERS
          LPC    777
          RAM    PNUN,DI     APPEND TO PORT NUMBER
          SHN    -6 
          STD    WB+4        SET *CSTB* INDEX 
          LDM    CSTB,WB+4
          NJN    IST5        IF CONTROLLER IDENTIFIED 
          LDD    DI 
          LMC    1S14        RESET FLAG + FIRST *PUT* ORDINAL 
          STML   CSTB,WB+4
 IST5     LDN    DSTBE
          RAD    DI          ADVANCE STATE TABLE ADDRESS
          LMC    DSTBL
          NJP    IST2        IF DEVICE TABLE NOT FULL 
          LJM    IST7        SET INITIAL STATE TABLE ADDRESS
 MCI      SPACE  4,10 
**        MCI - MODIFY CHANNEL INSTRUCTIONS.
* 
*         ENTRY  (IR+4) = CONCURRENT CHANNEL NUMBER.
* 
*         EXIT   (A) = 0. 
* 
*         USES   T1, T2, T3.
* 
*         CALLS  C2D. 
  
  
 MCI1     LDD    T3 
          SBN    CH 
          RAIL   T2          MODIFY CHANNEL INSTRUCTION 
          AOD    T1 
 MCI2     LDML   TCHA,T1     EXTRACT CHANNEL NUMBER 
          STDL   T2 
          NJN    MCI1        IF MORE INSTRUCTIONS TO MODIFY 
  
 MCI      SUBR               ENTRY/EXIT 
          LDD    IR+4 
          LPN    37          EXTRACT CHANNEL NUMBER 
          STD    T3 
          RJM    C2D         CONVERT FOR OPERATOR MESSAGES
          STM    SRSH+14
          STM    SRSG+13
          LDN    0           INITIALIZE REMOTE TABLE INDEX
          STD    T1 
          UJN    MCI2        ENTER LOOP 
 MRS      SPACE  4,10 
**        MRS - MASTER RESET SLAVES.
* 
*         EXIT   TO *XMD4*. 
* 
*         USES   T1.
* 
*         CALLS  FCN, RCR.
* 
*         MACROS WAIT.
  
  
 MRS      BSS    0           ENTRY
          RJM    RCR         MASTER CLEAR CHANNEL 
          LDN    1
          STD    T1 
          SHN    13-0        POSITION PORT NUMBER 
 MRS2     LMC    F0062
          RJM    FCN         SELECT ADAPTOR PORT
          LDC    F9213
          RJM    FCN         ISSUE MASTER RESET 
          WAIT   10 
          LDDL   LF          LAST FUNCTION
          SCN    2
          RJM    FCN         CLEAR SYNC OUT 
          SOD    T1 
          ZJN    MRS2        IF ANOTHER PORT TO PROCESS 
          LJM    XMD4        ENTER MAIN LOOP
 SCT      SPACE  4,10 
**        SCT - SET CHANNEL TABLE ENTRY ADDRESSES.
* 
*         ENTRY  (IR+4) = CHANNEL NUMBER. 
* 
*         USES   T1, T2, CM - CM+4. 
* 
*         CALLS  C2D, STA.
  
  
 SCT      SUBR               ENTRY/EXIT 
          LDD    IR+4 
          STD    T1          SET CHANNEL NUMBER 
          STM    RCSA+3 
          RAM    BMLM+2 
          RJM    C2D         CONVERT FOR ERROR MESSAGE
          STM    LDAA+6 
          LCN    0           WORD OFFSET
          STD    T2 
 SCT1     AOD    T2          INCREMENT WORD OFFSET
          LCN    5
          RAD    T1 
          PJN    SCT1        IF CHANNEL NOT IN THIS WORD
          ADN    5
          STD    T1 
          RAM    RCTA        SET BYTE OFFSET
          LDD    T1 
          SHN    1           BYTE OFFSET * 2
          ADD    T1          BYTE OFFSET * 3
          SHN    2           BYTE OFFSET * 12 
          SBN    59D         (BYTE OFFSET * 12) - 59
          LMC    -0          59 - (BYTE OFFSET * 12)
          SBN    2
          SHN    6
          STM    SRFA+1      SET DRIVER FLAG BIT POSITION 
          LDK    CHTP 
          CRD    CM 
          LDD    T2          SET ADDRESS OF WORD IN CHANNEL TABLE 
          RAD    CM+3 
          SHN    -14
          RAD    CM+2 
 .CM2     EQU    CM+2 
          LDC    .CM2*20000+TCHT  SET CHANNEL TABLE ADDRESSES 
          RJM    STA
          LJM    SCTX        RETURN 
 SPA      SPACE  4,10 
**        SPA - SET PP EXCHANGE PACKAGE ADDRESSES.
* 
*         USES   T1 - T5, CM - CM+4.
* 
*         CALLS  STA. 
  
  
 SPA      SUBR               ENTRY/EXIT 
          LDN    PXPP 
          CRD    CM          FETCH FWA OF PP EXCHANGE PACKAGE AREA
          ADN    1
          CRM    AMEA,ON     SET FIRST WORD OF PP EXCHANGE PACKAGE
          ADN    PPCP-PXPP-2
          CRD    T1          READ PP COMMUNICATION AREA POINTER 
          LDD    IA 
          STM    AMEA+4      SET (B0) NON-ZERO FOR EXCHANGE TEST
          SBD    T1+4 
          SHN    -3          (A) = CPP NUMBER 
          SBN    24 
          SHN    6
          STM    BMLM+2      INSERT CPP NUMBER IN BML MESSAGE 
          SHN    -6 
          ADN    24-2 
          STD    T1          CPP NUMBER - 2 
          SHN    4
          ADD    T1          (CPP NUMBER - 2) * 21B 
          RAD    CM+4 
          SHN    -14
          RAD    CM+3 
 .CM3     EQU    CM+3 
          LDC    .CM3*20000+TEXP  SET EXCHANGE PACKAGE ADDRESSES
          RJM    STA
          LJM    SPAX        RETURN 
 STA      SPACE  4,10 
**        STA - SET TABLE ADDRESSES.
* 
*         ENTRY  (A) = 5/ TP, 13/ TA
*                      TP = TABLE POINTER.
*                      TA = INSTRUCTION TABLE ADDRESS.
* 
*         EXIT   (A) = 0. 
* 
*         USES   T1, T2, T3.
  
  
 STA1     STDL   T2          SET INSTRUCTION ADDRESS
          LDM    1,T1 
          RAM    1,T2        SET LOWER 12 BITS OF ADDRESS 
          SHN    -14
          ADI    T1          SET UPPER 6 BITS OF ADDRESS
          LPN    37 
          RAI    T2 
          AODL   T3          ADVANCE INSTRUCTION LIST 
 STA2     LDIL   T3 
          NJN    STA1        IF NOT END OF TABLE
  
 STA      SUBR               ENTRY/EXIT 
          STDL   T3 
          SHN    -15         SET POINTER ADDRESS
          STD    T1 
          LDDL   T3          SET INSTRUCTION TABLE ADDRESS
          LPC    17777
          STDL   T3 
          UJN    STA2        ENTER LOOP 
  
  
 ENDD     BSS    0           END OF DRIVER
          OVERFLOW  OCMD,20000
  
          END 
