1DA 
          IDENT  1DA,DASX 
          TITLE  1DA - DISK ARRAY SUBSYSTEM (DAS) DRIVER. 
          CIPPU  ,S 
          MEMSEL 8
          LIST   F
          BASE   M
          SST    DLYA,.DLY,.EST 
*COMMENT  1DA - DISK ARRAY SUBSYSTEM (DAS) DRIVER.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          SPACE  4,10 
***       1DA - DAS DRIVER. 
* 
*         C. D. ROWE.        91/03/06.
*         P. C. SMITH.       94/03/21.
*         R. E. DUNBAR.      94/07/15.
*         P. C. SMITH.       95/12/10.
          SPACE  4,40 
***       *1DA* IS THE DRIVER FOR THE 583X/47444 DISK ARRAY SUBSYSTEM.
* 
*         THE FOLLOWING DISK DRIVES ARE SUPPORTED,
*                5832-1,   5832-2 
*                5833-1,   5833-1P
*                5833-2,   5833-2P
*                5833-3P,  5833-4 
*                5838-1,   5838-1P
*                5838-2,   5838-2P
*                5838-3P,  5838-4 
*                47444-1,  47444-1P 
*                47444-2,  47444-2P 
*                47444-3P, 47444-4
* 
*         THE DAS DISK DRIVES ARE SUPPORTED AS BUFFERED I/O 
*         DEVICES.  REQUESTS TO BE PROCESSED BY *1DA* ARE POSTED
*         BY *CPUMTR* IN THE BUFFERED I/O TABLES IN *CMR*.
*         *1DA* INTERLOCKS UNITS, DELINKS BUFFERS, AND COMPLETES
*         SAID REQUESTS BY ISSUING APPROPRIATE *BIOM* FUNCTIONS.
* 
*         EACH COPY OF *1DA* WILL SUPPORT ONE CONCURRENT CHANNEL
*         CONFIGURED WITH THE INTELLIGENT PERIPHERAL INTERFACE (IPI)
*         AND IS THE SOLE DRIVER FOR ALL DAS DISKS ON THAT CHANNEL. 
*         *1DA* MUST BE LOADED INTO A CONCURRENT PP, IN THE SAME
*         BANK AS THE CHANNEL IT IS TO SERVICE.  THIS DRIVER SUPPORTS 
*         THE 10 AND THE 25 MB IPI CHANNELS.  WHEN THE DRIVER IS
*         LOADED IT STATUSES THE CHANNEL TO DETERMINE WHICH ONE IS
*         PRESENT.  IT WILL READ THE CHANNEL SPEED SELECTED IN THE
*         CONTROLLER USING INTERLOCK MODE.  IF THE SPEED IS 
*         INCORRECT, IT WILL SET THE SPEED TO BE THE SAME AS THE
*         CHANNEL.
* 
*         EACH COPY OF THE DRIVER CAN SERVICE UP TO 24 LOGICAL DAS
*         UNITS IN ANY CONFIGURATION MIX.  UP TO 4 CONTROLLERS MAY
*         BE CONFIGURED; A CONTROLLER MAY BE COUPLED TO EITHER PORT 
*         OF THE IPI ADAPTER. 
* 
*         *1DA* SCANS THROUGH THE *PUT* ENTRIES IN A CIRCULAR FASHION 
*         LOOKING FOR REQUESTS TO PROCESS.  ONCE A REQUEST IS FOUND,
*         *1DA* USES THE PHYSICAL DISK AND UEM ADDRESSES IN THE 
*         CORRESPONDING *CBT* ENTRY TO DETERMINE THE ACTION TO BE 
*         TAKEN.  *1DA* 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
*         *1DA* WILL RESUME ITS SEARCH THROUGH THE *PUT* WITH THE 
*         *PUT* ENTRY IMMEDIATELY FOLLOWING THE ONE JUST PROCESSED. 
          SPACE  4,40 
***       ORGANIZATION OF THE DAS UNITS (MEASUREMENTS IN DECIMAL).
* 
*         EQUIPMENT TYPE                      EA             EB 
*         PRODUCT NUMBER                    5832-1         5832-2 
* 
*         UNITS/LOGICAL DEVICE               1-8            1-4 
*         PARTITIONS                           1              1 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR           2048           2048 
*           PHYSICAL SECTORS/TRACK             3              6 
*           SPARE SECTORS/CYLINDER             0              0 
*           PHYSICAL TRACKS/CYLINDER           4              4 
*           CYLINDERS/DRIVE                  844            844 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK    160            320 
*           LOGICAL TRACKS/DRIVE            2023           2023 
* 
* 
*         EQUIPMENT TYPE                   EC/ED          EE/EF 
*         PRODUCT NUMBER                    5833-1/1P      5833-2/2P
* 
*         UNITS/LOGICAL DEVICE               1-2              1 
*         PARTITIONS                           1              1 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR           2048           2048 
*           PHYSICAL SECTORS/TRACK             6             11 
*           SPARE SECTORS/CYLINDER             2              2 
*           PHYSICAL TRACKS/CYLINDER           7              7 
*           CYLINDERS/DRIVE                 1629           1629 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK    992           1920 
*           LOGICAL TRACKS/DRIVE            2046           2034 
* 
* 
*         EQUIPMENT TYPE                      EM             EN 
*         PRODUCT NUMBER                    5833-3P        5833-4 
* 
*         UNITS/LOGICAL DEVICE                 1              1 
*         PARTITIONS                           2              2 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR           2048           2048 
*           PHYSICAL SECTORS/TRACK            17             22 
*           SPARE SECTORS/CYLINDER             2              2 
*           PHYSICAL TRACKS/CYLINDER           7              7 
*           CYLINDERS/DRIVE                 1629           1629 
*           CYLINDERS/PARTITION              814            814 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK   1504           1952 
*           LOGICAL TRACKS/LOGICAL DEVICE   2023           2025 
* 
* 
*         EQUIPMENT TYPE                   EG/EH          EI/EJ 
*         PRODUCT NUMBER                    5838-1/1P      5838-2/2P
* 
*         UNITS/LOGICAL DEVICE                 1              1 
*         PARTITIONS                           1              2 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR           2048           2048 
*           PHYSICAL SECTORS/TRACK             5              9 
*           SPARE SECTORS/CYLINDER             4              4 
*           PHYSICAL TRACKS/CYLINDER           9              9 
*           CYLINDERS/DRIVE                 2620           2620 
*           CYLINDERS/PARTITION             2620           1310 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK   1696           1600 
*           LOGICAL TRACKS/LOGICAL DEVICE   2025           2015 
* 
* 
*         EQUIPMENT TYPE                      EK             EL 
*         PRODUCT NUMBER                    5838-3P        5838-4 
* 
*         UNITS/LOGICAL DEVICE                 1              1 
*         PARTITIONS                           3              4 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR           2048           2048 
*           PHYSICAL SECTORS/TRACK            14             18 
*           SPARE SECTORS/CYLINDER             4              4 
*           PHYSICAL TRACKS/CYLINDER           9              9 
*           CYLINDERS/DRIVE                 2620           2620 
*           CYLINDERS/PARTITION              873            655 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK   1696           1632 
*           LOGICAL TRACKS/LOGICAL DEVICE   2007           2026 
* 
* 
*         EQUIPMENT TYPE                   EO/EP          ES/EU 
*         PRODUCT NUMBER                   47444-1/1P     47444-2/2P
* 
*         UNITS/LOGICAL DEVICE                 1              1 
*         PARTITIONS                           1              2 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR            512           1024 
*           PHYSICAL SECTORS/TRACK            13             13 
*           SPARE SECTORS/CYLINDER             7              7 
*           PHYSICAL TRACKS/CYLINDER          15             15 
*           CYLINDERS/DRIVE                 2290           2290 
*           CYLINDERS/PARTITION             2290           1145 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK   3240B          3240B
*           LOGICAL TRACKS/LOGICAL DEVICE   3755B          3754B
* 
* 
*         EQUIPMENT TYPE                      EV             EW 
*         PRODUCT NUMBER                   47444-3P       47444-4 
* 
*         UNITS/LOGICAL DEVICE                 1              1 
*         PARTITIONS                           3              4 
* 
*         PHYSICAL ORGANIZATION 
* 
*           WORDS/PHYSICAL SECTOR           1024           1024 
*           PHYSICAL SECTORS/TRACK            19             25 
*           SPARE SECTORS/CYLINDER             7              7 
*           PHYSICAL TRACKS/CYLINDER          15             15 
*           CYLINDERS/DRIVE                 2290           2290 
*           CYLINDERS/PARTITION              763            572 
* 
*         LOGICAL ORGANIZATION
* 
*           WORDS/LOGICAL SECTOR              64             64 
*           LOGICAL SECTORS/LOGICAL TRACK   3200B          3200B
*           LOGICAL TRACKS/LOGICAL DEVICE   3764B          3744B
          SPACE  4,20 
***       TRANSFER RATES
* 
*    1.   MAXIMUM TRANSFER RATE OF PP IF 10 MB IPI CHANNEL, 16 KB 
*         SECTOR SIZE, AND CPU RESPONSE TIME IS IMMEDIATE.
* 
*          SECTORS STREAMED / PP OVERHEAD + SECTORS * (1.6384 + .150) 
* 
*            USE SECTORS = 96 (8 SSD CYLINDERS) 
* 
*              RATE =     96 * 16384          1572864 
*                      -----------------   =  ------- = 9.06 MB/S 
*                       2 + 96 * (1.7884)     173.686 
* 
*                                                      = 11310 KCHAR/S
* 
*    2.   MAXIMUM RATE FOR SSD IF 10 MB IPI CHANNEL, 16 KB SECTOR 
*         SIZE, AND CPU RESPONSE TIME IS IMMEDIATE. 
* 
*                            BYTES FOR 8 CYLINDERS
*     RATE =   -------------------------------------------------------
*              PP+CTR OVERHEAD + 8 CYL SWITCHES+SEC. * (1.6384 + 150) 
* 
* 
*                             1572864 
*               =      --------------------------  =  8.83 MB/S 
*                      2 + 2 + 2.4 + 96 * (1.7884)
* 
*                                                  = 11040  KCHAR/S 
* 
*    3.  MAXIMUM RATE FOR 5833-1 IF 10 MB IPI CHANNEL, 16 KB SECTOR 
*        SIZE, AND CPU RESPONSE TIME IS IMMEDIATE.
* 
*        CYLINDER SWITCH = 5.5 MILLISECONDS 
* 
* 
*                            BYTES FOR 8 CYLINDERS
*        RATE =   ------------------------------------------------
*                  8 CYL SWITCHES + ((HEADS * CYL) + 1) * 16.66666
* 
* 
*                  40 * 16384 * 8         5242880 
*        RATE =  ------------------  =  ------------  =  5.27 MB/S
*                44 + 57 * 16.6666           994
* 
*                                    = 6593 KCHAR/S 
* 
*    4.  MAXIMUM RATE FOR 5833-2 IF 10 MB IPI CHANNEL, 16 KB SECTOR 
*        SIZE, AND CPU RESPONSE TIME IS IMMEDIATE.
* 
*        CYLINDER SWITCH = 11 MILLISECONDS
* 
*                         BYTES FOR 8 CYLINDERS 
*        RATE =   ------------------------------------------------
*                  8 CYL SWITCHES + ((HEADS * CYL) + 1) * 16.66666
* 
* 
*                   75 * 16384 * 8          9830400 
*         RATE =  ------------------  =   ------------  =  9.45 MB/S
*                 88 + 57 * 16.6666          1040 
* 
* 
*                                     = 11810 KCHAR/S 
* 
*     NOTE - SINCE THIS IS GREATER THAN THE RATE THE PP CAN MAINTAIN, 
*            YOU MUST USE THE RATE THE PP CAN MAINTAIN (11310 KCHAR/S). 
* 
*    5.   MAXIMUM TRANSFER RATE OF PP IF 25 MB IPI CHANNEL, 16 KB 
*         SECTOR SIZE, AND CPU RESPONSE TIME IS IMMEDIATE.
* 
*         SECTORS STREAMED / PP OVERHEAD + SECTORS * (.65536 + 150) 
* 
*         USE SECTORS = 96 (8 SSD CYLINDERS)
* 
*         RATE =     96 * 16384          1572864
*                 -----------------   =  ------- = 20.34 MB/S 
*                  2 + 96 * (.80536)      77.316
* 
*                                                = 25430 KCHAR/S
          SPACE  4,35 
***       MEASURED TRANSFER RATES.
*                MAINFRAME = 860/870
*                MST(N=400000,P=6) TO GET TIMING VALUES.
* 
*         NOTE - THE NUMBER OF DRIVES CONFIGURED PER DRIVER AND THE 
*                INTERRUPT SIZE (PHYSICAL SECTORS) FOR WRITES COULD 
*                AFFECT PERFORMANCE.
* 
*         NOTE- BUFFER THRESHOLD VALUES USED WERE 4,3,3.  CHANGING
*               THE BUFFER VALUES TO 1,3,3 FOR 583X DRIVES INCREASED
*               RANDOM READS APPROXIMATELY 30 PERCENT AND DID NOT 
*               HURT OTHER VALUES.
* 
*         NOTE- A FIELD LENGTH OF 60000 WAS USED WHEN RUNNING MST.
*               USE OF A SMALLER FIELD LENGTH COULD CAUSE PERFORMANCE 
*               NUMBERS TO DECREASE.
* 
*                             SEQ.   SEQ.   RANDOM  RANDOM
*              UNITS   INT.   WRITE  READ    READ   WRITE 
*     TYPE    DEFINED  SIZE   KC/S   KC/S    IO/S   IO/S    CHANNEL 
*     ------------------------------------------------------------- 
*     5832-1     1      NA    9448   9306   78.2    59.9    IPI-10
*     5832-2     1      NA   10009   9980   73.6    53.9    IPI-10
*     5833-1     1       2    6669   6765   31.8    25.4    IPI-10
*     5833-2     1       2    9996   9379   36.3    27.0    IPI-10
*     5833-3     1       2    9945   9956   36.0    26.4    IPI-10
*     5833-4     1       2    9983  10078   37.2    16.4    IPI-10
*     5838-1     1       2    8180   8172   44.4    27.9    IPI-10
*     47444-1    1       8    4097   4232   29.1    16.4    IPI-10
*     47444-2    1       4    8191   9525   33.5    17.8    IPI-10
*     47444-3    1       4    8792   9594   32.1    16.6    IPI-10
*     47444-4    1       4    9161   9713   32.8    17.0    IPI-10
*     5832-1     1      NA    9886  10032   88.2    66.9    IPI-25
*     5832-2     1      NA   12894   8157  119.1    79.8    IPI-25
*     5833-1     1       2    6649   6774   32.9    25.9    IPI-25
*     5833-2     1       2   11975   8078   40.4    27.5    IPI-25
*     5833-3     1       2
*     5833-4     1       2
*     5838-1     1       2    8067   8205   44.3    26.9    IPI-25
*     5838-2     1       2
*     5838-3     1       2
*     5838-4     1       2
*     47444-1    1       8                                  IPI-25
*     47444-2    1       4                                  IPI-25
*     47444-3    1       4                                  IPI-25
*     47444-4    1       4                                  IPI-25
*     9853       1       8    3087   3130   21.7    17.2    IPI-10
*     887-4K     1           11210  10958   35.3    18.9    ISI 
          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,20 
***       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 MH427-DXX,CMN. 
* 
*         CONTROLLER N ON CHANNEL CC IS RUNNING MICROCODE REVISION
*         LEVEL XX. 
* 
* 
*         YYZZZ, UNN, CMA CONTROLLER DISABLED, CCHBB. 
* 
*         CONTROLLER A ON CONCURRENT CHANNEL BB HAS BEEN DISABLED.
*         THIS DRIVER WILL NO LONGER TRY TO USE THIS CONTROLLER.
*         THIS ACTION WAS TAKEN AS A RESULT OF ERROR PROCESSING FOR 
*         DRIVE NN OF THE LOGICAL UNIT WITH DRIVE TYPE YY AND EST 
*         ORDINAL ZZZ.  ACCESS TO THIS CONTROLLER MAY BE REENABLED
*         BY ENTERING AN *UP,CCH* COMMAND FOR THE AFFECTED CHANNEL. 
* 
* 
*         YYZZZ, UNN, CMA CONTROLLER ENABLED,  CCHBB. 
* 
*         CONTROLLER A ON CONCURRENT CHANNEL BB HAS BEEN REENABLED. 
*         THIS DRIVER WILL NOW ATTEMPT TO USE THIS CONTROLLER AGAIN.
*         THIS ACTION WAS TAKEN IN RESPONSE TO AN *UP,CCH* COMMAND
*         FOR THIS CHANNEL. 
* 
* 
*         YYZZZ, UNN, CMA RESET ON CCHBB. 
* 
*         A SLAVE RESET HAS BEEN INITIATED ON CONTROLLER A ON 
*         CONCURRENT CHANNEL BB, AS PART OF ERROR PROCESSING FOR
*         DRIVE NN OF THE LOGICAL UNIT WITH DRIVE TYPE YY AND EST 
*         ORDINAL ZZZ.
* 
* 
*         YYZZZ, UNN, CMA RESET COMPLETE. 
* 
*         THE SLAVE RESET OF CONTROLLER A, WHICH WAS INITIATED AS 
*         PART OF ERROR PROCESSING FOR DRIVE NN OF THE LOGICAL UNIT 
*         WITH DRIVE TYPE YY AND EST ORDINAL ZZZ, IS COMPLETE.
* 
* 
*         YYZZZ, UNN, CMA RESET FAILURE.
* 
*         THE SLAVE RESET OF CONTROLLER A, WHICH WAS INITIATED AS 
*         PART OF ERROR PROCESSING FOR DRIVE NN OF THE LOGICAL UNIT 
*         WITH DRIVE TYPE YY AND EST ORDINAL ZZZ, HAS FAILED. 
* 
* 
*         YYZZZ, UNN, FORMAT COMPLETE.
* 
*         THE FORMAT OF DRIVE NN OF THE LOGICAL UNIT WITH DRIVE TYPE
*         YY AND EST ORDINAL ZZZ IS COMPLETE. 
* 
* 
*         YYZZZ, UNN, FORMAT INITIATED. 
* 
*         A FORMAT HAS BEEN INITIATED ON DRIVE NN OF THE LOGICAL UNIT 
*         WITH DRIVE TYPE YY AND EST ORDINAL ZZZ. 
* 
* 
*         YYZZZ, UNN,PS=XXXXXX. 
* 
*         THE DAS UNIT, NN, WITH DEVICE TYPE YY AND ORDINAL ZZZ HAS 
*         THE PACK SERIAL NUMBER XXXXXX.
* 
* 
*         YYZZZ, UNN, PARITY PROTECTION DISABLED. 
* 
*         DRIVE NN OF THE LOGICAL UNIT WITH DRIVE TYPE YY AND ORDINAL 
*         ZZZ HAS BEEN SET OFF LINE.
* 
* 
*         YYZZZ, UNN, PARITY PROTECTION RESTORED. 
* 
*         DRIVE NN OF THE LOGICAL UNIT WITH DRIVE TYPE YY AND ORDINAL 
*         ZZZ HAS BEEN RESTORED.
* 
* 
*         YYZZZ, UNN, PARITY RESTORE INITIATED. 
* 
*         A PARITY RESTORE HAS BEEN INITIATED ON DRIVE NN OF THE
*         LOGICAL UNIT WITH DRIVE TYPE YY AND ORDINAL ZZZ.
          SPACE  4,10 
***       OPERATOR MESSAGES.
* 
*         EQORD, SPIN UP PENDING. 
* 
*         EQORD UNN FORMATTING. 
* 
*         CMX BEING RESET ON CCHNN. 
* 
*         MR ERROR. 
          SPACE  4,15 
***       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 SET FOR THE PORT IN USE ON EACH CONTROLLER.
          SPACE  4,20 
***       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)  SUBROUTINE *IMR* ISSUES A *BIOM* REQUEST TO *CPUMTR*
*             WITHOUT WAITING FOR THE REQUEST TO COMPLETE.  THEREFORE,
*             BEFORE WRITING THE OUTPUT REGISTER FOR ANY OTHER MONITOR
*             FUNCTION, SUBROUTINE *CMC* MUST BE CALLED TO ENSURE ANY 
*             PREVIOUS *BIOM* REQUEST IS COMPLETE.  TO ENSURE THAT THIS 
*             LOGIC IS FOLLOWED, THE *MONITOR* MACRO IS REDEFINED TO
*             CALL SUBROUTINE *IMF* RATHER THAN *PPR* SUBROUTINE *FTN*. 
* 
*         3)  THE DEVICE STATE TABLE COMPLETELY OVERLAYS *PPR*. 
*             THEREFORE, IT IS NOT POSSIBLE TO CALL ANY *PPR* ENTRY 
*             POINT AFTER SUBROUTINE *IST* IS CALLED IN *3DZ*.
          SPACE  4,25 
***       INFORMATIVE BML MESSAGES. 
* 
*         SOME MESSAGES MAY BE LOGGED AT DRIVE INITIALIZATION TIME THAT 
*         ARE INFORMATIVE RATHER THAN HARDWARE ERRORS.
* 
*         1)  IF A DRIVE IS FORMATTED FOR NOS/VE, THEN USED BY NOS IN 
*             DUAL ACCESS MODE, THE DRIVE WILL BE FORMATTED THROUGH 
*             ONE PATH, BUT THE CONTROLLER ON THE OTHER PATH DOES NOT 
*             YET KNOW A FORMAT CHANGE OCCURRED.  IF THE NUMBER OF
*             PHYSICAL DRIVES PER LOGICAL UNIT REMAINS THE SAME, A
*             LOGICAL RESET WILL BE REQUIRED.  EXAMPLE OF RESPONSE
*             RETURNED. 
* 
*             0016 0132 0600 0018 0DE1 0000 0101 0000 C0FE 0000 1000
* 
*             IF THE NUMBER OF PHYSICAL DRIVES PER LOGICAL UNIT 
*             CHANGES, A SLAVE RESET WILL BE REQUIRED ON THE SIDE THAT
*             DOES NOT DO THE FORMAT/CLUSTER. 
* 
*         2)  IF THE SYSTEM IS DEADSTARTED WHILE I/O REQUESTS ARE IN
*             PROGRESS OR A CHANNEL IS DOWNED WHEN I/O IS IN PROGRESS,
*             A DRIVE COULD BE LEFT RESERVED.  THE NEXT TIME THE DRIVE
*             IS ACCESSED, A RECOVERABLE ERROR MAY OCCUR.  IF A DRIVE 
*             IS BUSY, THE DRIVE RESET, STEP 2 OF ERROR RECOVERY, WILL
*             BREAK THE RESERVE.
          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   *
          QUAL   MMF
*CALL     COMSMMF 
          QUAL   *
*CALL     COMSMSC 
*CALL     COMSMSP 
*CALL     COMSMST 
*CALL     COMSPIM 
*CALL     COMS1DS 
          SPACE  4,10 
**        INTERFACE SPECIFICATIONS. 
  
  
 DN       MICRO  1,3,*1DA*   DEFAULT DRIVER NAME
          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 
 CI       EQU    36          CONTROLLER STATE TABLE ADDRESS 
 CN       EQU    37          CONTROLLER NUMBER
 MS       EQU    40          MAJOR STATUS (RESPONSE PACKET) 
 RT       EQU    41          STATUS RESPONSE TYPE 
 TM       EQU    42          TRANSFER MODE, 0 = STREAM DATA 
 DT       EQU    43          DRIVE TYPE 
 UC       EQU    44          UNIT ACTIVITY COUNT
 RW       EQU    45          READ / WRITE FLAG
 PA       EQU    46          PROCESSOR ADDRESS
 DI       EQU    47          DEVICE STATE TABLE ADDRESS 
 CT       EQU    IR          CHANNEL TYPE, 0 = 10 MB CHANNEL
 FC       EQU    IR+1        FORMAT COMPLETE FOR ALL UNITS IF NONZERO 
 DD       EQU    IR+2        NUMBER OF DATA DRIVES IN DEVICE
 MF       EQU    IR+3        MASTER CLEAR CHANNEL ERROR IF NONZERO
 CR       EQU    57          CHANNEL RESERVED IF NONZERO
 RF       EQU    60          RESET IN PROGRESS IF NONZERO 
 LF       EQU    61          LAST FUNCTION
 PD       EQU    62          NUMBER OF PARITY DRIVES IN DEVICE
 CW       EQU    63 - 67     CM WORD BUFFER 
****
          SPACE  4,10 
**        IPI ADAPTER FUNCTION CODES. 
  
  
 F0000    EQU    0#0000      MASTER CLEAR 
 F00E1    EQU    0#00E1      READ STATUS REGISTER 
 F0100    EQU    0#0100      CLEAR DMA ERROR
 F0102    EQU    0#0102      READ IPI REVISION REGISTER 
 F0300    EQU    0#0300      WRITE CONTROL 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 REGISTER 
 F0C00    EQU    0#0C00      DMA READ FROM ADAPTER
 F0D00    EQU    0#0D00      DMA WRITE TO ADAPTER 
 F0E00    EQU    0#0E00      CLEAR T REGISTER 
  
 F0062    EQU    0#0062      PORT A SELECT
 F0862    EQU    0#0862      PORT B SELECT
          SPACE  4,10 
**        IPI CHANNEL FUNCTION CODES. 
  
  
 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
  
 IOPL     EQU    20          I/O COMMAND PACKET LENGTH
  
 RPBFL    EQU    77          RESPONSE PACKET BUFFER LENGTH
          SPACE  4,10 
**        COMMAND PACKET OPERATION CODES. 
  
  
 C0200    EQU    0#0200      REPORT ATTRIBUTES
 C0202    EQU    0#0202      RESTORE ATTRIBUTES 
 C0209    EQU    0#0209      LOAD ATTRIBUTES
 C020A    EQU    0#020A      SAVE ATTRIBUTES
 C0301    EQU    0#0301      REPORT ADDRESSEE CONDITION 
 C0302    EQU    0#0302      REPORT ADDRESSEE STATUS
 C0700    EQU    0#0700      SET OPERATING MODE 
 C0800    EQU    0#0800      ABORT (DRIVE RESET)
 C1005    EQU    0#1005      BLOCK READ 
 C2005    EQU    0#2005      BLOCK WRITE
 C280E    EQU    0#280E      FORMAT 
 C8100    EQU    0#8100      DRIVE DIAGNOSTICS
 CE005    EQU    0#E005      RESTORE DRIVE
          SPACE  4,10 
**        COMMAND PACKET PARAMETER ID-S.
  
  
 P02D1    EQU    0#02D1      PERFORMANCE LOGGING
 P0254    EQU    0#0254      DRIVE RESET
 P02D2    EQU    0#02D2      MASTER TERMINATE 
 P02D3    EQU    0#02D3      EXTENT RESPONSE
 P02D4    EQU    0#02D4      ENABLE ASYNCS
 P02D5    EQU    0#02D5      PHYSICAL DRIVE 
 P0351    EQU    0#0351      DISK MODES 
 P036C    EQU    0#036C      REQUEST ATTRIBUTE
 P0931    EQU    0#0931      COMMAND EXTENT 
 P0568    EQU    0#0568      FACILITIES ATTACHED
 P0968    EQU    0#0968      FACILITIES ATTACHED
 P0D68    EQU    0#0D68      FACILITIES ATTACHED
 P1168    EQU    0#1168      FACILITIES ATTACHED
          SPACE  4,10 
**        SUBSTATUS PARAMETER ID CODES. 
  
  
 ID16     EQU    0#16        MACHINE EXCEPTION FOR CONTROLLER 
 ID17     EQU    0#17        COMMAND EXCEPTION FOR CONTROLLER 
 ID23     EQU    0#23        MESSAGE EXCEPTION
 ID24     EQU    0#24        INTERVENTION REQUIRED FOR DRIVE
 ID26     EQU    0#26        MACHINE EXCEPTION FOR DRIVE
 ID29     EQU    0#29        CONDITIONAL SUCCESS
 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 
**        INITIAL OR FINAL FAULT ANALYSIS CODES.
  
  
 ECIE     EQU    2           IPI CHANNEL ERROR FLAG        (CHPE) 
  
 ECHF     EQU    7           CHANNEL HUNG FULL             (CHFE) 
  
 ETIT     EQU    10          CONTROLLER INTERRUPT TIMEOUT  (FTOE) 
 ETFN     EQU    11          CHANNEL FUNCTION TIMEOUT 
  
 EDPE     EQU    14          MEDIA ERROR                   (PARE) 
  
*EDNR     EQU    20          USED BY 9853                  (NRDE) 
  
 EIDT     EQU    24          INCOMPLETE DATA TRANSFER      (IDTE) 
  
 ERSS     EQU    30          RESERVED SUBSTATUS (ID X1)    (DSTE) 
 EDFM     EQU    31          DEFECT MANAGEMENT ERROR (ID X2)
 EMME     EQU    32          MESSAGE/MICROCODE EXCEPTION (ID X3)
 ETSL     EQU    33          SELECT TIMEOUT 
  
 ESUF     EQU    34          SPIN-UP FAILURE               (DSTE) 
 ESDF     EQU    35          SPIN-DOWN FAILURE
*ETTC     EQU    36          USED BY 9853 
 EIVR     EQU    37          INTERVENTION REQUIRED (ID X4)
  
 EAPR     EQU    40          ALTERNATE PORT EVENT (ID X5)  (DSTE) 
 EMEX     EQU    41          MACHINE EXCEPTION (ID X6)
 ECEX     EQU    42          COMMAND EXCEPTION (ID X7)
 EFDF     EQU    43          FORMAT DRIVE FAILURE 
  
 EIOS     EQU    44          I/O INITIATION ERROR          (DSTE) 
*ERPE     EQU    45          USED BY 9853 
*ERDS     EQU    46          USED BY 9853 
 EROD     EQU    47          RESTORE OFF-LINE DRIVE ERROR 
  
 ECMA     EQU    50          COMMAND ABORTED (ID X8)       (DSTE) 
 ECCS     EQU    51          CONDITIONAL SUCCESS (ID X9)
 ECIC     EQU    52          COMMAND INCOMPLETE (ID XA) 
 EUST     EQU    53          SUCCESSFUL NOT SET IN ENDING STATUS
  
 EDTF     EQU    54          DIAGNOSTIC FAULT              (DDFE) 
*EDRS     EQU    55          USED BY 9853 
  
 ECNR     EQU    60          SLAVE/SYNC IN SIGNAL ERROR    (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         (RAME) 
 ECOT     EQU    65          CONTROLLER OVER TEMPERATURE
  
 EDRE     EQU    70          DRIVE RESERVE ERROR           (DRVE) 
  
 ECRE     EQU    74          USED BY 9853                  (RAME) 
 ECMD     EQU    75          CONTROLLER DEAD
  
 WDTP     EQU    100         WRONG DRIVE TYPE              (DSTE) 
 PNSP     EQU    101         PARALLEL NOT SUPPORTED 
 PDPD     EQU    102         PARITY DRIVE PROTECTION DISABLED 
 PDPE     EQU    103         PARITY DRIVE PROTECTION ENABLED
          SPACE  4,10 
**        CHANNEL STATUS FAULT CODES. 
  
  
 ECPE     EQU    1           CHANNEL PARITY ERROR 
*ECIE     EQU    2           IPI CHANNEL ERROR FLAG 
  
 ECER     EQU    4           CHANNEL DETECTED ERROR 
 ECCM     EQU    5           CHANNEL DETECTED CM ERROR
          SPACE  4,10 
**        DEVICE STATE TABLE DEFINITIONS.  (LDM XXXX,DI)
  
  
 BEGIN    BSSN   0
 PUTO     BSSN   1           *PUT* ORDINAL
 PNUN     BSSN   1           4/C, 3/P, 3/E, 6/U  WHERE
                              C = *CSTB* INDEX
                              P = PORT NUMBER 
                              E = EQUIPMENT (CONTROLLER) NUMBER 
                              U = UNIT NUMBER 
 ADDR     BSSN   1           NO ATTENTION RETURN
 ATTN     BSSN   1           ATTENTION RETURN 
 IDTR     BSSN   1           RETURN ADDRESS FROM *IDT*
 EEST     BSSN   1           EXPECTED EXECUTION STATUS
 RWST     BSSN   1           READ / WRITE STATUS
 RQLN     BSSN   1           1/U, 11/R  WHERE 
                              U = UNIT INTERLOCK SET (IN *PUT*) 
                              R = NUMBER OF REQUESTS PROCESSED
 CSCT     BSSN   1           CUMULATIVE SECTOR COUNT
 CYLN     BSSN   1           CYLINDER ON SEEK 
 PHYD     BSSN   1           PHYSICAL DRIVE 
 TKSN     BSSN   1           TRACK, SECTOR FOR I/O
 ERCT     BSSN   1           ERROR COUNT
 SREQ     BSSN   1           SPECIAL REQUEST
 IPPS     BSSN   1           I/O PREPROCESSING STATUS 
 LCMD     BSSN   1           LAST COMMAND OP CODE 
 IOST     BSSN   1           READ/WRITE STATUS
 DVTP     BSSN   1           9/XX, 1/0, 6/YY  WHERE 
                              XX = BIT 15 PARTITIONED DEVICE
                                   BIT 14 PROCESS LOST PARITY 
                                   BIT 13 CHECK DRIVE TYPE
                                   BIT 12 MMF RESTORE / ACCESS DISABLED 
                                   BIT 11 MMF RESTORE / ACCESS ENABLED
                                   BIT 10 ENABLE MMF PARITY DEV. ACCESS 
                                   BIT 09 MMF SHARED DEVICE 
                                   BIT 08 MMF RESTORE INITIATION
                                   BIT 07 CHECK MMF PARITY ACCESS 
                              YY = DRIVE TYPE (0 = EA, 1 = EB, ... )
 OUPD     BSSN   1           OFFLINE UNIT OF PARITY DEVICE
 SEPR     BSSN   1           RETURN ADDRESS FROM *SEP* OR *WAC* 
 DSTBE    BSSN   0           LENGTH OF STATE TABLE ENTRY
 END      BSSN
          SPACE  4,10 
**        CSTB - CONTROLLER STATE TABLE.  (LDML XXXX,CI)
  
  
 BEGIN    BSSN   0
 CTST     BSSN   1           CONTROLLER STATUS
  
*           1/S, 1/R, 1/D, 1/0, 12/FD 
*           S = SLAVE RESET IN PROGRESS 
*           R = INITIAL LOGICAL RESET REQUIRED (DRIVER STARTUP) 
*           D = CONTROLLER DEAD (SLAVE RESET FAILED)
*           FD = *DST* ADDRESS OF FIRST DEVICE ON CONTROLLER. 
* 
*         NOTE - COMMANDS AND RESPONSES WILL BE TRANSFERRED IN
*         INTERLOCK MODE IF *CTST* BIT 15, 14 OR 13 IS SET. 
  
 CTSN     BSSN   3           CONTROLLER SERIAL NUMBER (LAST 6 DIGITS) 
 CSTBE    BSSN   0           LENGTH OF CONTROLLER STATE TABLE ENTRY 
 END      BSSN
          SPACE  4,10 
****      ASSEMBLY CONSTANTS. 
  
 TE       EQU    0           = 1 TO ENABLE COMMAND/RESPONSE TRACING 
 DE       EQU    0           = 1 TO ENABLE DEBUG MODE 
 BPB      EQU    16384D      BYTES PER BUFFER / DATA BURST
 CH       EQU    16          CHANNEL NUMBER 
 MXCN     EQU    4           MAXIMUM NUMBER OF CONTROLLERS / DRIVER 
 MXND     EQU    30          MAXIMUM NUMBER OF UNITS / DRIVER 
 CBTO     EQU    30D         NORMAL COMMAND BLOCK TIMEOUT (SECONDS) 
 FMTO     EQU    12D*60D     FORMAT TIMEOUT (SECONDS) (UPPED FOR 47444) 
 SUTO     EQU    8D*60D      SPIN UP TIMEOUT (SECONDS)
 SRTO     EQU    9D*60D      SLAVE RESET TIMEOUT (SECONDS)
 DRFM     EQU    1000        DIRECTION FLAG MASK
 ILFM     EQU    4000        INTERLOCK FLAG MASK
 CSRC     EQU    4           RETRY COUNT TO MAKE CHANNEL SWITCH 
 SRRC     EQU    2           RETRY COUNT TO ISSUE SLAVE RESET 
 MERC     EQU    CSRC*2      RETRY COUNT TO SET UNRECOVERABLE 
 IRBR     EQU    3           I/O REQUESTS BEFORE NEXT RESTORE 
 SBUR     EQU    20D         SECONDS BETWEEN *UTRS* REQUESTS
  
****
          SPACE  4,10 
*         MEMORY LAYOUT.
  
 DSTB     EQU    100         START OF DEVICE STATE TABLES 
 DSTBL    EQU    DSTB+DSTBE*MXND  LWA+1 OF DEVICE STATE TABLES
          ERRNG  7777-DSTBL  DI IS IN *CTST* BITS 0-11 ONLY 
 CSTB     EQU    DSTBL       CONTROLLER STATE TABLE 
 CSTBL    EQU    CSTB+CSTBE*MXCN  LWA+1 OF CONTROLLER STATE TABLES
  
 OCMD     MAX    CSTBL,MSFW+5  DRIVER ORIGIN
          SPACE  4,10 
*         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 
 EREA     BSSN   1           ERROR RECOVERY ENTRY ADDRESS 
 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 
 EMBF2L   EQU    EMBF2/5
 .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.
**        MACRO DEFINITIONS.
TBLM      SPACE  4,10 
**        TBLM - CREATE MASS STORAGE DEVICE TABLE ENTRIES.
* 
          PURGMAC  TBLM 
  
 TBLM     MACRO  TY 
 .A1      IFGE   AI_TY,AIAB 
 .A2      IFLT   AI_TY,AIAE 
  
*         1/PARITY DRIVES, 3/DATA DRIVES, 12/MNEMONIC 
  
 DM       RMT 
 EQ_TY    EQU    *-DM 
          VFDL   1/BF_TY-6,3/PDD_TY,12/2R_TY
 DM       RMT 
  
*         PHYSICAL SECTORS PER CYLINDER.
  
 PSCY     RMT 
          CON    PTCY_TY*PSPT_TY-SPSC_TY
 PSCY     RMT 
  
 .A       SET    CYPN_TY-1
 .B       SET    PTCY_TY*PSPT_TY-SPSC_TY
 .A       SET    .A*.B
 .C       SET    MCLT_TY-4000B
 .D       SET    SL_TY/LSPS_TY
 .C       SET    .D*.C
 .A       SET    .A-.C+1
 .A       SET    .A/PSBF_TY*PSBF_TY 
          IFGT   .A,10B*.B,1
 .A       SET    10B*.B 
 STS_TY   EQU    .A 
  
*         7/BML MESSAGE DEVICE CODE, 9/STREAMING END-CASE SECTORS.
  
 STS      RMT 
          VFDL   7/MLID_TY,9/STS_TY 
 STS      RMT 
  
*         4/LOGICAL TO PHYSICAL SHIFT, 12/LAST CYLINDER ON UNIT.
  
 CYUN     RMT 
          VFDL   4/CFS_TY,12/CYUN_TY-1
 CYUN     RMT 
  
*         4/PHYSICAL SECTORS PER BUFFER, 12/MAINTENANCE CYLINDER. 
  
 MC       RMT 
          VFDL   4/PSBF_TY,12/CYPN_TY-1 
 MC       RMT 
  
*         6/LAST TRACK ON CYLINDER, 6/LAST SECTOR ON CYLINDER + 1 
  
 LSOC     RMT 
          VFD    6/PTCY_TY-1,6/PSPT_TY-SPSC_TY
 LSOC     RMT 
  
*         BYTES PER SECTOR + PHYSICAL SECTORS PER PHYSICAL TRACK. 
  
 BPS      RMT 
          CONL   16384D/PSBF_TY+PSPT_TY 
 BPS      RMT 
  
*         MODEL NUMBER (LAST TWO BYTES).
  
 MN       RMT 
          CONL   MDL_TY 
 MN       RMT 
  
 .A2      ENDIF 
 .A1      ENDIF 
 TBLM     ENDM
          SPACE  4
          TBL    "MSEQ"      GENERATE DEVICE ATTRIBUTE TABLES 
 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,15 
**        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,15 
**        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,15 
**        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,15 
**        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,15 
**        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
 FTTE     SPACE  4,15 
**        FTTE - FUNCTION TIMEOUT TABLE ENTRY.
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TFTT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE FUNCTION TIMEOUT TABLE. 
* 
*         FTTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TFTT*. 
  
  
 FTT      TBLM
 PUTE     SPACE  4,15 
**        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
 ERRMSG   SPACE  4,10 
**        ERRMSG - DEFINE ERROR LOG MESSAGE.
* 
* TAG     ERRMSG (TEXT) 
* 
*         *ERRMSG* DEFINES AN ERROR LOG MESSAGE, AND CALCULATES THE 
*         LENGTH OF THE MESSAGE IN CM WORDS.  THE LENGTH IS STORED
*         IN THE PP LOCATION BEFORE THE TEXT.  *TAG* POINTS TO THE
*         TEXT ITSELF.  THE CALCULATED LENGTH IS BIASED TO INCLUDE
*         THE MESSAGE HEADER CONTAINED IN SUBROUTINE *IEM*. 
  
  
          PURGMAC ERRMSG
  
          MACRO  ERRMSG,TAG,MSG 
          LOCAL  LEN
          CON    LEN/5
 TAG      DATA   C*MSG* 
          ERRNG  18D-*+TAG   MESSAGE TOO LONG 
 LEN      EQU    *-TAG+13+4 
          ENDM
 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. 
  
  
          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         IF WAIT TIME HAS NOT ELAPSED 
          ENDM
          TITLE  MAIN PROGRAM.
 DAS      SPACE  4,15 
**        DAS - MAIN PROGRAM. 
* 
*         ENTRY  AT *DAS* (VIA *RJM*) TO SET REENTRY ADDRESS. 
*                AT *DAS1* WITH (ADDR,DI) ZERO WHEN REQUEST COMPLETE. 
*                AT *DAS1* WITH (ADDR,DI) NONZERO TO ALLOW REENTRY. 
*                AT *DAS6* IF CHANNEL DOWN WHEN DRIVER LOADED.
* 
*         USES   DI.
* 
*         CALLS  CAA, CCR, CET, CFR, EMP, IOM, LDP, PLP, PPE, PRS.
* 
*         MACROS MONITOR. 
  
  
          ORG    OCMD 
          RICHI              BEGIN CHANNEL INSTRUCTION MODIFICATION 
  
 DAS      SUBR   PRS         ENTRY (EXECUTE *PRS* ON INITIAL ENTRY) 
          LDML   DAS         SET REENTRY ADDRESS
          STML   ADDR,DI
  
*         PROCESS NEXT DEVICE.
  
 DAS1     LDC    DSTB        (ADDRESS OF NEXT *DST* ENTRY)
 DASA     EQU    *-1
          LMC    DSTBL       (LWA+1 OF *DSTB* - ADJUSTED BY *IST*)
 DASB     EQU    *-1
          ZJN    DAS3        IF END OF DEVICE STATE TABLE 
 DAS2     LDM    DASA 
          STD    DI          SET DEVICE STATE TABLE ADDRESS 
          ADN    DSTBE
          STM    DASA        ADVANCE TABLE ADDRESS
          RJM    LDP         LOAD DEVICE PARAMETERS 
          RJM    PLP         PROCESS LOST PARITY, IF PENDING
          RJM    PPE         PROCESS PARITY ENABLE, IF PENDING
          RJM    CAA         CHECK IF ACCESS ALLOWED
          NJN    DAS1        IF ACCESS TO DEVICE NOT ALLOWED
          RJM    CFR         CHECK FOR REQUEST
          UJN    DAS1        CHECK NEXT DEVICE
  
*         END OF DEVICE STATE TABLE - CHECK FOR CHANNEL DOWN. 
  
 DAS3     RJM    CCR         CHECK FOR CHANNEL REQUEST
          ZJN    DAS5        IF CHANNEL DOWN
          RJM    CET         CHECK ELAPSED TIME 
          MJN    DAS4        IF NOT TIME TO REFRESH OPERATOR MESSAGE
          LCN    0           TRY TO MAKE MULTIPLE MESSAGES VISIBLE
          RJM    IOM         REFRESH OPERATOR MESSAGE 
 DAS4     LDC    DSTB        RESTART DEVICE STATE TABLE SCAN
          STM    DASA 
          UJP    DAS2        PROCESS NEXT DEVICE
  
*         CHANNEL *DOWN* DETECTED - FORCE COMPLETION ON ALL REQUESTS. 
  
 DAS5     UJN    *+2         FIRST PASS 
*         UJN    *+1         (SECOND PASS)
 DASC     EQU    *-1
          UJN    DAS6        DROP PP ON SECOND PASS 
  
          SOM    DASC 
          LDC    CMP8        CHANGE PATH THRU *CFR* 
          STML   CFRA 
          UJN    DAS4        LOOP THROUGH DEVICE STATE TABLE
  
 DAS6     MONITOR  DPPM      DROP PP
          UJN    *           HANG UNTIL *CPUMTR*/*1MA* IDLES PP 
  
  
 .DLY     CON    370         DELAY MACRO - DELAY COUNT FOR 4X PP
 DLYA     SBN    4           DELAY MACRO - FOR 4X PP
          TITLE  DEVICE ATTRIBUTE TABLES. 
          SPACE  4,20 
**        DEVICE RELATED TABLES BUILT VIA *MSDC*. 
* 
*         LOCATION DT IS THE INDEX TO THESE TABLES. 
  
          LIST   G
 DM       SPACE  4,10 
**        1/PARITY DRIVES, 3/DATA DRIVES, 12/MNEMONIC 
  
  
 DM       BSS    0
 DM       HERE
 EQNS     EQU    *-DM 
          CON    0           TERMINATE DEVICE TYPE LIST 
 PSCY     SPACE  4,10 
**        PHYSICAL SECTORS PER CYLINDER.
  
  
 PSCY     BSS    0
 PSCY     HERE
 STS      SPACE  4,10 
**        7/BML MESSAGE DEVICE CODE, 9/STREAMING END-CASE SECTORS.
  
  
 BMID     BSS    0
 STS      BSS    0
 STS      HERE
 CYUN     SPACE  4,10 
**        4/LOGICAL TO PHYSICAL SHIFT, 12/LAST CYLINDER ON UNIT.
  
  
 CFS      BSS    0
 CYUN     BSS    0
 CYUN     HERE
 MC       SPACE  4,10 
**        4/PHYSICAL SECTORS PER BUFFER, 12/MAINTENANCE CYLINDER. 
  
  
 PSBF     BSS    0
 MC       BSS    0
 MC       HERE
 LSOC     SPACE  4,10 
**        6/LAST TRACK ON CYLINDER, 6/LAST SECTOR ON CYLINDER + 1 
  
  
 LSOC     BSS    0
 LSOC     HERE
 BPS      SPACE  4,10 
**        BYTES PER SECTOR + PHYSICAL SECTORS PER PHYSICAL TRACK. 
  
  
 BPS      BSS    0
 PSPT     BSS    0
 BPS      HERE
 MN       SPACE  4,10 
**        MODEL NUMBER (LAST TWO BYTES).
  
  
 MN       BSS    0
 MN       HERE
  
          LIST   *
          SPACE  4,20 
**        CHANNEL TYPE RELATED TABLES.
* 
*         LOCATION CT IS THE INDEX INTO THESE TABLES. 
  
 TRAT     DATA   0#7E42      10 MB CHANNEL TRANSFER RATE
          DATA   0#FF42      25 MB CHANNEL TRANSFER RATE
  
 PAS      DATA   0#62        10 MB CHANNEL PORT A SELECT
          DATA   0#362       25 MB CHANNEL PORT A SELECT
  
 CTS      DATA   0#F02       10 MB CHANNEL, CHANNEL TRANSFER SPEED
          DATA   0           25 MB CHANNEL, CHANNEL TRANSFER SPEED
  
 EDC      DATA   0           10 MB CHANNEL, USE SINGLE CMI SLOT 
          DATA   0#4000      25 MB CHANNEL, USE DOUBLE CMI SLOT 
          TITLE  READ / WRITE PROCESSING. 
 PIO      SPACE  4,20 
**        PIO - READ / WRITE PROCESSING.
* 
*         ENTRY  AT *PIO* TO INITIATE REQUEST.
*                AT *PIO2* FROM *CTC* IF NO DATA TRANSFERRED. 
*                AT *PIO6* FROM *CTC* IF NO MORE DATA.
*                (RW) = 0 IF READ.
*                (CB) = CONTROL BUFFER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   TO *ERR* IF ERROR. 
*                TO *CMP* WHEN COMMAND COMPLETES. 
* 
*         USES   CB, T1.
* 
*         CALLS  ATT, BCS, CTC, DCM, EIO, FCN, GSS, SCD, SFR, SOU,
*                WCB, WTR.
  
 PIO      BSS    0           ENTRY
          LDML   PIOA,RW     READ OR WRITE OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
  
*         COMMAND EXTENT PARAMETER SET BY *IIO*.
  
          LDN    IOPL        COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          UJN    PIO2        SET I/O IN PROGRESS
  
 PIO1     RJM    DCM         DESELECT CONTROLLER
 PIO2     LDD    CB          SET I/O IN PROGRESS
          STM    IPPS,DI
          LDN    XFNT        PROCESS ATTENTION
          RJM    ATT
          ZJN    PIO3        IF EXPECTED STATUS 
          LCN    EIOS        I/O INITIATION ERROR 
          RJM    ERR         PROCESS ERROR
  
 PIO3     STML   PIOC        CLEAR ENDING STATUS
          LDN    1           SET CHANNEL ACTIVE FOR *CPD* 
          RJM    SCD
          LDM    IPPS,DI     RESTORE CURRENT BUFFER ORDINAL 
 PIO4     STD    CB 
          LDML   PIOC        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   PIOB,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. 
  
          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 
          NJN    PIO4        IF CONSECUTIVE REQUEST PRESENT 
  
*         COMPLETE READ / WRITE OPERATIONS. 
  
*         LDN    0           CLEAR CHANNEL ACTIVE FOR *CPD* 
          RJM    SCD
          RJM    DCM         DESELECT CONTROLLER
          LDN    CMSS        EXPECT COMMAND COMPLETE
 PIO6     RJM    ATT         WAIT FOR INTERRUPT 
          NJN    PIO7        IF NOT SUCCESSFUL
          LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    PIO6.1      IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          SOM    RMUX        REQUESTS TO MULTIPLEX BETWEEN RESTORES 
 PIO6.1   LJM    CMP         COMPLETION PROCESSING
  
 PIO7     LDDL   MS 
          LMC    0#42 
          NJN    PIO8        IF NOT CONDITIONAL SUCCESS/ASYNCH
          LDDL   PA 
          STML   ATTN,DI     SET ATTENTION RETURN ADDRESS 
 PIO8     LCN    EIOS        I/O INITIATION ERROR 
          RJM    ERR         PROCESS ERROR
  
  
 PIOA     BSS    0           COMMAND CODES
          CONL   C1005
          CONL   C2005
  
 PIOB     BSS    0           DATA TRANSFER FUNCTIONS
          CON    F0281
          CON    F0381
  
 PIOC     CON    0           ENDING STATUS (SET BY *GSS*) 
          TITLE  FORMAT DRIVES AT DEADSTART.
 CFF      SPACE  4,25 
**        CFF - CHECK FOR FORMAT. 
* 
*         ENTRY  FROM *CFR* AFTER INITIAL LOGICAL RESET HAS BEEN
*                  PERFORMED FOR ALL CONTROLLERS. 
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (FC) = 0.
* 
*         EXIT   TO *CMP*.
*                TO *ERR* IF CONTROLLER NOT FUNCTIONING.
*                (FC) = 1 IF ALL UNITS FORMATTED. 
* 
*         USES   DI, FC.
* 
*         CALLS  CCS, CFM, CLP, CMN, CPC, CPF, IDU, ILU, LDP, SEP.
  
  
 CFF5     LDN    ECMD        CONTROLLER DEAD
          RJM    ERR         PROCESS ERROR
  
 CFF      BSS    0           ENTRY/EXIT 
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LDD    CM+3 
          SHN    21-FCRF+14 
          PJN    CFF1        IF NO FORMAT REQUEST FOR THIS DEVICE 
          RJM    IDU         INTERLOCK DEVICE 
          NJN    CFF1        IF INTERLOCK NOT AVAILABLE 
          RJM    SEP         SET ERROR PROCESSING INTERLOCK 
          NJN    CFF1        IF ERROR IN PROGRESS ON DIFFERENT DEVICE 
  
*         FORMAT DEVICE.
  
          LDD    DI          INDICATE FORMAT IN PROGRESS
          STM    CFFA 
          LDML   CTST,CI     CHECK FOR CONTROLLER DEAD
          SHN    21-15
          MJN    CFF5        IF CONTROLLER NOT FUNCTIONAL 
          RJM    CPC         CHECK FOR PARALLEL CONTROLLER
          RJM    CMN         CHECK MODEL NUMBER 
          RJM    ILU         INITIALIZE LOGICAL UNIT
          LDN    0
          STM    CFFA        INDICATE FORMAT COMPLETE 
          RJM    CLP         CLEAR *LOST PARITY* FLAGS, IF SET
          RJM    CFM         CLEAR *FORMAT PENDING* FLAG IN MST 
          LDN    FCRF 
          RJM    CPF         CLEAR *FORMAT* SPECIAL REQUEST IN *PUT*
  
*         CHECK IF ANY FORMAT REQUESTS REMAIN.
  
 CFF1     LDD    DI          SAVE DEVICE STATE TABLE INDEX
          STM    CFFB 
          LDC    DSTB        CHECK FIRST DEVICE 
          STD    DI 
 CFF2     RJM    LDP         LOAD DEVICE PARAMETERS 
          LDD    CM+3 
          SHN    21-FCRF+14 
          PJN    CFF3        IF NO FORMAT REQUEST FOR DEVICE
          RJM    CCS         CHECK CHANNEL STATE
          ZJN    CFF4        IF CHANNEL UP
 CFF3     LDN    DSTBE       CHECK NEXT DEVICE
          RAD    DI 
          LMM    DASB 
          NJN    CFF2        IF MORE DEVICES TO CHECK 
          AOD    FC          INDICATE NO MORE DEVICES TO FORMAT 
 CFF4     LDC    **          RESTORE DEVICE STATE TABLE INDEX 
 CFFB     EQU    *-1
          STD    DI 
          RJM    LDP         RELOAD DEVICE PARAMETERS 
          LJM    CMP         COMPLETE REQUEST 
  
  
 CFFA     DATA   0           FORMAT IN PROGRESS (*DST* ADDRESS) 
          TITLE  SELECTIVE RESET PROCESSING.
 SRS      SPACE  4,20 
**        SRS - SELECTIVE RESET PROCESSING. 
* 
*         ENTRY  (A) = 2/X, 16/RA.
*                  WHERE X = 0 IF SLAVE RESET.
*                          = 1 IF LOGICAL RESET.
*                       RA = RETURN ADDRESS IF COMMAND COMPLETE.
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
*                AT *SRS1* FROM *CCA* IF CHANNEL SPEED WRONG. 
* 
*         EXIT   (SRSA) = 0 IF RESET COMPLETE.
*                TO *CMP* IF PROCESSING INITIAL LOGICAL RESET.
*                TO *CMP10* IF RESET IN PROGRESS ON A DIFFERENT DEVICE, 
*                   OR IF SLAVE RESET REQUIRED DURING *RESTORE*.
*                TO *ERR* IF ERROR. 
* 
*         USES   PA, RW, TM, T1.
* 
*         CALLS  ATT, CCA, CRF, CRP, GCS, IEM, IOM, RIF, SRI, SRP, STO. 
  
  
 SRS      BSS    0           ENTRY
          STDL   T1          SAVE RETURN ADDRESS
          SHN    -20         SAVE RESET OPTION
          STD    RW 
          LDM    SRSA 
          ZJN    SRS0        IF NO RESET IN PROGRESS
          LMD    DI 
          NJP    CMP10       IF RESET IN PROGRESS ON A DIFFERENT DEVICE 
 SRS0     LDDL   T1 
          STML   SRSB        SAVE RETURN ADDRESS
  
*         REENTER HERE FROM *CCA* WITH (RW) = 0 TO FORCE SLAVE RESET. 
  
 SRS1     RJM    SRI         SET SLAVE RESET INTERLOCK, IF REQUIRED 
          LDD    RW          SET RESET OPTION 
          STM    RWST,DI
          LMN    1
          SHN    17-0 
          STDL   T1 
          LDD    DI 
          STM    SRSA        SET LOCAL RESET IN PROGRESS
          LDML   CTST,CI
          LPC    77777
          LMDL   T1          SET BIT 15 IF SLAVE RESET
          STML   CTST,CI
          LDN    1
          STDL   TM          INTERLOCK DATA TRANSFERS 
          RJM    RIF         RESET SLAVE / LOGICAL INTERFACE
          LDML   SRST,RW     DEFINE RESET TIMEOUT 
          RJM    STO
          LDD    CN          CONVERT CONTROLLER NUMBER
          ADN    1R0
          SHN    6           INSERT IN MESSAGE
          LMN    1R 
          STM    SRSG+1 
          LDD    RW 
          NJN    SRS2        IF LOGICAL RESET 
  
*         IF A SLAVE RESET IS REQUIRED DURING A RESTORE, THE RESTORE
*         WILL BE ABANDONED.  AN EXIT TO *CMP10* IS FORCED TO ENSURE
*         THAT ALL INTERLOCKS ARE CLEARED.
  
          LDM    RSIN        CHECK RESTORE INTERLOCK
          LMD    DI 
          NJN    SRS1.1      IF INTERLOCK NOT SET ON THIS DEVICE
          RJM    CRP         CLEAR *RESTORE IN PROGRESS*
          LDC    CMP10       FORCE COMPLETION AFTER RESET 
          STML   SRSB 
 SRS1.1   LDC    SRSG        ISSUE OPERATOR MESSAGE 
          RJM    IOM
          LDC    ERCR+100000 *EQXXX, UXX, CMX RESET ON CCHXX.*
          RJM    IEM         ISSUE ERRORLOG MESSAGE 
 SRS2     LDN    ASRT        WAIT ON ASYNC INTERRUPT
          RJM    ATT
          NJN    SRS3        IF NOT ASYNCHRONOUS RESPONSE 
  
*         SEARCH RESPONSE PACKET FOR MACHINE EXCEPTION PARAMETER. 
  
          LDN    ID16        LOOK FOR MACHINE EXCEPTION 
          RJM    SRP
          MJN    SRS3        IF PARAMETER NOT FOUND 
          LDML   RPBF+6,T3
          LPC    0#FEE0      CHECK OPERATIONAL + READY TRANSITION 
          LMC    0#6000 
          ZJN    SRS4        IF CONTROLLER RESET SUCCESSFUL 
 SRS3     LCN    ESRE        SELECTIVE RESET ERROR
          RJM    ERR         PROCESS ERROR
  
 SRS4     RJM    CCA         CHECK CONTROLLER ATTRIBUTES
          RJM    GCS         GET CONTROLLER SERIAL NUMBER 
          LDM    RWST,DI
          NJN    SRS5        IF NOT SLAVE RESET 
          LDC    ERRC+100000 *EQXXX, UXX, CMX RESET COMPLETE.*
          RJM    IEM         ISSUE ERRORLOG MESSAGE 
 SRS5     RJM    CRF         CLEAR RESET FLAGS
          LDML   CTST,CI     ENABLE CONTROLLER ACTIVITY 
          STDL   T0 
          LPC    37777       CLEAR BITS 15 AND 14 
          STML   CTST,CI
          LDDL   T0 
          SHN    21-16
          MJP    CMP         IF PROCESSING INITIAL LOGICAL RESET
          LDML   SRSB        RETURN ADDRESS 
          STDL   PA 
          LJM    0,PA        RETURN TO CALLER 
  
  
 SRSA     CON    0           DI OF CONTROLLING DRIVE FOR RESET
 SRSB     CON    0           RETURN ADDRESS 
  
 SRSG     DATA   C*CM3 BEING RESET ON CCHNN.* 
  
 SRST     BSS    0
          CONL   SRTO        SLAVE RESET TIMEOUT
          CONL   CBTO        LOGICAL RESET TIMEOUT
          TITLE  SUBROUTINES. 
 ACE      SPACE  4,10 
**        ACE - ANALYZE CHANNEL ERROR.
* 
*         ENTRY  (RBUF) = CHANNEL STATUS REGISTER.
* 
*         EXIT   (A) = 0 IF ERROR FLAG NOT SET. 
*                    = CHANNEL ERROR FAULT CODE.
  
  
 ACE3     LDN    ECCM        SET CHANNEL DETECTED CM ERROR
  
 ACE      SUBR               ENTRY/EXIT 
          LDM    RBUF+5 
          LPN    2
          ZJN    ACEX        IF CHANNEL ERROR FLAG NOT SET
          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
  
*         SET FAULT ANALYSIS CODE.
  
          LDN    ECPE&ECIE   CHANNEL PARITY ERROR 
 ACE1     LMN    ECIE&ECER   IPI CHANNEL ERROR FLAG 
 ACE2     LMN    ECER        CHANNEL DETECTED ERROR 
          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 STATE TABLE ADDRESS. 
* 
*         EXIT   VIA *ECI* IF INTERRUPT RECEIVED. 
*                TO *ERR* IF NO INTERRUPT.
*                (ATTA) = INTERRUPT ADDRESS FOR LAST INTERRUPT TIMEOUT. 
* 
*         CALLS  CTO, DAS.
  
  
 ATT      CON    0           ENTRY
          STML   EEST,DI
          LDML   ATT         SAVE RETURN ADDRESS
          STML   ATTN,DI
 ATT1     RJM    DAS         RETURN TO MAIN LOOP
  
*         RETURN HERE THROUGH *ECI* IF NO INTERRUPT RECEIVED. 
  
          RJM    CTO
          MJN    ATT1        IF NOT TIMEOUT 
          LDML   ATTN,DI     SAVE ADDRESS 
          STML   ATTA 
          LDN    0
          STML   ATTN,DI     CLEAR ATTENTION PROCESSING ADDRESS 
          STML   ADDR,DI     CLEAR REENTRY ADDRESS
          LDN    ETIT        INTERRUPT TIMEOUT
          RJM    ERR         PROCESS ERROR
  
  
 ATTA     CON    0           ADDRESS FOR INTERRUPT TIMEOUT
 CAA      SPACE  4,10 
**        CAA - CHECK IF ACCESS TO PARITY DEVICE IS ALLOWED.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DVTP,DI) BIT 7 SET, TIME TO CHECK FOR MMF *RESTORE*.
* 
*         EXIT   (A) = 0, IF ACCESS ALLOWED.
* 
*         CALLS  CMR, DMP, EMP. 
  
  
 CAA8     LDN    0           INDICATE ACCESS ALLOWED
  
 CAA      SUBR               ENTRY/EXIT 
          LDML   ADDR,DI
*         UJN    CAA8        (NO SHARED DEVICES CONFIGURED) 
 CAAA     EQU    *-2
          NJN    CAA8        IF REQUEST IN PROGRESS ON THIS DEVICE
          LDM    RSIN        CHECK IF RESTORE INTERLOCK SET 
          LMD    DI 
          ZJN    CAAX        IF INTERLOCK SET FOR THIS DEVICE 
          LDML   DVTP,DI
          SHN    21-7 
          MJN    CAA2        IF TIME TO CHECK FOR MMF RESTORE 
 CAA1     LDML   DVTP,DI     CHECK IF ACCESS ALLOWED
          SHN    0-10 
          LPN    21          *ACCESS DISABLED* AND *RESTORE INITIATION* 
          UJN    CAAX        RETURN 
  
 CAA2     LDML   DVTP,DI     CLEAR *CHECK MMF PARITY ACCESS* BIT
          LPC    177577 
          STML   DVTP,DI
          SHN    21-10       CHECK MMF RESTORE BITS 
          MJN    CAA5        IF *MMF RESTORE INITIATION* FLAG SET 
          RJM    CMR         CHECK MMF RESTORE FLAGS IN MST 
          PJN    CAA7        IF RESTORE INITIATION NOT IN PROGRESS
          LDML   DVTP,DI     SET *MMF RESTORE INITIATION* FLAG
          LPC    177377 
          LMC    400
          STML   DVTP,DI
 CAA3     RJM    DMP         DISABLE MMF PARITY DEVICE ACCESS 
 CAA4     UJN    CAA1        RETURN ACCESS PERMISSION 
  
 CAA5     RJM    CMR         CHECK MMF RESTORE FLAGS IN MST 
          PJN    CAA6        IF RESTORE INITIATION COMPLETE 
          LDML   DVTP,DI     CHECK MMF RESTORE BITS 
          SHN    21-14
          PJN    CAA3        IF *DISABLE* FLAG NOT SET
          UJN    CAA4        RETURN ACCESS PERMISSION 
  
 CAA6     RJM    EMP         ENABLE MMF PARITY ACCESS, IF POSSIBLE
          UJN    CAA4        RETURN ACCESS PERMISSION 
  
 CAA7     LDML   DVTP,DI     CHECK MMF RESTORE BITS 
          SHN    0-13 
          LPN    3
          ZJN    CAA4        IF NEITHER *ENABLE* OR *DISABLE* BIT SET 
          LDM    CMRA 
          NJN    CAA4        IF RESTORE STILL IN PROGRESS 
          UJN    CAA6        ENABLE MMF PARITY ACCESS 
 CAB      SPACE  4,10 
**        CAB - CHECK ACGL *MMF PARITY DEVICE ACCESS* BIT.
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (A) = 0, IF THE BIT FOR THIS MAINFRAME IS CLEAR. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  REE. 
  
  
 CAB      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM+4 
          SHN    3
          ADN    ACGL 
          CRD    CM 
          LDD    CM 
          LPN    0           (MACHINE MASK FOR THIS MF) 
 CABA     EQU    *-1
          UJN    CABX        RETURN 
 CAC      SPACE  4,15 
**        CAC - CHECK FOR ALTERNATE CHANNEL.
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (A) = 0, IF ALTERNATE CHANNEL DEFINED AND UP.
*                (CM - CM+4) = *EQDE* WORD OF EST.
*                (T1) = INDEX INTO (CM+1) FOR THIS CHANNEL. 
*                (T2) = INDEX INTO (CM+1) FOR ALTERNATE CHANNEL.
*                (T6) = MST ADDRESS / 10B.
* 
*         USES   T2.
* 
*         CALLS  CCI. 
  
  
 CAC      SUBR               ENTRY/EXIT 
          RJM    CCI         CALCULATE CHANNEL INDEX
          LMN    1
          STD    T2 
          LDM    CM+1,T2     CHECK ALTERNATE CHANNEL
          SHN    -11         CHECK IF ALTERNATE CHANNEL DEFINED AND UP
          LMN    4
          UJN    CACX        RETURN 
 CAN      SPACE  4,10 
**        CAN - CONVERT ASCII NUMBER TO DISPLAY CODE. 
* 
*         ENTRY  (T3) = ADDRESS OF OUTPUT BUFFER. 
*                (T4) = ADDRESS OF 6-DIGIT ASCII NUMBER.
* 
*         EXIT   (T3) ADVANCED. 
*                (T4) ADVANCED. 
* 
*         USES   T1, T3, T4.
  
  
 CAN      SUBR               ENTRY/EXIT 
          LDDL   T3 
          ADN    3
          STDL   T1 
 CAN1     LDIL   T4 
          SHN    -10
          SBN    60-33       CONVERT ASCII TO DISPLAY CODE
          SHN    6
          STI    T3          UPPER CHARACTER OF WORD
          LDIL   T4 
          LPC    377
          SBN    60-33       CONVERT ASCII TO DISPLAY CODE
          RAI    T3          LOWER CHARACTER OF WORD
          AODL   T4 
          AODL   T3 
          LMDL   T1 
          NJN    CAN1        IF MORE CHARACTERS TO CONVERT
          UJN    CANX        RETURN 
 CBB      SPACE  4,10 
**        CBB - CHECK BDLL *DISABLE ACCESS* BIT.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE INDEX. 
* 
*         EXIT   (A) .LT. 0, IF THE BIT FOR THIS CHANNEL IS SET.
*                (A) .GE. 0, IF THE BIT FOR THIS CHANNEL IS CLEAR.
*                (T1) = CHANNEL INDEX.
* 
*         CALLS  CCI, RBD.
  
  
 CBB      SUBR               ENTRY/EXIT 
          RJM    CCI         CALCULATE CHANNEL INDEX
          LDC    SHNI+21-7
          SBD    T1 
          STM    CBBA 
          RJM    RBD         READ *BDLL*
          LDD    CM+3        CHECK *DISABLE ACCESS* BIT IN *BDLL* 
          SHN    21-7        CHECK IF BIT SET FOR FIRST CHANNEL 
*         SHN    21-10       (CHECK IF BIT SET FOR SECOND CHANNEL)
 CBBA     EQU    *-1
          UJN    CBBX        RETURN 
 CBC      SPACE  4,10 
**        CBC - CLEAR BUFFER COUNT. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = (RQLN,DI). 
*                BUFFER COUNT IN (RQLN,DI) CLEARED. 
  
  
 CBC      SUBR               ENTRY/EXIT 
          LDM    RQLN,DI
          LPC    4000 
          STM    RQLN,DI
          UJN    CBCX        RETURN 
 CBI      SPACE  4,10 
**        CBI - CLEAR *BDT* ERROR PROCESSING INTERLOCKS.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  LNE, RBD, UBP. 
* 
*         MACROS MONITOR. 
  
  
 CBI      SUBR               ENTRY/EXIT 
          LDN    0           INITIALIZE PARTITION SEARCH
 CBI1     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CBIX        IF NO MORE PARTITIONS
          RJM    RBD         READ *BDLL*
          LDD    CM+3        CHECK IF THIS MF HOLDS INTERLOCK 
          SHN    21-12
          PJN    CBI2        IF THIS MF DOES NOT HOLD INTERLOCK 
          LDN    CEPS        CLEAR ERROR PROCESSING INTERLOCK 
          STD    CM+1 
          LDD    EO          SET EST ORDINAL
          STD    CM+4 
          MONITOR  MTEM 
*         LDN    0           CLEAR FLAG THAT SAYS THIS MF HAS INTERLOCK 
          STD    CM+2 
          LDN    26          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
 CBI2     LDD    EO 
          UJN    CBI1        CHECK FOR NEXT PARTITION 
 CCA      SPACE  4,20 
**        CCA - CHECK CONTROLLER ATTRIBUTES.
*               - DISABLE USAGE STATISTIC COUNTING. 
*               - ENABLE MASTER TERMINATE.
*               - DISABLE EXTENT RESPONSE FOR MASTER TERMINATE. 
*               - ENABLE REPORTING DEVICE FAULT LOG.
*               - SET SPEED SELECTION TO 10 MB IF 10 MB CHANNEL.
*               - SET SPEED SELECTION TO 25 MB IF 25 MB CHANNEL.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (CT) = CHANNEL TYPE. 
* 
*         EXIT   TO *SRS1* WITH (RW) = 0, IF CHANNEL SPEED WRONG. 
*                TO *ERR*, IF LOAD CONTROLLER ATTRIBUTES ERROR. 
* 
*         USES   RW, TM, T1 - T3. 
* 
*         CALLS  ATT, IDT, SDT, SOC, WCB. 
  
  
 CCA      SUBR               ENTRY/EXIT 
  
*         RESTORE CONTROLLER ATTRIBUTES.
  
          LDC    C0202       RESTORE ATTRIBUTES OPERATION CODE
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJP    CCA1.1      IF NOT SUCCESSFUL
          RJM    SDT         SET DATA TRANSFER MODE FOR INTERLOCK 
  
*         CHECK ATTRIBUTE PARAMETERS D1, D2, D3, D4, AND D6.
  
          LDC    C0200       REPORT ATTRIBUTES OPERATION CODE 
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDC    0#76C
          STML   CPBF+FCP 
          LDC    0#80D1      REPORT PARAMETERS D1,D2,D3,D4,D6 
          STML   CPBF+FCP+1 
          LDC    0#D2D3 
          STML   CPBF+FCP+2 
          LDC    0#D4D6 
          STML   CPBF+FCP+3 
          LDN    14D         COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDN    0
          STDL   T1 
          STDL   T2 
          STDL   T3 
          STDL   TM          DATA TRANSFER MODE IS STREAMING
 CCA1     LDML   ATTB,T1
          LMML   CCAA,T1
 CCA1.1   NJN    CCA2.1      IF PARAMETER ID NOT FOUND
          AODL   T1 
          SBN    11 
          PJN    CCA2        IF ALL PARAMETERS CHECKED
          LDML   ATTB,T1
          LMML   CCAA,T1
          NJN    CCA3        IF PARAMETER SET WRONG 
          AODL   T1 
          UJN    CCA1        CHECK NEXT PARAMETER 
  
 CCA2     LDML   ATTB+13
          LPC    0#F02
          LMML   CTS,CT 
          NJN    CCA3        IF ATTRIBUTE D6 INCORRECT
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          RJM    SDT         SET DATA TRANSFER MODE TO STREAMING
          LJM    CCAX        EXIT 
  
 CCA2.1   LCN    ELCA        LOAD CONTROLLER ATTRIBUTES FAILURE 
          RJM    ERR         PROCESS ERROR
  
*         LOAD/SAVE ATTRIBUTES. 
  
 CCA3     LDML   CCAA,T3     BUILD COMMAND PACKET 
          STML   CPBF+FCP,T3
          AODL   T3 
          LMN    11 
          NJN    CCA3        IF MORE PARAMETER WORDS TO MOVE
          LDML   ATTB+11
          STML   CPBF+FCP+11 PORT A,B CONTROLLER ADDRESS
          LDML   ATTB+12
          STML   CPBF+FCP+12 PORT C,D CONTROLLER ADDRESS
          LDML   ATTB+13
          LPC    0#F0FD 
          LMML   CTS,CT 
          STML   CPBF+FCP+13 SELECT CHANNEL TRANSFER RATE 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDM    RPBF 
          LMN    10 
 CCA3.1   NJP    CCA2.1      IF ERROR 
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDC    P02D1
          STM    CPBF+FCP    RESTORE WORD WIPED OUT BY *ATT*
          LDN    30D         COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    CCA3.1      IF NOT SUCCESSFUL
          RJM    SDT         SET DATA TRANSFER MODE 
          LDC    C020A       SAVE ATTRIBUTE OPERATION CODE
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDN    6
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    CCA3.1      IF NOT SUCCESSFUL
          LDML   ATTB+13
          LPC    0#F02
          LMML   CTS,CT 
          ZJP    CCAX        IF CHANNEL TRANSFER SPEED CORRECT
          LDN    0
          STD    RW 
          LJM    SRS1        FORCE SLAVE RESET
  
  
 CCAA     BSS    0           EXPECTED CONTROLLER ATTRIBUTES 
          CONL   P02D1,0#100
          CONL   P02D2,0#100
          CONL   P02D3,0#100
          CONL   P02D4,0#100
          CONL   0#7D6
 CCI      SPACE  4,15 
**        CCI - CALCULATE CHANNEL INDEX.
* 
*         ENTRY  (EO) = EST ORDINAL.
*                (IR+4) = CHANNEL SERVICED BY THIS DRIVER.
* 
*         EXIT   (A) = (T1) = INDEX INTO (CM+1) FOR THIS CHANNEL. 
*                (CM - CM+4) = *EQDE* WORD OF EST.
* 
*         USES   T1.
* 
*         CALLS  REE. 
  
  
 CCI      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM+1        EXTRACT CHANNEL
          LMD    IR+4 
          LPN    77 
          ZJN    CCI1        IF PATH SERVICED BY THIS DRIVER
          LDN    1
 CCI1     STD    T1          SET CHANNEL BYTE INDEX 
          UJN    CCIX        RETURN 
 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. 
*                (DT) = DRIVE TYPE. 
* 
*         USES   CM+2, T7.
* 
*         CALLS  IDM, IEE, SRP, UBP.
  
  
 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    MSID 
          STM    CCOA        SAVE VALUES FROM CURRENT MESSAGE 
          LDM    EDBF+FALT
          STM    CCOA+1 
          LDM    EDBF+FCS2
          STM    CCOA+2 
          LDM    MSGL+1 
          STM    CCOA+3 
          LDML   BMID,DT
          SHN    -11
          STM    MSID        ERROR MESSAGE ID 
          LDN    ECOT        CONTROLLER OVERTEMPERATURE 
          STM    EDBF+FALT   FINAL FAULT CODE 
          LDD    T7 
          ZJP    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    MSID        RESTORE VALUES IN CURRENT MESSAGE
          LDM    CCOA+1 
          STM    EDBF+FALT
          LDM    CCOA+2 
          STM    EDBF+FCS2
          LDM    CCOA+3 
          STM    MSGL+1 
  
*         SET OVER TEMPERATURE BIT IN *BDLL*. 
  
 CCO1     LDN    1           NEW VALUE
          STD    CM+2 
          LDN    63          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
          RJM    IEE         ISSUE *CHECK E,E DISPLAY* EVENT
          UJP    CCOX        RETURN 
  
  
 CCOA     BSS    4           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. 
*                AT *CCR2* FROM */3DZ/BST*. 
* 
*         EXIT   (A) = 0 IF CHANNEL DOWN. 
*                TO */3DZ/BST2* IF ENTRY WAS FROM */3DZ/BST*. 
* 
*         USES   CM+1, CR.
* 
*         CALLS  DCR, RCT, SRF. 
* 
*         MACROS DELAY, MONITOR.
  
  
 CCR3     RJM    SRF         SET DRIVER RELOAD FLAG 
 CCR4     LDD    CR 
  
 CCR      SUBR   /3DZ/BST2   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
          UJP    CCR3        SET DRIVER RELOAD FLAG 
 CCS      SPACE  4,10 
**        CCS - CHECK CHANNEL STATE FOR SPECIFIED DEVICE. 
* 
*         ENTRY  (EO) = EST ORDINAL.
*                (IR+4) = CHANNEL SERVICED BY THIS DRIVER.
* 
*         EXIT   (A) = CHANNEL STATE. 
* 
*         CALLS  CCI. 
  
  
 CCS      SUBR               ENTRY/EXIT 
          RJM    CCI         CALCULATE CHANNEL INDEX
          LDM    CM+1,T1
          SHN    -11
          SCN    4
          UJN    CCSX        RETURN 
 CDA      SPACE  4,15 
**        CDA - CONVERT DISK ADDRESS. 
* 
*         ENTRY  (T4) = RELATIVE CYLINDER NUMBER. 
*                (T5) = PHYSICAL TRACK. 
*                (T7) = LOGICAL SECTOR WITHIN PHYSICAL TRACK. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   (T6) = LOGICAL TRACK.
* 
*         USES   T1, T3 - T7, CM - CM+4.
* 
*         CALLS  REE. 
  
  
 CDA      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM+4 
          SHN    3
          ADN    MDGL 
          CRD    CM 
          LDD    CM+1        SINGLE UNIT SECTOR LIMIT 
          STD    T1 
          LDN    0           CLEAR SECTOR COUNT ACCUMULATOR 
          STD    T3 
          LDC    3777        INITIALIZE LOGICAL TRACK CALCULATION 
          STD    T6 
          LDML   CFS,DT      SET UP PHYSICAL TO LOGICAL SHIFTS
          SHN    -14
          ADK    SHNI 
          STM    CDAA 
          STM    CDAB 
  
*         MULTIPLY THE PHYSICAL TRACK NUMBER BY THE NUMBER OF LOGICAL 
*         SECTORS PER PHYSICAL TRACK. 
  
 CDA1     SOD    T5 
          MJN    CDA3        IF END OF CONVERSION 
          LDM    PSPT,DT
 CDAA     SHN    **          PHYSICAL SECTORS TO LOGICAL SECTORS
          RAD    T7          ADVANCE LOGICAL SECTOR COUNT 
          SHN    -14
          RAD    T3 
          UJN    CDA1        LOOP ON CONVERSION 
  
*         MULTIPLY THE CYLINDER NUMBER BY THE NUMBER OF LOGICAL SECTORS 
*         PER CYLINDER. 
  
 CDA2     LDML   PSCY,DT
 CDAB     SHN    **          PHYSICAL SECTORS TO LOGICAL SECTORS
          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 NUMBER OF
*         LOGICAL SECTORS PER LOGICAL TRACK.  THE SINGLE UNIT SECTOR
*         LIMIT IS USED, BECAUSE ONLY THE LOGICAL TRACK NUMBER (AND 
*         NOT THE LOGICAL SECTOR NUMBER) IS OF INTEREST.
  
 CDA4     AOD    T6          ADVANCE LOGICAL TRACK NUMBER 
          LDN    0
          SBD    T1          SINGLE UNIT SECTOR LIMIT 
          RAD    T7 
          PJN    CDA4        IF NO UNDERFLOW
          AOD    T7 
          SOD    T3 
          PJN    CDA4        IF DIVISION INCOMPLETE 
          LJM    CDAX        RETURN 
 CDS      SPACE  4,15 
**        CDS - CHECK DEVICE STATUS.
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (A) .LT. 0, IF DEVICE HAS NOT BEEN RECOVERED.
*                (A) .GT. 0, IF DEVICE IS RECOVERD AND SHARED.
*                (A) .EQ. 0, IF DEVICE IS RECOVERD AND NOT SHARED.
*                (CM - CM+4) = *EQDE* WORD OF EST ENTRY.
* 
*         CALLS  REE. 
  
  
 CDS      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM 
          SHN    21-6 
          MJN    CDSX        IF DEVICE UNAVAILABLE (NOT RECOVERED)
          LDD    CM 
          LPC    1000        ISOLATE *SHARED* STATUS
          UJN    CDSX        RETURN 
 CDT      SPACE  4,25 
**        CDT - CHECK DRIVE TYPE. 
* 
*         VERIFY THAT THE CONFIGURED DRIVE MATCHES THE ACTUAL DRIVE 
*         TYPE.  IF A DRIVE IS ACCESSED FROM 2 CONTROLLERS, THE DRIVE 
*         COULD BE RECLUSTERED FROM ONE CONTROLLER AND THE OTHER ONE
*         WOULD NOT KNOW THE CHANGE OCCURRED.  A SLAVE RESET MUST BE
*         ISSUED TO CAUSE THE CONTROLLER TO REEVALUATE THE DRIVE. 
* 
*         ENTRY  (DN) = DRIVE NUMBER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *CMP* WITH CHECK DRIVE BIT CLEAR IF CORRECT 
*                  NUMBER OF PHYSICAL DRIVES IN THE LOGICAL UNIT AND
*                  THE DRIVE ATTRIBUTES ARE CORRECT.
*                TO *CMP10* IF ERROR IN PROGRESS ON A DIFFERENT DEVICE. 
*                TO *ERR* IF ERROR. 
* 
*         USES   CM+2, T2, T3.
* 
*         CALLS  ATT, COD, CUF, DDT, SEP, UBP, VDA, WAC.
  
  
 CDT      BSS    0           ENTRY
  
*         ALLOW ACTIVITY ON OTHER DRIVES TO COMPLETE BEFORE REPORTING 
*         ATTRIBUTE 68 FOR THE CONTROLLER.  EVEN IF ISSUED, IT WOULD
*         NOT BE EXECUTED UNTIL ALL COMMANDS IN PROGRESS COMPLETE.
  
          RJM    SEP         SET ERROR PROCESSING INTERLOCK 
          NJP    CMP10       IF ERROR IN PROGRESS ON A DIFFERENT DEVICE 
          RJM    WAC         WAIT FOR OTHER ACTIVITY TO COMPLETE
  
*         CLEAR CONTROLLER OVER TEMPERATURE BIT IN *BDLL*.
  
          LDN    0           SET NEW VALUE
          STD    CM+2 
          LDN    63          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
  
*         CHECK DRIVE CONFIGURATION.
  
          LDD    DN 
          STM    PHYD,DI     PHYSICAL DRIVE 
          RJM    DDT         DETERMINE DRIVE TYPE 
          MJN    CDT1        IF DRIVE NOT FOUND 
          LDM    DDTA        TOTAL DRIVES FOUND 
          STD    T2 
          SBD    DD          TOTAL DRIVES EXPECTED
          SBD    PD 
          ZJN    CDT2        IF CORRECT DRIVE COUNT 
 CDT1     LCN    ERDA        REPORT DEVICE ATTRIBUTES ERROR 
          RJM    ERR         PROCESS ERROR
  
 CDT2     LDD    T2 
          SHN    1
          RAD    T3 
          LDM    ATTB,T3
          SHN    21-4 
          PJN    CDT4        IF NO PARITY DRIVE 
          SOD    T2 
 CDT4     LDD    T2          TOTAL DATA DRIVES FOUND
          LMD    DD          EXPECTED DATA DRIVES 
          NJN    CDT1        IF ERROR 
          LDM    ATTB,T3
          SHN    21-11
          PJN    CDT1        IF NOT CLUSTERED 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDC    C0302       REPORT ADDRESSEE STATUS OPERATION CODE 
          RJM    CUF         CHECK IF UNIT FORMATTED
          NJN    CDT1        IF NOT FORMATTED 
          RJM    VDA         VERIFY DRIVE ATTRIBUTES
          RJM    COD         CHECK FOR OFFLINE DRIVE
          LDML   DVTP,DI
          LPC    157777      CLEAR *CHECK DRIVE TYPE* FLAG
          STML   DVTP,DI
          LJM    CMP         EXIT 
 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. 
* 
*         USES   CM+2.
* 
*         CALLS  CCI, CPF, UBP. 
  
  
 CEA      SUBR               ENTRY/EXIT 
          RJM    CCI         CALCULATE CHANNEL INDEX
          LDN    0           NEW VALUE
          STD    CM+2 
          LDD    T1          BIT TO CHANGE
          ADN    49D
          RJM    UBP         CLEAR ENABLE CHANNEL BIT IN *BDLL* 
          LDN    ECAF        CLEAR SPECIAL REQUEST IN *PUT* 
          RJM    CPF
          UJN    CEAX        RETURN 
 CEC      SPACE  4,10 
**        CEC - CHECK FOR *ENABLE CONTROLLER ACTIVITY* REQUEST. 
* 
*         EXIT   (A) = 0, IF REQUEST IS FOR THIS CHANNEL. 
* 
*         USES   T1 - T7, CM. 
* 
*         MACROS SFA. 
  
  
 CEC      SUBR               ENTRY/EXIT 
          SFA    EST,EO      CHECK EST ENTRY
          ADK    EQDE 
          CRD    T1 
          LDD    T1+4 
          SHN    3
          ADN    BDLL        CHECK IF REQUEST IS FOR THIS CHANNEL 
          CRD    T4 
          LDD    T4 
          SHN    -1 
          LPN    3
          STD    T4 
          ZJN    CECX        IF NEITHER CHANNEL FLAG IS SET 
          SBN    3
          ZJN    CECX        IF BOTH CHANNEL FLAGS ARE SET
          LDM    T1,T4       COMPARE REQUESTED CHANNEL TO THIS CHANNEL
          LMD    IR+4 
          LPN    77 
          UJN    CECX        RETURN 
 CEP      SPACE  4,15 
**        CEP - CLEAR ERROR PROCESSING INTERLOCK. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
*                (ERPA) = (DI), IF ERROR PROCESSING ACTIVE ON DEVICE. 
*                (ERFL) = (DI), IF E.P. INTERLOCK SET FOR THIS DEVICE.
*                (ERMF) = (DI), IF MMF RECOVERY INTERLOCK SET.
* 
*         EXIT   (ERPA) = (ERRA) = 0, IF ERROR PROCESSING ACTIVE. 
*                (ERFL) = (ERRA) = 0, IF INTERLOCK SET. 
*                (ERMF) = 0, IF MMF RECOVERY INTERLOCK SET. 
*                MMF INTERLOCK(S) CLEARED.
* 
*         CALLS  CBI, CDS, LNE. 
* 
*         MACROS CMSTF, MONITOR.
  
  
 CEP      SUBR               ENTRY/EXIT 
          LDM    ERPA        CHECK IF ERROR PROCESSING ACTIVE 
          LMD    DI 
          NJN    CEP1        IF NOT ACTIVE ON THIS DEVICE 
          STM    ERPA        CLEAR ERROR PROCESSING ACTIVE FLAG 
          STM    ERRA        ENABLE NEXT PASS THROUGH ERROR PROCESSOR 
 CEP1     LDM    ERFL        CHECK IF ERROR PROCESSING INTERLOCK SET
          LMD    DI 
          NJN    CEPX        IF NOT SET ON THIS DEVICE
          STM    ERFL        CLEAR ERROR PROCESSING INTERLOCK FLAG
  
*         CLEAR ERROR PROCESSING FLAGS IN *MST*.
  
 CEP2     LDN    0           INITIALIZE PARTITION SEARCH
 CEP3     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CEP5        IF NO MORE PARTITIONS TO PROCESS 
          RJM    CDS         CHECK DEVICE STATUS
          MJN    CEP4        IF DEVICE NOT RECOVERED
          CMSTF  GDER        CLEAR *ERROR RECOVERY IN PROGRESS* FLAG
 CEP4     LDD    EO 
          UJN    CEP3        CHECK FOR NEXT PARTITION 
  
*         CLEAR MMF INTERLOCKS, IF SET. 
  
 CEP5     LDM    ERMF        CHECK IF RECOVERY ERROR INTERLOCK SET
          ZJN    CEP6        IF INTERLOCK NOT SET 
          LDN    CRIS        CLEAR RECOVERY ERROR PROCESSING INTERLOCK
          STD    CM+1 
          MONITOR  MTEM 
*         LDN    0           CLEAR RECOVERY ERROR INTERLOCK FLAG
          STM    ERMF 
 CEP6     RJM    CBI         CLEAR *BDT* ERROR PROCESSING INTERLOCKS
          UJP    CEPX        RETURN 
 CET      SPACE  4,10 
**        CET - CHECK ELAPSED TIME. 
* 
*         ENTRY  (CETB) = TIME OF LAST GLOBAL MST CHECK.
* 
*         EXIT   (A) .LT. 0, IF NOT TIME TO CHECK GLOBAL MST-S. 
*                (DVTP) BIT 7 SET FOR SHARED PARITY DEVICES, IF TIME. 
*                (CETB) UPDATED, IF TIME TO CHECK GLOBAL MST-S. 
* 
*         USES   T1, T2, CM - CM+4. 
  
  
 CET      SUBR               ENTRY/EXIT 
          LDK    RTCL        GET CURRENT CLOCK
          CRD    CM 
          LDD    CM+1        COMPARE LOW ORDER BYTE OF SECONDS
          SBM    CETB        CALCULATE ELAPSED TIME 
          PJN    CET1        IF NO UNDERFLOW
          ADC    10000       CORRECT FOR UNDERFLOW
 CET1     SBN    SBUR 
          MJN    CETX        IF ELAPSED TIME LESS THAN *SBUR* SECONDS 
          LDD    CM+1        SAVE CURRENT CLOCK VALUE 
          STM    CETB 
  
*         SET *CHECK MMF ACCESS* FLAGS FOR ALL SHARED PARITY DEVICES. 
  
          LDC    DSTB-DSTBE 
*         UJN    CETX        (NO SHARED DEVICES CONFIGURED) 
 CETA     EQU    *-2
          STD    T1 
 CET2     LDN    DSTBE       PROCESS NEXT DEVICE
          RAD    T1 
          LMM    DASB 
          ZJN    CETX        IF NO MORE DEVICES TO PROCESS
          LDM    DVTP,T1
          LPN    77 
          STD    T2          DRIVE TYPE 
          LDML   DM,T2
          SHN    21-17
          PJN    CET2        IF NOT PARITY DEVICE 
          LDML   DVTP,T1
          SHN    21-11
          PJN    CET2        IF NOT SHARED DEVICE 
          SHN    -21+11+22
          LPC    177577 
          LMC    200         SET *CHECK MMF PARITY ACCESS* FLAG 
          STML   DVTP,T1
          UJN    CET2        PROCESS NEXT DEVICE
  
  
 CETB     CON    0           TIME OF LAST GLOBAL MST CHECK (SECONDS)
 CFM      SPACE  4,15 
**        CFM - CLEAR *FORMAT PENDING* FLAG IN MST(S).
* 
*         IF FORMAT IS COMPLETE ON ALL UNITS OF A DEVICE, CLEAR *FP*
*         IN THE MST(S) FOR ALL PARTITIONS OF THAT DEVICE.
* 
*         ENTRY  (EO) = EST ORDINAL FOR DEVICE. 
* 
*         EXIT   MST(S) UPDATED IF FORMAT COMPLETE. 
* 
*         USES   CM - CM+4, CW - CW+4.
* 
*         CALLS  LNE. 
* 
*         MACROS CMSTF, PUTE. 
  
  
 CFM      SUBR               ENTRY/EXIT 
          LDI    DI          *PUT* ORDINAL OF FIRST UNIT OF DEVICE
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
 CFM1     SHN    PUTLS
          PUTE   *
          ADC    HSCT        GET *PUT* ORDINAL OF NEXT UNIT 
          CRD    CM 
          ADN    PILL-HSCT   GET SPECIAL REQUEST FLAGS
          CRD    CW 
          LDD    CW+3 
          SHN    21-FCRF-14 
          MJN    CFMX        IF FORMAT REQUEST SET FOR THIS UNIT
          LDD    CM+4 
          NJN    CFM1        IF ADDITIONAL UNITS IN DEVICE
*         LDN    0           INITIALIZE PARTITION SEARCH
 CFM2     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CFMX        IF NO MORE PARTITIONS
          CMSTF  LFPR        CLEAR *FORMAT PENDING* FLAG IN MST 
          LDD    EO 
          UJN    CFM2        SEARCH FOR NEXT PARTITION
 CFR      SPACE  4,25 
**        CFR - CHECK *PUT* FOR REQUEST.
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (FC) = 0 IF FORMATTING OF DRIVES NOT COMPLETE. 
* 
*         EXIT   TO SPECIAL REQUEST OR IO ROUTINE 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.
*                  (DI) = DEVICE STATE TABLE ADDRESS. 
*                TO *ERR* IF CONTROLLER ERROR.
*                TO *CFF* TO CHECK FOR FORMAT REQUEST.
*                TO *ISR* TO PROCESS SPECIAL REQUEST. 
*                TO *PIO* TO PROCESS I/O REQUEST. 
*                TO *ROD* TO RESTORE AN OFF-LINE DRIVE. 
* 
*         USES   CM+3.
* 
*         CALLS  CMP8, ECI, IDU, IIO, ISR, LDP, ROD.
  
  
 CFR9     LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    CFRX        IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          STM    RMUX        CLEAR MULTIPLEX COUNT
          RJM    ROD         RESTORE OFF-LINE DRIVE 
  
 CFR      SUBR               ENTRY/EXIT 
          RJM    ECI         EXAMINE CONTROLLER INTERRUPTS
*         RJM    CMP8        (TERMINATION PROCESSING) 
 CFRA     EQU    *-1
          NJN    CFRX        IF DEVICE SHOULD NOT BE PROCESSED
          LDD    FC 
          NJN    CFR0        IF FORMAT COMPLETE 
          LJM    CFF         CHECK FOR FORMAT 
  
 CFR0     RJM    LDP         LOAD DEVICE PARAMETERS 
          LDML   DVTP,DI     CHECK FOR INTERNAL SPECIAL REQUESTS
          SHN    6-15 
          LPC    100         ISOLATE *CHECK DRIVE TYPE* FLAG
          ZJN    CFR1        IF NO INTERNAL SPECIAL REQUESTS PENDING
          STD    CM+3        SET INTERNAL SPECIAL REQUESTS
 CFR1     LDD    CM+3 
          NJN    CFR2        IF SPECIAL REQUEST 
          LDD    WB+3 
 CFR1.1   ZJN    CFR9        IF NO I/O REQUEST
 CFR2     LDD    CM+4 
          ZJN    CFR3        IF UNIT NOT INTERLOCKED
          LMD    OA 
 CFR2.1   NJN    CFRX        IF UNIT INTERLOCKED BY OTHER DRIVER
 CFR3     LDD    CM+3 
          ZJN    CFR5        IF NOT SPECIAL REQUEST 
          RJM    ROD         SEE IF TIME TO ISSUE RESTORE 
          RJM    ISR         IDENTIFY AND PROCESS SPECIAL REQUEST 
          UJN    CFR1        CHECK FOR ANOTHER REQUEST
  
 CFR5     LDD    CB 
          RJM    IIO         INITIATE I/O 
          ZJN    CFR1.1      IF I/O NOT ENABLED ON THIS ACCESS
          RJM    IDU         INTERLOCK DISK UNIT
          NJN    CFR2.1      IF INTERLOCK NOT AVAILABLE 
          LDML   CTST,CI
          SHN    21-15
          PJN    CFR6        IF CONTROLLER FUNCTIONAL 
          LDN    ECMD        CONTROLLER DEAD
          RJM    ERR         PROCESS ERROR
  
 CFR6     RJM    ROD         SEE IF TIME TO ISSUE RESTORE 
          LJM    PIO         PROCESS I/O REQUEST
 CLP      SPACE  4,10 
**        CLP - CLEAR *LOST PARITY* FLAGS.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  CDS, LNE.
* 
*         MACROS CMSTF, MONITOR.
  
  
 CLP      SUBR               ENTRY/EXIT 
          LDML   DVTP,DI     CLEAR *PROCESS LOST PARITY* FLAG, IF SET 
          LPC    137777 
          STML   DVTP,DI
          LDN    0           INTIALIZE PARTITION SEARCH 
 CLP1     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CLPX        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    CLP2        IF DEVICE NOT RECOVERED
          LDD    EO          SET EST ORDINAL
          STD    CM+1 
          LDN    0
          STD    CM+2 
          LDN    SOUS        CLEAR OFFLINE UNIT IN *ACGL* 
          STD    CM+3 
          MONITOR  STBM 
          CMSTF  GDPL        CLEAR *PARITY PROTECTION LOST* FROM *ACGL* 
 CLP2     LDD    EO 
          UJN    CLP1        PROCESS NEXT PARTITION 
 CLU      SPACE  4,40 
**        CLU - CLUSTER LOGICAL UNIT. 
* 
*         ENTRY  (DT) = DRIVE TYPE. 
*                (CN) = CONTROLLER NUMBER.
*                (DD) = NUMBER OF DATA DRIVES IN DEVICE.
*                (DN) = DRIVE NUMBER. 
*                (PD) = NUMBER OF PARITY DRIVES IN DEVICE.
* 
*         EXIT   TO *ERR* IF ERROR. 
*                COMMAND PACKET WRITTEN THE FOLLOWING VALUES, WHERE 
*                X INDICATES THE UNIT NUMBER (RANK IN THE CABINET). 
* 
*             <- 5832 ->  <-------- 5833 / 5838 / 47444 --------->
*              -1    -2    -1    -1P   -2    -2P   -3    -3P   -4 
* 
* LENGTH      000C  0010  000C  0010  0010  0014  0014  0018  0018
* 
* CPBF+FCP+0  0568  0968  0568  0968  0968  0D68  0D68  1168  1168
* 
*          1  0X01  0X01  0X01  0X01  0X01  0X01  0X01  0X01  0X01
*          2  8600  8680  8A00  8A80  8A80  8A80  8A80  8A80  8A80
* 
*                    X           X     X     X     X     X     X
*          3  ----  0801  ----  1801  0801  0801  0801  0801  0801
*          4  ----  8680  ----  8A10  8A80  8A80  8A80  8A80  8A80
* 
*                                            X
*          5  ----  ----  ----  ----  ----  1801  1X01  1X01  1X01
*          6  ----  ----  ----  ----  ----  8A10  8A80  8A80  8A80
* 
*                                                        X     X
*          7  ----  ----  ----  ----  ----  ----  ----  1801  1801
*          8  ----  ----  ----  ----  ----  ----  ----  8A10  8A80
* 
*         USES   T1.
* 
*         CALLS  ATT, SOU, SRP, WCB.
  
  
 CLU      SUBR               ENTRY/EXIT 
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LPN    77B
          SHN    10 
          ADN    1
          STML   CPBF+FCP+1  FIRST DRIVE
          ADC    0#800
          STML   CPBF+FCP+3  SECOND DRIVE 
          ADC    0#800
          STML   CPBF+FCP+5  THIRD DRIVE
          ADC    0#800
          STML   CPBF+FCP+7  FOURTH DRIVE 
          LDD    DD          NUMBER OF DATA DRIVES
          ADD    PD          NUMBER OF PARITY DRIVES
          SBN    1           TOTAL DRIVES LESS 1
          SHN    1           SET PARAMETER BLOCK INDEX
          STD    T1 
          SHN    1+10B       BUILD CLUSTER PARAMETER
          ADC    P0568
          STML   CPBF+FCP 
          LDD    DT 
          IFNE   EQEA,0,2 
          SBK    EQEA 
          MJN    CLU1        IF NOT 5832 SOLID STATE DEVICE 
          SBK    EQEC-EQEA
          PJN    CLU1        IF NOT 5832 SOLID STATE DEVICE 
          LDC    0#8680 
          UJN    CLU2        CONTINUE SETUP 
  
 CLU1     LDC    0#8A80 
 CLU2     STML   CPBF+FCP+2 
          STML   CPBF+FCP+4 
          STML   CPBF+FCP+6 
          STML   CPBF+FCP+10
          LDD    T1 
          NJN    CLU3        IF NOT 1X DRIVE
          LDC    -0#80       CLEAR PARALLEL BIT 
          RAML   CPBF+FCP+2 
 CLU3     LDD    PD 
          ZJN    CLU4        IF NOT A PARITY DEVICE 
          LDML   CPBF+FCP+7  MAKE LAST DRIVE PARITY DRIVE 
          STML   CPBF+FCP+1,T1
          LDC    0#10-0#80   CLEAR PARALLEL BIT, SET PARITY BIT 
          RAML   CPBF+FCP+2,T1
  
*         COMMAND PACKET SETUP COMPLETE FOR ALL CONFIGURATIONS. 
  
 CLU4     LDD    T1 
          SHN    1
          ADK    0#C
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    CLU10       IF NOT SUCCESSFUL
  
*         WAIT FOR ASYNCHRONOUS RESPONSE FROM DRIVE.
  
 CLU9     LDN    ASRT 
          RJM    ATT         PROCESS ATTENTION
          NJN    CLU10       IF ERROR 
          LDD    CN 
          SHN    10 
          ADD    DN 
          LMML   RPBF+CUN 
          NJN    CLU9        IF WRONG UNIT
          LDN    ID26 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    CLU10       IF ID26 NOT FOUND
          LDML   RPBF+5,T3
          SBN    7
          MJN    CLU10       IF PARAMETER TOO SHORT 
          LDML   RPBF+5+3,T3
          SHN    21-13
          MJP    CLUX        IF READ READY
 CLU10    LCN    ELCA        LOAD CONTROLLER ATTRIBUTES FAILURE 
          RJM    ERR         PROCESS ERROR
 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          CHECK OUTPUT REGISTER
          CRD    CW 
          LDD    CW 
          ZJN    CMCX        IF NO REQUEST WAITING FOR RESPONSE 
          SHN    21-13
          PJN    CMC2        IF REISSUE FLAG NOT SET
          SHN    13-21
          LPC    177         CLEAR FLAGS
          STD    CW 
          LDD    OA          UPDATE OUTPUT REGISTER 
          CWD    CW 
          RJM    AME         REISSUE REQUEST
          UJN    CMC3        DELAY AND RECHECK
  
 CMC2     SHN    13-21
          LPC    177
          SBN    CPUM 
          PJN    CMC3        IF NOT *MTR* REQUEST 
          LDK    PPRL        SET *MTR* REQUEST FLAG 
          CRD    CW 
          LDD    OA 
          STD    CW 
          LDK    PPRL 
          CWD    CW 
 CMC3     DELAY 
          UJN    CMC1        RECHECK OUTPUT REGISTER
 CMN      SPACE  4,15 
**        CMN - CHECK MODEL NUMBER. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DN) = DRIVE NUMBER. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *ERR* IF WRONG DRIVE TYPE.
* 
*         USES   T1, T2.
* 
*         CALLS  ATT, DDT, IDT, SCP, SOU. 
  
  
 CMN4     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
  
 CMN      SUBR               ENTRY/EXIT 
          LDD    DN 
          STM    PHYD,DI     PHYSICAL DRIVE 
          RJM    DDT         DETERMINE DRIVE TYPE 
          MJN    CMN4        IF DRIVE NOT FOUND 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDC    C0200       REPORT ATTRIBUTES OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#8050 
          STML   CPBF+FCP+1 
          LDC    0#36C
          RJM    SCP         SET COMMAND PARAMETER
          LDN    10D         COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDM    DDTA        DRIVES PER LOGICAL UNIT
          STDL   T1 
          LDN    0
          STDL   T2 
 CMN1     LDML   ATTB+26D,T2
          NJN    CMN2        IF MODEL NUMBER PRESENT
          SODL   T1 
          ZJN    CMN3        IF NO MODEL NUMBER 
          LDN    14 
          RADL   T2 
          UJN    CMN1        CONTINUE SEARCH FOR MODEL NUMBER 
  
 CMN2     LMML   MN,DT       EXPECTED MODEL NUMBER
          ZJN    CMN3        IF CORRECT MODEL NUMBER
          LDC    -WDTP       WRONG DRIVE TYPE 
          RJM    ERR         PROCESS ERROR
  
 CMN3     UJP    CMN4        WAIT FOR COMPLETION RESPONSE 
 CMP      SPACE  4,25 
**        CMP - COMPLETE PROCESSING.
* 
*         ENTRY  AT *CMP* IF SPECIAL REQUEST OR I/O REQUEST 
*                   COMPLETED SUCCESSFULLY. 
*                AT *CMP1* IF UNRECOVERED ERROR.
*                AT *CMP2* FROM *ERR* IF SUSPECT STATE WAS JUST 
*                   SET FOR THE DEVICE. 
*                AT *CMP8* IF PP BEING DROPPED. 
*                AT *CMP10* TO ABANDON REQUEST (WILL BE RETRIED LATER). 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (UC) = UNIT ACTIVITY COUNT.
*                (RW) = READ / WRITE STATUS.
* 
*         EXIT   TO *DAS1*. 
*                (UC) = UNIT ACTIVITY COUNT DECREMENTED.
* 
*         USES   UC, WB+3, WB+4.
* 
*         CALLS  CBC, CEP, CMC, CRF, CRP, DMP, IDM, IMR, RCR. 
  
  
 CMP10    RJM    RCR         RESET CHANNEL REGISTERS
          RJM    CBC         CLEAR BUFFER COUNT 
*         UJN    CMP         ABANDON REQUEST
  
  
 CMP      LDM    ERCT,DI
          ZJN    CMP3        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           CLEAR ERROR COUNT
          STM    ERCT,DI
 CMP3     RJM    CEP         CLEAR ERROR PROCESSING, IF SET 
          RJM    CRF         CLEAR RESET FLAGS, IF SET
          LDM    CFFA 
          LMD    DI 
          NJN    CMP4        IF NO FORMAT IN PROGRESS ON DEVICE 
          STM    CFFA        CLEAR *FORMAT IN PROGRESS* FLAG
  
*         INCLUDE *PROBE* DATA IN FINAL *BIOM* REQUEST. 
  
 CMP4     LDD    RW          SET DATA TRANSFER DIRECTION
          SHN    13-0 
          LMM    CSCT,DI     APPEND CUMULATIVE SECTOR COUNT 
          STD    WB+4 
          LDM    RQLN,DI
 CMP5     ZJN    CMP7        IF UNIT NOT INTERLOCKED
          STD    WB+3 
          LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    CMP6        IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          LDD    WB+3 
          LPN    77 
          STD    WB+3 
          ZJN    CMP7        IF NO BUFFERS TO DELINK
          LDN    DCBS        DELINK BUFFERS (LEAVE INTERLOCK SET) 
          RJM    IMR
          RJM    CBC         CLEAR BUFFER COUNT (LEAVE INTERLOCK SET) 
          UJN    CMP7        CHECK MONITOR COMPLETE 
  
 CMP6     LDN    DCBS        DELINK BUFFERS / RELEASE UNIT INTERLOCK
          RJM    IMR
*         LDN    0           CLEAR UNIT INTERLOCKED FLAG
          STM    RQLN,DI
          SOD    UC          ADJUST UNIT ACTIVITY COUNT 
 CMP7     RJM    CMC         CHECK MONITOR COMPLETE 
*         LDN    0
          STM    ADDR,DI     CLEAR REENTRY ADDRESS
          STM    ATTN,DI     CLEAR INTERRUPT ADDRESS
          STM    CSCT,DI     CLEAR CUMULATIVE SECTOR COUNT
          STM    SREQ,DI     CLEAR SPECIAL REQUEST FLAG 
          LJM    DAS1        PROCESS NEXT DEVICE
  
*         TERMINATION PROCESSING. 
  
 CMP8     CON    0
          RJM    CRF         CLEAR RESET FLAGS, IF SET
          RJM    CEP         CLEAR ERROR PROCESSING, IF SET 
          RJM    CRP         CLEAR *RESTORE IN PROGRESS*, IF SET
          LDN    0           CLEAR *PROBE* DATA 
          STD    WB+4 
          LDD    PD 
          ZJN    CMP9        IF NOT PARITY DEVICE 
          LDML   DVTP,DI
          SHN    21-11
          PJN    CMP9        IF NOT MMF SHARED DEVICE 
          RJM    DMP         DISABLE MMF PARITY DEVICE ACCESS 
 CMP9     RJM    CBC         CLEAR BUFFER COUNT 
          UJP    CMP5        RELEASE UNIT INTERLOCK, IF SET 
 CMR      SPACE  4,15 
**        CMR - CHECK FOR MMF *RESTORE* FLAGS.
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (A) .EQ. 0, IF RESTORE NOT IN PROGRESS.
*                (A) .GT. 0, IF RESTORE IN PROGRESS FOR ANY PARTITION.
*                (A) .LT. 0, IF RESTORE INITIATION FOR ANY PARTITION. 
*                (CMRA) = EST ORDINAL OF DEVICE WITH RESTORE FLAG SET.
*                (CMRA) = 0, IF NO EST WITH RESTORE FLAG FOUND. 
* 
*         USES   T4.
* 
*         CALLS  CDS, GCA, LNE. 
  
  
 CMR3     LDD    T4          RETURN STATUS
          SHN    21-3 
  
 CMR      SUBR               ENTRY/EXIT 
          LDN    0
          STD    T4 
          STM    CMRA 
*         LDN    0           INITIALIZE PARTITION SEARCH
 CMR1     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CMR3        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    CMR2        IF DEVICE NOT RECOVERED
          ZJN    CMR2        IF NOT SHARED DEVICE 
          RJM    GCA         GET CURRENT *ACGL* 
          LDD    CM+4 
          LPN    11          CHECK *RESTORE* AND *RESTORE INITIATION* 
          ZJN    CMR2        IF NEITHER BIT SET 
          STD    T4          SAVE STATUS
          LDD    EO 
          STM    CMRA        SAVE EST ORDINAL 
 CMR2     LDD    EO 
          UJN    CMR1        CHECK FOR NEXT PARTITION 
  
  
 CMRA     CON    0           EST ORDINAL WITH *RESTORE* SET 
 COD      SPACE  4,10 
**        COD - CHECK FOR OFF-LINE DRIVE. 
* 
*         ENTRY  (PD) = PARITY DEVICE FLAG. 
* 
*         EXIT   (A) = 0, IF NO OFFLINE DRIVE FOUND.
* 
*         CALLS  ATT, RDO, SOU, WCB.
  
  
 COD1     LDN    0           INDICATE NO OFFLINE DRIVE FOUND
  
 COD      SUBR               ENTRY/EXIT 
          LDD    PD 
          ZJN    CODX        IF NOT A PARITY DEVICE 
          LDC    C0302       REPORT ADDRESSEE STATUS OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          NJN    COD1        IF ERROR 
          LDML   RPBF+11
          SHN    21-11
          PJN    COD1        IF NO OFF-LINE DRIVE DETECTED
          SHN    -21+11+22   SET PHYSICAL DRIVE ID
          LPN    37 
          STM    PHYD,DI
          STM    OUPD,DI     SET OFFLINE UNIT 
          RJM    RDO         REPORT DRIVE OFFLINE 
          LDN    1           INDICATE OFFLINE DRIVE FOUND 
          UJN    CODX        RETURN 
 CPC      SPACE  4,10 
**        CPC - CHECK FOR PARALLEL CONTROLLER.
* 
*         ENTRY (DT) = DRIVE TYPE.
* 
*         EXIT   TO *ERR* IF CONTROLLER DOES NOT SUPPORT THIS DRIVE.
* 
*         CALLS  ATT, IDT, SOC. 
  
  
 CPC1     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
  
 CPC      SUBR               ENTRY/EXIT 
          LDD    DD          DATA DRIVES PER LOGICAL UNIT 
          SBN    1
          ZJN    CPCX        IF THIS DRIVE WILL WORK IN SERIAL MODE 
          LDC    C0200       REPORT ATTRIBUTES OPERATION CODE 
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDC    0#36C
          STML   CPBF+FCP 
          LDC    0#80DA 
          STML   CPBF+FCP+1  REPORT PARAMETER DA
          LDN    10D         COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDML   ATTB+1 
          SHN    21-10
          MJN    CPC1        IF CONTROLLER SUPPORTS PARALLEL DRIVES 
          LDC    -PNSP       CONTROLLER DOES NOT SUPPORT PARALLEL 
          RJM    ERR         PROCESS ERROR
 CPE      SPACE  4,20 
**        CPE - CHECK IF PARITY DRIVE ENABLED.
* 
*         ENTRY  (FFDA) = 0 IF FAILING DRIVE IN RESPONSE PACKET.
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (FC) = FORMAT COMPLETE FLAG. 
*                (PD) = 0, IF NOT PARITY DEVICE.
*                (IPPA) = 1.
* 
*         EXIT   (CPEA) = 0 IF PARITY DRIVE AND RESPONSE HAS FAILING
*                           DRIVE.
*                (T2) = (RPBF+9) FROM REPORT ADDRESSEE STATUS.
*                TO *ERR* IF ERROR. 
* 
*         USES   T2.
* 
*         CALLS  ATT, SOU, WCB. 
  
  
 CPE      SUBR               ENTRY/EXIT 
          LDD    PD          PARITY DRIVE INDICATOR 
          ZJN    CPEX        IF NOT A PARITY DEVICE 
          LDM    SREQ,DI
          NJN    CPEX        IF SPECIAL REQUEST 
          LDML   CTST,CI
          SHN    21-15
          MJN    CPEX        IF CONTROLLER DEAD 
          LDD    FC 
          ZJN    CPEX        IF FORMAT NOT COMPLETE 
          LDM    FFDA 
          NJN    CPEX        IF NO FAILING DRIVE
          LDC    C0302       REPORT ADDRESSEE STATUS
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          ZJN    CPE2        IF SUCCESSFUL
          LCN    ERDA        REPORT DEVICE ATTRIBUTES ERROR 
          RJM    ERR         PROCESS ERROR
  
 CPE2     LDML   RPBF+11
          STDL   T2 
          SHN    3
          PJN    CPE4        IF LOGICAL UNIT NOT READ READY 
          SHN    1
          PJN    CPE4        IF NO PARITY DRIVE 
          SHN    4
          PJN    CPE3        IF NO OFF-LINE DRIVE 
          SHN    -10         RIGHT JUSTIFY OFF-LINE UNIT NUMBER 
          LMM    PHYD,DI
          LPN    37 
          NJN    CPE4        IF FAILING DRIVE NOT OFF-LINE
 CPE3     LDN    0
          STM    CPEA 
 CPE4     UJP    CPEX        RETURN 
  
  
 CPEA     CON    0
 CPF      SPACE  4,15 
**        CPF - CHANGE *PILL* FIELD IN *PUT*. 
* 
*         ENTRY  (A) = 6/V, 6/N, 6/B. 
*                      V = VALUE TO SET INTO SPECIFIED FIELD. 
*                      N = NUMBER OF BITS - 1 TO CLEAR. 
*                      B = LOW ORDER BIT NUMBER TO CHANGE.
*                (DI) = DEVICE STATUS TABLE ENTRY ADDRESS.
* 
*         EXIT   (A) = 0. 
* 
*         USES   T6, T7, CM+1 - CM+4. 
* 
*         MACROS MONITOR, PUTE. 
  
  
 CPF      SUBR               ENTRY/EXIT 
          STD    T6          SAVE FIELD SIZE AND LOW ORDER BIT
          SHN    -14
          STD    CM+2        NEW VALUE
          LDD    T6 
          SHN    6
          STD    T7          SET BIT NUMBER 
          SHN    -14
          ADC    PILL*100+1  WORD OFFSET
          STD    T6 
          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 
*         LDN    0
          UJN    CPFX        RETURN 
 CRF      SPACE  4,10 
**        CRF - CLEAR RESET FLAGS.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (SRSA) = (DI), IF RESET IN PROGRESS ON DEVICE. 
* 
*         USES   RF.
* 
*         CALLS  CRI, IOM.
  
  
 CRF      SUBR               ENTRY/EXIT 
          LDM    SRSA        CHECK RESET FLAG 
          LMD    DI 
          NJN    CRFX        IF NO RESET IN PROGRESS ON THIS DEVICE 
          STM    SRSA        CLEAR RESET FLAG 
          STD    RF          CLEAR *RESET FAILED* 
          RJM    CRI         CLEAR SLAVE RESET INTERLOCK, IF SET
          LDN    0           CLEAR OPERATOR MESSAGE 
          RJM    IOM
          UJN    CRFX        RETURN 
 CRI      SPACE  4,10 
**        CRI - CLEAR SLAVE RESET INTERLOCK.
* 
*         ENTRY  (CRIB) = 0, IF SLAVE RESET INTERLOCK NOT SET.
* 
*         CALLS  IFR. 
  
  
 CRI      SUBR               ENTRY/EXIT 
 CRIA     LDC    **          (SLAVE RESET INTERLOCK FLAG) 
*         UJN    CRIX        (NO SHARED BUFFERED DEVICES CONFIGURED)
 CRIB     EQU    *-1
          ZJN    CRIX        IF SLAVE RESET INTERLOCK NOT SET 
          LCN    /MMF/DSRI   CLEAR *DAS SLAVE RESET INTERLOCK* FLAG BIT 
          RJM    IFR
          LDN    0           CLEAR *SLAVE RESET INTERLOCK SET* FLAG 
          STM    CRIB 
          UJN    CRIX        RETURN 
 CRP      SPACE  4,15 
**        CRP - CLEAR *RESTORE IN PROGRESS* FLAGS.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
*                (RSIN) = (DI), IF RESTORE INTERLOCK SET ON DEVICE. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  CPF, CDS, LNE, RBD, UBP. 
* 
*         MACROS CMSTF, MONITOR.
  
  
 CRP4     LDN    RSPF        CLEAR *RESTORE* SPECIAL REQUEST FLAG 
          RJM    CPF
          STM    SREQ,DI     CLEAR SPECIAL REQUEST FLAG 
  
 CRP      SUBR               ENTRY/EXIT 
          LDM    RSIN        CHECK RESTORE INTERLOCK FLAG 
          LMD    DI 
          NJN    CRPX        IF INTERLOCK NOT SET FOR THIS DEVICE 
          STM    RSIN        CLEAR RESTORE INTERLOCK FLAG 
          STM    RSDI        CLEAR *RESTORE IN PROGRESS* FLAG 
*         LDN    0           INITIALIZE PARTITION SEARCH
 CRP1     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CRP4        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          ZJN    CRP2        IF DEVICE RECOVERED BUT NOT SHARED 
          RJM    RBD         READ *BDLL*
          LDD    CM+3        CHECK IF THIS MF HOLDS *RESTORE* INTERLOCK 
          SHN    21-11
          PJN    CRP3        IF THIS MF DOES NOT HOLD INTERLOCK 
 CRP2     CMSTF  GDUR        CLEAR *RESTORE IN PROGRESS* FROM *ACGL*
          CMSTF  GDRI        CLEAR *RESTORE INITIATION* FROM *ACGL* 
          LDD    EO          SET EST ORDINAL
          STD    CM+1 
          LDN    0
          STD    CM+2 
          LDN    SRCS        CLEAR REMAINING CYLINDERS / 100B IN *ACGL* 
          STD    CM+3 
          MONITOR  STBM 
          RJM    CDS         CHECK DEVICE STATUS
          MJN    CRP3        IF DEVICE NOT RECOVERED
          ZJN    CRP3        IF NOT SHARED DEVICE 
          LDD    EO          SET EST ORDINAL
          STD    CM+4 
          LDN    CRPS        CLEAR RESTORE PARITY INTERLOCK IN *BDT*
          STD    CM+1 
          MONITOR  MTEM 
*         LDN    0           CLEAR FLAG THAT SAYS THIS MF HAS INTERLOCK 
          STD    CM+2 
          LDN    25          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
 CRP3     LDD    EO 
          UJP    CRP1        PROCESS NEXT PARTITION 
 CSC      SPACE  4,10 
**        CSC - COMPUTE SECTOR COUNT FOR RESTORE. 
* 
*         ENTRY  (DT) = DRIVE TYPE. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (CPBF+FCP+2) = NUMBER OF SECTORS TO RESTORE. 
* 
*         USES   T1 - T3. 
  
  
 CSC2     LDM    PSPT,DT
          SBD    T2 
          RAD    T3          ADD SECTORS FOR LAST TRACK 
          STM    CPBF+FCP+2  SECTOR COUNT 
  
 CSC      SUBR               ENTRY/EXIT 
          LDM    RTSN 
          STM    TKSN,DI     FOR ERROR LOGGING
          SHN    14 
          STD    T1          STARTING TRACK 
          SHN    -14
          STD    T2          STARTING SECTOR
          LDD    T1 
          SHN    10 
          ADD    T2 
          STML   CPBF+FCP+4  STARTING TRACK, SECTOR 
          LDN    0
          STD    T3 
          STM    CPBF+FCP+1  UPPER 2 BYTES OF SECTOR COUNT
 CSC1     AOD    T1 
          LDM    LSOC,DT
          SHN    -6 
          SBD    T1 
          MJN    CSC2        IF LAST TRACK
          LDM    PSPT,DT
          RAD    T3          COMPUTE SECTOR COUNT 
          UJN    CSC1        INCREMENT TRACK NUMBER 
 CSN      SPACE  4,15 
**        CSN - COMPARE CONTROLLER SERIAL NUMBERS.
* 
*         COMPARE THE CONTROLLER SERIAL NUMBER IN THE *BDT* ENTRY 
*         FOR THE SPECIFIED DEVICE WITH THE SERIAL NUMBER OF THE
*         CONTROLLER PROCESSING THE DEVICE ON THIS CHANNEL. 
* 
*         ENTRY  (A) = EST ORDINAL. 
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = 0, IF CONTROLLER SERIAL NUMBER MATCHES.
* 
*         USES   CM - CM+4. 
* 
*         MACROS MONITOR. 
  
  
  
 CSN      SUBR               ENTRY/EXIT 
  
*         GET SERIAL NUMBER OF CONTROLLER PERFORMING *RESTORE*. 
  
          STD    CM+4        SET EST ORDINAL
          LDN    GBDS        GET *BDT* ENTRY
          STD    CM+1 
          MONITOR  MTEM 
          LDD    MA          READ *BDT* ENTRY 
          CRD    CM 
  
*         COMPARE WITH THIS CONTROLLER-S SERIAL NUMBER. 
  
          LDD    CM+2 
          LMM    CTSN,CI
          NJN    CSNX        IF NOT THE SAME SERIAL NUMBER
          LDD    CM+3 
          LMM    CTSN+1,CI
          NJN    CSNX        IF NOT THE SAME SERIAL NUMBER
          LDD    CM+4 
          LMM    CTSN+2,CI
          UJN    CSNX        RETURN STATUS
 CSR      SPACE  4,10 
**        CSR - CLEAR SPECIAL REQUEST.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE 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 SPECIAL REQUEST FROM *PUT* 
 CSR1     LJM    CMP         COMPLETE PROCESSING
 CTO      SPACE  4,10 
**        CTO - CHECK TIMEOUT.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) .LT. 0 IF NOT TIMEOUT. 
* 
*         USES   T6, T7, CM - CM+4. 
* 
*         MACROS FTTE.
  
  
 CTO      SUBR               ENTRY/EXIT 
          LDI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          SHK    FTTLS
          FTTE   *
          ADC    0           READ *FTT* ENTRY 
          CRD    CM 
          LDC    RTCL        FETCH CURRENT CLOCK VALUE
          CRD    T6 
          LDD    T6          CHECK ELAPSED TIME 
          SBD    CM+3 
          MJN    CTOX        IF NOT TIMEOUT 
          SHN    14 
          ADD    T7 
          SBD    CM+4 
          UJN    CTOX        RETURN 
 CUF      SPACE  4,10 
**        CUF - CHECK IF UNIT FORMATTED.
* 
*         ENTRY  (A) = OPERATION CODE.
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   (A) = 0 IF DRIVE FORMATTED WITH CORRECT SECTOR SIZE. 
*                TO *ERR* IF ERROR. 
* 
*         CALLS  ATT, SOU, WCB. 
  
 CUF3     LDN    1
  
 CUF      SUBR               ENTRY/EXIT 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          ZJN    CUF1        IF SUCCESSFUL
          LCN    ERDA        REPORT DEVICE ATTRIBUTES ERROR 
          RJM    ERR         PROCESS ERROR
  
 CUF1     LDML   RPBF+11
          SHN    21-16
          PJN    CUF3        IF NOT FORMATTED 
          SHN    21-17-21+16+22 
          MJN    CUF2        IF CLUSTERED (DATA DRIVES ALREADY CHECKED) 
          LDML   RPBF+7 
          LPN    77B         MASK ACTUAL DATA DRIVES FOR FORMAT 
          LMD    DD          EXPECTED DATA DRIVES 
          NJN    CUFX        IF WRONG NUMBER OF DATA DRIVES 
 CUF2     LDML   BPS,DT      EXPECTED SECTOR SIZE 
          SCN    77 
          LMML   RPBF+13     ACTUAL SECTOR SIZE 
          UJP    CUFX        RETURN 
 DCA      SPACE  4,15 
**        DCA - DISABLE CONTROLLER ACTIVITY.
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   *CONTROLLER DEAD* FLAG SET IN CONTROLLER STATE TABLE.
*                *CMX CONTROLLER DISABLED, CCHXX.* MESSAGE ISSUED.
* 
*         CALLS  IEM. 
  
  
 DCA      SUBR               ENTRY/EXIT 
          LDML   CTST,CI     SET *CONTROLLER DEAD* FLAG 
          LPC    017777      CLEAR BITS 15, 14 AND 13 
          LMC    020000      SET BIT 13 
          STML   CTST,CI
          LDC    ERCD+100000 *EQXXX, UXX, CMX CONTROLLER DISABLED.* 
          RJM    IEM         ISSUE ERRORLOG MESSAGE 
          UJN    DCAX        RETURN 
 DCE      SPACE  4,10 
**        DCE - DOWN CHANNEL ON EQUIPMENT.
* 
*         ENTRY  (EO) = EST ORDINAL OF DEVICE.
* 
*         USES   EO, CM - CM+4. 
* 
*         CALLS  DAS. 
* 
*         MACROS DELAY, EXECUTE, MONITOR. 
  
  
 DCE      SUBR               ENTRY/EXIT 
 DCE1     LDD    EO          SET EST ORDINAL
          STM    DCEA 
          LMC    4000 
          STM    DCEB+4      SET DRIVER CALL FLAG, EST ORDINAL
          LDD    MA 
          CWM    DCEB,ON     STORE *1DS* CALL IN MESSAGE BUFFER 
          LDN    0
          STD    CM+1        SET NON-PRIORITY REQUEST 
          EXECUTE  1DS,=
          MONITOR  RPPM      REQUEST PP 
          LDD    CM+1 
          NJN    DCEX        IF *1DS* STARTED 
          RJM    DAS         PROCESS ACTIVITY ON OTHER DEVICES
          DELAY 
          LDC    **          (EST ORDINAL OF CURRENT PARTITION) 
 DCEA     EQU    *-1
          STD    EO          RESTORE EST ORDINAL
          UJN    DCE1        RETRY CALL 
  
  
 DCEB     VFD    18/3L1DS,6/,12/DWNF,12/0,12/4000 
 DCR      SPACE  4,15 
**        DCR - DROP CHANNEL RESERVATION. 
* 
*         ENTRY  (CR) = 1 IF CHANNEL RESERVED.
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   (A) = (CR) = 0.
*                CHANNEL RESERVATION DROPPED. 
* 
*         USES   CM+1, CR.
* 
*         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 
 DDT      SPACE  4,20 
**        DDT - DETERMINE DRIVE TYPE. 
* 
*         ENTRY (PHYD,DI) =  DRIVE TO DETERMINE TYPE OF.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) .EQ. DRIVE TYPE (0-7) IF SUPPORTED DRIVE FOUND.
*                         DRIVE TYPE 8-13 AND 14-19 ARE REPORTED AS 
*                         DRIVE TYPE 2-7. 
*                (A) .EQ. *EQNS* IF NON-SUPPORTED DRIVE TYPE FOUND. 
*                (A) .LT. 0 IF DRIVE NOT FOUND OR ERROR.
*                (DDTA) = DRIVES PER LOGICAL UNIT.
*                (ATTB+2,T3) HAS BIT 9 SET IF THE DRIVE IS FOUND
*                  AND IT IS CLUSTERED.  (T3) IS ADJUSTED TO POINT
*                  TO THE CORRECT WORD IN THE RESPONSE. 
* 
*         USES   T1 - T4. 
* 
*         CALLS  IDT, SOC.
* 
*         NOTE   TO ENSURE THAT THIS ROUTINE IS NOT CALLED FOR MORE 
*                THAN ONE DEVICE AT THE SAME TIME, THE ERROR PROCESSING 
*                FLAG MUST ALWAYS BE SET BEFORE CALLING THIS ROUTINE. 
  
  
 DDT      SUBR               ENTRY
          LDC    C0200       REPORT ATTRIBUTES OPERATION CODE 
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDC    P036C
          STML   CPBF+FCP    PARAMETER TO READ REV NUMBER 
          LDC    0#8068 
          STML   CPBF+FCP+1  REPORT PARAMETER 68
          LDN    10D         COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDML   DDT
          STDL   T4          RETURN ADDRESS FROM *DDT*
          LDML   RPBF+5+2 
          SHN    -1 
          STDL   T1          LENGTH OF ATTRIBUTE DATA 
          LDM    PHYD,DI     PHYSICAL DRIVE 
          SHN    10 
          ADN    1
          STDL   T2          EXPECTED PARAMETER WORD WITH UNIT NUMBER 
          LDN    0
          STDL   T3          INDEX TO PARAMETER 68
          LDN    1
          STML   DDTA        PHYSICAL DRIVES PER LOGICAL UNIT 
 DDT1     LDML   ATTB,T3
          LMC    0#568
          NJN    DDT4        IF NOT SINGLE UNIT 
          LDML   ATTB+1,T3
          LMDL   T2 
          NJP    DDT15       IF DIFFERENT UNIT
          LDML   ATTB+2,T3
          SHN    21-12
          MJN    DDT2        IF SOLID STATE DISK
          LDN    EQEC        5833-1 OR 5838-1 OR 47444-1
          UJN    DDT3        EXIT 
  
 DDT2     LDN    EQEA        5832-1 
 DDT3     UJP    DDTX        RETURN 
  
 DDT4     LMC    0#968&0#568
          NJN    DDT9        IF NOT 2 UNITS 
          LDML   ATTB+1,T3
          LMDL   T2 
          ZJN    DDT5        IF UNIT FOUND
          LDML   ATTB+3,T3
          LMDL   T2 
          NJP    DDT16       IF DIFFERENT UNIT
 DDT5     LDN    2
          STML   DDTA        PHYSICAL DRIVES PER LOGICAL UNIT 
          LDML   ATTB+4,T3
          SHN    21-13
          MJN    DDT6        IF NOT SSD 
          LDN    EQEB        5832-2 
          UJN    DDT3        EXIT 
  
 DDT6     SHN    21-4-21+13 
          MJN    DDT7        IF PARITY DRIVE
          LDN    EQEE        5833-2 OR 5838-2 OR 47444-2
          UJN    DDT3        EXIT 
  
 DDT7     LDN    EQED        5833-1P OR 5838-1P OR 47444-1P 
 DDT8     UJN    DDT3        EXIT 
  
 DDT9     LMC    0#D68&0#968
          NJN    DDT12       IF NOT 3 UNITS 
          LDML   ATTB+1,T3
          LMDL   T2 
          ZJN    DDT10       IF UNIT FOUND
          LDML   ATTB+3,T3
          LMDL   T2 
          ZJN    DDT10       IF UNIT FOUND
          LDML   ATTB+5,T3
          LMDL   T2 
          NJP    DDT17       IF UNIT NOT FOUND
 DDT10    LDN    3
          STML   DDTA        PHYSICAL DRIVES PER LOGICAL UNIT 
          LDML   ATTB+6,T3
          SHN    21-4 
          PJP    DDT14       IF NOT A PARITY UNIT 
          LDN    EQEF        5833-2P OR 5838-2P OR 47444-2P 
 DDT11    UJN    DDT8        EXIT 
  
 DDT12    LMC    0#1168&0#D68 
          NJP    DDT20       IF ILLEGAL PARAMETER 
          LDML   ATTB+1,T3
          LMDL   T2 
          ZJN    DDT12.1     IF UNIT FOUND
          LDML   ATTB+3,T3
          LMDL   T2 
          ZJN    DDT12.1     IF UNIT FOUND
          LDML   ATTB+5,T3
          LMDL   T2 
          ZJN    DDT12.1     IF UNIT FOUND
          LDML   ATTB+7,T3
          LMDL   T2 
          NJN    DDT18       IF DIFFERENT UNIT
 DDT12.1  LDN    4
          STML   DDTA        TOTAL DRIVES 
          LDML   ATTB+10,T3 
          SHN    21-4 
          PJN    DDT13.1     IF NOT A PARITY UNIT 
          LDN    EQEM        5833-3P OR 5838-3P OR 47444-3P 
 DDT13    UJN    DDT11       EXIT 
  
 DDT13.1  LDN    EQEN        5833-4 OR 5838-4 OR 47444-4
          UJN    DDT13       EXIT 
  
 DDT14    LDN    EQNS        NUMBER OF DEFINED DRIVE TYPES
          UJN    DDT13       EXIT 
  
 DDT15    LDN    3
          UJN    DDT19       UPDATE POINTER 
  
 DDT16    LDN    5
          UJN    DDT19       UPDATE POINTER 
  
 DDT17    LDN    7
          UJN    DDT19       UPDATE POINTER 
  
 DDT18    LDN    11 
 DDT19    RADL   T3          UPDATE POINTER TO PARAMETER 68 
          SBDL   T1 
          MJP    DDT1        IF MORE PARAMETERS TO CHECK
 DDT20    LCN    0           DRIVE NOT FOUND OR ERROR 
          UJN    DDT13       EXIT 
  
  
 DDTA     CON    0           TOTAL NUMBER OF DRIVES IN LOGICAL UNIT 
 DLU      SPACE  4,10 
**        DLU - DECLUSTER LOGICAL UNIT. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DDTA) = PHYSICAL DRIVES PER LOGICAL UNIT. 
*                (PHYD,DI) = DRIVE TO DECLUSTER.
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         CALLS  ATT, SCP, SOU, SRP, WCB. 
  
  
 DLU      SUBR               ENTRY/EXIT 
          LDC    C0209+1S17  LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P0568
          RJM    SCP         SET COMMAND PARAMETER
          LDML   CPBF+CUN 
          LPN    77B         MASK DRIVE NUMBER
          SHN    10 
          ADN    1
          STML   CPBF+FCP+1  PARAMETER WORD WITH DRIVE NUMBER 
          LDD    DT 
          IFNE   EQEA,0,2 
          SBN    EQEA 
          MJN    DLU1        IF NOT SOLID STATE 
          SBN    EQEC-EQEA
          PJN    DLU1        IF NOT SOLID STATE 
          LDC    0#8500      DECLUSTER 5832 
          UJN    DLU2        SET DECLUSTER PARAMETER
  
 DLU1     LDC    0#8900      DECLUSTER 5833/5838/47444
 DLU2     STML   CPBF+FCP+2 
          LDN    12D         COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    DLU4        IF NOT SUCCESSFUL
  
*         IF THE NEXT COMMAND IS ISSUED BEFORE THE DECLUSTER
*         COMPLETES, AN ERROR COULD OCCUR.
  
 DLU3     LDN    ASRT 
          RJM    ATT         PROCESS ATTENTION
          LDK    ID26 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    DLU3        IF ID26 NOT FOUND
          SOM    DDTA 
          NJN    DLU3        IF ANOTHER ASYNCHRONOUS RESPONSE EXPECTED
          UJP    DLUX        RETURN 
  
 DLU4     LCN    ELCA        LOAD CONTROLLER ATTRIBUTES FAILURE 
          RJM    ERR         PROCESS ERROR
 DMP      SPACE  4,15 
**        DMP - DISABLE MMF PARITY DEVICE ACCESS. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         USES   CM+2.
* 
*         CALLS  CAB, CAC, CBB, LNE, RBD, UBP.
* 
*         MACROS CMSTF. 
  
  
 DMP5     LDC    **          (UNPROCESSED PARTITION COUNT)
 DMPB     EQU    *-1
          NJN    DMPX        IF NOT ALL PARTITIONS PROCESSED
          LDML   DVTP,DI     SET *ACCESS DISABLED* FLAG 
          LPC    167777 
          LMC    10000
          STML   DVTP,DI
  
 DMP      SUBR               ENTRY/EXIT 
          LDN    0           CLEAR UNPROCESSED PARTITION COUNT
          STM    DMPB 
*         LDN    0           INITIALIZE PARTITION SEARCH
 DMP1     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    DMP5        IF NO MORE PARTITIONS
          RJM    CAB         CHECK ACGL *MMF PARITY DEVICE ACCESS* BIT
          ZJN    DMP4        IF BIT FOR THIS MF IS CLEAR
          RJM    CBB         CHECK BDLL *DISABLE ACCESS* BIT
          MJN    DMP2        IF BIT FOR THIS DRIVER ALREADY SET 
          LDN    1           NEW VALUE
          STD    CM+2 
          LDD    T1          BIT TO CHANGE
          ADN    19D
          RJM    UBP         SET DISABLE ACCESS BIT IN *BDLL* 
 DMP2     RJM    CAC         CHECK FOR ALTERNATE CHANNEL
          NJN    DMP3        IF ALTERNATE CHANNEL UNDEFINED OR DOWN 
          RJM    RBD         READ *BDLL*
          LDD    CM+3        CHECK IF BITS SET FOR BOTH CHANNELS
          SHN    -7 
          LPN    3
          LMN    3
          ZJN    DMP3        IF BOTH BITS ARE NOW SET 
          AOM    DMPB        UNPROCESSED PARTITION COUNT
          UJN    DMP4        PROCESS NEXT PARTITION 
  
 DMP3     CMSTF  GPDA        CLEAR ACCESS FLAG BIT FOR THIS MF
 DMPA     EQU    *-3         (BIT NUMBER FOR THIS MF) 
 DMP4     LDD    EO 
          UJP    DMP1        PROCESS NEXT PARTITION 
 DRT      SPACE  4,10 
**        DRT - CHECK REQUEST TYPE. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (FC) = 0 IF FORMAT NOT COMPLETE. 
*                (CB) = 0 IF NO I/O BUFFER PRESENT. 
* 
*         EXIT   (A) .NE. 0 IF I/O REQUEST. 
  
  
 DRT2     LDN    0
  
 DRT      SUBR               ENTRY/EXIT 
          LDD    FC 
          ZJN    DRTX        IF FORMAT NOT COMPLETE 
          LDM    SREQ,DI
          NJN    DRT2        IF SPECIAL REQUEST 
          LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    DRT1        IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          LDM    RMUX 
          ZJN    DRTX        IF CURRENTLY RESTORING A CYLINDER
 DRT1     LDD    CB 
          UJN    DRTX 
 ECA      SPACE  4,20 
**        ECA - ENABLE CONTROLLER ACTIVITY. 
* 
*         THIS SPECIAL REQUEST CLEARS THE CONTROLLER DEAD FLAG IN THE 
*         CONTROLLER STATE TABLE.  THIS FUNCTION IS ISSUED BY *1MV* 
*         WHEN AN *UP,CCH* COMMAND IS ENTERED.
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   *CONTROLLER DEAD* FLAG CLEARED IN *CTST*.
*                *CMX CONTROLLER ENABLED, CCHXX* MESSAGE ISSUED.
*                TO *CMP* WHEN FUNCTION COMPLETE. 
* 
*         CALLS  CEA, IEM.
  
  
 ECA      BSS    0           ENTRY
          LDML   CTST,CI     ENABLE CONTROLLER ACTIVITY 
          SHN    21-15
          PJN    ECA1        IF CONTROLLER NOT DISABLED 
          SHN    -21+15+22
          LPC    17777       CLEAR BITS 15 - 13 
          STML   CTST,CI
          LDC    ERCE+100000 *EQXXX, UXX, CMX CONTROLLER ENABLED.*
          RJM    IEM         ISSUE ERRORLOG MESSAGE 
 ECA1     RJM    CEA         CLEAR ENABLE ACTIVITY REQUEST
          LJM    CMP         COMPLETE FUNCTION
 ECI      SPACE  4,15 
**        ECI - EXAMINE CONTROLLER INTERRUPTS.
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = (PA) = 0 IF NO REQUEST IN PROGRESS.
*                (A) .NE. 0, IF DEVICE SHOULD NOT BE PROCESSED. 
*                TO (ADDR,DI) IF NO RESPONSE FOR REQUEST IN PROGRESS. 
*                TO (ATTN,DI) IF RESPONSE FOR REQUEST IN PROGRESS.
*                TO *CMP* AFTER PERFORMING THE INITIAL LOGICAL RESET
*                   ON THE CONTROLLER.  THIS RESET IS DONE ONCE PER 
*                   CONTROLLER WHEN THE DRIVER IS LOADED. 
* 
*         USES   PA.
* 
*         CALLS  FCN, GIS, IDU, IHD, LDP, SAP, SRS. 
  
  
 ECI      SUBR               ENTRY/EXIT 
          RJM    SAP         SELECT ADAPTER PORT
          LDC    F0715       ENABLE INTERRUPTS
          RJM    FCN
          RJM    LDP         LOAD DEVICE PARAMETERS 
          RJM    GIS         GET INTERRUPT STATUS 
          LPML   TMSK,CN
          ZJN    ECI2        IF NO INTERRUPT FROM THIS CONTROLLER 
  
*         CHECK THAT INTERRUPT BELONGS TO CURRENT DRIVE.
  
          RJM    IHD
          ZJN    ECI2        IF RESPONSE FROM INACTIVE DRIVE
*         LDML   ATTN,DI
          STDL   PA          SET RETURN ADDRESS 
          LDN    0
          STML   ATTN,DI     DEACTIVATE RETURN
  
*         RETURN TO CALLER WITH STATUS FROM RESPONSE PACKET.
  
          LDM    EEST,DI     EXPECTED RESPONSE TYPE 
          LMD    RT 
          ZJN    ECI1        IF EXPECTED RESPONSE 
          LMD    RT 
          LMD    MS 
          ZJN    ECI1        IF EXPECTED STATUS 
          LMK    CMCS&CMSS
 ECI1     LJM    0,PA        RETURN TO CALLER 
  
*         NO INTERRUPT FOUND - CHECK FOR REQUEST IN PROGRESS. 
  
 ECI2     LDDL   PA 
          NJN    ECI1        IF REQUEST IN PROGRESS 
          LDM    ERFL 
          ZJN    ECI3        IF DRIVER NOT IN ERROR PROCESSING
          LMD    DI 
          NJN    ECI5        IF ERROR ON DIFFERENT DEVICE 
 ECI3     LDM    SRSA 
          NJN    ECI5        IF RESET IN PROGRESS 
          LDM    CFFA 
          NJN    ECI5        IF FORMAT IN PROGRESS
          LDML   CTST,CI     CHECK CONTROLLER STATUS
          SHN    21-16
          MJN    ECI6        IF INITIAL LOGICAL RESET NOT COMPLETE
          LDN    0
 ECI5     LJM    ECIX        RETURN 
  
*         PROCESS INITIAL LOGICAL RESET.
  
 ECI6     RJM    IDU         INTERLOCK DISK UNIT
          NJN    ECI5        IF DEVICE ASSIGNED ELSEWHERE 
          LDC    1S16+CMP 
          LJM    SRS         INITIATE LOGICAL RESET 
 EDR      SPACE  4,20 
**        EDR - EXECUTE DRIVE (POWER ON) RESET. 
* 
*         THIS MASTER CLEARS THE DRIVE(S), BREAKS AN OPPOSITE ACCESS
*         RESERVE AND RUNS DIAGNOSTICS.  IT IS ISSUED BY THE
*         CONTROLLER EVEN IF THE DRIVE IS OFF-LINE OR NOT OPERATIONAL.
*         IF A SLAVE RESET IS ISSUED AND AN ATTACHED DRIVE IS RESERVED
*         TO ANOTHER CONTROLLER, THE CONTROLLER WILL REPORT THE DRIVE 
*         AS NOT OPERATIONAL. 
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DD) = NUMBER OF DATA DRIVES IN DEVICE.
*                (DN) = DRIVE NUMBER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (PD) = NUMBER OF PARITY DRIVES IN DEVICE.
* 
*         EXIT   (PHYD,DI) IS NOT CHANGED.
* 
*         CALLS  ATT, DDT, SRS, UPD, WCB. 
  
  
 EDR5     RJM    UPD         UPDATE PHYSICAL DRIVE ADDRESS
          NJN    EDR1        IF MORE PHYSICAL DRIVES IN LOGICAL UNIT
          LDM    EDRA 
          STM    PHYD,DI     RESTORE DRIVE NUMBER 
  
 EDR      SUBR               ENTRY/EXIT 
          LDM    MSGL+1 
          SBN    EMBF2L-1 
          MJN    EDRX        IF NO RESPONSE PACKET
          LDM    PHYD,DI
          STM    EDRA        SAVE DRIVE NUMBER
          LDD    DN 
          STM    PHYD,DI     PHYSICAL DRIVE 
 EDR1     RJM    DDT         DETERMINE DRIVE TYPE 
          LDML   DDTA        TOTAL DRIVES IN LOGICAL UNIT 
          LMN    1
          ZJN    EDR3        IF 1X DRIVE
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDD    DD 
          ADD    PD 
          SBN    1
          ZJN    EDR2        IF 1X DRIVE CONFIGURED 
          LDM    PHYD,DI
          LPN    70B
          NJP    EDR5        IF RESET ALREADY ISSUED
 EDR2     LDD    CN 
          SHN    10 
          ADD    DN 
          SCN    0#38 
          UJN    EDR4        SAVE ADDRESS FOR COMMAND 
  
 EDR3     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDDL   CN 
          SHN    10 
          ADM    PHYD,DI
 EDR4     STML   CPBF+CUN    LOGICAL ADDRESS
          LDC    C0800       ABORT COMMAND
          STML   CPBF+OPC 
          LDC    P0254
          STML   CPBF+FCP 
          LDC    0#400       RESET AS AT POWER ON 
          STML   CPBF+FCP+1 
          LDN    10D         COMMAND PACKET LENGTH
          RJM    WCB         COMMAND PACKET TRANSFER
          LDN    CMSS        WAIT ON INTERRUPT
          RJM    ATT
          LDC    EDR5+1S16   RETURN ADDRESS/LOGICAL RESET 
          LJM    SRS         RESET IN CASE OF MULTIPLE RESPONSES
  
  
 EDRA     CON    0           FAILING DRIVE NUMBER 
 EIO      SPACE  4,35 
**        EIO - ENTER I/O REQUEST QUEUE.
* 
*         THIS ROUTINE SETS LINKAGE BITS IF THE REQUEST IS A READ.
*         IT ALSO DELINKS COMPLETED BUFFERS FROM THE REQUEST QUEUE. 
*         ON READ REQUESTS, EACH BUFFER IS DELINKED IMMEDIATELY.
*         ON WRITE REQUESTS, BUFFERS ARE ONLY DELINKED AFTER ENOUGH 
*         SUBSEQUENT SECTORS HAVE BEEN SENT TO THE CONTROLLER TO
*         ENSURE THAT THE DATA HAS BEEN FLUSHED TO THE DISK (BASED
*         ON THE FACT THAT THE CONTROLLER HAS AN INTERNAL BUFFER OF 
*         128KB FOR EACH SPINDLE OF THE DEVICE).
* 
*         THIS ALGORITHM ENSURES THAT THE CURRENT CBT ORDINAL IN THE
*         *PUT* WILL POINT TO THE SECTOR IN ERROR, WHEN AN ERROR IS 
*         ENCOUNTERED ON A WRITE REQUEST.  SINCE (CB) IS ALWAYS RESET 
*         TO THE CURRENT CBT ORDINAL FROM THE *PUT* WHEN *LDP* IS 
*         CALLED, THIS ALLOWS CODE IN *ERR* TO ENSURE THAT THE CORRECT
*         I/O REQUEST WILL BE RETRIED DURING ERROR PROCESSING.
* 
*         ENTRY  (RW) = READ / WRITE STATUS.
*                (CB) = CURRENT BUFFER ORDINAL. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
*                (NB) = NEXT BUFFER ORDINAL.
* 
*         USES   T1, WB+3, CM - CM+4. 
* 
*         CALLS  IMR, SLB.
  
  
 EIO      SUBR               ENTRY/EXIT 
          LDD    RW 
          NJN    EIO2        IF WRITE OPERATION 
          LDD    CB 
          RJM    SLB         SET LINKAGE BITS 
          LDD    NB 
          ZJN    EIO1        IF LAST BUFFER 
          LDN    1
          UJN    EIO3        DELINK AFTER ONE BUFFER READ 
  
 EIO1     LDN    2           LAST MONITOR REQUEST WILL DELINK AND 
          UJN    EIO3         RELEASE UNIT INTERLOCK
  
 EIO2     LDD    DD          CONTROLLER BUFFER IS 128K PER DATA DRIVE 
          SHN    3
          ADN    2
 EIO3     STD    T1          DELINKING CRITERIA 
          LDML   PSBF,DT
          SHN    -14
          RAM    CSCT,DI
          AOM    RQLN,DI     ADVANCE ENTRY COUNT
          LPC    3777 
          SBD    T1 
          MJN    EIO5        IF QUEUE NOT FULL
          ADN    1
          STD    WB+3        NUMBER OF BUFFERS TO DELINK
          SBN    14 
          PJN    EIO4        IF TIME TO FORCE DELINK
          LDD    OA 
          CRD    CM          CHECK OUTPUT REGISTER
          LDD    CM 
          NJN    EIO5        IF MONITOR REQUEST IN PROGRESS 
 EIO4     LDN    DCBS 
          RJM    IMR         INITIATE MONITOR REQUEST 
*         LDN    0
          SBD    WB+3        ADJUST QUEUE ENTRY COUNT 
          RAM    RQLN,DI
 EIO5     UJP    EIOX        RETURN 
 EMP      SPACE  4,15 
**        EMP - ENABLE MMF PARITY DEVICE ACCESS.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (A) = 0, IF ALL PARTITIONS PROCESSED.
* 
*         USES   CM+2, T4.
* 
*         CALLS  CAB, CBB, CCI, CDS, CMR, CSN, LNE, UBP.
* 
*         MACROS SMSTF. 
  
  
 EMP6     LDC    10000       SET *MMF RESTORE / ACCESS DISABLED* FLAG 
          STDL   T4 
 EMP7     LDML   DVTP,DI     CLEAR *ACCESS DISABLED*, *ACCESS ENABLED*, 
          LPC    163377        AND *RESTORE INITIATION* 
          LMDL   T4          SET ACCESS ENABLED OR DISABLED FLAG
          STML   DVTP,DI
 EMP8     LDC    **          (COUNT OF UNPROCESSED PARTITIONS LEFT) 
 EMPB     EQU    *-1
  
 EMP      SUBR               ENTRY/EXIT 
          LDN    0           CLEAR UNPROCESSED PARTITION COUNT
          STM    EMPB 
          RJM    CMR         CHECK MMF RESTORE FLAGS
          MJN    EMP8        IF RESTORE INITIATION IN PROGRESS
          ZJN    EMP1        IF NO RESTORE IN PROGRESS
          LDM    CMRA        EST ORDINAL WITH RESTORE SET 
          RJM    CSN         COMPARE CONTROLLER SERIAL NUMBERS
          NJN    EMP6        IF RESTORE ON DIFFERENT CONTROLLER 
          LDC    4000        SET *MMF RESTORE / ACCESS ENABLED* FLAG
          STD    T4 
          UJN    EMP7        SET FLAG AND EXIT
  
 EMP1     LDN    0           CLEAR ACCESS ENABLED/DISABLED FLAG 
          STD    T4 
*         LDN    0           INITIALIZE PARTITION SEARCH
 EMP2     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    EMP7        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    EMP4        IF DEVICE NOT RECOVERED
          RJM    CBB         CHECK BDLL *DISABLE ACCESS* BIT
          PJN    EMP3        IF BIT FOR THIS DRIVER ALREADY CLEAR 
          LDN    0           NEW VALUE
          STD    CM+2 
          LDD    T1          BIT TO CHANGE
          ADN    19D
          RJM    UBP         CLEAR DISABLE ACCESS BIT IN *BDLL* 
 EMP3     RJM    CAB         CHECK ACGL *MMF PARITY DEVICE ACCESS* BIT
          NJN    EMP5        IF BIT FOR THIS MF IS ALREADY SET
          SMSTF  GPDA        SET ACCESS FLAG BIT FOR THIS MF
 EMPA     EQU    *-3         (BIT NUMBER FOR THIS MF) 
          UJN    EMP5        PROCESS NEXT PARTITION 
  
 EMP4     AOM    EMPB        INCREMENT UNPROCESSED PARTITION COUNT
 EMP5     LDD    EO 
          UJP    EMP2        PROCESS NEXT PARTITION 
 ERR      SPACE  4,45 
**        ERR - PROCESS ERRORS. 
* 
*         ERROR PROCESSING FLOW IS CONTROLLED BY THE RETRY COUNT
*         (ERCT,DI).  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 (OR LOGICAL RESET IF A DRIVE CAN BE 
*                  OFF-LINE OR MEDIA ERROR) 
*         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      IF NO DRIVE TO OFF-LINE OR THE OFF-LINE COMMAND
*                  FAILED, SET MISCELLANEOUS AND ISSUE THE FINAL BML
*                  MESSAGE.  OTHERWISE, OFF-LINE THE FAILING DRIVE, 
*                  SET ERCT TO 0, AND EXIT. 
* 
*         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. 
* 
*         NOTE - IF AN ERROR OCCURS ON AN I/O REQUEST DURING A
*                RESTORE, ALL RETRIES WILL BE DONE ON THIS CHANNEL. 
*                IF THE ERROR IS UNRECOVERABLE, I/O REQUESTS AND
*                SPECIAL REQUESTS WILL BE DISABLED FOR THE DRIVE
*                UNTIL THE RESTORE COMPLETES. 
* 
*         ENTRY  (A) = FAULT ANALYSIS CODE. 
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   TO *DAS1* TO RETRY REQUEST.
*                TO *CMP2* AFTER SUSPECT STATE SET. 
*                TO *CMP1* IF RETRIES COMPLETE AND UNRECOVERABLE SET. 
*                TO *CMP10* IF ERROR IN PROGRESS ON DIFFERENT DEVICE. 
* 
*         USES   RW, T1 - T5. 
* 
*         CALLS  CBC, CMC, CRF, DCA, EDR, EUI, GBM, ICR, IDM, IEM, IOM, 
*                LDP, RCR, RND, SCD, SDO, SEC, SEP, SRS, SSS, WAC.
* 
*         MACROS CBTE.
  
  
 ERR      CON    0           ENTRY
          PJN    ERR1        IF NO RESPONSE PACKET
          LMC    767777 
 ERR1     STD    T4          SAVE FAULT CODE
          SHN    0-14 
          STD    T1          SET RESPONSE PACKET STATUS 
          RJM    EUI         ENSURE UNIT INTERLOCKED
          LDM    ERPA        CHECK IF ERROR PROCESSING ALREADY ACTIVE 
          ZJN    ERR1.1      IF ERROR PROCESSING NOT ACTIVE 
          LMD    DI 
          NJN    ERR2        IF ACTIVE ON DIFFERENT DEVICE
 ERR1.1   LDD    DI          SET ERROR PROCESSING ACTIVE FLAG 
          STM    ERPA 
          LDM    SRSA 
          ZJN    ERR4        IF NO RESET IN PROGRESS
          LMD    DI 
          ZJN    ERR3        IF THIS UNIT CONTROLLING RESET 
 ERR2     LJM    CMP10       ABANDON REQUEST (RETRY LATER)
  
 ERR3     RJM    CRF         CLEAR RESET FLAGS
          LDM    RWST,DI
          NJN    ERR4        IF NOT SLAVE RESET 
          LDC    ERRF+100000 *EQXXX, UXX, CMX RESET FAILURE.* 
          RJM    IEM         ISSUE ERRORLOG MESSAGE 
          LDN    0           CLEAR OPERATOR MESSAGE 
          RJM    IOM
          RJM    DCA         DISABLE CONTROLLER ACTIVITY
 ERR4     LDN    0           CLEAR CHANNEL ACTIVE 
          RJM    SCD
          LDC    **          (ZERO IF NEW PASS THROUGH ERROR PROCESSING)
 ERRA     EQU    *-1
          NJP    ERR11       IF NOT NEW PASS THROUGH ERROR PROCESSING 
          AOM    ERRA        INDICATE STATUS SAVED
          LDM    ERCT,DI
          SBN    SRRC 
          ZJN    ERR6        IF ERROR MIGHT BE FROM SLAVE RESET 
          LDM    RWST,DI
          STM    IOST,DI     SAVE READ/WRITE STATUS 
 ERR6     LDD    DN          SET DEFAULT FAILING DRIVE (MAY BE CHANGED
          STM    PHYD,DI       LATER IF A RESPONSE IS PRESENT)
          LCN    0
          STM    EDBF+FCS2   NO RESPONSE PACKET FOR *HPA* 
          LDD    T4          INSERT INITIAL FAULT CODE
          STM    EDBF+CODE
          STM    EDBF+FALT   PRESET FINAL FAULT CODE
  
*         GENERATE BML MESSAGE.  ON A *CONDITIONAL SUCCESS* ERROR,
*         REENTER CALLING ROUTINE TO COMPLETE PROCESSING REQUEST. 
  
          RJM    GBM         GENERATE BML MESSAGE 
  
*         RELOAD DEVICE PARAMETERS AND CLEAR BUFFER COUNT.  IF AN ERROR 
*         OCCURS WHILE STREAMING WRITE REQUESTS, THIS ENSURES THAT (CB) 
*         POINTS TO THE REQUEST IN ERROR, AND THAT NO ADDITIONAL WRITE
*         REQUESTS WILL BE DELINKED.  SEE DOCUMENTATION IN *EIO*. 
  
          RJM    LDP         RELOAD DEVICE PARAMETERS 
          RJM    CBC         CLEAR BUFFER COUNT 
  
*         SET ERROR PROCESSING INTERLOCK. 
  
          RJM    SEP         SET ERROR PROCESSING INTERLOCK 
          NJP    CMP10       IF ERROR IN PROGRESS ON A DIFFERENT DEVICE 
          LDN    0           CLEAR *FORMAT IN PROGRESS* FLAG
          STM    CFFA 
          LDML   CTST,CI
          SHN    21-15
          PJN    ERR7        IF CONTROLLER STILL FUNCTIONAL 
          LDN    1
          STM    CPEA        INDICATE NO DRIVE TO OFF-LINE
          UJN    ERR14       SLAVE RESET FAILED 
  
*         ALLOW ACTIVITY ON OTHER DRIVES TO COMPLETE BEFORE ISSUING 
*         THE RESET.
  
 ERR7     RJM    WAC         WAIT FOR OTHER ACTIVITY TO COMPLETE
          RJM    ICR         ISSUE CONTROLLER RESET 
*         UJN    ERR12       (IF RESET SUCCESSFUL)
          UJN    ERR14       RESET FAILED 
  
*         REENTER HERE IF ERROR WHILE ATTEMPTING HARDWARE RECOVERY. 
  
 ERR11    RJM    RCR         RESET CHANNEL REGISTERS
          UJN    ERR14       SET RECOVERY FAULT CODE
  
 ERR12    LDM    ERCT,DI     CHECK RETRY COUNT
          SBN    1
          ZJN    ERR13       IF TIME FOR DRIVE RESET
          SBN    MERC-CSRC
          NJN    ERR14       IF NOT TIME FOR DRIVE RESET
 ERR13    RJM    EDR         EXECUTE DRIVE RESET
 ERR14    LDN    0
          STM    EDBF+FCS3   SET RECOVERY FAULT CODE
          LDM    IOST,DI
          STM    RWST,DI     RESTORE READ/WRITE STATUS
          STD    RW 
          LDM    ERCT,DI     CHECK ERROR COUNT
          SBN    MERC-1 
          MJN    ERR15       IF NOT TIME TO OFF-LINE DRIVE
          RJM    SDO         SET DRIVE OFF-LINE 
          RJM    SEC         SET ERROR CODE IN *CBT*
          AOM    MISC        MARK ERROR UNRECOVERED 
          LJM    CMP1        COMPLETE PROCESSING
  
 ERR15    AOM    ERCT,DI
          LDD    HN 
          ERRNZ  HD0100-100  CODE DEPENDS ON VALUE
          RJM    IDM         ISSUE MESSAGE
          LDML   CTST,CI
          SHN    21-15
          MJN    ERR16       IF CONTROLLER DEAD 
          LDM    ERCT,DI
          SBN    MERC-1 
          NJN    ERR16       IF NOT TIME TO RUN DIAGNOSTICS 
          RJM    RND         RUN DRIVE DIAGNOSTICS
 ERR16    LDM    SREQ,DI
          NJP    ERR19       IF SPECIAL REQUEST 
          LDD    FC 
          ZJP    ERR19       IF FORMAT NOT COMPLETE 
          LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    ERR17       IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          LDM    RMUX 
          ZJN    ERR18       IF CURRENTLY RESTORING A CYLINDER
 ERR17    LDM    ERCT,DI
          LMN    CSRC 
          NJN    ERR18       IF NOT TIME FOR CHANNEL SWAP 
          LDD    CB 
          ZJN    ERR17.1     IF NO I/O BUFFER 
          SHN    CBTLS
          CBTE   *
          ADC    HSLK        GET CHANNEL SELECT STATUS
          CRD    T1 
          LDD    T1 
          SHN    0-12 
          LMN    1
          ZJN    ERR19       IF REQUEST ALREADY CHANNEL-SPECIFIC
 ERR17.1  UJP    ERR20       SET SUSPECT STATE
  
 ERR18    LDM    EDBF+CODE
          LMN    EROD 
          NJN    ERR19       IF NOT RESTORE 
          LDM    EDBF+FALT
          LMN    EDPE 
          NJN    ERR19       IF NOT MEDIA ERROR 
  
*         IF THE RETRY LIMIT FOR SKIPPING MEDIA ERRORS DURING A 
*         RESTORE IS CHANGED, CODE IN *GBM* MUST ALSO BE CHANGED. 
  
          LDML   ERCT,DI
          SBN    2
          ZJP    CMP         IF MEDIA RETRY LIMIT FOR RESTORE 
 ERR19    RJM    CMC         CHECK MONITOR COMPLETE 
*         LDN    0
          STM    ADDR,DI     CLEAR REENTRY ADDRESS
          STM    ATTN,DI     CLEAR INTERRUPT ADDRESS
          STM    CSCT,DI     CLEAR CUMULATIVE SECTOR COUNT
          STM    SREQ,DI     CLEAR SPECIAL REQUEST FLAG 
          STM    ERRA        ENABLE NEXT PASS THROUGH ERROR PROCESSOR 
          LDD    RF 
          NJN    ERR19.2     IF RESET FAILURE 
 ERR19.1  LJM    DAS1        RETURN TO MAIN LOOP
  
 ERR19.2  LDML   CTST,CI
          SHN    21-15
          MJN    ERR19.1     IF CONTROLLER DEAD 
          LDC    1S16+DAS1   RETURN ADDRESS 
          LJM    SRS         ISSUE LOGICAL RESET
  
 ERR20    RJM    SSS         SET SUSPECT STATE ON DEVICE
          RJM    SEC         SET ERROR CODE IN *CBT*
          LJM    CMP2        COMPLETE PROCESSING
  
  
 ERPA     CON    0           ERROR PROCESSING ACTIVE FLAG (*DST* INDEX) 
 EUI      SPACE  4,15 
**        EUI - ENSURE UNIT INTERLOCKED.
* 
*         IF AN INTERRUPT IS PRESENT AND A CHANNEL ERROR OCCURS WHILE 
*         READING THE RESPONSE, (DI) MIGHT BE FOR A UNIT THAT IS NOT
*         INTERLOCKED.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (DI) = DEVICE ADDRESS OF INTERLOCKED UNIT. 
*                TO *CMP7* IF NO INTERLOCKED UNIT.
* 
*         USES   DI.
* 
*         CALLS  LDP, LND, RCR. 
  
  
 EUI      SUBR               ENTRY/EXIT 
          LDM    RQLN,DI
          SHN    0-13 
          NJN    EUIX        IF UNIT INTERLOCKED
          STML   ADDR,DI     CLEAR REENTRY ADDRESS
          STML   ATTN,DI     CLEAR INTERRUPT ADDRESS
*         LDN    0           LOCATE FIRST DRIVE 
 EUI1     RJM    LND         LOCATE NEXT DRIVE
          ZJN    EUI2        IF NO MORE DRIVES ON CONTROLLER
          LDM    RQLN,T7
          SHN    0-13 
          LMN    1
          NJN    EUI1        IF UNIT NOT INTERLOCKED
          LDD    T7 
          STD    DI 
          RJM    LDP         LOAD DEVICE PARAMETERS 
          UJN    EUIX        RETURN 
  
 EUI2     RJM    RCR         RESET CHANNEL REGISTERS
          LJM    CMP7        COMPLETE REQUEST 
 FFD      SPACE  4,15 
**        FFD - FIND FAILING DRIVE. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (FFDA) = 0 IF FAILING DRIVE. 
*                (PHYD,DI) = FAILING DRIVE. 
* 
*         USES   T3.
* 
*         CALLS  SRP. 
  
  
 FFD      SUBR               ENTRY/EXIT 
          LDM    EDBF+FALT
          SBN    EMME 
          ZJN    FFD1        IF RESPONSE PRESENT
          SBN    EIVR-EMME
          ZJN    FFD1        IF RESPONSE PRESENT
          SBN    EMEX-EIVR
          NJP    FFD7        IF NO RESPONSE PACKET
 FFD1     LDK    ID23 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    FFD2        IF ID23 NOT FOUND
          LDML   RPBF+5,T3
          SHN    -10
          SBN    6
          PJN    FFD4        IF FAILING DRIVE FOUND 
 FFD2     LDK    ID24 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    FFD3        IF ID24 NOT FOUND
          LDML   RPBF+5,T3
          SHN    -10
          SBN    7
          MJN    FFD3        IF NO FAILING DRIVE
          LDML   RPBF+5+3,T3
          UJN    FFD5        CHECK FOR PHYSICAL DRIVE NUMBER
  
 FFD3     LDK    ID26 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    FFD7        IF ID26 NOT FOUND
          LDML   RPBF+5,T3
          SHN    -10
          SBN    10 
          MJN    FFD7        IF NO FAILING DRIVE
          AOD    T3 
 FFD4     LDML   RPBF+5+3,T3
          SHN    -10
 FFD5     LPC    377
          LMC    0#FE 
          ZJN    FFD7        IF NO PHYSICAL DRIVE NUMBER
          LMC    0#FE 
          STM    PHYD,DI     SAVE FAILING DRIVE NUMBER
          LDML   RPBF+OPC 
          LMC    C0209
          ZJN    FFD7        IF COMMAND THAT OFF-LINES A DRIVE
          LDN    0
 FFD6     STM    FFDA 
          UJP    FFDX        RETURN 
  
 FFD7     LDN    1
          UJN    FFD6        RETURN 
  
  
 FFDA     CON    0
 FMU      SPACE  4,15 
**        FMU - FORMAT UNIT.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (PHYD,DI) = THE PHYSICAL DRIVE TO FORMAT.
*                (DD) = NUMBER OF DATA DRIVES IN DEVICE.
*                (DT) = DRIVE TYPE. 
*                (FC) = FORMAT COMPLETE FLAG. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         CALLS  ATT, C2D, IEM, IOM, SFP, WCB.
  
  
 FMU      SUBR               ENTRY/EXIT 
          LDC    ERFI        *EQXXX, UXX, FORMAT INITIATED.*
          RJM    IEM         ISSUE ERROR LOG MESSAGE
          LDM    PHYD,DI
          RJM    C2D         PUT UNIT NUMBER IN MESSAGE 
          STM    FMUA+4 
          LDD    EO 
          RJM    C2D         CONVERT EST ORDINAL
          STM    FMUA+2 
          LDD    EO 
          SHN    -6          SET ORDINAL IN MESSAGE 
          ADC    2RQ0 
          STM    FMUA+1 
          LDC    FMUA 
          RJM    IOM         ISSUE OPERATOR MESSAGE 
  
*         FORMAT THE DIAGNOSTIC CYLINDER. 
  
          RJM    SFP         SET COMMON FORMAT PARAMETERS 
          LDC    0#1DF
          STML   CPBF+FCP+3  FORMAT THE DIAGNOSTIC CYLINDER 
          LDD    DT          DRIVE TYPE 
          IFNE   EQEA,0,2 
          SBN    EQEA 
          MJN    FMU0        IF NOT 5832
          SBN    EQEC-EQEA
          MJN    FMU1        IF 5832
 FMU0     LDN    0#E         COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    FMU1.2      IF NOT SUCCESSFUL
  
*         FORMAT THE DATA CYLINDERS.
  
 FMU1     RJM    SFP         SET COMMON FORMAT PARAMETERS 
          LDML   FC 
          NJN    FMU2        IF DRIVE CLUSTERED 
          LDC    0#7DD       FACTORY FORMAT PARAMETER 
          STML   CPBF+FCP+3 
          LDD    DD 
          STML   CPBF+FCP+4  DATA DRIVES PER LOGICAL UNIT 
          LDN    0
          STML   CPBF+FCP+5  UPPER BYTES OF SECTOR SIZE 
          LDML   BPS,DT      BYTES PER SECTOR 
          SCN    77 
          STML   CPBF+FCP+6 
          LDN    0#14        COMMAND PACKET LENGTH
          UJN    FMU3        WRITE COMMAND PACKET 
  
 FMU1.2   LCN    EFDF        FORMAT DRIVE FAILURE 
          RJM    ERR         PROCESS ERROR
  
 FMU2     LDC    0#53B
          STML   CPBF+FCP+3  LOGICAL SECTOR SIZE
          LDN    0
          STML   CPBF+FCP+4  UPPER BYTES OF SECTOR SIZE 
          LDML   BPS,DT 
          SCN    77 
          STML   CPBF+FCP+5 
          LDN    0#12        COMMAND PACKET LENGTH
 FMU3     RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    FMU1.2      IF ERROR 
*         LDN    0           CLEAR OPERATOR MESSAGE 
          RJM    IOM
          LDC    ERFC        *EQXXX, UXX, FORMAT COMPLETE.* 
          RJM    IEM         ISSUE ERROR LOG MESSAGE
          UJP    FMUX        RETURN 
  
  
 FMUA     DATA   C* EQ000 U00 FORMATTING.*
 GBM      SPACE  4,35 
**        GBM - GENERATE BML MESSAGE. 
* 
*         THIS ROUTINE GENERATES THE ERROR MESSAGE FOR SYMPTOM 100 OR 
*         111.  IF THE ERROR IS A MEDIA ERROR, THE RETRY COUNT IS ONE,
*         AND THE COMMAND IS READ OR WRITE, THE TRACK FLAW WILL BE SET
*         IN THE MST.  IF THE ERROR IS A MEDIA ERROR, THE RETRY COUNT 
*         IS ONE, AND THE COMMAND IS A RESTORE, THE CYLINDER, TRACK,
*         AND SECTOR VALUES WILL BE UPDATED TO POINT TO THE SECTOR
*         AFTER THE ONE WITH THE MEDIA ERROR, SO THE NEXT RESTORE 
*         COMMAND WILL END UP SKIPPING THE MEDIA DEFECT.
* 
*         ENTRY  (T1) .NE. 0 IF RESPONSE PACKET PRESENT.
*                (DI) .EQ. DEVICE STATE TABLE ADDRESS.
*                (DT) .EQ. DEVICE TYPE. 
* 
*         EXIT   TO *DAS1* IF CONDITIONAL SUCCESS.  THE CONTROLLER
*                  RETURNS AN ASYNCHRONOUS RESPONSE WITH A PARAMETER 29 
*                  FOR EACH PHYSICAL DRIVE OF THE LOGICAL UNIT THAT IT
*                  PERFORMED RECOVERY ON.  IT THEN RETURNS A COMMAND
*                  COMPLETION RESPONSE.  THIS ROUTINE LOGS THE
*                  ASYNCHRONOUS RESPONSE TO THE BML, THEN EXITS TO THE
*                  MAIN LOOP, *DAS*.  SINCE (ATTN,DI) AND (ADDR,DI) ARE 
*                  STILL SET EXPECTING THE COMMAND COMPLETION RESPONSE, 
*                  WHEN THE COMMAND COMPLETION RESPONSE IS RECEIVED,
*                  THE CODE IN *PIO* WILL GO TO *CMP* AND LOG A 
*                  RECOVERED ERROR.  HOWEVER, IF THE ERROR COUNT
*                  REACHES THE MAXIMUM VALUE WHEN PROCESSING A
*                  CONDITIONAL SUCCESS, IT WILL BE TREATED AS A 
*                  NORMAL ERROR.
* 
*         USES   PA, T2 - T7. 
* 
*         CALLS  ACE, CCO, FFD, IDM, RCR, RMR, RTR, SMD, SRP, STF, UHD. 
  
  
 GBM      SUBR               ENTRY/EXIT 
          LDM    CSCT,DI
          STM    EDBF+STCT   SECTORS TRANSFERRED
          LDM    CYLN,DI     SET SEEK ADDRESS - CYLINDER
          STM    EDBF+ICYL
          LDM    TKSN,DI     SEEK ADDRESS - TRACK AND SECTOR
          STM    EDBF+ITAS
          LDML   LCMD,DI     SET LAST COMMAND 
          STML   EDBF+LSCC
          LDML   GSSA        EXECUTION (ENDING) STATUS
          STML   EDBF+EXST
          LDML   ERR         ERROR RECOVERY ENTRY ADDRESS 
          STML   EDBF+EREA
 GBM1     LDDL   LF          SAVE LAST CHANNEL FUNCTION 
          STML   EDBF+LCFN
          SCF.   GBM1,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 
          RJM    ACE         ANALYZE CHANNEL ERROR
          STML   EDBF+FCS1   SAVE CHANNEL STATUS
          LDC    EDBF+CREG
          STDL   T5          SET ERROR BUFFER ADDRESS 
 GBM2     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    GBM2        IF MORE REGISTER DATA
          RJM    RTR         READ T REGISTER
          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
          LDD    T1 
          ZJN    GBM3        IF NO RESPONSE PACKET PRESENT
  
*         PUT RESPONSE IN BML.
  
          LDC    RPBF 
          STDL   T2          SET SOURCE DATA ADDRESS
          LDIL   T2 
          ADN    3           CALCULATE STATUS BLOCK LENGTH
          SHN    -1 
          SBK    RPBFL
          MJN    GBM2.1      IF LESS THAN MAXIMUM SIZE
          LDN    0
 GBM2.1   ADK    RPBFL
          STD    T4 
          LDC    EDBF+EMBF2  CONVERT STATUS TO 12 BIT DATA
          RJM    UHD         MOVE RESPONSE PACKET TO BML MESSAGE
          RAM    MSGL+1      INCREASE LENGTH TO INCLUDE RESPONSE
          LDN    0
          STM    EDBF+FCS2   RESPONSE PACKET 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 
 GBM3     ZJP    GBM27       IF NO SUBSTATUS
          LCN    0
          STD    T3 
 GBM4     AOD    T3          ADVANCE INDEX
          LDD    T2 
          SHN    21-0        CONVERT FLAG POSITION TO INDEX 
          STD    T2 
          PJN    GBM4        IF BIT NOT SET 
          LDML   GBMA,T3
          STDL   PA          SET PROCESSOR ADDRESS
          LJM    0,PA        EXIT TO PROCESSOR
  
*         RESERVED SUBSTATUS (PID = X0 AND X1). 
  
 GBM5     LDN    ERSS 
          UJN    GBM11       SET FINAL FAULT CODE 
  
*         DEFECT MANAGEMENT (PID = X2). 
  
 GBM6     LDN    EDFM 
          UJN    GBM11       SET FINAL FAULT CODE 
  
*         MESSAGE / MICROCODE EXCEPTION (PID = X3). 
  
 GBM7     LDN    EMME 
          UJN    GBM11       SET FINAL FAULT CODE 
  
*         INTERVENTION REQUIRED (PID = X4). 
  
 GBM8     LDN    ID24 
          RJM    SRP         SEARCH RESPONSE PACKET 
          PJN    GBM10       IF ID24 FOUND
 GBM9     LDN    EIVR 
          UJN    GBM11       SET FINAL FAULT CODE 
  
 GBM10    LDML   RPBF+5+1,T3
          SHN    21-11
          PJN    GBM9        IF NOT FACILITY BUSY 
          LDN    EDRE 
 GBM11    LJM    GBM26       SET FINAL FAULT CODE 
  
*         ALTERNATE PORT EXCEPTION (PID = X5).
  
 GBM12    LDN    EAPR 
          UJN    GBM11       SET FINAL FAULT CODE 
  
*         MACHINE EXCEPTION (PID = X6). 
  
 GBM13    LDN    ID26        SEARCH FOR DRIVE SUBSTATUS 
          RJM    SRP
          ZJN    GBM15       IF SUBSTATUS FOUND 
 GBM14    LDN    0           DO NOT ISSUE SPECIAL BML MESSAGE 
          RJM    CCO         CHECK FOR CONTROLLER OVER TEMPERATURE
          LDN    EMEX 
          LJM    GBM26       SET FINAL FAULT CODE 
  
 GBM15    LDML   RPBF+5,T3   CHECK LENGTH OF PARAMETER
          SHN    -10
          SBN    0#10+1 
          MJN    GBM14       IF NO EXTENDED SUBSTATUS 
          LDML   RPBF+5+4,T3
          SHN    -10
          LMC    0#FE 
          ZJN    GBM16       IF NO PHYSICAL DRIVE NUMBER
          LMC    0#FE 
          STM    PHYD,DI     FAILING PHYSICAL DRIVE 
 GBM16    LDM    RPBF+15,T3 
          LPN    77          EXAMINE COMMAND ENDING STATUS
          SBN    0#11 
          ZJN    GBM17       IF ECC ERROR 
          SBN    0#13-0#11
          ZJN    GBM17       IF MISSING SYNC
          SBN    0#19-0#13
          NJP    GBM14       IF NOT SECTOR NOT FOUND ERROR
 GBM17    LDML   RPBF+OPC 
          SHN    -14
          SBN    1
          ZJN    GBM18       IF READ
          SBN    1
          ZJN    GBM18       IF WRITE 
          SBN    14 
          NJP    GBM14       IF NOT RESTORE (NOT MEDIA ERROR) 
 GBM18    LDM    ERCT,DI
          LMN    1
          NJN    GBM19       IF NOT FIRST RETRY 
          LDM    RPBF+12,T3 
          STD    T4          SET CYLINDER IN ERROR
 GBM18.1  SBM    MC,DT       CHECK FOR MAINTENANCE CYLINDER 
          ZJN    GBM19       IF NOT IN USER AREA
          SBN    1
          PJN    GBM18.1     IF MORE TO CHECK 
          LDML   CFS,DT 
          SHN    -14
          ADK    SHNI 
          STM    GBMB 
          LDML   RPBF+13,T3 
          LPN    77 
          STD    T6          PHYSICAL SECTOR
 GBMB     SHN    **          CONVERT PHYSICAL TO LOGICAL
          STD    T7          LOGICAL SECTOR WITHIN PHYSICAL TRACK 
          LDML   RPBF+13,T3 
          SHN    -10
          STD    T5          PHYSICAL TRACK 
          RJM    SMD         SKIP MEDIA DEFECT
          NJN    GBM19       IF RESTORE 
          RJM    STF         INSERT TRACK FLAW IN MST 
 GBM19    LDN    EDPE 
          UJN    GBM22       SET FINAL FAULT CODE 
  
*         COMMAND EXCEPTION (PID = X7). 
  
 GBM20    LDN    ECEX 
          UJN    GBM22       SET FINAL FAULT CODE 
  
*         COMMAND ABORTED (PID = X8). 
  
 GBM21    LDN    ECMA 
 GBM22    LJM    GBM26       SET FINAL FAULT CODE 
  
*         COMMAND CONDITIONALLY SUCCESSFUL (PID = X9).
  
 GBM23    LDN    ECCS 
          STML   EDBF+FALT   SET FAULT CODE 
          LDN    ID29 
          RJM    SRP         SEARCH RESPONSE PACKET 
          MJN    GBM24       IF ID29 NOT FOUND
          LDML   RPBF+5,T3
          SHN    -10
          SBN    6
          MJN    GBM24       IF NO FAILING DRIVE
          LDML   RPBF+5+3,T3
          SHN    -10
          LMC    0#FE 
          ZJN    GBM24       IF NO FAILING DRIVE NUMBER 
          LMC    0#FE 
          STM    PHYD,DI     FAILING DRIVE NUMBER 
 GBM24    LDN    0
          STM    EDBF+FCS3
          LDM    ERCT,DI     CHECK ERROR COUNT
          SBN    MERC-1 
          MJN    GBM24.1     IF MAXIMUM ERROR COUNT NOT REACHED 
          LDN    ECCS 
          UJN    GBM26       SET FINAL FAULT CODE 
  
*         ISSUE BML MESSAGE AND RETURN TO MAIN LOOP.  THIS ALLOWS 
*         A REENTRY BASED ON THE VALUES OF (ATTN,DI) AND (ADDR,DI). 
  
 GBM24.1  AOM    ERCT,DI     INCREMENT ERROR COUNT
          LDD    HN 
          ERRNZ  HD0100-100  CODE DEPENDS ON VALUE
          RJM    IDM         ISSUE MESSAGE
          LDN    0
          STM    ERPA        CLEAR ERROR PROCESSING ACTIVE FLAG 
          STM    ERRA        ENABLE NEXT PASS THROUGH ERROR PROCESSOR 
          LJM    DAS1        RETURN TO MAIN LOOP
  
*         COMMAND INCOMPLETE (PID = XA).
  
 GBM25    LDN    ECIC 
*         LJM    GBM26       SET FINAL FAULT CODE 
  
*         COMPLETE ERROR PROCESSING.
  
 GBM26    STML   EDBF+FALT   SET FINAL FAULT CODE 
 GBM27    RJM    RCR         RESET CHANNEL
          RJM    FFD         FIND FAILING DRIVE 
          LJM    GBMX        RETURN 
  
  
 GBMA     BSS    0           SUBSTATUS PROCESSORS 
          CONL   GBM5        RESERVED 
          CONL   GBM5        RESERVED 
          CONL   GBM6        DEFECT MANAGEMENT
          CONL   GBM7        MESSAGE / MICROCODE EXCEPTION
          CONL   GBM8        INTERVENTION REQUIRED
          CONL   GBM12       ALTERNATE PORT EXCEPTION 
          CONL   GBM13       MACHINE EXCEPTION
          CONL   GBM20       COMMAND EXCEPTION
          CONL   GBM21       COMMAND ABORTED
          CONL   GBM23       COMMAND CONDITIONALLY SUCCESSFUL 
          CONL   GBM25       COMMAND INCOMPLETE 
 GCA      SPACE  4,15 
**        GCA - GET CURRENT *ACGL*. 
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (CM - CM+4) = *ACGL* WORD FROM *MST*.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  REE. 
* 
*         MACROS MONITOR. 
  
  
 GCA      SUBR               ENTRY/EXIT 
          LDD    EO          SET EST ORDINAL
          STD    CM+1 
          LDN    UTRS        GET CURRENT MST
          STD    CM+3 
          MONITOR  STBM 
          RJM    REE         READ EST ENTRY 
          LDD    CM+4 
          SHN    3
          ADN    ACGL        READ *ACGL*
          CRD    CM 
          UJN    GCAX        RETURN 
 GCS      SPACE  4,15 
**        GCS - GET CONTROLLER SERIAL NUMBER. 
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
* 
*         EXIT   CONTROLLER SERIAL NUMBER IN (CTSN - CTSN+2). 
* 
*         USES   T3, T4.
* 
*         CALLS  ATT, CAN, IDT, RCA.
  
  
 GCS      SUBR               ENTRY/EXIT 
          LDM    CTSN,CI
          NJN    GCSX        IF CONTROLLER SERIAL NUMBER ALREADY KNOWN
          RJM    RCA         REPORT CONTROLLER ATTRIBUTES 
          RJM    IDT         INPUT DATA TO PP 
  
*         CONVERT RIGHT 6 OF 8 CONTROLLER SERIAL NUMBER CHARACTERS. 
  
          LDC    ATTB+0#10   SET ADDRESS OF CONTROLLER SERIAL NUMBER
          STDL   T4 
          LDD    CI          SET ADDRESS FOR CONVERSION 
          ADN    CTSN 
          STDL   T3 
          RJM    CAN         CONVERT ASCII NUMBER TO DISPLAY CODE 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          UJN    GCSX        RETURN 
 IBM      SPACE  4,10 
**        IBM - ISSUE BML MESSAGE.
* 
*         ENTRY  (A) = SYMPTOM - 100. 
*                (NR - NR+4, WB - WB+4) = MESSAGE PARAMETERS. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   CM - CM+4, NR, NR+1. 
* 
*         CALLS  IDM. 
  
  
 IBM      SUBR               ENTRY/EXIT 
          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           ISSUE BML MESSAGE
          RJM    IDM
*         LDN    0
          UJN    IBMX        RETURN 
 ICR      SPACE  4,15 
**        ICR - ISSUE CONTROLLER RESET. 
* 
*         ENTRY  (RW) .NE. 0 IF PREVIOUS RESET FAILED.
*                (RF) .NE. 0 IF RESET FAILURE.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (PD) = 0, IF NOT PARITY DEVICE.
*                (CPEA) = 0, IF TIME TO DO SLAVE RESET AND THERE
*                             IS A DRIVE TO OFF-LINE. 
* 
*         EXIT   TO *ERR12* IF RESET COMPLETE.
*                (CPEA) = 0 IF LOGICAL RESET ISSUED AND THERE IS
*                           A DRIVE TO OFF-LINE.
* 
*         CALLS  CPE, SRS.
  
  
 ICR6     LDN    1
          STM    CPEA        INDICATE NO DRIVE TO OFF-LINE
          LDM    RWST,DI
          ZJN    ICRX        IF SLAVE RESET FAILED
          LDM    ERCT,DI
          SBN    CSRC-SRRC
          ZJN    ICR1        IF TIME TO TRY SLAVE RESET 
  
 ICR      SUBR               ENTRY/EXIT 
          LDD    RF 
          NJN    ICR6        IF PREVIOUS RESET FAILED 
          LDM    ERCT,DI
          SBN    CSRC-SRRC
          NJN    ICR2        IF NOT TIME TO TRY SLAVE RESET 
  
*         DO NOT DO SLAVE RESET IF CHANNEL ERROR, MEDIA ERROR,
*         OR CONTROLLER DEAD. 
  
 ICR1     LDML   EDBF+FALT
          SBN    ETIT 
          ZJN    ICR3        IF INTERRUPT TIMEOUT 
          SBN    EDPE-ETIT+1
          MJN    ICR2        IF NOT DOING SLAVE RESET (CHANNEL ERROR) 
          SBN    ECNR-EDPE-1
          ZJN    ICR3        IF SLAVE IN/SYNC IN SIGNAL ERROR 
          SBN    ECRE-ECNR
          PJN    ICR2        IF NOT DOING SLAVE RESET 
  
*         DO NOT ISSUE SLAVE RESET (1 MINUTE) IF A DRIVE CAN
*         BE SET OFF-LINE.
  
          LDD    PD 
          ZJN    ICR3        IF NOT PARITY DEVICE 
          LDM    CPEA 
          NJN    ICR3        IF NO DRIVE TO OFF-LINE
 ICR2     LDN    1
          STM    CPEA        INDICATE NO DRIVE TO OFF-LINE
          LDC    1S16+ICR5   RETURN ADDRESS 
          UJN    ICR4        ISSUE LOGICAL RESET
  
 ICR3     LDN    0           ENABLE LOGGING OF ERROR RESPONSE 
          STM    ERRA 
          LDC    ERR12       RETURN ADDRESS FROM SLAVE RESET
 ICR4     LJM    SRS         ISSUE RESET
  
 ICR5     RJM    CPE         CHECK IF PARITY DRIVE ENABLED
          LJM    ERR12       EXIT 
 IDM      SPACE  4,20 
**        IDM - ISSUE DAYFILE MESSAGE.
* 
*         ENTRY  (A) = BML MESSAGE SYMPTOM CODE.
*                (RW) = READ / WRITE FLAG.
*                (EO) = EST ORDINAL.
*                (CN) = CONTROLLER NUMBER.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
*                (PHYD,DI) = DRIVE NUMBER.
*                (MISC) = 1 IF UNRECOVERED ERROR. 
*                (MAD1) = MESSAGE ADDRESS.
* 
*         NOTE - THE CONTENTS OF THE MESSAGE DETERMINES WHETHER IT
*                GOES TO THE ERROR LOG OR THE BML.
* 
*         EXIT   (A) = (MISC) = 0.
* 
*         CALLS  IMB, UEC.
  
  
 IDM      SUBR               ENTRY/EXIT 
          LMC    D"DN"*400
          STM    BMLM+1      INSERT SYMPTOM CODE IN MESSAGE 
          LDML   BMID,DT
          SHN    -11
          STM    MSID        ERROR MESSAGE ID 
          LDD    CN 
          SHN    6
          ADM    PHYD,DI     INSERT UNIT NUMBER 
          STM    UNIT 
          LDM    PNUN,DI     SET PORT NUMBER
          SHN    -3 
          SCN    77 
          STM    PORT 
          LDD    EO          INCLUDE EST ORDINAL
          STM    ESTO 
          LDD    RW          READ / WRITE FLAG
          LPN    1
          SHN    21-4 
          ADM    ERCT,DI     SET RETRY COUNT
          SHN    13-5 
          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.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (A) .EQ. 0, IF UNIT INTERLOCKED SUCCESSFULLY.
*                (A) .LT. 0, IF CHANNEL DOWN. 
*                (A) .GT. 0, IF UNABLE TO INTERLOCK.
* 
*         USES   T7, WB+3, CM - CM+4. 
* 
*         CALLS  CAC, CCS, SUI. 
* 
*         MACROS CBTE.
  
  
 IDU4     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 
          RJM    CCS         CHECK CHANNEL STATE
 IDU2     ZJN    IDU4        IF CHANNEL UP
          SCN    1
          NJN    IDU3        IF CHANNEL DOWN
  
*         CHANNEL IDLE.  IF OTHER CHANNEL IS DEFINED AND UP, ONLY 
*         PROCESS CHANNEL-SPECIFIC REQUESTS ON THIS CHANNEL.
  
          LDD    CB 
          ZJN    IDU3        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 
          NJN    IDU2.1      IF CHANNEL SPECIFIC REQUEST
          RJM    CAC         CHECK ALTERNATE CHANNEL STATUS 
          ZJN    IDU3        IF OTHER CHANNEL DEFINED AND UP
          UJP    IDU4        SET UNIT INTERLOCK 
  
 IDU2.1   LDD    T7          CHECK SPECIFIED CHANNEL
          SHN    -6 
          LMD    IR+4 
          ZJN    IDU2        IF REQUEST FOR THIS DRIVER 
 IDU3     LCN    0           RETURN *CHANNEL DOWN* STATUS 
          UJP    IDUX        RETURN 
 IEE      SPACE  4,15 
**        IEE - ISSUE E,E EVENT.
* 
*         THIS ROUTINE ISSUES A MONITOR REQUEST WHICH CAUSES AN 
*         OPERATOR ACTION TO VIEW THE E,E DISPLAY.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         USES   CM - CM+4. 
* 
*         MACROS MONITOR. 
  
  
 IEE      SUBR               ENTRY/EXIT 
          LDN    EEVS 
          STD    CM+1        ENTER EVENT
          LDN    0
          STD    CM+3 
          LDN    CEDE        *CHECK E,E DISPLAY* EVENT
          STD    CM+4 
          MONITOR  EATM 
          UJN    IEEX        RETURN 
 IEM      SPACE  4,15 
**        IEM - ISSUE ERROR LOG MESSAGE.
* 
*         ENTRY  (A) = 1/CF,15/ADDRESS. 
*                      CF - SET CONTROLLER NUMBER INTO MESSAGE. 
*                      THE MESSAGE LENGTH IS IN (ADDRESS-1).
*                (CN) = CONTROLLER NUMBER.
*                (DT) = DRIVE TYPE. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         USES   T1, T2.
* 
*         CALLS  C2D, IDM.
  
  
 IEM      SUBR               ENTRY/EXIT 
          STDL   T0          SAVE COMPLETE PARAMETER
          LPC    17777
          STDL   T1          ADDRESS OF SPECIFIED MESSAGE 
          STML   IEMA 
          LDDL   T0          CHECK IF CONTROLLER NUMBER FLAG SET
          SHN    21-17
          PJN    IEM1        IF CONTROLLER NUMBER NOT PART OF MESSAGE 
          LDD    CN          CONVERT CONTROLLER NUMBER
          ADN    1R0
          SHN    6           INSERT IN MESSAGE
          LMN    1R 
          STM    1,T1 
 IEM1     LDM    DM,DT       SAVE DEVICE MNEMONIC 
          STM    ERMH+5 
          LDD    EO 
          SHN    -3 
          RJM    C2D
          STM    ERMH+6      UPPER 2 DIGITS OF EST ORDINAL
          LDD    EO 
          LPN    7
          SHN    6
          ADC    2R0, 
          STM    ERMH+7      LOWER DIGIT OF EST ORDINAL 
          LDM    PHYD,DI
          RJM    C2D
          STM    ERMH+11     FAILING DRIVE
          LDM    -1,T1       SET MESSAGE LENGTH 
          STM    ERMH+3 
          LDN    4
          STD    T1 
          LDD    MA 
          CWM    **,T1       COPY MESSAGE INTO BUFFER 
 IEMA     EQU    *-1
          LDD    MA 
          CRM    ERMB,T1
          LDC    ERMH        MESSAGE HEADER ADDRESS 
          STML   MAD1 
          RJM    IDM         ISSUE MESSAGE TO ERROR LOG 
          UJP    IEMX        RETURN 
  
  
*         ERROR MESSAGE HEADER AND BUFFER.
  
 ERMH     CON    0,0,0,**,ELDY
          DATA   12H*****, U**, 
 ERMB     BSSZ   4*5
          CON    0
  
*         ERROR MESSAGES. 
  
 ERPD     ERRMSG (PARITY PROTECTION DISABLED.)
 ERPR     ERRMSG (PARITY PROTECTION RESTORED.)
 ERRI     ERRMSG (PARITY RESTORE INITIATED.)
 ERFI     ERRMSG (FORMAT INITIATED.)
 ERFC     ERRMSG (FORMAT COMPLETE.) 
 ERCR     ERRMSG (CMX RESET ON CCHXX.)
 ERRC     ERRMSG (CMX RESET COMPLETE.)
 ERRF     ERRMSG (CMX RESET FAILURE.) 
 ERCD     ERRMSG (CMX CONTROLLER DISABLED, CCHXX.)
 ERCE     ERRMSG (CMX CONTROLLER ENABLED,  CCHXX.)
 IHD      SPACE  4,20 
**        IHD - INTERRUPT HANDLER.
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE 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.
*                (DI) = THE COMMAND REFERENCE NUMBER FROM AN EXPECTED 
*                       RESPONSE. 
*                TO *DAS1* IF UNEXPECTED ASYNCH.
* 
*         USES   DI, MS, RT, T4.
* 
*         CALLS  DCM, LDP, LSD, RCR, RRP, SCM, VIS. 
  
  
 IHD6     LCN    0           INDICATE ASYNC INTERRUPT 
 IHD7     RJM    VIS         VERIFY INTERRUPT SOURCE
  
 IHD      SUBR               ENTRY/EXIT 
          LDML   CTST,CI
          SHN    -15
          ZJN    IHD1        IF STREAMING MODE FOR RESPONSES
  
*         IF 10 MB CHANNEL AND INTERLOCK MODE, SOMETIMES AFTER SENDING
*         A COMMAND PACKET, THE ERROR FLAG WILL SET DURING THE
*         FOLLOWING BUS CONTROL SEQUENCE (IPI ERROR REGISTER = 0004). 
*         MASTER CLEARING THE CHANNEL AFTER THE COMMAND PACKET
*         PREVENTS THIS PROBLEM.
  
          RJM    RCR         RESET CHANNEL REGISTERS
 IHD1     RJM    SCM         SELECT CONTROLLER
          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    IHD7        IF TRANSFER NOTIFICATION 
          RJM    DCM         DESELECT CONTROLLER
          LDD    RT          CHECK RESPONSE TYPE
          LMN    ASRT 
          NJP    IHD7        IF NOT ASYNC (UNSOLICITED) RESPONSE
          LDM    RPBF+CUN 
          LPC    377
          STD    T4          SAVE DRIVE NUMBER
          LMC    377
          ZJP    IHD6        IF RESPONSE FOR CONTROLLER 
          RJM    LSD         LOCATE SELECTED DRIVE
          ZJN    IHD5        IF DRIVE UNKNOWN ON THIS CONTROLLER
          STD    DI 
          RJM    LDP         LOAD DEVICE PARAMETERS 
  
*         AN ASYNCH FOR A DRIVE CAN OCCUR BEFORE THE ASYNCH FOR THE 
*         CONTROLLER AFTER A SLAVE RESET. 
  
          LDM    SRSA 
          NJN    IHD5        IF RESET IN PROGRESS 
          LDM    EEST,DI
          LMN    ASRT 
          ZJN    IHD4        IF EXPECTED ASYNCH 
          LDML   RPBF+CRN 
          LMD    DI 
          NJN    IHD5        IF NOT EXPECTED ASYNCH 
 IHD4     LDML   ATTN,DI
          LJM    IHDX        RETURN 
  
*         AN UNEXPECTED ASYNCH CAN BE THE RESULT OF A DRIVE RESET FROM
*         THE OTHER ACCESS, OR BECAUSE AN OFF-LINE DRIVE HAS BEEN 
*         REPAIRED AND SPUN UP.  SUCH UNEXPECTED ASYNCHS ARE IGNORED. 
  
 IHD5     LJM    DAS1        RETURN TO MAIN LOOP
 IIO      SPACE  4,20 
**        IIO - INITIATE I/O. 
* 
*         ENTRY  (A) = (CB) = *CBT* ORDINAL.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
* 
*         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     STDL   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     LDN    0
 IIO1     STML   CPBF+FCP+1  CLEAR UPPER BYTES OF BLOCK COUNT 
          STML   CPBF+FCP+6  CLEAR UPPER BYTES OF INTERRUPT SIZE
          STML   CPBF+FCP+10 CLEAR UPPER BYTES OF BURST SIZE
          LDC    P0931
          STML   CPBF+FCP    COMMAND EXTENT PARAMETER 
          LDD    NR+1 
          STM    CPBF+FCP+3  SET CYLINDER IN COMMAND PACKET 
          STM    CYLN,DI
  
*         DETERMINE PARTITION.
  
 IIO2     SBM    MC,DT
          MJN    IIO2.1      IF IN THE CORRECT PARTITION
          SBN    1
          PJN    IIO2        IF NOT AT MAINTENANCE CYLINDER 
  
*         SET BLOCK COUNT.  USING A LARGER BLOCK COUNT IMPROVES 
*         STREAMING PERFORMANCE.
  
 IIO2.1   ADN    7
          PJN    IIO2.2      IF WITHIN LAST 8 CYLINDERS 
          LDML   PSCY,DT     SET SECTOR COUNT FOR 8 CYLINDERS 
          SHN    3
          UJN    IIO3        RETURN 
  
 IIO2.2   LDM    STS,DT      SET SECTOR COUNT FOR .LT. 8 CYLINDERS
          LPC    777
 IIO3     STML   CPBF+FCP+2  SECTOR COUNT 
          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
          UJP    IIO4        SET PROCESSOR ADDRESS
 ILU      SPACE  4,15 
**        ILU - INITIALIZE LOGICAL UNIT.
* 
*         DECLUSTER UNIT IF CLUSTERED, FORMAT ALL THE PHYSICAL DRIVES 
*         OF THE LOGICAL UNIT AS NECESSARY, THEN CLUSTER THE UNIT.
* 
*         ENTRY  (DN) = DRIVE NUMBER. 
*                (DT) = DRIVE TYPE. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  ATT, CLU, CUF, DDT, DLU, FMU, SRS, UPD.
  
  
 ILU      SUBR               ENTRY/EXIT 
          LDD    DN 
          STM    PHYD,DI     PHYSICAL DRIVE 
 ILU1     RJM    DDT         DETERMINE DRIVE TYPE 
          MJP    ILU7        IF DRIVE NOT IN CONTROLLER TABLE 
          SBD    DT 
          PJN    ILU1.2      IF ACTUAL EQUAL OR GREATER THAN EXPECTED 
 ILU1.1   ADN    EQEG-EQEC   ADVANCE DEVICE TYPE RANGE
          ERRNZ  EQEO-EQEG-EQEG+EQEC  (RANGES MUST BE EQUAL SIZE) 
          MJN    ILU1.1      IF NOT TO PROPER RANGE 
 ILU1.2   ZJN    ILU4        IF EXPECTED AND ACTUAL TYPES MATCH 
          LDM    DDTA 
          SBN    1
          ZJN    ILU4        IF LOGICAL UNIT IS ONE DRIVE 
  
*         IF 2 CONTROLLERS ARE CABLED TO THE UNIT AND THE UNIT IS 
*         CLUSTERED DIFFERENTLY THAN IT IS CONFIGURED, THE OTHER
*         CONTROLLER MAY ALREADY HAVE DECLUSTERED AND RECLUSTERED 
*         DIFFERENTLY.  SLAVE RESET MUST BE DONE TO CAUSE THE 
*         CONTROLLER TO REEVALUATE THE DRIVES.
  
          LDC    ILU2        RETURN ADDRESS 
          LJM    SRS         INITIATE SLAVE RESET 
  
*         CLEAR THE ASYNCHRONOUS RESPONSES AFTER THE SLAVE RESET. 
*         THERE IS NORMALLY ONE ASYNCH PER PHYSICAL DRIVE AFTER A 
*         DECLUSTER COMMAND.  IF THE DECLUSTER COMMAND IS ISSUED AFTER
*         SLAVE RESET, THE ASYNCHS THAT SHOULD HAVE BEEN AFTER THE
*         COMPLETION RESPONSE FOR THE DECLUSTER MAY COME BEFORE THE 
*         COMPLETION RESPONSE.  THIS WILL CAUSE A TIMEOUT WAITING 
*         FOR A RESPONSE. 
  
 ILU2     LDC    1S16+ILU3   RETURN ADDRESS 
          LJM    SRS         ISSUE LOGICAL RESET
  
 ILU3     RJM    DDT         DETERMINE DRIVE TYPE 
          MJN    ILU7        IF DRIVE NOT IN CONTROLLER TABLE 
 ILU4     LDML   ATTB+2,T3
          SHN    21-11
          PJN    ILU5        IF UNIT NOT CLUSTERED
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          RJM    DLU         DECLUSTER LOGICAL UNIT 
          UJN    ILU6        CHECK FOR CONDITIONAL FORMAT 
  
 ILU5     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
 ILU6     LDK    SSTL 
          CRD    CM 
          LDD    CM+1 
          SHN    21-12
          PJN    ILU8        IF UNCONDITIONAL FORMAT
          RJM    DDT         DETERMINE DRIVE TYPE 
          MJN    ILU7        IF DRIVE NOT IN CONTROLLER TABLE 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDC    C0302+1S17  REPORT ADDRESSEE STATUS OPERATION CODE 
          RJM    CUF         CHECK IF UNIT FORMATTED
          ZJN    ILU9        IF UNIT FORMATTED
          UJN    ILU8        FORMAT THE UNIT
  
 ILU7     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
 ILU8     RJM    FMU         FORMAT UNIT
 ILU9     RJM    UPD         UPDATE DRIVE NUMBER
          NJP    ILU1        IF MORE DRIVES TO CHECK
          RJM    CLU         CLUSTER LOGICAL UNIT 
          UJP    ILUX        RETURN 
 IMF      SPACE  4,10 
**        IMF - ISSUE MONITOR FUNCTION AND WAIT FOR COMPLETION. 
* 
*         ENTRY  (A) = FUNCTION.
* 
*         EXIT   (A) = 0. 
*                (CM - CM+4) = MONITOR FUNCTION RESPONSE. 
* 
*         USES   CM - CM+4. 
* 
*         CALLS  AME, CMC.
  
  
 IMF      SUBR               ENTRY/EXIT 
          STD    CM 
          RJM    CMC         WAIT MONITOR COMPLETE (PREVIOUS REQUEST) 
          LDD    OA          WRITE OUTPUT REGISTER
          CWD    CM 
          LDD    CM 
          SBN    CPUM 
          MJN    IMF1        IF NOT *CPUMTR* REQUEST
          RJM    AME         ATTEMPT MONITOR EXCHANGE 
 IMF1     RJM    CMC         WAIT FOR MONITOR COMPLETE (NEW REQUEST)
          LDD    OA          READ OUTPUT REGISTER 
          CRD    CM 
          LDN    0
          UJN    IMFX        RETURN 
 IMR      SPACE  4,15 
**        IMR - INITIATE *BIOM* MONITOR REQUEST.
* 
*         ENTRY  (A) = *BIOM* SUBFUNCTION.
*                (WB+3 - WB+4) = *BIOM* PARAMETERS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   WB - WB+2. 
* 
*         CALLS  AME, CMC.
  
  
 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 
          RJM    AME         ATTEMPT MONITOR EXCHANGE 
*         LDN    0
          UJN    IMRX        RETURN 
 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     LDML   IOMA 
          NJN    IOM1        IF MESSAGE PRESENT 
  
 IOM      SUBR               ENTRY/EXIT 
          STDL   T1 
          MJN    IOM3        IF MESSAGE REFRESH 
          STML   IOMA 
          ZJN    IOM2        IF CLEAR MESSAGE CALL
 IOM1     LDD    CP          SYSTEM CP ADDRESS
          ADN    MS2W 
          CWM    **,TR       STORE OPERATOR MESSAGE 
 IOMA     EQU    *-1
          UJN    IOMX        RETURN 
 IPR      SPACE  4,30 
**        IPR - INITIATE PARITY RESTORE.
* 
*         INITIATE RESTORE OF AN OFF-LINE DRIVE, IN RESPONSE TO AN
*         OPERATOR *RESTORE* COMMAND. 
* 
*         THIS ROUTINE CHECKS FOR AN OFF-LINE DRIVE OF A PARITY UNIT. 
*         IT WILL ISSUE A SPIN UP DRIVE COMMAND TO SEE IF THE DRIVE 
*         IS USEABLE, AND IF SO, FORMAT THE DRIVE IF NECESSARY, THEN
*         SET UP TABLES SO THE DRIVE WILL BE RESTORED ONE CYLINDER
*         AT A TIME AS A BACKGROUND OPERATION.
* 
*         THIS DRIVER WILL HOLD THE UNIT INTERLOCK (IN THE *PUT*) 
*         DURING THE ENTIRE RESTORE OPERATION.  FOR A SHARED DEVICE,
*         IT WILL ALSO HOLD THE ERROR PROCESSING INTERLOCK (IN THE
*         *BDT*) DURING THE RESTORE INITIATION PROCESS, AND THE MMF 
*         RESTORE INTERLOCK (IN THE *BDT*) DURING THE ENTIRE RESTORE. 
*         THE MMF RESTORE INTERLOCK WILL ENSURE THAT ONLY THE 
*         CONTROLLER THAT IS PERFORMING THE RESTORE WILL BE ALLOWED 
*         TO DO I/O ON THE DEVICE DURING THE RESTORE. 
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   TO *CSR*.
*                TO *CMP*, TO LEAVE REQUEST PENDING.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  ATT, CDS, CLP, COD, CRP, DAS, FMU, GCA, IEE, IEM,
*                LNE, SEP, SOU, SRS, SUD, UBP, WAC, WCB.
* 
*         MACROS CMSTF, DELAY, MONITOR, SMSTF.
  
  
 IPR      BSS    0           ENTRY
          LDM    RSIN        CHECK RESTORE INTERLOCK FLAG 
          ZJN    IPR1        IF INTERLOCK NOT SET 
          LMD    DI 
          NJN    IPR2        IF INTERLOCK SET FOR ANOTHER DEVICE
          LJM    IPR13       PROCESS REENTRY FOR RESTORE ON THIS DEVICE 
  
*         ISSUE LOGICAL RESET TO ENSURE THAT THIS CONTROLLER SEES 
*         THE CURRENT STATUS OF THE DRIVE IN QUESTION.  ALLOW ACTIVITY
*         ON OTHER DEVICES TO COMPLETE BEFORE ISSUING THE RESET.
  
 IPR1     RJM    SEP         SET ERROR PROCESSING INTERLOCK 
          ZJN    IPR3        IF INTERLOCK SET SUCCESSFULLY
 IPR2     LJM    CMP         LEAVE REQUEST PENDING
  
 IPR3     RJM    WAC         WAIT FOR OTHER ACTIVITY TO COMPLETE
          LDML   CSTB,CI
          SHN    21-15
          MJN    IPR5        IF CONTROLLER NOT FUNCTIONAL 
          LDC    IPR4+1S16   RETURN ADDRESS 
          LJM    SRS         ISSUE LOGICAL RESET
  
*         CHECK FOR OFF-LINE DRIVE. 
  
 IPR4     RJM    COD         CHECK FOR OFF-LINE DRIVE 
          NJN    IPR6        IF OFF-LINE DRIVE DETECTED 
          RJM    CLP         CLEAR *LOST PARITY* FLAGS
 IPR5     RJM    CRP         CLEAR *RESTORE IN PROGRESS*, IF SET
          LJM    CSR         ABANDON REQUEST
  
*         SET *RESTORE IN PROGRESS* FLAGS AND INTERLOCKS. 
  
 IPR6     LDD    DI          SET RESTORE INTERLOCK FLAG 
          STM    RSIN 
          LDD    CI          SET ADDRESS OF CONTROLLER SERIAL NUMBER
          ADK    CTSN-2 
          STM    IPRA 
          LDN    0           INITIALIZE PARTITION SEARCH
 IPR7     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJP    IPR9        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    IPR5        IF DEVICE NOT RECOVERED
          ZJN    IPR8        IF NOT SHARED DEVICE 
          LDD    MA          SET CONTROLLER SERIAL NUMBER INTO MB 
          CWM    **,ON       (ADDRESS OF *CTSN* FOR THIS CONTROLLER)
 IPRA     EQU    *-1
          LDD    EO          SET EST ORDINAL
          STD    CM+4 
          LDN    SRPS        SET RESTORE PARITY INTERLOCK IN *BDT*
          STD    CM+1 
          MONITOR  MTEM 
          LDD    CM+4 
          NJP    IPR5        IF REJECT (OTHER MF PERFORMING RESTORE)
          LDN    1           SET FLAG THAT SAYS THIS MF HAS INTERLOCK 
          STD    CM+2 
          LDN    25          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
 IPR8     SMSTF  GDRI        SET *RESTORE INITIATION* IN *ACGL* 
          SMSTF  GDUR        SET *RESTORE IN PROGRESS* IN *ACGL*
          LDC    ERRI        *EQXXX, UXX, PARITY RESTORE INITIATED.*
          RJM    IEM         ISSUE ERROR LOG MESSAGE
          LDD    EO 
          UJP    IPR7        PROCESS NEXT PARTITION 
  
*         IF SHARED DEVICE, WAIT FOR OTHER MF-S TO ACKNOWLEDGE. 
  
 IPR9     RJM    IEE         ISSUE E,E EVENT
          LDN    0           INITIALIZE PARTITION SEARCH
 IPR10    RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    IPR13       IF NO MORE PARTITIONS
          STM    IPRC        SAVE EST ORDINAL 
          RJM    CDS         CHECK DEVICE STATUS
          ZJN    IPR12       IF NOT SHARED DEVICE 
 IPR11    RJM    GCA         GET CURRENT *ACGL* 
          LDD    CM          GET ACCESS FLAGS 
          LPN    17 
          SCN    **          (MACHINE MASK FOR THIS MF) 
 IPRB     EQU    *-1
          ZJN    IPR12       IF NO OTHER MF HAS ACCESS FLAG SET 
          RJM    DAS         PROCESS ACTIVITY ON OTHER DEVICES
          DELAY 
          LDC    **          (EST ORDINAL OF CURRENT PARTITION) 
 IPRC     EQU    *-1
          STD    EO          RESTORE EST ORDINAL
          UJN    IPR11       RETRY
  
 IPR12    LDD    EO 
          UJN    IPR10       PROCESS NEXT PARTITION 
  
*         SPIN UP DRIVE.
  
 IPR13    RJM    SUD         SPIN UP DRIVE
          ZJN    IPR15       IF SUCCESSFUL
 IPR14    LJM    IPR5        ABANDON RESTORE
  
*         FORMAT DRIVE, IF REQUIRED.
  
 IPR15    LDK    SSTL 
          CRD    CM 
          LDD    CM+1 
          SHN    21-12
          PJN    IPR16       IF UNCONDITIONAL FORMAT
          LDC    C0302       REPORT ADDRESSEE STATUS OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P02D5
          STML   CPBF+FCP    PHYSICAL DRIVE PARAMETER 
          LDM    OUPD,DI     OFFLINE UNIT NUMBER
          SHN    10 
          STML   CPBF+FCP+1  PHYSICAL DRIVE TO STATUS 
          LDN    12          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    IPR14       IF ERROR 
          LDML   RPBF+11
          SHN    21-16
 IPR16    PJN    IPR17       IF DRIVE NOT FORMATTED 
          LDM    RPBF+7      CHECK NUMBER OF DATA DRIVES
          LPN    77 
          LMD    DD          EXPECTED DATA DRIVES 
          NJN    IPR17       IF WRONG NUMBER OF DATA DRIVES 
          LDML   BPS,DT      CHECK SECTOR SIZE
          SCN    77 
          LMML   RPBF+13     ACTUAL SECTOR SIZE 
          ZJN    IPR18       IF CORRECT SECTOR SIZE 
 IPR17    RJM    FMU         FORMAT THE DRIVE 
  
*         SET UP RESTORE PARAMETERS.
  
 IPR18    LDD    DI          SET *RESTORE IN PROGRESS* FLAG 
          STM    RSDI 
          LDN    0
          STM    RCYL        STARTING CYLINDER TO RESTORE 
          STM    RTSN        STARTING TRACK, SECTOR TO RESTORE
          STM    RMUX        I/O REQUESTS TO MULTIPLEX PER RESTORE
*         LDN    0           INITIALIZE PARTITION SEARCH
 IPR19    RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    IPR20       IF NO MORE PARTITIONS
          CMSTF  GDRI        CLEAR *RESTORE INITIATION* FROM *ACGL* 
          LDD    EO 
          UJN    IPR19       PROCESS NEXT PARTITION 
  
 IPR20    LJM    CSR         CLEAR SPECIAL REQUEST FLAG / START RESTORE 
 ISR      SPACE  4,25 
**        ISR - IDENTIFY AND PROCESS SPECIAL REQUEST. 
* 
*         ENTRY  (CM+3) = SPECIAL REQUEST FLAGS.
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (CM+3) UPDATED - BITS FOR *ECAF* AND/OR *LMLF* CLEARED 
*                   IF REQUEST IS FOR THE ALTERNATE CHANNEL.
*                TO *DAS1* IF UNIT INTERLOCK NOT OBTAINED.
*                TO *ERR* IF CONTROLLER FAILURE.
*                TO *ECA* IF ENABLE CONTROLLER ACTIVITY AND *BDLL*
*                   BIT SET FOR THIS CHANNEL. 
*                TO SPECIAL REQUEST PROCESSOR (ADDRESS IN TABLE *ISRA*) 
*                   IF SPECIAL REQUEST FOUND, WITH -
*                    (RW) = INDEX FOR SPECIAL REQUEST.
* 
*         USES   CM+3, PA, RW.
* 
*         CALLS  CEC, CPF, IDU, SEO.
  
  
 ISR      SUBR               ENTRY/EXIT 
  
*         CHECK FOR *ENABLE CONTROLLER ACTIVITY* (*ECAF*) REQUEST.
*         IF REQUEST IS FOR OTHER CHANNEL, LOOK FOR DIFFERENT REQUEST.
  
          LDD    CM+3 
          SHN    21-ECAF+ECAF/12D*12D 
          PJN    ISR3        IF *ECAF* REQUEST NOT SET
          RJM    CEC         CHECK IF REQUEST IS FOR THIS CHANNEL 
          NJN    ISR2        IF REQUEST IS NOT FOR THIS CHANNEL 
          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 
  
*         IF RESTORE ALREADY IN PROGRESS FOR ANY DEVICE, LEAVE ANY
*         ADDITIONAL *RESTORE* REQUEST PENDING. 
  
 ISR4     LDM    RSDI 
          ZJN    ISR4.1      IF NO RESTORE IN PROGRESS
          LDD    CM+3        CLEAR *RESTORE* SPECIAL REQUEST FLAG 
          SCN    2
          ERRNZ  RSPF-13D    CODE DEPENDS ON VALUE
          STD    CM+3 
  
*         SEARCH FOR OTHER SPECIAL REQUEST. 
  
 ISR4.1   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 
          RJM    SEO         SET EST ORDINAL
          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 
          LDML   CTST,CI
          SHN    21-15
          MJN    ISR10       IF CONTROLLER DEAD 
          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     CLEAR SPECIAL REQUEST FLAG 
          STM    ADDR,DI     CLEAR REENTRY ADDRESS
          STM    ATTN,DI     CLEAR INTERRUPT ADDRESS
          LJM    DAS1        RETURN TO MAIN LOOP
  
*         CONTROLLER FAILURE. 
  
 ISR10    LDN    ECMD        CONTROLLER DEAD
          RJM    ERR         PROCESS ERROR
  
  
 ISRA     BSS    0           SPECIAL REQUEST PROCESSORS 
          CONL   CSR         CLEAR FLAG (ENABLE CONTROLLER ACTIVITY)
          CONL   IPR         INITIATE PARITY RESTORE
          CONL   CSR         CLEAR FLAG (RESERVED)
          CONL   LPS         LIST PACK SERIAL NUMBER
          CONL   CSR         CLEAR FLAG (FORMAT REQUEST)
          CONL   LMR         LIST MICROCODE REVISION LEVEL
 ISRB     BSS    0           INTERNAL SPECIAL REQUEST PROCESSORS
          CONL   CDT         CHECK DRIVE TYPE (INTERNAL REQUEST)
 LDP      SPACE  4,25 
**        LDP - LOAD DEVICE PARAMETERS. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = (EO) = EST ORDINAL.
*                (CB) = *CBT* ORDINAL.
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (CN) = CONTROLLER NUMBER.
*                (DD) = NUMBER OF DATA DRIVES IN DEVICE.
*                (DN) = DRIVE NUMBER. 
*                (DT) = DRIVE TYPE. 
*                (PA) = REQUEST IN PROGRESS ADDRESS.
*                (PD) = PARITY DEVICE FLAG. 
*                (RW) = READ / WRITE FLAG.
*                (CM - CM+4) = *PILL* WORD OF *PUT* ENTRY.
*                (WB - WB+4) = *UNCT* WORD OF *PUT* ENTRY.
* 
*         USES   CB, CI, CN, DD, DN, DT, PA, PD, RW, CM - CM+4, 
*                WB - WB+4. 
* 
*         CALLS  SEO. 
* 
*         MACROS PUTE.
  
  
 LDP      SUBR               ENTRY/EXIT 
          LDM    DVTP,DI
          LPN    77 
          STD    DT          DRIVE TYPE 
          LDML   DM,DT
          SHN    0-17 
          STD    PD          NONZERO IF PARITY DEVICE 
          LDML   DM,DT
          SHN    0-14 
          LPN    7
          STD    DD          NUMBER OF DATA DRIVES IN DEVICE
          LDML   PNUN,DI
          SHN    -14
          SHN    2
          ERRNZ  CSTBE-4     CODE DEPENDS ON VALUE
          ADC    CSTB 
          STD    CI          CONTROLLER STATE TABLE ADDRESS 
          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 NUMBER 
          LPC    777
          SHN    21-5        EXTRACT CONTROLLER NUMBER
          STD    CN 
          SHN    5-21        ISOLATE DRIVE NUMBER 
          STD    DN 
          LDM    RWST,DI     RESTORE READ / WRITE STATUS
          STD    RW 
          LDML   ADDR,DI     CURRENT PROCESSING ADDRESS 
          STDL   PA 
          LDD    WB+3        *CBT* ORDINAL
          STD    CB 
          RJM    SEO         SET EST ORDINAL
          UJP    LDPX        RETURN 
 LMR      SPACE  4,15 
**        LMR - LOG MICROCODE REVISION. 
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *CSR* WHEN THE REQUEST IS COMPLETE. 
* 
*         USES   NR+2, NR+3, T3, T4, WB - WB+4. 
* 
*         CALLS  ATT, CHD, IBM, IDM, IDT, RCA.
  
  
 LMR      BSS    0           ENTRY
          RJM    RCA         REPORT CONTROLLER ATTRIBUTES 
          RJM    IDT         INPUT DATA TO PP 
  
*         GENERATE MICROCODE REVISION ERRLOG MESSAGE. 
  
          LDD    CN          SET CONTROLLER NUMBER IN BML MESSAGE 
          STD    NR+3 
          ADC    2RM0        CONVERT FOR ERRLOG MESSAGE 
          STM    LMRB+6 
          LDC    LMRB+4      LOCATION FOR REVISION LEVEL
          STDL   T3 
          SBN    LMRB+4-LMRA SET MESSAGE ADDRESS
          STML   MAD1 
          LDM    ATTB+16     CONVERT REVISION LEVEL 
          RJM    CHD
          RJM    IDM         ISSUE MESSAGE TO ERRLOG
  
*         GENERATE MICROCODE REVISION BML MESSAGE.
  
          LDD    MA          MOVE MICROCODE REVISION LEVEL
          CWM    LMRB,ON
          SBN    1           COPY TO BML MESSAGE
          CRD    WB 
          LDD    IR+4        SET CHANNEL NUMBER 
          STD    NR+2 
          LDN    HI0104-HI0100
          RJM    IBM         ISSUE BML MESSAGE
*         LDN    0
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LJM    CSR         CLEAR SPECIAL REQUEST FLAG 
  
  
 LMRA     CON    0,0,0,4,ELDY  MICROCODE REVISION ERRLOG MESSAGE
          DATA   4HCH** 
 LMRB     DATA   10H MH427-D**
          DATA   C+,CM0.+ 
 LND      SPACE  4,15 
**        LND - LOCATE NEXT DRIVE (ON SPECIFIED CONTROLLER).
* 
*         ENTRY  (A) = 0 TO LOCATE FIRST DRIVE OF STRING. 
*                (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (T7) = CURRENT *DST* ADDRESS, IF (A) .NE. 0. 
* 
*         EXIT   (A) = (T7) = DEVICE STATE TABLE ADDRESS OF NEXT DRIVE. 
*                (A) = 0 IF NO MORE DRIVES (ON CONTROLLER). 
* 
*         USES   T7.
  
  
 LND2     LDM    CTST,CI     ADDRESS OF FIRST DRIVE IN STRING 
          STD    T7 
 LND3     LDM    PNUN,T7     VERIFY CONTROLLER
          LMM    PNUN,DI
          SHN    -6 
          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    DASB 
          NJN    LND3        IF NOT END OF BLOCK
*         LDN    0
          UJN    LNDX        RETURN 
 LNE      SPACE  4,25 
**        LNE - LOCATE NEXT EST/PARTITION FOR THIS DEVICE.
* 
*         LOCATE NEXT EST ASSOCIATED WITH THE CURRENT DEVICE. 
* 
*         ENTRY  (A) .EQ. 0, START SEARCH WITH EST ORDINAL IN *PUT*.
*                (A) .NE. 0, (A) = LAST EST ORDINAL PROCESSED.
*                (DI) = DEVICE STATUS TABLE ADDRESS.
*                (EO) = CURRENT EST ORDINAL.
* 
*         EXIT   (A) = (EO) = EST ORDINAL OF NEXT PARTITION.
*                (A) = 0, IF NO MORE PARTITIONS FOR THIS *PUT*. 
*                      (EO) = ORIGINAL EST ORDINAL (FROM *CBT*/*PUT*).
* 
*         USES   EO, CM - CM+4. 
* 
*         CALLS  REE, SEO.
* 
*         MACROS PUTE.
  
  
 LNE3     RJM    SEO         SET EST ORDINAL FROM *CBT* OR *PUT*
 LNE4     LDN    0           INDICATE NO MORE PARTITIONS
  
 LNE      SUBR               ENTRY/EXIT 
          ZJN    LNE1        IF INITIAL ENTRY OF SEARCH 
          STD    EO          SET EST ORDINAL
          LDML   DVTP,DI
          SHN    21-17
          PJN    LNE4        IF NOT PARTITIONED DEVICE
          UJN    LNE2        LOCATE NEXT EST ORDINAL
  
 LNE1     LDI    DI          *PUT* ORDINAL FROM DEVICE STATE TABLE
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          SHN    PUTLS
          PUTE   *
          ADC    UNCT        GET FIRST EST FOR THIS *PUT* 
          CRD    CM 
          SOD    CM+1        SET STARTING EST ORDINAL FOR SEARCH
          STD    EO 
 LNE2     AOD    EO 
          LMC    **          HIGHEST EST ORDINAL FOR THIS DRIVER (+1) 
 LNEA     EQU    *-1
          ZJN    LNE3        IF NO MORE *EST* ENTRIES TO CHECK
          RJM    REE         READ EST ENTRY 
          LDD    CM 
          SHN    21-13
          PJN    LNE2        IF NOT MASS STORAGE
          SHN    21-5-21+13 
          PJN    LNE2        IF NOT A BUFFERED DEVICE 
          LDD    CM+4 
          SHN    3
          ADK    DILL 
          CRD    CM 
          LDD    CM+2        GET *PUT* ORDINAL FROM *MST* 
          LMI    DI          *PUT* ORDINAL FROM DEVICE STATE TABLE
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          NJN    LNE2        IF NOT FOR THE DESIRED *PUT* 
          LDD    EO 
          UJP    LNEX        RETURN NEXT EST ORDINAL
 LPS      SPACE  4,15 
**        LPS - LOG PACK SERIAL NUMBER(S).
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *CSR* WHEN THE REQUEST IS COMPLETE. 
* 
*         USES   NR+2, NR+3, T3, T4, WB - WB+4. 
* 
*         CALLS  ATT, CAN, C2D, IBM, IDM, IDT, SOU, UPD.
  
  
 LPS      BSS    0           ENTRY
          LDD    DN 
          STM    PHYD,DI     PHYSICAL DRIVE NUMBER
          LDC    C0200       REPORT ATTRIBUTES OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P036C       REQUEST ATTRIBUTE PARAMETER
          STM    CPBF+FCP 
          LDC    0#8050      RETURN ATTRIBUTE ID 50 AS DATA 
          STML   CPBF+FCP+1 
          LDN    12          COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDC    ATTB+0#1E   SET ADDRESS OF FIRST PACK SERIAL NUMBER
          STDL   T4 
  
*         GENERATE PACK SERIAL NUMBER ERRLOG MESSAGE. 
  
 LPS1     LDC    LPSB+2      SET ADDRESS FOR CONVERSION 
          STDL   T3 
          SBN    LPSB+2-LPSA DEFINE MESSAGE ADDRESS 
          STML   MAD1 
          RJM    CAN         CONVERT ASCII NUMBER TO DISPLAY CODE 
          LDN    11 
          RADL   T4          UPDATE POINTER TO NEXT SERIAL NUMBER 
          LDM    PHYD,DI
          STD    NR+3        PUT UNIT NUMBER IN BML MESSAGE 
          RJM    C2D         CONVERT UNIT NUMBER FOR ERRLOG MESSAGE 
          STM    LPSA+11
          LDD    EO          CONVERT EST ORDINAL
          SHN    -3 
          RJM    C2D
          STM    LPSA+6      INSERT IN ERRLOG MESSAGE 
          LDM    DM,DT
          STM    LPSA+5      SAVE DEVICE MNEMONIC 
          STD    NR+2 
          LDD    EO 
          LPN    7           CONVERT LOWER DIGIT
          SHN    6
          ADC    2R0,        ADD TO ERRLOG MESSAGE
          STM    LPSA+7 
          RJM    IDM         ISSUE MESSAGE TO ERRLOG
  
*         GENERATE PACK SERIAL NUMBER BML MESSAGE.
  
          LDD    MA          MOVE DRIVE SERIAL NUMBER 
          CWM    LPSB,ON
          SBN    1           COPY TO BML MESSAGE
          CRD    WB 
          LDD    EO          INSERT EST ORDINAL 
          STD    WB 
          LDN    0           CLEAR UNUSED FIELD 
          STD    WB+1 
          RJM    IBM         ISSUE BML MESSAGE
          RJM    UPD         UPDATE PHYSICAL DRIVE
          NJP    LPS1        IF MORE PHYSICAL DRIVES
*         LDN    0
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LJM    CSR         CLEAR SPECIAL REQUEST FLAG 
  
  
 LPSA     CON    0,0,0,4,ELDY PACK SERIAL NUMBER ERRLOG MESSAGE 
          DATA   10H*****, U**
 LPSB     DATA   C+,PS=******.+ 
 LSD      SPACE  4,15 
**        LSD - LOCATE SELECTED DRIVE IN *DSTB*.
* 
*         ENTRY  (T4) = DRIVE NUMBER. 
* 
*         EXIT   (A) = 0 IF NO RESPONSE EXPECTED. 
*                    = DEVICE STATE TABLE ADDRESS FOR DRIVE.
* 
*         CALLS  LND. 
  
  
 LSD      SUBR               ENTRY/EXIT 
          LDN    0
          UJN    LSD2        LOCATE FIRST DRIVE 
  
 LSD1     LDN    1
 LSD2     RJM    LND
          ZJN    LSDX        IF END OF DRIVE STRING 
          LDD    FC 
          NJN    LSD3        IF FORMAT COMPLETE 
          LDML   ATTN,T7
          ZJN    LSD1        IF RESPONSE NOT EXPECTED 
          UJN    LSD4 
  
 LSD3     LDM    PNUN,T7
          LPN    77          CHECK DRIVE NUMBER 
          LMD    T4 
          NJN    LSD1        IF SPECIFIED DRIVE NOT FOUND 
 LSD4     LDD    T7 
          UJN    LSDX        RETURN 
 PEF      SPACE  4,15 
**        PEF - PROCESS ERROR FLAGS.
* 
*         ENTRY  (RW) = ERROR INDEX.
*                (CB) = *CBT* ORDINAL.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DN) = DRIVE NUMBER. 
*                (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 (0,PA) TO PROCESS A CHANNEL SPECIFIC READ OR
*                  WRITE REQUEST.  AFTER SUSPECT STATE IS SET, THE
*                  REQUEST BECOMES CHANNEL SPECIFIC.
*                TO *CMP10* IF ERROR IN PROGRESS ON A DIFFERENT DEVICE. 
* 
*         CALLS  IDU, IIO, LDP, SEP.
  
  
 PEF1     LDN    0           INDICATE I/O IN ORDER
  
 PEF      SUBR               ENTRY/EXIT 
          LDD    T1 
          SHN    -6          CHECK CHANNEL NUMBER 
          LMD    IR+4 
          NJN    PEFX        IF I/O DISABLED ON THIS ACCESS 
          LDD    RW 
          ZJN    PEFX        IF *1MV* DEVICE VERIFICATION 
          LDM    ERFL 
          LMD    DI 
          ZJN    PEFX        IF ERROR IN PROGRESS ON THIS DEVICE
          LDML   CTST,CI
          SHN    21-15
          MJN    PEF1        IF CONTROLLER DEAD 
          LDML   ERCT,DI
          NJN    PEF1        IF I/O INITIATED 
          RJM    IDU         INTERLOCK DEVICE 
          NJN    PEFX        IF INTERLOCK NOT AVAILABLE 
          LDN    CSRC 
          STM    ERCT,DI     SET INITIAL ERROR COUNT
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LDD    CM+1 
          SHN    -6          FAILING DRIVE NUMBER 
          STM    PHYD,DI     FOR RECOVERED ERROR REPORTING
          RJM    SEP         SET ERROR PROCESSING INTERLOCK 
          NJP    CMP10       IF ERROR IN PROGRESS ON A DIFFERENT DEVICE 
          LDD    CB          INITIATE I/O 
          RJM    IIO
          LJM    0,PA        EXIT TO PROCESSOR
 PLP      SPACE  4,20 
**        PLP - PROCESS LOST PARITY.
* 
*         PLP HANDLES *PROCESS LOST PARITY* CONDITIONS, PROVIDED THAT 
*         THE DEVICE HAS BEEN RECOVERED.  IF IT HAS, PLP SETS THE UNIT
*         NUMBER AND THE *PARITY PROTECTION LOST* FLAG IN MST WORD
*         *ACGL*, SO THAT THE THE E,E DISPLAY ON EACH MAINFRAME WILL
*         SHOW WHICH DRIVE IS OFF-LINE. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  CDS, IEE, LNE. 
* 
*         MACROS MONITOR, SMSTF.
  
  
 PLP4     LDC    **          (COUNT OF NEW PARTITIONS PROCESSED)
 PLPA     EQU    *-1
          ZJN    PLP5        IF NO NEW PARTITIONS PROCESSED 
          RJM    IEE         ISSUE E,E EVENT
 PLP5     LDC    **          (COUNT OF UNPROCESSED PARTITIONS LEFT) 
 PLPB     EQU    *-1
          NJN    PLPX        IF NOT ALL PARTITIONS PROCESSED
          LDML   DVTP,DI     CLEAR *PROCESS LOST PARITY* FLAG 
          LPC    137777 
          STML   DVTP,DI
  
 PLP      SUBR               ENTRY/EXIT 
          LDML   DVTP,DI
          SHN    21-16
          PJN    PLPX        IF *PROCESS LOST PARITY* NOT SET 
          LDN    0           CLEAR PARTITION COUNTS 
          STM    PLPA 
          STM    PLPB 
*         LDN    0           INITIALIZE PARTITION SEARCH
 PLP1     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    PLP4        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    PLP2        IF DEVICE NOT RECOVERED
          LDD    CM+4        CHECK IF *PARITY LOST* FLAG ALREADY SET
          SHN    3
          ADN    ACGL 
          CRD    CM 
          LDD    CM+4 
          SHN    21-2 
          MJN    PLP3        IF PARTITION ALREADY PROCESSED 
          LDD    EO          SET EST ORDINAL
          STD    CM+1 
          LDM    OUPD,DI     OFFLINE UNIT OF PARITY DEVICE
          STD    CM+2 
          LDN    SOUS        SET OFFLINE UNIT IN *ACGL* 
          STD    CM+3 
          MONITOR  STBM 
          SMSTF  GDPL        SET *PARITY PROTECTION LOST* IN *ACGL* 
          AOM    PLPA        INDICATE NEW PARTITION PROCESSED 
          UJN    PLP3        PROCESS NEXT PARTITION 
  
 PLP2     AOM    PLPB        INCREMENT UNPROCESSED PARTITION COUNT
 PLP3     LDD    EO 
          UJP    PLP1        PROCESS NEXT PARTITION 
 PPE      SPACE  4,10 
**        PPE - PROCESS PARITY ENABLE.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (DVTP,DI) BIT 10 CLEAR, IF PROCESSING COMPLETE.
*                (DVTP,DI) BIT 7 SET, IF PROCESSING COMPLETE. 
* 
*         CALLS  EMP. 
  
  
 PPE      SUBR               ENTRY/EXIT 
          LDML   DVTP,DI
          SHN    21-12
          PJN    PPEX        IF *ENABLE MMF PARITY ACCESS* NOT SET
          RJM    EMP         ENABLE MMF PARITY DEVICE ACCESS
          NJN    PPEX        IF NOT ALL PARTITIONS PROCESSED
          LDML   DVTP,DI     CLEAR *ENABLE MMF PARITY ACCESS* FLAG
          LPC    175577 
          LMC    200         SET *CHECK MMF PARITY ACCESS* FLAG 
          STML   DVTP,DI
          UJN    PPEX        RETURN 
 RBD      SPACE  4,10 
**        RBD - READ *BDLL*.
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (CM - CM+4) = *BDLL* WORD OF MST.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  REE. 
  
  
 RBD      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM+4 
          SHN    3
          ADN    BDLL 
          CRD    CM 
          UJN    RBDX        RETURN 
 RCA      SPACE  4,10 
**        RCA - REPORT CONTROLLER ATTRIBUTES. 
* 
*         ENTRY  (CN) = CONTROLLER NUMBER.
* 
*         EXIT   PARAMETERS SET UP FOR *IDT* CALL.
* 
*         CALLS  SOC. 
  
  
 RCA      SUBR               ENTRY/EXIT 
          LDC    C0200       REPORT ATTRIBUTES OPERATION CODE 
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDC    P036C       REQUEST ATTRIBUTE PARAMETER
          STM    CPBF+FCP 
          LDC    0#8050      RETURN ATTRIBUTE ID 50 AS DATA 
          STML   CPBF+FCP+1 
          LDN    12          COMMAND PACKET LENGTH
          UJN    RCAX        RETURN 
 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 
          UJN    RCTX        RETURN 
 RDO      SPACE  4,15 
**        RDO - REPORT DRIVE OFF-LINE.
* 
*         RDO SETS THE *PROCESS LOST PARITY* FLAG SO THAT MST WORD
*         *ACGL* WILL BE UPDATED WHEN THE DEVICE HAS BEEN RECOVERED.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         CALLS  PLP. 
  
  
 RDO      SUBR               ENTRY/EXIT 
          LDML   DVTP,DI     SET *PROCESS LOST PARITY* FLAG 
          LPC    137777 
          LMC    40000
          STML   DVTP,DI
          RJM    PLP         PROCESS LOST PARITY
          UJN    RDOX        RETURN 
 REE      SPACE  4,10 
**        REE - READ EST ENTRY. 
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         EXIT   (A) = ADDRESS  OF *EQDE* WORD OF EST ENTRY.
*                (CM - CM+4) = *EQDE* WORD OF EST ENTRY.
* 
*         USES   CM - CM+4. 
* 
*         MACROS SFA. 
  
  
 REE      SUBR               ENTRY/EXIT 
          SFA    EST,EO 
          ADK    EQDE 
          CRD    CM 
          UJN    REEX        RETURN 
 RLB      SPACE  4,15 
**        RLB - READ LINKAGE BITS.
* 
*         ENTRY  (T6) = ADDRESS FOR LINKAGE.
*                (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 
          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 
 RND      SPACE  4,15 
**        RND - RUN DIAGNOSTICS.
* 
*         NOTE - THE DRIVE MUST BE CLUSTERED TO RUN DIAGNOSTICS.
*                THE CODE WILL NOT RUN DIAGNOSTICS IF A FORMAT
*                REQUEST IS PRESENT TO ENSURE THIS ROUTINE IS ONLY
*                RUN WHEN THE DRIVE IS CLUSTERED. 
* 
*         ENTRY  (PHYD,DI) = DRIVE TO RUN DIAGNOSTICS.
*                (FC) = 0 IF FORMAT NOT COMPLETE. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         CALLS  ATT, SOU, WCB. 
  
  
 RND      SUBR               ENTRY/EXIT 
          LDD    FC 
          ZJN    RNDX        IF FORMAT NOT COMPLETE 
          LDML   EDBF+FALT
          SBN    EDPE 
          ZJN    RND1        IF MEDIA ERROR 
          SBN    EIVR-EDPE
          ZJN    RND1        IF ID24
          SBN    EMEX-EIVR
          NJN    RNDX        IF NOT ID26
 RND1     STM    ERRA        ENABLE LOGGING OF ERROR RESPONSE 
          LDC    C8100       DRIVE DIAGNOSTIC COMMAND 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P02D5
          STML   CPBF+FCP    PARAMETER TO SELECT DRIVE
          LDM    PHYD,DI
          SHN    10 
          STML   CPBF+FCP+1  PHYSICAL DRIVE NUMBER
          LDN    12          WRITE COMMAND PACKET 
          RJM    WCB
          LDN    CMSS        PROCESS ATTENTION
          RJM    ATT
          ZJP    RNDX        IF DIAGNOSTICS COMPLETED SUCCESSFULLY
          LCN    EDTF        DIAGNOSTIC FAULT 
          RJM    ERR         PROCESS ERROR
 ROD      SPACE  4,20 
**        ROD - RESTORE OFF-LINE DRIVE. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO CALLER IF NO RESTORE OR NOT TIME TO RESTORE.
*                TO *CMP* IF RESTORE CYLINDER COMMAND COMPLETE. 
*                TO *ERR* IF ERROR. 
* 
*         USES   T1.
* 
*         CALLS  ATT, CLP, CRP, CSC, IDM, IEM, LNE, SOU, WCB. 
* 
*         MACROS MONITOR. 
  
  
 ROD10    LDDL   MS 
          LMC    0#42 
          NJN    ROD11       IF NOT CONDITIONAL SUCCESS 
          LDDL   PA          SET INTERRUPT REENTRY ADDRESS
          STML   ATTN,DI     EXPECT A COMMAND COMPLETE RESPONSE 
 ROD11    LCN    EROD        RESTORE OFF-LINE DRIVE ERROR 
          UJN    ROD13       PROCESS ERROR
  
 ROD12    LDN    ECMD        CONTROLLER DEAD
 ROD13    RJM    ERR         PROCESS ERROR
  
 ROD      SUBR               ENTRY/EXIT 
          LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    RODX        IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          LDM    RMUX 
          NJN    RODX        IF NOT TIME TO RESTORE A CYLINDER
          LDML   CTST,CI
          SHN    21-15
          MJN    ROD12       IF CONTROLLER DEAD 
  
*         RESTORE NEXT CYLINDER.
  
          LDC    CE005       RESTORE OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
          RJM    CSC         COMPUTE SECTOR COUNT 
          LDC    P0931
          STML   CPBF+FCP    COMMAND EXTENT PARAMETER 
          LDC    P02D5
          STML   CPBF+FCP+5  PHYSICAL DRIVE PARAMETER 
          LDM    OUPD,DI
          STM    PHYD,DI
          SHN    10 
          STML   CPBF+FCP+6  PHYSICAL DRIVE PARAMETER 
          LDC    0#2E3
          STML   CPBF+FCP+7  RESTORE OPTION PARAMETER 
          LDM    RCYL 
          STM    CPBF+FCP+3  CYLINDER TO RESTORE
          STM    CYLN,DI     FOR ERROR LOGGING
          LMM    CYUN,DT     CHECK FOR LAST CYLINDER
          NJN    ROD1        IF NOT LAST CYLINDER 
          LDC    0#901
          STML   CPBF+FCP    NO OP EXTENT PARAMETER 
          LDC    0#100
          UJN    ROD2        ON LINE DRIVE
  
 ROD1     LDC    0#200       RESTORE DRIVE
 ROD2     STML   CPBF+FCP+10
          LDN    30          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJP    ROD10       IF ERROR 
          STM    RTSN        NEXT TRACK, SECTOR TO RESTORE
          LDML   RMUX 
          SHN    21-17
          MJN    ROD3        IF MULTIPLEXING DISABLED 
          LDN    IRBR 
          STM    RMUX        I/O REQUESTS BEFORE NEXT RESTORE 
  
*         CALCULATE REMAINING CYLINDERS.
  
 ROD3     LDM    CYUN,DT     CALCULATE REMAINING CYLINDERS / 100B 
          SBM    RCYL 
          ADN    77 
          SHN    -6 
          STD    T1 
          LMC    **          (VALUE PREVIOUSLY CALCULATED)
 RODA     EQU    *-1
          ZJN    ROD5        IF VALUE HAS NOT CHANGED 
          LDN    0           INITIALIZE PARTITITON SEARCH 
 ROD4     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    ROD5        IF NO MORE PARTITIONS
          STD    CM+1        SET EST ORDINAL
          LDD    T1          REMAINING CYLINDERS / 100B 
          STM    RODA 
          STD    CM+2 
          LDN    SRCS        SET REMAINING CYLINDERS / 100B IN *ACGL* 
          STD    CM+3 
          MONITOR  STBM 
          LDD    EO 
          UJN    ROD4        PROCESS NEXT PARTITION 
  
 ROD5     AOM    RCYL        INCREMENT CYLINDER TO RESTORE
          SBM    CYUN,DT     CYLINDERS REMAINING
          MJN    ROD6        IF MORE CYLINDERS TO RESTORE 
          NJN    ROD7        IF NO MORE CYLINDERS TO RESTORE
 ROD6     LJM    CMP         COMPLETION PROCESSING
  
*         RESTORE COMPLETE. 
  
 ROD7     RJM    CRP         CLEAR *RESTORE IN PROGRESS* FLAGS
          RJM    CLP         CLEAR *LOST PARITY* FLAGS
          LDM    OUPD,DI     DRIVE JUST RESTORED
          STM    PHYD,DI
          LDN    EROD        RESTORE COMMAND
          STM    EDBF+CODE
          LDC    PDPE        PARITY DRIVE PROTECTION ENABLED
          STM    EDBF+FALT   FINAL FAULT CODE 
          LDN    0
          STM    EDBF+FCS1
          STM    EDBF+FCS2
          STM    EDBF+FCS3
*         LDN    0           INITIALIZE PARTITION SEARCH
 ROD8     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    ROD9        IF NO MORE PARTITIONS
          LDC    ERPR        *EQXXX, UXX, PARITY PROTECTION RESTORED.*
          RJM    IEM         ISSUE ERROR LOG MESSAGE
          LDD    EO 
          UJN    ROD8        PROCESS NEXT PARTITION 
  
 ROD9     LDN    4
          STM    MSGL+1      SET BASIC MESSAGE LENGTH 
          AOM    ERCT,DI
          LDD    HN 
          ERRNZ  HD0100-100  CODE DEPENDS ON VALUE
          RJM    IDM         ISSUE *PARITY RESTORED* BML MESSAGE
          LJM    CMP         COMPLETION PROCESSING
  
  
 RCYL     CON    0           CURRENT CYLINDER BEING RESTORED
 RMUX     CON    0           1/X, 15/Y WHERE
                               X = 0 IF MULTIPLEXING ALLOWED
                               Y = REQUESTS TO MULTIPLEX PER RESTORE
 RSDI     CON    0           RESTORE IN PROGRESS FLAG (*DST* INDEX) 
 RSIN     CON    0           RESTORE INTERLOCK FLAG (*DST* INDEX) 
 RTSN     CON    0           6 / RESTORE TRACK, 6 / RESTORE SECTOR
 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   CM - CM+2, T5 - T7.
* 
*         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 
 SCP      SPACE  4,10 
**        SCP - SET COMMAND PARAMETER.
* 
*         ENTRY  (A) = COMMAND PARAMETER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DDTA) = TOTAL NUMBER OF DRIVES IN LOGICAL UNIT. 
* 
*         EXIT   (A) = 0 IF 1X DRIVE. 
*                (CPBF+CUN) = LOGICAL ADDRESS.
  
  
 SCP      SUBR               ENTRY/EXIT 
          STML   CPBF+FCP 
          LDML   DDTA        TOTAL DRIVES 
          LMN    1
          ZJN    SCPX        IF SINGLE DRIVE
          LDML   CPBF+CUN 
          SCN    0#38 
          STML   CPBF+CUN    ENSURE STRING BIT CLEAR
          LDN    1
          UJN    SCPX        RETURN 
 SDO      SPACE  4,15 
**        SDO - SET DRIVE OFF-LINE. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
*                (PD) = 0, IF NOT PARITY DEVICE.
*                (CPEA) = 0 IF DRIVE SHOULD BE SET OFF-LINE.
*                (PHYD,DI) = FAILING DRIVE. 
* 
*         EXIT   TO CALLER IF NO DRIVE TO SET OFF-LINE. 
*                TO *CMP10* WITH *ERCT* CLEAR IF DRIVE SET OFF-LINE.
*                TO *ERR* IF ERROR. 
* 
*         CALLS  ATT, CRP, IDM, IEM, LNE, RDO, SOU, WCB.
  
  
 SDO      SUBR               ENTRY/EXIT 
          LDD    PD 
          ZJN    SDOX        IF NOT PARITY DEVICE 
          LDM    CPEA 
          NJN    SDOX        IF NO DRIVE TO SET OFF-LINE
          STM    ERRA        ENABLE LOGGING OF ERROR
          RJM    CRP         CLEAR *RESTORE IN PROGRESS*, IF SET
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P02D5
          STML   CPBF+FCP    PARAMETER WITH FAILING DRIVE NUMBER
          LDM    PHYD,DI
          STM    OUPD,DI     OFFLINE DRIVE UNIT NUMBER
          SHN    10 
          STML   CPBF+FCP+1  FAILING DRIVE NUMBER 
          LDC    0#1D9
          STML   CPBF+FCP+2  PARAMETER TO SET OFF-LINE DRIVE
          LDN    14          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND BLOCK
          LDN    CMSS 
          RJM    ATT         WAIT FOR ATTENTION 
          ZJN    SDO1        IF SUCCESSFUL
          LCN    ERDA        REPORT DRIVE ATTRIBUTES ERROR
          RJM    ERR         PROCESS ERROR
  
*         *HPA* DOES NOT DISPLAY THE DATA WITH SYMPTOM 0111 WHEN THE
*         ERROR IS RECOVERABLE, SO TWO MESSAGES ARE ISSUED TO THE BML.
  
 SDO1     AOM    ERCT,DI
          LCN    0
          STM    EDBF+FCS2   INDICATE NO RESPONSE FOR HPA 
          LDC    PDPD        PARITY DRIVE PROTECTION DISABLED 
          STM    EDBF+FALT   FINAL FAULT CODE 
          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
          STM    ERCT,DI     CLEAR ERROR COUNT
*         LDN    0           INITIALIZE PARTITION SEARCH
 SDO2     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    SDO3        IF NO MORE PARTITIONS
          LDC    ERPD        *EQXXX, UXX, PARITY PROTECTION DISABLED.*
          RJM    IEM         ISSUE ERROR LOG MESSAGE
          LDD    EO 
          UJN    SDO2        PROCESS NEXT PARTITION 
  
 SDO3     RJM    RDO         REPORT DRIVE OFF-LINE
          LJM    CMP10       ABANDON REQUEST (RETRY LATER)
 SDT      SPACE  4,10 
**        SDT - SET DATA TRANSFER MODE. 
* 
*         ENTRY  (TM) = 0 TO STREAM DATA. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         CALLS  ATT, SOC, WCB. 
  
  
 SDT      SUBR               ENTRY/EXIT 
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOC         SET OPERATION CODE AND CONTROLLER
          LDC    0#46E
          STML   CPBF+FCP    PARAMETER 6E 
          LDDL   TM 
          ADC    0#C080 
          STML   CPBF+FCP+1  MODE FOR DATA
          LDN    0
          STML   CPBF+FCP+2 
          LDN    14          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          ZJP    SDTX        IF SUCCESSFUL
          LCN    ELCA        LOAD CONTROLLER ATTRIBUTES FAILURE 
          RJM    ERR         PROCESS ERROR
 SEC      SPACE  4,15 
**        SEC - SET ERROR CODE. 
* 
*         ENTRY  (CI) = CONTROLLER STATE TABLE ADDRESS. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         USES   RF, T5, UC, WB+3, WB+4.
* 
*         CALLS  CAC, CEA, CEC, CFM, CPF, CRP, DCE, DRT, IMR, IOM, LDP. 
  
  
*         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. 
  
 SEC6     LDM    RSDI        CHECK IF RESTORE IN PROGRESS 
          LMD    DI 
          NJN    SEC7        IF NO RESTORE IN PROGRESS ON THIS DEVICE 
          LDC    100000 
          STML   RMUX        DISABLE REQUEST MULTIPLEXING 
          UJN    SECX        RETURN 
  
 SEC7     LDN    1           BUFFER COUNT TO BE DELINKED
          STD    WB+3 
          LDN    SETS        INSERT CODE IN *CBT*, RELEASE INTERLOCK
          RJM    IMR
*         LDN    0           SET INTERLOCK RELEASED (FOR *CMP*) 
          STM    RQLN,DI
          SOD    UC          DECREMENT UNIT ACTIVITY COUNT
  
 SEC      SUBR               ENTRY/EXIT 
          LDN    0
          STD    RF          CLEAR RESET IN PROGRESS FLAG 
          RJM    IOM         CLEAR OPERATOR MESSAGE 
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LDML   EDBF+FALT
          SHN    -2          CREATE INDEX FROM FAULT CODE 
          STD    T5 
          LDM    TMSE,T5
          STD    WB+4        SET MASS STORAGE ERROR CODE
          RJM    DRT         DETERMINE REQUEST TYPE 
          NJP    SEC6        IF I/O REQUEST 
          LDML   CTST,CI
          SHN    21-15
          MJN    SEC1        IF CONTROLLER DEAD 
          SHN    -21+15+22
          LPC    137777      CLEAR RESET FLAG (BIT 14)
          STML   CTST,CI
 SEC1     RJM    CRP         CLEAR *RESTORE IN PROGRESS*
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LDD    CM+3 
          SHN    21-LMLF+14 
          PJN    SEC2        IF *LIST MICROCODE REVISION* NOT SET 
          LPN    77 
          LMD    IR+4 
          NJN    SEC2        IF REQUEST NOT FOR THIS DRIVER 
          LDC    6S6+LMLF    BITS - 1 TO CLEAR / STARTING BIT 
          RJM    CPF         CLEAR SPECIAL REQUEST BIT IN *PUT* 
 SEC2     RJM    LDP         LOAD DEVICE PARAMETERS 
          LDD    CM+3 
          SHN    21-ECAF+14 
          PJN    SEC3        IF *ENABLE CONTROLLER ACTIVITY* NOT SET
          RJM    CEC         CHECK IF REQUEST IS FOR THIS CHANNEL 
          NJN    SEC3        IF REQUEST IS NOT FOR THIS CHANNEL 
          RJM    CEA         CLEAR REQUEST
 SEC3     RJM    CAC         CHECK FOR ALTERNATE CHANNEL
          NJN    SEC4        IF NO ALTERNATE CHANNEL
          RJM    DCE         DOWN CHANNEL ON EQUIPMENT
          UJN    SEC5        COMPLETE PROCESSING
  
 SEC4     LDC    3S6+ECAF+1  BITS - 1 TO CLEAR / STARTING BIT 
          RJM    CPF         CLEAR SPECIAL REQUEST BITS IN *PUT*
          RJM    CFM         ENSURE *FORMAT PENDING* CLEARED IN MST 
 SEC5     LJM    SECX        RETURN 
 SEO      SPACE  4,15 
**        SEO - SET EST ORDINAL.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (CB) = CBT ORDINAL.
* 
*         EXIT   (A) = (EO) = EST ORDINAL.
* 
*         USES   EO, CW - CW+4. 
* 
*         CALLS  DRT. 
* 
*         MACROS CBTE, PUTE.
  
  
 SEO1     LDD    CW+1        GET EST ORDINAL FROM *PUT* 
 SEO2     STD    EO          SET EST ORDINAL
  
 SEO      SUBR               ENTRY/EXIT 
          LDI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          SHN    PUTLS
          PUTE   *
          ADC    UNCT        FETCH UNIT CONTROL WORD
          CRD    CW 
          RJM    DRT         DETERMINE REQUEST TYPE 
          ZJN    SEO1        IF NOT I/O REQUEST 
          LDD    CB          *CBT* ORDINAL
          SHN    CBTLS
          CBTE   *
          ADC    FSTC 
          CRD    CW          GET EST ORDINAL FROM *CBT* 
          LDD    CW 
          UJN    SEO2        SET EST ORDINAL AND RETURN 
 SEP      SPACE  4,30 
**        SEP - SET ERROR PROCESSING INTERLOCK. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (A) .EQ. 0, IF INTERLOCK SET FOR THIS DEVICE.
*                (A) .NE. 0, IF ALREADY SET FOR A DIFFERENT DEVICE. 
*                (ERFL) = DEVICE STATE TABLE OF DEVICE WITH ERROR.
*                TO *CMP10*, IF RESTORE IN PROGRESS ON OTHER MF.
* 
*         USES   T1, CM - CM+4. 
* 
*         CALLS  CBI, CDS, CMR, DAS, LNE, SEO, UBP. 
* 
*         MACROS DELAY, SMSTF, MONITOR. 
  
  
 SEP      CON    0           ENTRY
          LDML   SEP         SAVE RETURN ADDRESS
          STML   SEPR,DI
 SEP1     LDM    ERFL 
          ZJN    SEP3        IF ERROR PROCESSING FLAG NOT SET 
 SEP2     LDML   SEPR,DI     GET RETURN ADDRESS 
          STDL   T1 
          LDM    ERFL        RETURN (A) = 0 IF ERROR IS ON THIS DEVICE
          LMD    DI 
          LJM    0,T1        RETURN 
  
*         SET MMF ERROR PROCESSING INTERLOCKS, IF REQUIRED. 
  
 SEP3     LDML   DVTP,DI
          SHN    21-11
          PJN    SEP6        IF NOT SHARED DEVICE 
          LDN    0           INITIALIZE PARTITION SEARCH
 SEP4     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    SEP6        IF NO MORE PARTITIONS TO PROCESS 
          RJM    CDS         CHECK DEVICE STATUS
          MJP    SEP10       IF DEVICE NOT RECOVERED
  
*         DEVICE RECOVERED.  SET ERROR INTERLOCK IN *BDT*.
  
          LDD    EO          SET EST ORDINAL
          STD    CM+4 
          LDN    SEPS        SET ERROR PROCESSING INTERLOCK IN *BDT*
          STD    CM+1 
          MONITOR  MTEM 
          LDD    CM+4 
          NJP    SEP13       IF NOT SUCCESSFUL
          LDN    1           SET FLAG THAT SAYS THIS MF HAS INTERLOCK 
          STD    CM+2 
          LDN    26          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
 SEP5     LDD    EO 
          UJN    SEP4        PROCESS NEXT PARTITION 
  
 SEP6     LDD    DI          SET ERROR PROCESSING FLAG
          STM    ERFL 
  
*         SET ERROR PROCESSING FLAG(S) IN THE MST(S). 
  
 SEP7     LDN    0           INITIALIZE PARTITION SEARCH
 SEP8     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJP    SEP2        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    SEP9        IF DEVICE NOT RECOVERED
          SMSTF  GDER        SET *ERROR RECOVERY IN PROGRESS* FLAG
 SEP9     LDD    EO 
          UJN    SEP8        CHECK FOR NEXT PARTITION 
  
*         DEVICE NOT RECOVERED.  SET RECOVERY ERROR INTERLOCK.
  
 SEP10    LDN    SRIS        SET RECOVERY ERROR PROCESSING INTERLOCK
 SEP11    STD    CM+1 
          MONITOR  MTEM 
          LDD    CM+4 
          SBN    2
          ZJN    SEP13       IF REJECT (ANOTHER DRIVER HOLDS INTERLOCK) 
          LDD    DI 
          STM    ERFL        SET ERROR PROCESSING FLAG
          STM    ERMF        SET RECOVERY INTERLOCK FLAG
          LDD    CM+4 
          NJN    SEP12       IF CONFLICTING INTERLOCKS SET
          RJM    SEO         RESTORE ORIGINAL EST ORDINAL 
          UJN    SEP7        RETURN SUCCESSFUL STATUS 
  
*         THE RECOVERY ERROR PROCESSING INTERLOCK WAS SET SUCCESSFULLY, 
*         BUT ONE OR MORE CONFLICTING *BDT* INTERLOCKS ARE STILL SET. 
*         *SEP* MUST WAIT, PERIODICALLY ISSUING *MTEM*/*GRIS* REQUESTS, 
*         UNTIL ALL CONFLICTING INTERLOCKS HAVE BEEN RELEASED.
  
 SEP12    RJM    DAS         PROCESS ACTIVITY ON OTHER DEVICES
          DELAY 
          RJM    CMR         CHECK FOR MMF *RESTORE* FLAGS
          NJN    SEP14       IF RESTORE IN PROGRESS ON OTHER MF 
          LDN    GRIS        GET RECOVERY INTERLOCK STATUS
          UJN    SEP11       CHECK FOR CONFLICTING INTERLOCKS 
  
*         INTERLOCK ATTEMPT UNSUCCESSFUL.  THIS MEANS THAT ANOTHER MF 
*         HOLDS THE INTERLOCK (OR SOME OF THE INTERLOCKS) REQUIRED. 
*         TO AVOID A DEADLOCK, THIS MF MUST RELEASE ANY INTERLOCK 
*         THAT IT HOLDS, AND THEN RETRY THE INTERLOCK ATTEMPT LATER.
  
 SEP13    RJM    CBI         CLEAR *BDT* ERROR PROCESSING INTERLOCKS
          RJM    DAS         PROCESS ACTIVITY ON OTHER DEVICES
          DELAY 
          RJM    CMR         CHECK FOR MMF *RESTORE* FLAGS
          NJN    SEP14       IF RESTORE IN PROGRESS ON OTHER MF 
          LJM    SEP1        RETRY INTERLOCK
  
 SEP14    LJM    CMP10       ABANDON REQUEST (RETRY LATER)
  
  
 ERFL     CON    0           ERROR PROCESSING FLAG
 ERMF     CON    0           RECOVERY INTERLOCK FLAG
 SFP      SPACE  4,10 
**        SFP - SET COMMON FORMAT PARAMETERS. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (FC) = 0 IF DRIVE DECLUSTERED. 
*                (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
* 
*         CALLS  SOU. 
  
  
 SFP      SUBR               ENTRY/EXIT 
          LDC    C280E+1S17  FORMAT OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P02D5       PARAMETER TO SELECT DRIVE
          STML   CPBF+FCP 
          LDM    PHYD,DI
          SHN    10 
          STML   CPBF+FCP+1  DRIVE TO FORMAT
          LDC    0#1E5
          STML   CPBF+FCP+2  DO NOT READ HEADERS
          LDD    FC 
          ZJN    SFPX        IF DRIVE DECLUSTERED 
          LDD    CN 
          SHN    10 
          ADD    DN 
          STML   CPBF+CUN    LOGICAL ADDRESS
          UJP    SFPX        RETURN 
 SFR      SPACE  4,15 
**        SFR - SEARCH FOR CONSECUTIVE REQUEST. 
* 
*         ENTRY  (A) = CURRENT *CBT* ORDINAL. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   (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.
  
  
 SFR9     LDN    0
          STD    NB 
  
 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 
          LDM    ERCT,DI
          NJN    SFR9        IF IN ERROR RECOVERY 
          LDML   PSBF,DT     SET NUMBER OF SECTORS PER BUFFER 
          SHN    -14
          STD    T0 
          LDM    CYLN,DI
 SFR1     SBM    MC,DT
          MJN    SFR1.1      IF IN THE CORRECT PARTITION
          SBN    1
          PJN    SFR1        IF NOT AT MAINTENANCE TRACK
 SFR1.1   ADN    7
          PJN    SFR1.2      IF WITHIN LAST 8 CYLINDERS 
          LDML   PSCY,DT     SET SECTOR COUNT FOR 8 CYLINDERS 
          SHN    3
          UJN    SFR2        CONTINUE 
  
 SFR1.2   LDM    STS,DT      SET SECTOR COUNT FOR .LT. 8 CYLINDERS
          LPC    777
 SFR2     SBM    CSCT,DI
          SBD    T0          LESS NUMBER OF SECTORS PER BUFFER
          ZJN    SFR3        IF TIME TO CURTAIL STREAMING 
          LDD    T1+2 
          ZJN    SFR3        IF NO REQUEST AVAILABLE
          STD    NB 
          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    SFR5        IF SAME DIRECTION AND INTERLOCKED
 SFR3     UJP    SFR9        RETURN 
  
 SFR5     LDML   PSBF,DT     CALCULATE NEXT SECTOR
          SHN    -14
          RAD    CM+2 
          LDD    NR+1        CHECK SEEK PARAMETERS
          SBD    CM+1 
          ZJN    SFR6        IF SAME CYLINDER 
          SBN    1
          NJN    SFR3        IF NOT NEXT CYLINDER 
          LDD    CM+2        CALCULATED NEXT SECTOR 
          SBM    LSOC,DT
          PJN    SFR7        IF END OF CYLINDER REACHED 
          UJN    SFR3        RETURN WITH NO CONSECUTIVE REQUEST 
  
 SFR6     LDD    CM+2        CHECK NEXT SECTOR
          LMD    NR+2 
          ZJN    SFR8        IF NEXT SECTOR ON SAME TRACK 
          LDD    CM+2 
          LPN    77 
          SBM    PSPT,DT
          MJN    SFR3        IF NOT AT END OF TRACK 
          LMD    CM+2 
          LPN    77 
          LMD    CM+2 
          ADD    HN          SET NEXT TRACK 
 SFR7     LMD    NR+2 
          NJN    SFR3        IF NOT NEXT SECTOR ON CONSECUTIVE TRACKS 
 SFR8     LJM    SFRX        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, T1, T2, T5, T6, UA, UA+1, CM - CM+4. 
* 
*         CALLS  RLB, SUA, WLB. 
* 
*         MACROS CBTE.
  
  
 SLB      SUBR               ENTRY/EXIT 
          STD    PB 
          RJM    SUA         SET UEM ADDRESS
          LDN    PAD1 
          STD    T2 
          LDN    5           UEM WORD COUNT 
          STD    T5 
          LDML   SLBB,RW     SET PROCESSOR ADDRESS
          STML   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
          UJP    SLBX        RETURN 
  
  
 SLBB     CONL   RLB
          CONL   WLB
 SMD      SPACE  4,15 
**        SMD - SKIP MEDIA DEFECT DURING RESTORE. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (T5) = PHYSICAL TRACK. 
*                (T6) = PHYSICAL SECTOR.
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   (A) = 0 IF NOT RESTORE.
* 
*         USES   T5, T6.
  
  
 SMD4     LDN    0
  
 SMD      SUBR               ENTRY/EXIT 
          LDML   RPBF+OPC 
          LMC    CE005
          NJN    SMD4        IF NOT RESTORE 
  
*         SET RCYL, RTSN TO THE PHYSICAL SECTOR AFTER THE FAILING ONE.
  
          AOD    T6          PHYSICAL SECTOR
          SHN    14 
          ADD    T5          PHYSICAL TRACK 
          SHN    6
          STM    RTSN 
          AOD    T5 
          LDM    LSOC,DT
          SHN    -6 
          SBD    T5 
          MJN    SMD1        IF LAST TRACK
          LDD    T6 
          SBM    PSPT,DT
          MJN    SMD2        IF NEXT RESTORE ADDRESS ALREADY SET
          SHN    14          POTENTIAL RESIDUAL SECTOR NUMBER 
          ADD    T5 
          SHN    6
          STM    RTSN 
          UJN    SMD2        SET REQUESTS TO MULTIPLEX
  
 SMD1     LDM    RTSN 
          SBM    LSOC,DT
          MJN    SMD2        IF NEXT RESTORE ADDRESS ALREADY SET
          STM    RTSN 
          AOM    RCYL 
 SMD2     LDML   RMUX 
          SHN    21-17
          MJN    SMD3        IF MULTIPLEXING I/O REQUESTS DISABLED
          LDN    IRBR 
          STML   RMUX        I/O REQUESTS BEFORE NEXT RESTORE 
 SMD3     UJP    SMDX        RETURN 
 SOC      SPACE  4,10 
**        SOC - SET OPERATION CODE AND CONTROLLER.
* 
*         ENTRY  (A) = OPERATION CODE.
*                (CN) = CONTROLLER NUMBER.
  
  
 SOC      SUBR               ENTRY/EXIT 
          STML   CPBF+OPC 
          LDD    CN 
          SHN    10 
          LMC    0#FF 
          STM    CPBF+CUN 
          UJN    SOCX        RETURN 
 SOU      SPACE  4,15 
**        SOU - SET OPERATION CODE AND UNIT.
* 
*         ENTRY  (A) = 1/X, 17/YY.
*                  WHERE X = 0 IF (DN) IS THE DRIVE NUMBER. 
*                          = 1 IF (PHYD,DI) IS THE DRIVE NUMBER.
*                        YY = OPERATION CODE. 
*                (CN) = CONTROLLER NUMBER.
*                (DN) = DRIVE NUMBER. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = UNIT NUMBER FOR COMMAND PACKET.
  
  
 SOU      SUBR               ENTRY/EXIT 
          STML   CPBF+OPC 
          MJN    SOU1        IF USING PHYSICAL DRIVE
          LDD    CN          MERGE CONTROLLER + DRIVE NUMBERS 
          SHN    10 
          LMD    DN 
          UJN    SOU2        SET FACILITY ADDRESS 
  
 SOU1     LDD    CN          MERGE CONTROLLER + DRIVE NUMBERS 
          SHN    10 
          ADM    PHYD,DI
 SOU2     STM    CPBF+CUN 
          UJN    SOUX        RETURN 
 SRF      SPACE  4,10 
**        SRF - SET DRIVER RELOAD FLAG. 
* 
*         EXIT   (A) = 0. 
* 
*         USES   CM+1 - CM+4. 
* 
*         CALLS  DCR. 
* 
*         MACROS MONITOR, CHTE. 
  
  
 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
 SRI      SPACE  4,30 
**        SRI - SET SLAVE RESET INTERLOCK.
* 
*         IN A MMF ENVIRONMENT, DAS MUST BE CONFIGURED WITH MORE
*         THAN ONE DRIVER ACCESSING EACH CONTROLLER.  TO PREVENT AN 
*         ENDLESS SEQUENCE OF SLAVE RESETS UNDER SOME ERROR CONDITIONS, 
*         AN EXTENDED MEMORY FLAG REGISTER INTERLOCK IS USED TO ENSURE
*         THAT ONLY ONE DRIVER TRIES TO PERFORM A SLAVE RESET AT ANY
*         ONE TIME.  IF *1DA* ATTEMPTS TO SET THIS INTERLOCK AND
*         DETERMINES THAT IT IS HELD BY ANOTHER DRIVER, IT WILL WAIT
*         UNTIL THE INTERLOCK IS CLEAR, AND THEN CLEAR THE BUFFER COUNT 
*         AND COMPLETE THE CURRENT REQUEST.  THE REQUEST WILL BE
*         RETRIED ON A SUBSEQUENT PASS THROUGH THE MAIN LOOP. 
* 
*         ENTRY  (RW) = 0, IF SLAVE RESET.
*                (CRIB) .NE. 0, IF SLAVE RESET INTERLOCK ALREADY SET. 
* 
*         EXIT   INTERLOCK SET, IF FIRST *IFR* CALL SUCCESSFUL. 
*                (CRIB) .NE. 0, IF SLAVE RESET INTERLOCK SET. 
*                TO *CMP10*, IF FIRST *IFR* CALL UNSUCCESSFUL.
* 
*         CALLS  IFR. 
* 
*         MACROS DELAY. 
  
  
 SRI      SUBR               ENTRY/EXIT 
 SRIA     LDD    RW 
*         UJN    SRIX        (NO SHARED BUFFERED DEVICES CONFIGURED)
          NJN    SRIX        IF NOT SLAVE RESET 
          STM    SRIB        CLEAR *UNSUCCESSFUL IFR CALL* FLAG 
          LDM    CRIB 
          NJN    SRIX        IF SLAVE RESET INTERLOCK ALREADY SET 
 SRI1     LDN    /MMF/DSRI   SET *DAS SLAVE RESET INTERLOCK* FLAG BIT 
          RJM    IFR
          NJN    SRI3        IF NOT SUCCESSFUL
          LDC    0
*         LDC    NONZERO     (AT LEAST ONE UNSUCCESSFUL *IFR* CALL) 
 SRIB     EQU    *-1
          NJN    SRI2        IF NOT SUCCESSFUL ON FIRST TRY 
          LDN    1           SET *SLAVE RESET INTERLOCK SET* FLAG 
          STM    CRIB 
          UJN    SRIX        RETURN 
  
 SRI2     LCN    /MMF/DSRI   CLEAR *DAS SLAVE RESET INTERLOCK* FLAG BIT 
          RJM    IFR
          LJM    CMP10       ABANDON REQUEST (RETRY LATER)
  
 SRI3     STM    SRIB        SET *UNSUCCESSFUL IFR CALL* FLAG 
          DELAY  20B         DELAY TWO MILLISECONDS 
          UJN    SRI1        RETRY INTERLOCK ATTEMPT
 SRP      SPACE  4,10 
**        SRP - SEARCH RESPONSE PACKET. 
* 
*         ENTRY  (A) = PARAMETER ID TO SEARCH FOR.
* 
*         EXIT   (A) .EQ. 0 IF ID FOUND.
*                (A) .LT. 0 IF ID NOT FOUND.
*                (RPBF+5,T3) .EQ. THE PARAMETER.
* 
*         USES   T1 - T3. 
  
  
 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
 SSS      SPACE 4,15
**        SSS - SET SUSPECT STATE ON DEVICE.
* 
*         THIS ROUTINE ALSO SAVES THE FAILING DRIVE IN WORD *PILL*
*         SO THAT THE ALTERNATE CHANNEL DRIVER CAN INCLUDE THE CORRECT
*         UNIT NUMBER IN THE BML MESSAGE IF THE ERROR IS RECOVERED. 
* 
*         ENTRY  (EO) = EST ORDINAL.
* 
*         USES   T6, T7, CM+1 - CM+4. 
* 
*         CALLS  REE. 
* 
*         MACROS MONITOR, PUTE. 
  
  
 SSS      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM          CHECK DEVICE STATUS
          LPN    2
          NJN    SSSX        IF DEVICE *OFF* OR *DOWN*
          LDD    EO 
          STD    CM+1        SET EST ORDINAL
          LDD    IR+4 
          STD    CM+3        INSERT CHANNEL NUMBER
          LDN    SSES 
          STD    CM+2        SET SUSPECT STATE ON DEVICE
          MONITOR  SEQM 
  
*         SAVE FAILING DRIVE IN WORD *PILL* FOR THE ALTERNATE CHANNEL.
  
          LDC    PILL*100+6 
          STD    T6          6/WORD, 6/BITS TO CHANGE 
          LDC    52*100 
          STD    T7          LOW ORDER BIT TO CHANGE
          LDM    PHYD,DI
          STD    CM+2        NEW VALUE
          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      SAVE FAILING DRIVE IN *PUT*
          UJP    SSSX        RETURN 
 STF      SPACE  4,15 
**        STF - REQUEST TRACK FLAW. 
* 
*         ENTRY  (CB) = CURRENT *CBT* ORDINAL.
*                (EO) = EST ORDINAL.
*                (T4) = CYLINDER NUMBER.
*                (T5) = PHYSICAL TRACK. 
*                (T7) = LOGICAL SECTOR WITHIN PHYSICAL TRACK. 
* 
*         USES   T4, CM - CM+4. 
* 
*         CALLS  CDA, C2D, IDM, REE.
* 
*         MACROS MONITOR. 
  
  
 STF      SUBR               ENTRY/EXIT 
          RJM    REE         READ EST ENTRY 
          LDD    CM+4        GET PARTITION CYLINDER OFFSET
          SHN    3
          ADK    SCYL 
          CRD    CM 
          LDD    T4          CONVERT ABSOLUTE TO RELATIVE CYLINDER
          SBD    CM+2 
          STD    T4 
          RJM    CDA         CONVERT DISK ADDRESS 
          LDD    T6 
          STD    CM+2        TRACK NUMBER FOR MONITOR REQUEST 
          RJM    C2D         SET TRACK NUMBER IN MESSAGE
          STM    STFB+5 
          LDD    T6 
          SHN    -6 
          RJM    C2D         SET TRACK NUMBER IN MESSAGE
          STM    STFB+4 
          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 
          LDK    SFTS        INSERT SUBFUNCTION 
          STD    CM+3 
          MONITOR  SMDM      SET TRACK FLAW REQUEST IN MST
          LDD    CM+1 
          NJN    STF1        IF THIS FLAW ALREADY REQUESTED 
          LDC    STFA 
          STML   MAD1        ISSUE ERROR LOG MESSAGE
          RJM    IDM
 STF1     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   CM - CM+4, T5 - T7.
* 
*         MACROS FTTE.
  
  
 STO      SUBR               ENTRY/EXIT 
          STD    T6 
          LDC    RTCL        FETCH CURRENT TIME 
          CRD    CM 
          LDD    T6 
          RAD    CM+1        SET TIME LIMIT 
          SHN    -14
          RAD    CM 
          LDM    STO         SET CALLERS ADDRESS
          STD    T7 
          LDN    0
          STD    T5 
          LDI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          SHK    FTTLS
          FTTE   *
          ADC    0           STORE *FTT* ENTRY
          CWD    T5 
          UJN    STOX        RETURN 
 SUA      SPACE  4,10 
**        SUA - SET UEM ADDRESS.
* 
*         ENTRY  (A) = *CBT* ORDINAL. 
* 
*         EXIT   (UA - UA+1) = UEM ADDRESS / 100. 
* 
*         USES   UA, UA+1, 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 
 SUD      SPACE  4,10 
**        SUD - SPIN UP DRIVE.
* 
*         ENTRY  (OUPD,DI) = PHYSICAL DRIVE TO SPIN UP. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (EO) = EST ORDINAL.
* 
*         EXIT   (A) = 0 IF COMMAND SUCCESSFUL. 
*                (PHYD,DI) = PHYSICAL DRIVE.
* 
*         CALLS  ATT, SOU, WCB. 
  
  
 SUD      SUBR               ENTRY/EXIT 
          LDM    OUPD,DI     SET PHYSICAL DRIVE TO SPIN UP
          STM    PHYD,DI
          SHN    10 
          STML   CPBF+FCP+1  DRIVE TO SPIN UP 
          LDC    P02D5
          STML   CPBF+FCP    PHYSICAL DRIVE PARAMETER 
          LDC    C0301       REPORT CONDITION OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    12          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND BLOCK
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJP    SUD2        IF ERROR 
          LDML   RPBF+6 
          SHN    21-7 
          MJN    SUD2        IF DRIVE NOT OPERATIONAL 
          LDC    C0700       SET OPERATING MODE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P02D5
          STML   CPBF+FCP    PHYSICAL DRIVE PARAMETER 
          LDM    OUPD,DI     PHYSICAL DRIVE 
          SHN    10 
          STML   CPBF+FCP+1  DRIVE TO SPIN UP 
          LDC    P0351
          STML   CPBF+FCP+2 
          LDC    0#8000 
          STML   CPBF+FCP+3  PARAMETER TO SELECT SPIN UP
          LDN    16          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
 SUD2     UJP    SUDX        RETURN 
 SUI      SPACE  4,15 
**        SUI - SET UNIT INTERLOCK. 
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   (A) = 0 IF *PUT* ENTRY INTERLOCKED.
*                (UC) = UNIT ACTIVITY COUNT INCREMENTED.
*                (CM+1) = *BIOM* STATUS.
* 
*         USES   CM+1, CM+2, UC.
* 
*         MACROS MONITOR. 
  
  
 SUI      SUBR               ENTRY/EXIT 
          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 
          NJN    SUIX        IF INTERLOCK NOT ACQUIRED
          AOD    UC          ADVANCE UNIT ASSIGNED COUNT
          LDC    4000 
          STM    RQLN,DI     SET UNIT INTERLOCKED 
          LDN    0
          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    RAME        CONTROLLER MEMORY
          CON    DRVE        DRIVE RESERVE
          CON    RAME        CONTROLLER MEMORY
          CON    DSTE        DEVICE STATUS
          LOC    *O 
 TMSK     SPACE  4,10 
**        TMSK - TABLE OF CONTROLLER MASKS. 
* 
*         INDEXED BY CONTROLLER NUMBER. 
          SPACE  2
 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 IN WORD *BDLL* OF THE MST. 
* 
*         ENTRY  (A) = BIT TO CHANGE. 
*                (EO) = EST ORDINAL.
*                (CM+2) = NEW VALUE.
* 
*         USES   T6, T7, CM - CM+4. 
* 
*         CALLS  REE. 
* 
*         MACROS MONITOR. 
  
  
 UBP      SUBR               ENTRY/EXIT 
          SHN    6
          STD    T7          BIT NUMBER * 100B
          LDN    1
          STD    T6          NUMBER OF BITS TO CHANGE 
          LDD    MA 
          CWD    T6          STORE MESSAGE BUFFER PARAMETERS
          RJM    REE         READ EST ENTRY 
          LDD    CM+4 
          SHN    3
          ADN    BDLL        SET ADDRESS OF *BDLL*
          STD    CM+4 
          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.
* 
*         STATUS READ FROM THE IPI CHANNEL AND RESPONSES RECEIVED 
*         FROM THE CONTROLLER ARE IN 16-BIT WORDS.  THIS ROUTINE
*         MOVES CONSECUTIVE 16-BIT WORDS TO CONSECUTIVE 12-BIT
*         WORDS.  THUS, 3 16-BIT WORDS WOULD BE UNPACKED AND STORED 
*         IN 4 12-BIT WORDS IN PP MEMORY. 
* 
*         ENTRY  (A) = DESTINATION DATA ADDRESS.
*                (T2) = SOURCE DATA ADDRESS.
*                (T4) = 16-BIT WORD COUNT OF HEX DATA.
* 
*         EXIT   (A) = CM WORD COUNT OF 12 BIT DATA.
* 
*         USES   T2 - 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
 UPD      SPACE  4,25 
**        UPD - UDPATE PHYSICAL DRIVE NUMBER. 
* 
*         THIS ROUTINE UPDATES (PHYD,DI) TO THE NEXT PHYSICAL DRIVE 
*         OF THE LOGICAL UNIT.  THE PHYSICAL DRIVE PROGRESSION IS AS
*         FOLLOWS, WHERE X IS THE CABINET RANK. 
* 
*         TYPE    PROGRESSION 
* 
*          1      NX. (N = 0-3) 
*          1P     0X, 3X. 
*          2      0X, 1X. 
*          2P     0X, 1X, 3X. 
*          3      0X, 1X, 2X. 
*          3P     0X, 1X, 2X, 3X. 
*          4      0X, 1X, 2X, 3X. 
* 
*         ENTRY  (DT) = DRIVE TYPE. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (DD) = NUMBER OF DATA DRIVES IN DEVICE.
*                (PD) = NUMBER OF PARITY DRIVES IN DEVICE.
* 
*         EXIT   (A) = 0 IF (PHYD,DI) IS THE LAST PHYSICAL
*                      DRIVE OF THE LOGICAL UNIT.  NO UPDATE IS 
*                      MADE IN THIS CASE. 
  
  
 UPD2     LDN    0           EXIT WITH NO UPDATE
  
 UPD      SUBR               ENTRY/EXIT 
          LDM    PHYD,DI
          SHN    -3 
          ADN    1
          SBD    DD 
          MJN    UPD4        IF NORMAL UPDATE 
          NJN    UPD2        IF NO UPDATE NECESSARY 
          LDD    PD 
          ZJN    UPDX        IF NO UPDATE NECESSARY 
          LDN    4
          SBD    DD 
          SHN    3
          UJN    UPD5        UPDATE TO PARITY DRIVE 
  
 UPD4     LDN    10B         UPDATE TO NEXT STRING
 UPD5     RAM    PHYD,DI
          UJP    UPDX        RETURN 
 VDA      SPACE  4,10 
**        VDA - VERIFY DRIVE ATTRIBUTES.
* 
*         ENTRY  (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         USES   T1.
* 
*         CALLS  ATT, IDT, SOU, WCB.
  
  
 VDA11    RJM    ATT         WAIT FOR COMPLETION RESPONSE 
  
 VDA      SUBR               ENTRY/EXIT 
  
*         RESTORE DRIVE ATTRIBUTES. 
  
          LDC    C0202       RESTORE ATTRIBUTES OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJP    VDA10       IF NOT SUCCESSFUL
  
*         CHECK ATTRIBUTE 6E. 
  
          LDC    C0200       REPORT ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P036C
          STML   CPBF+FCP    REPORT ATTRIBUTE 6E
          LDC    0#806E 
          STML   CPBF+FCP+1 
          LDN    12          COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDML   ATTB+1 
          LMC    0#C080 
          NJN    VDA1        IF ATTRIBUTE INCORRECT 
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          UJP    VDA3        CHECK ATTRIBUTE 6F 
  
 VDA1     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#46E
          STML   CPBF+FCP    PARAMETER 6E 
          LDC    0#C080      FOR PARITY DRIVES THIS ENABLES PARITY
          STML   CPBF+FCP+1   CORRECTION BEFORE ECC CORRECTION
          LDN    0
          STML   CPBF+FCP+2 
          LDN    14          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    VDA2        IF NOT SUCCESSFUL
          LDC    C020A       SAVE ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
 VDA2     NJP    VDA10       IF NOT SUCCESSFUL
  
*         CHECK ATTRIBUTE PARAMETER 6F. 
  
 VDA3     LDC    C0200
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P036C
          STML   CPBF+FCP    REPORT ATTRIBUTE 6F
          LDC    0#806F 
          STML   CPBF+FCP+1 
          LDN    12          COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDML   ATTB+13
          LMC    BPB
          NJN    VDA4        IF BURST SIZE NOT CORRECT
          RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          UJP    VDA7        CHECK ATTRIBUTE D8 
  
 VDA4     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDN    0
          STD    T1 
 VDA5     LCN    0           PARAMETERS WITH FFFF WILL NOT BE CHANGED 
          STML   CPBF+FCP,T1
          AOD    T1 
          LMN    24 
          NJN    VDA5        IF MORE WORDS TO INITIALIZE
          STM    CPBF+FCP+10
          STM    CPBF+FCP+12
          LDC    BPB*2       SET INTERRUPT SIZE 
          STML   CPBF+FCP+11
          SHN    -1          SET BURST SIZE 
          STML   CPBF+FCP+13
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    0#276F 
          STML   CPBF+FCP    PARAMETER 6F 
          LDN    46D         COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    VDA6        IF NOT SUCCESSFUL
          LDC    C020A       SAVE ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNT 
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
 VDA6     NJN    VDA8        IF NOT SUCCESSFUL
  
*         CHECK ATTRIBUTE D8. 
  
 VDA7     LDD    DT 
          IFNE   EQEA,0,2 
          SBN    EQEA 
          MJN    VDA7.1      IF NOT SOLID STATE 5832
          SBN    EQEC-EQEA
          MJP    VDAX        IF INTERRUPT SIZE NOT USED 
 VDA7.1   LDC    C0200       REPORT ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDC    P036C       REPORT PARAMETER D8
          STML   CPBF+FCP 
          LDC    0#80D8 
          STML   CPBF+FCP+1 
          LDN    12          COMMAND PACKET LENGTH
          RJM    IDT         INPUT DATA TO PP 
          LDML   ATTB 
          LMC    0#9D8
 VDA8     NJP    VDA10       IF RESPONSE INCORRECT
          LDC    BPB         SET INTERRUPT SIZE 
          LMML   ATTB+2 
          NJN    VDA9        IF INTERRUPT SIZE WRONG
          LDML   ATTB+4 
          LMC    BPB
          ZJP    VDA11       IF BURST SIZE CORRECT
 VDA9     RJM    ATT         WAIT FOR COMPLETION RESPONSE 
          LDN    0
          STML   CPBF+FCP+1 
          STML   CPBF+FCP+3 
          LDC    BPB*2       SELECT INTERRUPT SIZE
          STML   CPBF+FCP+2 
          SHN    -1          SET BURST SIZE 
          STML   CPBF+FCP+4 
          LDC    0#09D8 
          STML   CPBF+FCP    PARAMETER D8 
          LDC    C0209       LOAD ATTRIBUTE OPERATION CODE
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    20          COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    VDA10       IF NOT SUCCESSFUL
          LDC    C020A       SAVE ATTRIBUTES OPERATION CODE 
          RJM    SOU         SET OPERATION CODE AND UNIT
          LDN    6           COMMAND PACKET LENGTH
          RJM    WCB         WRITE COMMAND PACKET 
          LDN    CMSS 
          RJM    ATT         PROCESS ATTENTION
          NJN    VDA10       IF NOT SUCCESSFUL
          LJM    VDAX        RETURN 
  
 VDA10    LCN    ERDA        REPORT DRIVE ATTRIBUTES ERROR
          RJM    ERR         PROCESS ERROR
 VIS      SPACE  4,15 
**        VIS - VERIFY INTERRUPT SOURCE.
* 
*         ENTRY  (A) .LT. 0 IF ASYNC INTERRUPT FROM CONTROLLER. 
* 
*         EXIT   (A) = 0 IF INTERRUPT FOR INACTIVE DRIVE. 
*                    = RETURN ADDRESS TO PROCESSOR. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         USES   DI.
* 
*         CALLS  CCO, DCM, LDP. 
  
  
 VIS4     RJM    CCO         CHECK FOR CONTROLLER OVER TEMPERATURE
          LDM    SRSA 
          ZJN    VISX        IF NO RESET IN PROGRESS
          STD    DI 
          UJN    VIS1        LOAD DEVICE PARAMETERS 
  
 VIS      SUBR               ENTRY/EXIT 
          MJN    VIS4        IF ASYNCH FOR CONTROLLER 
          LDM    RPBF+CRN    CHECK COMMAND NUMBER 
          STD    DI 
 VIS1     RJM    LDP         LOAD DEVICE PARAMETERS 
          LDM    RQLN,DI
          SHN    21-13
          PJN    VIS2        IF UNIT NOT INTERLOCKED
          LDML   ATTN,DI
          NJN    VISX        IF EXPECTED RESPONSE 
 VIS2     LDDL   RT 
          LMN    XFNT 
          NJN    VIS3        IF NOT TRANSFER NOTIFICATION 
          RJM    DCM         DESELECT CONTROLLER
 VIS3     LDN    0
          UJN    VISX        RETURN 
 WAC      SPACE  4,25 
**        WAC - WAIT FOR OTHER ACTIVITY TO COMPLETE.
* 
*         WAIT UNTIL ALL OTHER ACTIVITY ON THIS CONTROLLER IS COMPLETE. 
*         THE FACT THAT *ERFL* IS SET WILL PREVENT NEW ACTIVITY.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         USES   DI, T1.
* 
*         CALLS  LND, LDP.
  
  
 WAC      CON    0           ENTRY
          LDML   WAC         SAVE RETURN ADDRESS
          STML   SEPR,DI
          LDC    WAC1 
          STML   ADDR,DI     RETURN ADDRESS IF NO RESPONSE
 WAC1     LDN    1
 WAC2     LMN    1
          RJM    LND         LOCATE DRIVE 
          ZJN    WAC3        IF NO MORE DRIVES ON CONTROLLER
          LDML   ADDR,T7
          ZJN    WAC2        IF NO ACTIVITY ON DRIVE
          LDD    T7 
          LMD    DI 
          ZJN    WAC2        IF CURRENT DRIVE 
          LDD    T7 
          STD    DI 
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LJM    0,PA        CHECK FOR TIMEOUT ON ACTIVE DRIVE
  
 WAC3     LDML   SEPR,DI     GET RETURN ADDRESS 
          STDL   T1 
          LJM    0,T1        RETURN 
 WLB      SPACE  4,10 
**        WLB - WRITE LINKAGE BITS. 
* 
*         ENTRY  (T6) = ADDRESS FOR LINKAGE.
*                (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 
          UJN    WLB2        MOVE SECTOR LINKAGE
 WMC      SPACE  4,10 
**        WMC - WAIT MAINTENANCE CHANNEL EMPTY. 
* 
*         EXIT   (A) .EQ. 0 IF CHANNEL EMPTY. 
*                (A) .NE. 0 IF CHANNEL HUNG FULL. 
  
  
 WMC2     LDN    0           INDICATE CHANNEL EMPTY 
  
 WMC      SUBR               ENTRY/EXIT 
          LDD    TH 
 WMC1     EJM.   WMC2,MR     IF TRANSMISSION COMPLETE 
          SBN    1
          NJN    WMC1        IF NOT TIMED OUT 
          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.* 
          TITLE  CHANNEL SUBROUTINES. 
 BCS      SPACE  4,10 
**        BCS - DEFINE INFORMATION TRANSFER.
* 
*         ENTRY  (A) = BUS *A* BITS 7 AND 6.
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         CALLS  RSR. 
  
  
 BCS1     LDDL   LF          FETCH LAST FUNCTION
          LMN    0#32 
          RJM    RSR         DROP SYNC OUT
  
 BCS      SUBR               ENTRY/EXIT 
          SHN    17-1 
          ADK    F005B       SET SYNC OUT 
          RJM    RSR         READ SLAVE RESPONSE
          LPC    377
          ZJN    BCS1        IF BUS ACKNOWLEDGE CORRECT 
          LDN    EBAE        BUS ACKNOWLEDGE ERROR
          RJM    ERR         PROCESS ERROR
 CFE      SPACE  4,10 
**        CFE - CHECK FOR I/O ERROR.
* 
*         ENTRY  (A) = RESIDUAL WORD COUNT. 
*                AT *CFE1* FROM *DCT* IF ERROR FLAG SET.
* 
*         EXIT   (A) = 0. 
*                TO *ERR* IF ERROR. 
  
  
 CFE4     NJN    CFE3        IF INCOMPLETE DATA TRANSFER
  
 CFE      SUBR               ENTRY/EXIT 
          CFM    CFE4,CH     IF CHANNEL ERROR FLAG CLEAR
 CFE1     LDN    ECIE        IPI CHANNEL ERROR FLAG 
 CFE2     RJM    ERR         PROCESS CHANNEL ERROR
  
 CFE3     LDN    EIDT        INCOMPLETE DATA TRANSFER 
          UJN    CFE2        PROCESS ERROR
 CRC      SPACE  4,10 
**        CRC - COMMON READ CODE. 
* 
*         ENTRY  (A) = LENGTH FOR INPUT.
*                (T0) = WORDS NOT TRANSFERRED.
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         USES   T1.
* 
*         CALLS  GSS. 
  
  
 CRC2     LDN    0
          RJM    GSS         GET ENDING STATUS
  
 CRC      SUBR               ENTRY/EXIT 
          SBD    T0 
          STD    T1          WORDS NOT TRANSFERRED
          LDC    50000D 
 CRC1     IJM    CRC2,CH     IF SLAVE IN
          SBN    1
          NJN    CRC1        IF TIMEOUT NOT EXPIRED 
          LCN    ECNR        SLAVE/SYNC IN SIGNAL ERROR 
          RJM    ERR         PROCESS ERROR
 CTC      SPACE  4,15 
**        CTC - CHECK TRANSFER COMPLETE.
* 
*         ENTRY  (RW) = 0 IF READ.
* 
*         EXIT   (A) = 0 TO CALLER IF NO ERROR. 
*                TO *PIO2* IF ENDING STATUS INDICATES PAUSE AND 
*                   NO DATA WAS READ. 
*                TO *PIO6* IF ENDING STATUS INDICATES NO MORE DATA
*                   AND NOT ALL DATA WAS TRANSFERRED. 
*                TO *ERR* IF ERROR. 
* 
*         USES   T1.
* 
*         CALLS  DCM, FAN, FCN, GSS, RCR, RDR, RTR, SCD.
  
  
 CTC      SUBR               ENTRY/EXIT 
          LDC    7700D
          STDL   T1 
 CTC1     LDC    F0700
          RJM    FCN         REQUEST OPERATIONAL STATUS 
          ACN    CH 
          EJM    CTC2,CH     IF ERROR 
          IAN    CH          READ STATUS
          LPN    1
          ZJN    CTCX        IF TRANSFER COMPLETE 
 CTC2     SODL   T1 
          NJN    CTC1        IF NOT TIMEOUT 
          RJM    RTR         READ T REGISTER
          LDD    CT 
          ZJN    CTC2.1      IF 10 MB CHANNEL 
  
*         THE DMA TERMINATE FUNCTION DOES NOT CLEAR DMA MODE
*         IN THE 25 MB CHANNEL. 
  
          SFM    CTC2.0,CH   CLEAR ERROR FLAG ON 25MB CHANNEL 
 CTC2.0   LDC    F0E00
          RJM    FAN         CLEAR T REGISTER 
 CTC2.1   LDC    F0800       DMA TERMINATE FUNCTION 
          RJM    FAN         SEND THE FUNCTION
          LDC    F00E1       READ STATUS REGISTER FUNCTION
          RJM    RDR         READ REGISTER
          SHN    6
          PJN    CTC3        IF SLAVE IN DROPPED
          LDN    ECNR        SLAVE/SYNC IN SIGNAL ERROR 
          RJM    ERR         PROCESS ERROR
  
 CTC3     LDN    0           NO MASTER TERMINATE
*         STD    T1          SO LENGTH ERROR NOT REPORTED IN *CFE*
          RJM    GSS         GET ENDING STATUS
          LPN    60B
          LMN    20B
          ZJN    CTC5        IF NO MORE DATA
  
*         IF MULTIPLE PHYSICAL DRIVES PER LOGICAL UNIT, AND THERE 
*         IS A MEDIA ERROR FOR AT LEAST 2 DRIVES AT THE SAME SECTOR,
*         THE CONTROLLER WILL TRANSFER NO DATA THEN RETURN AN ENDING
*         STATUS INDICATING PAUSE, AND EXPECT THE HOST TO REREAD
*         THE DATA IF IT SENDS A TRANSFER NOTIFICATION RESPONSE.
  
          LDDL   RW 
          NJN    CTC4        IF WRITE 
          LDML   EDBF+TREG
          LMC    BPB
          NJN    CTC4        IF NOT 0-BYTE TRANSFER 
          RJM    RCR         RESET CHANNEL REGISTERS
          LJM    PIO2        WAIT FOR ANOTHER RESPONSE
  
 CTC4     LDN    EIDT        INCOMPLETE DATA TRANSFER 
          RJM    ERR         PROCESS ERROR
  
*         THE CONTROLLER MAY DROP SLAVE IN ANYTIME DURING THE TRANSFER
*         AND RETURN 90 HEX AS ENDING STATUS.  THIS INDICATES COMMAND 
*         COMPLETE.  THE RESPONSE PACKET SHOULD REPORT AN ERROR.
  
*CTC5     LDN    0
 CTC5     RJM    SCD         CLEAR CHANNEL ACTIVE FOR *CPD* 
          RJM    DCM         DESELECT THE CONTROLLER
          LCN    0           TO GUARANTEE AN ERROR IS REPORTED
          LJM    PIO6        WAIT FOR A RESPONSE
 DCM      SPACE  4,10 
**        DCM - DESELECT CONTROLLER.
* 
*         CALLS  FCN, RSR.
  
  
 DCM      SUBR               ENTRY/EXIT 
          LDC    F0071
          RJM    RSR         WAIT FOR SLAVE IN TO DROP
          CFM    DCMX,CH     IF ERROR FLAG NOT SET
  
*         ON A 25 MB IPI CHANNEL, A DESELECT SEQUENCE COULD RESULT
*         IN A CHANNEL SEQUENCE ERROR.  THE FOLLOWING CODE CLEARS 
*         SUCH AN ERROR STATUS. 
  
          LDC    F0100
          RJM    FCN         CLEAR THE DMA ERROR
          UJN    DCMX        RETURN 
 DCT      SPACE  4,10 
**        DCT - DETERMINE CHANNEL TYPE. 
* 
*         EXIT   (CT) = 0 IF 10 MB CHANNEL. 
*                       1 IF 25 MB CHANNEL. 
* 
*         CALLS  FCN. 
  
  
 DCT1     STDL   CT 
 DCT      SUBR               ENTRY/EXIT 
          LDC    F0102
          RJM    FCN         READ IPI REVISION REGISTER 
          ACN    CH 
          LDN    0
          EJM    DCT1,CH     IF 10 MB/S IPI CHANNEL 
          LDN    1
          UJN    DCT1        RETURN 
 DTM      SPACE  4,15 
**        DTM - DETERMINE TRANSFER MODE.
* 
*         ENTRY  (A) = CONTROLLER NUMBER. 
*                (T6) = 0 IF STREAMING COMMANDS/RESPONSES.
*                (T6) = 200(16) IF INTERLOCKING COMMANDS/RESPONSES. 
* 
*         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    RSR         REQUEST TRANSFER SETTINGS
          LPN    0#10 
          LMN    0#10        COMPLEMENT TRANSFER MODE 
          SHN    11-4 
          LMDL   T6          MASK FOR INTERLOCK DATA
          SHN    2
          RADL   T4          APPEND TRANSFER MODE TO RESPONSE 
          SFM    CFE1,CH     IF ERROR FLAG SET
          LDDL   LF 
          LMC    0#54        DROP MASTER OUT
          RJM    RSR         ENSURE SLAVE IN DROPPED
          CFM    DTM1,CH     IF ERROR FLAG NOT SET
  
*         ON A 25 MB IPI CHANNEL, A REQUEST TRANSFER SETTINGS SEQUENCE
*         COULD RESULT IN A CHANNEL SEQUENCE ERROR.  THE FOLLOWING CODE 
*         CLEARS SUCH AN ERROR STATUS.
  
          LDC    F0100
          RJM    FCN         CLEAR THE DMA ERROR
 DTM1     LDDL   T4 
          UJP    DTMX        RETURN 
 FAN      SPACE  4,10 
**        FAN - SEND A FUNCTION TO THE IPI CHANNEL. 
* 
*         NOTE - THE CHANNEL MAY HAVE BEEN LEFT ACTIVE BY A MASTER
*                CLEAR, A ROUTINE SUCH AS DCM, OR AFTER A REPORTED
*                ERROR. 
* 
*         ENTRY  (A) = FUNCTION TO ISSUE. 
  
  
 FAN      SUBR               ENTRY/EXIT 
          DCN    CH+40       ENSURE THE CHANNEL IS INACTIVE 
          FAN    CH          SEND THE FUNCTION
          UJN    FANX        RETURN 
 FCN      SPACE  4,10 
**        FCN - ISSUE FUNCTION. 
* 
*         ENTRY  (A) = FUNCTION CODE. 
* 
*         EXIT   (A) .NE. 0.
*                (LF) = FUNCTION CODE.
*                TO *ERR* IF FUNCTION TIMEOUT.
  
  
 FCN      SUBR               ENTRY/EXIT 
          DCN    CH+40
          FAN    CH          ISSUE FUNCTION 
          STDL   LF 
          IJM    FCNX,CH     IF FUNCTION ACCEPTED 
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LDN    ETFN        CHANNEL FUNCTION TIMEOUT 
          RJM    ERR         PROCESS ERROR
 GIS      SPACE  4,10 
**        GIS - GET INTERRUPT STATUS. 
* 
*         EXIT   (A) = (GISA) = INTERRUPT STATUS. 
* 
*         CALLS  FCN. 
  
  
*         INTERRUPTS MUST BE ENABLED AT LEAST 6 MICROSECONDS BEFORE 
*         THE FOLLOWING INPUT.
  
 GIS1     IAN    CH          READ INTERRUPT STATUS
 GIS2     STML   GISA 
          LDC    F0711       NEGATE MASTER OUT
          RJM    FCN
          LDML   GISA        RETURN WITH (A) = STATUS 
  
 GIS      SUBR               ENTRY/EXIT 
          ACN    CH+40
          FJM    GIS1,CH
          LDN    0
          UJN    GIS2        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) = (PIOC) = ENDING STATUS IF TRANSFER SUCCESSFUL. 
*                (GSSA) = ENDING STATUS AS READ FROM CONTROLLER.
*                TO *ERR* IF ERROR. 
* 
*         CALLS  RRP, RSR.
  
  
 GSS5     LDML   GSSA        ENDING STATUS
          STML   PIOC 
  
 GSS      SUBR               ENTRY/EXIT 
          SHN    10 
          ADC    F8039       INDICATE TRANSFER SUCCESSFUL 
          RJM    RSR         GET ENDING STATUS
          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        INCOMPLETE DATA TRANSFER 
          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        SUCCESSFUL NOT SET IN ENDING STATUS
          UJN    GSS4        PROCESS ERROR
  
 GSS2     LDN    EUST        SUCCESSFUL NOT SET IN ENDING STATUS
          UJN    GSS4        PROCESS ERROR
  
 GSS3     LDN    ECIE        IPI CHANNEL ERROR FLAG 
 GSS4     RJM    ERR         PROCESS ERROR
  
  
 GSSA     CON    0           ENDING STATUS
 IDT      SPACE  4,15 
**        IDT - INPUT DATA TO PP. 
* 
*         ENTRY  (A) = COMMAND PACKET LENGTH. 
*                (TM) = TRANSFER MODE.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
* 
*         EXIT   ATTRIBUTE DATA STARTS AT ATTB. 
* 
*         USES   T1.
* 
*         CALLS  ATT, BCS, CRC, DCM, FCN, WCB.
  
  
 IDT1     LCN    ERDA        REPORT DRIVE ATTRIBUTES ERROR
          RJM    ERR         PROCESS ERROR
  
 IDT      CON    0           ENTRY
          RJM    WCB         WRITE COMMAND PACKET 
          LDML   IDT
          STML   IDTR,DI     SAVE RETURN ADDRESS
          LDN    XFNT        EXPECT TRANSFER NOTIFICATION RESPONSE
          RJM    ATT         PROCESS ATTENTION
          NJP    IDT1        IF ERROR 
          LDN    DAIN        DATA TRANSFER IN 
          RJM    BCS         BUS CONTROL SEQUENCE 
          LDI    T0          DELAY 750 NANOSECONDS
          LDDL   TM          TRANSFER MODE
          SHN    11-0 
          LMC    F0281
          RJM    FCN         TELL DMA LOGIC TO READ 
          ACN    CH 
          LDC    ATTBL
          IAM    ATTB,CH     INPUT ATTRIBUTE DATA 
          STD    T0          WORDS NOT TRANSFERRED
          LDM    RPBF+MST+3  BYTE LENGTH OF TRANSFER
          ADN    1           IN CASE OF ODD BYTE LENGTH 
          SHN    -1          EXPECTED WORDS TO TRANSFER 
          RAD    T0 
          LDC    ATTBL
          RJM    CRC         COMMON READ CODE 
          RJM    DCM         DESELECT CONTROLLER
          LDML   IDTR,DI
          STDL   T1 
          LJM    0,T1        RETURN TO CALLER 
 RCR      SPACE  4,10 
**        RCR - RESET CHANNEL REGISTERS.  THIS LEAVES THE IPI 
*               CHANNEL IN AN IDLE STATE. 
* 
*         ENTRY  (MF) = 0 IF PREVIOUS MASTER CLEAR SUCCESSFUL.
* 
*         USES   MF, T1.
* 
*         CALLS  DCT, FCN, WTC. 
* 
*         MACROS WAIT.
  
  
 RCR2     LDN    0
          STD    MF          INDICATE MASTER CLEAR COMPLETE 
  
 RCR      SUBR               ENTRY/EXIT 
          LDD    MF 
          NJN    RCR2        IF MASTER CLEAR FAILED 
          AOD    MF 
          LDN    F0000
          RJM    FCN         MASTER CLEAR THE ADAPTER 
          WAIT   100
  
*         MASTER CLEAR DOES NOT CLEAR ERROR FLAG ON THE 25 MB CHANNEL,
*         SO THE SFM INSTRUCTION MUST BE USED TO CLEAR IT.
  
          SFM    RCR1,CH
*RCR1     LDN    0           SET DEVICE NOT SELECTED
 RCR1     ADK    F0000-0     ENSURE NO SEQUENCE ERROR 
          RJM    FCN
          RJM    DCT         DETERMINE CHANNEL TYPE 
          LDML   TRAT,CT
          RJM    FCN         SET IPI CHANNEL TRANSFER RATE
          LDC    F0300
          RJM    FCN         WRITE CONTROL REGISTER FUNCTION
          ACN    CH 
          LDML   EDC,CT      ENABLE DOUBLE CMI SLOT IF 25 MB CHANNEL
          STDL   T1 
          LDN    1
          OAM    T1,CH
          RJM    WTC         WAIT TRANSFER COMPLETE 
          UJP    RCR2        SET COMPLETE AND RETURN
 RDR      SPACE  4,10 
**        RDR - READ REGISTER.
* 
*         ENTRY  (A) = FUNCTION CODE. 
* 
*         EXIT   (A) = VALUE OF REGISTER OR 0 IF ERROR. 
* 
*         CALLS  FAN. 
  
  
 RDR1     LDN    0
 RDR      SUBR               ENTRY/EXIT 
          RJM    FAN         SEND FUNCTION
          AJM    RDR1,CH     IF NO FUNCTION REPLY 
          ACN    CH+40B 
          EJM    RDR1,CH     IF WORD COULD NOT BE READ
          IAN    CH 
          UJN    RDRX        RETURN 
 RIF      SPACE  4,15 
**        RIF - RESET INTERFACE.
* 
*         ENTRY  (RW) = 0 TO RESET SLAVE INTERFACE. 
*                     = 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
          RJM    SAP         SELECT ADAPTER 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. 
* 
*         ENTRY  (T6) = 0 IF STREAMING MODE FOR RESPONSES.
* 
*         CALLS  BCS, CRC, FCN. 
  
  
 RRP      SUBR               ENTRY/EXIT 
          LDN    RIIN 
          RJM    BCS         INITIATE BUS EXCHANGE (RESPONSE IN)
          LDDL   T6          STREAMING OR INTERLOCK MODE
          LMC    F0281       READ 
          RJM    FCN         RAISE MASTER OUT 
          ACN    CH 
          LDN    RPBFL       TRANSFER RESPONSE PACKET 
          IAM    RPBF,CH
          STD    T0          SAVE RESIDUE 
          SBN    RPBFL-4
          PJN    RRP1        IF INVALID PACKET LENGTH 
          LDM    RPBF+PLN 
          ADN    3           CONVERT OCTET COUNT TO BYTE COUNT
          SHN    -1 
          RAD    T0 
 RRP1     LDK    RPBFL       COMPARE LENGTH WITH DATA READ
          RJM    CRC         COMMON READ CODE 
          UJN    RRPX        RETURN 
 RSR      SPACE  4,10 
**        RSR - READ SLAVE RESPONSE.
* 
*         ENTRY  (A) = FUNCTION TO ISSUE. 
* 
*         EXIT   (A) = SLAVE RESPONSE.
*                TO *ERR* IF ERROR. 
* 
*         CALLS  FCN. 
  
  
 RSR2     IAN    CH          READ SLAVE RESPONSE
  
 RSR      SUBR               ENTRY/EXIT 
          RJM    FCN
          LDC    2000 
          ACN    CH 
 RSR1     FJM    RSR2,CH     IF SLAVE IN DROPPED
          SBN    1
          NJN    RSR1        IF NOT TIMED OUT 
          LDN    ECNR        SLAVE/SYNC IN SIGNAL ERROR 
          RJM    ERR         PROCESS ERROR
 RTR      SPACE  4,10 
**        RTR - READ T REGISTER.
* 
*         USES   T2, T3.
* 
*         CALLS  FAN. 
  
  
 RTR      SUBR               ENTRY/EXIT 
          LDC    F0A00       READ T REGISTER FUNCTION 
          STD    T2 
          RJM    FAN
          LDN    0
          STML   EDBF+TREG
          STML   EDBF+TREG+1  CLEAR T REGISTER BUFFER 
          STML   EDBF+TREG+2
          STD    T3 
          ACN    CH+40B      ACTIVATE CHANNEL 
  
*         THE ONE WORD INPUT IS NECESSARY TO PREVENT THE CHANNEL
*         FROM HANGING ON A 170 DMA CHANNEL.
  
 RTR1     SOD    T2 
          ZJN    RTRX        IF TIMEOUT 
          IJM    RTRX,CH     IF ERROR 
          EJM    RTR1,CH     IF CHANNEL NOT FULL YET
          IAN    CH 
          STML   EDBF+TREG,T3  SAVE WORD FROM T REGISTER
          AOD    T3 
          LMN    3
          ZJN    RTRX        IF TRANSFER COMPLETE 
          UJN    RTR1        INPUT NEXT WORD
 SAP      SPACE  4,10 
**        SAP - SELECT ADAPTER PORT.
* 
*         ENTRY  (DI) = DEVICE STATE TABLE ADDRESS. 
*                (CT) = 0 IF 10 MB CHANNEL. 
* 
*         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
          ADML   PAS,CT 
          RJM    FCN
          UJN    SAPX        RETURN 
 SCM      SPACE  4,15 
**        SCM - SELECT CONTROLLER.
* 
*         ENTRY  (SF) = 1 IF DEVICE PREVIOUSLY SELECTED.
*                (CI) = CONTROLLER STATE TABLE INDEX. 
*                (CN) = CONTROLLER NUMBER.
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (T6) = 0 IF STREAMING COMMANDS/RESPONSES.
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         USES   T6.
* 
*         CALLS  DTM, RSR, SAP. 
  
  
 SCM      SUBR               ENTRY/EXIT 
          RJM    SAP         SELECT ADAPTER PORT
          LDML   CTST,CI
          SHN    -15
          ZJN    SCM1        IF STREAMING COMMANDS/RESPONSES
          LDC    0#200
 SCM1     STDL   T6 
          LDD    CN 
          RJM    DTM         DETERMINE TRANSFER MODE
          LMN    F0029       SET SELECT OUT 
          RJM    RSR         READ BIT SIGNIFICANT RESPONSE
          LPML   TMSK,CN
          NJN    SCMX        IF CORRECT CONTROLLER
          LDN    ETSL        SELECT TIMEOUT 
          RJM    ERR         PROCESS ERROR
 WCB      SPACE  4,15 
**        WCB - WRITE COMMAND BLOCK (PACKET). 
* 
*         ENTRY  (A) = COMMAND PACKET LENGTH. 
*                (DI) = DEVICE STATE TABLE ADDRESS. 
*                (T6) = 0 IF STREAMING MODE.
*                (DT) = DRIVE TYPE. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         USES   T1.
* 
*         CALLS  BCS, DCM, FCN, GSS, SCM, STO.
  
  
 WCB2     LDN    0           GET STATUS 
          RJM    GSS
          RJM    DCM         DESELECT CONTROLLER
          LDML   CPBF+OPC    OPERATION CODE 
          SHN    -10
          SBN    7
          NJN    WCB3        IF NOT SPIN UP/DOWN
          LDC    SUTO        SPIN UP TIMEOUT
          UJN    WCB5        SET COMMAND TIMEOUT
  
 WCB3     SBN    0#28-7 
          NJN    WCB4        IF NOT FORMAT
          LDML   CPBF 
          LMN    0#E
          ZJN    WCB4        IF NOT FULL PACK FORMAT
          LDC    FMTO 
          UJN    WCB5        SET COMMAND TIMEOUT
  
 WCB4     LDC    CBTO 
 WCB5     RJM    STO         SET TIMEOUT
  
 WCB      SUBR               ENTRY/EXIT 
          STM    CPBF+PLN 
          LDML   CPBF+OPC 
          STML   LCMD,DI     SAVE LAST COMMAND
          LDD    DI          SET COMMAND REFERENCE NUMBER 
          STM    CPBF+CRN 
          RJM    SCM         SELECT CONTROLLER
          LDN    CIOT 
          RJM    BCS         INITIATE BUS EXCHANGE (COMMAND OUT)
          LDDL   T6          STREAM OR INTERLOCK MODE 
          LMC    F0381       WRITE
          RJM    FCN         RAISE MASTER OUT 
          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 FOR *GSS* 
          LDC    50000D 
 WCB1     IJM    WCB2,CH     IF SLAVE IN DROPPED
          SBN    1
          NJN    WCB1        IF NOT TIMED OUT 
          LDN    ECNR        SLAVE/SYNC IN SIGNAL ERROR 
          RJM    ERR         PROCESS ERROR
 WTC      SPACE  4,10 
**        WTC - WAIT TRANSMISSION COMPLETE. 
* 
*         EXIT   TO *ERR* IF ERROR. 
* 
*         CALLS  CFE. 
  
  
 WTC1     DCN    CH+40       DEACTIVATE CHANNEL 
  
 WTC      SUBR               ENTRY/EXIT 
          RJM    CFE         CHECK FOR ERROR
          EJM    WTC1,CH     IF LAST WORD TAKEN OFF CHANNEL 
          LDN    ECHF        CHANNEL HUNG FULL
          RJM    ERR         PROCESS CHANNEL ERROR
 WTR      SPACE  4,10 
**        WTR - WRITE T REGISTER. 
* 
*         ENTRY  (CB) = *CBT* ORDINAL.
*                (RW) = 0 IF READ.
* 
*         CALLS  FCN, 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
          UJP    WTRX        RETURN 
  
  
 WTRA     BSS    0           T REGISTER BUFFER
          CONL   BPB         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  COMMON DECKS.
          SPACE  4,10 
**        COMMON DECKS. 
  
  
*CALL     COMPCHD 
*CALL     COMPC2D 
 RND$     EQU    0           DEFINE ROUNDING FOR *COMPDV5*
*CALL     COMPDV5 
 EST$     EQU    0           ASSEMBLE *EST* ACCESS ROUTINE
 IFP$     EQU    0           FORCE REMOTE ASSEMBLY OF *IFP* 
*CALL     COMPGFP 
*CALL     COMPIFR 
 M8K$     EQU    1           USE LONG INSTRUCTIONS
*CALL     COMPIMB 
          QUAL   TEO
 QUAL$    EQU    0           DO NOT FURTHER QUALIFY COMMON DECKS
 T5       EQU    EO          USE *EO* FOR EST ORDINAL IN COMMON DECKS 
*CALL     COMPTGB 
*CALL     COMPTLB 
          QUAL   *
 TGB      EQU    /TEO/TGB 
 TLB      EQU    /TEO/TLB 
          TITLE  BUFFERS. 
          SPACE  4,10 
**        BUFFERS.
  
  
 RPBF     BSS    0           RESPONSE PACKET BUFFER 
  
 CPBF     EQU    RPBF+1      COMMAND PACKET BUFFER
 ATTB     EQU    RPBF+10     ATTRIBUTE BUFFER 
 ATTBL    EQU    0#8A 
  
 RBUF     EQU    ATTB+ATTBL  REGISTER BUFFER
 RBUFL    EQU    2*4
  
 SBUF     EQU    RBUF+RBUFL  SCRATCH BUFFER 
 SBUFL    EQU    4*5
  
 EDBF     EQU    20000-400-RTEDL  ERROR DATA BUFFER 
          ERRNG  400-EDBFL+RTEDL  CODE DEPENDS ON VALUE 
  
 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 
 PPCH     EQU    MSID+2      PP NUMBER / CHANNEL NUMBER 
 UNIT     EQU    PPCH+1      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 
          SPACE  4,10 
*         CHECK FOR BUFFER OVERLAP. 
  
  
          ERRNG  EDBF-SBUF-SBUFL  *SBUF* OVERFLOWS INTO *EDBF*
          TITLE  PRESET.
*         PRESET DATA LOCATIONS.
  
  
 CPCH     CON    0           6/CPP NUMBER, 6/CHANNEL NUMBER 
 PUTA     CON    0,0         FWA OF *PUT* 
 PUTN     CON    0           NUMBER OF *PUT* ENTRIES
  
 OVLP     EQU    *+5         ORIGIN FOR OVERLAY *3DZ* 
 PRS      SPACE  4,15 
**        PRS - PRESET DRIVER FOR PROCESSING. 
* 
*         ENTRY  AT *PRS* WHEN DRIVER LOADED. 
* 
*         EXIT   TO *3DZ*.
* 
*         USES   CR, CT, PA, UC, CM - CM+4, T2 - T7, WB - WB+4. 
* 
*         CALLS  CCP, IFP, MCI, SCT, SPA, STA.
* 
*         MACROS EXECUTE. 
  
  
 PRS      BSS    0           ENTRY
          LDD    IR+2        SAVE *CCT* ORDINAL 
          STM    PRSA 
          RJM    IFP         INITIALIZE *COMPGFP* 
          LDN    0
          STD    UC          SET NO UNITS RESERVED
          STD    PA          SET NO REQUEST IN PROGRESS 
          STD    CT          DEFAULT TO 10 MB CHANNEL 
          RJM    MCI         MODIFY CHANNEL INSTRUCTIONS
*         LDN    0
          STD    CR          SET CHANNEL NOT RESERVED 
          RJM    SPA         SET PP EXCHANGE PACKAGE ADDRESSES
  
*         SET TIME FOR NEXT GLOBAL MST CHECK, BASED ON CPP NUMBER.
  
          LDK    RTCL        GET CURRENT CLOCK
          CRD    CM 
          LDD    CM+1        CURRENT TIME (SECONDS) 
          SBD    T4          ADJUST BY CPP NUMBER 
          PJN    PRS1        IF NO UNDERFLOW
          LDD    T4 
 PRS1     STM    CETB        PRESET TIME OF PREVIOUS GLOBAL MST CHECK 
          RJM    SCT         SET CHANNEL TABLE ADDRESSES
          LDK    BIOL 
          CRD    CM          READ BUFFERED I/O POINTERS 
          LDD    CM+1 
          SHN    14 
          LMD    CM+2 
          ADN    FTTP        READ *FTT* POINTER 
          CRD    T6 
          SBN    FTTP-CCTP   READ *CCT* POINTER 
          CRD    T4 
          ADN    CBTP-CCTP   READ *CBT* POINTER 
          CRD    WB 
          SBN    CBTP-PUTP   READ *PUT* POINTER 
          CRD    T2 
          LDD    T2+3        SAVE *PUT* ADDRESS 
          LPN    77 
          STM    PUTA 
          LDD    T2+4 
          STM    PUTA+1 
          AOD    T2 
          STM    PUTN        SAVE NUMBER OF *PUT* ENTRIES 
          LDC    T5*20000+TPUT  SET *PUT* ADDRESSES 
          RJM    STA
          LDC    **          ADJUST CHANNEL CONTROL TABLE POINTER 
 PRSA     EQU    *-1
          SCN    77 
          SHN    CCTLS-6
          RAD    CM 
          SHN    -14
          RAD    T7 
          LDC    T7*20000+TCCT  SET *CCT* ADDRESSES 
          RJM    STA
 .CM1     EQU    CM+1 
          LDC    .CM1*20000+TFTT  SET *FTT* ADDRESSES 
          RJM    STA
 .WB3     EQU    WB+3 
          LDC    .WB3*20000+TCBT  SET *CBT* ADDRESSES 
          RJM    STA
          LDN    EMBP        FETCH *EMB* POINTER
          CRD    CM 
          LDC    .CM1*20000+TEMB  SET *EMB* ADDRESSES 
          RJM    STA
          LDK    ESTP        SET ENDING EST ORDINAL FOR EST SEARCH
          CRD    CM 
          LDD    CM+3 
          STM    LNEA 
          LDK    UEML 
          CRD    CM          READ UEM POINTERS
          LDD    CM 
          SHN    11 
*         SHN    11+EMSC
          SCN    77 
          STM    SUAA        SET FWA OF UEM 
          LDD    CM 
          SHN    -3 
*         SHN    EMSC-3 
          STM    SUAB 
          RJM    CCP         CHECK CALLING PROGRAM
          EXECUTE  3DZ       CONTINUE PRESET
          TITLE  PRESET SUBROUTINES.
 CCP      SPACE  4,10 
**        CCP - CHECK CALLING PROGRAM.
* 
*         EXIT   (A) = 0. 
*                TO *PPR* IF UNAUTHORIZED CALL. 
* 
*         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 
          LDD    MA          MOVE MESSAGE BELOW ADDRESS 10000 
          CWM    CCPA,TR
          LDD    MA 
          CRM    CSTB,TR
          ERRNG  10000-CSTB  MESSAGE BUFFER MUST BE IN FIRST 4K OF PP 
          ERRNG  CSTB-MSFW   MESSAGE BUFFER MUST NOT DESTROY PPR
          LDC    CSTB 
          RJM    DFM         ISSUE DAYFILE MESSAGE
          MONITOR  ABTM 
          LJM    PPR         EXIT TO PP RESIDENT
  
  
 CCPA     DATA   C* 1DA - UNAUTHORIZED CALL.* 
 IFP      SPACE  4,10 
**        IFP - INITIALIZE MANAGED TABLE PROCESSORS.
  
  
          LIST   G
 IFP      HERE
          LIST   *
 MCI      SPACE  4,15 
**        MCI - MODIFY CHANNEL INSTRUCTIONS.
* 
*         ENTRY  (IR+4) = CONCURRENT CHANNEL NUMBER.
* 
*         EXIT   (A) = 0. 
* 
*         USES   T1 - T3. 
* 
*         CALLS  C2D. 
* 
*         MACROS CHTL.
  
  
 MCI1     RAIL   T2          MODIFY CHANNEL INSTRUCTION 
          AOD    T1 
 MCI2     LDML   TCHA,T1     EXTRACT NEXT ADDRESS 
          STDL   T2 
          LDD    T3          CHECK END OF LIST
          CHTL   *
          SBN    CH 
          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    SRSG+13
          STM    ERCR+10
          STM    ERCD+16
          STM    ERCE+16
          LDN    0           INITIALIZE REMOTE TABLE INDEX
          STD    T1 
          UJN    MCI2        ENTER 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    DCEB+3 
          RAM    CPCH 
          RJM    C2D         CONVERT FOR ERROR MESSAGE
          STM    LMRA+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.
* 
*         EXIT   (T4) = CPP NUMBER. 
* 
*         USES   CM - CM+4, T1 - T5.
* 
*         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          PP NUMBER
          SBN    24          CPP NUMBER 
          STD    T4 
          SHN    6
          STM    CPCH        SAVE CPP NUMBER FOR BML MESSAGE
          SHN    -6 
          ADN    24-2 
          STD    T1          PP NUMBER - 2
          SHN    4
          ADD    T1          (PP 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 - 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 ADDRESS POINTER
          STD    T1 
          LDDL   T3 
          LPC    17777
          STDL   T3 
          UJN    STA2        ENTER LOOP 
          TITLE  INSTRUCTION MODIFICATION TABLES. 
 TCHA     SPACE  4,10 
**        TABLE OF CHANNEL INSTRUCTIONS ADDRESSES.
  
  
 TCHA     CHTB
          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
 TFTT     SPACE  4,10 
**        TABLE OF INSTRUCTIONS REQUIRING FWA OF *FTT*. 
  
  
 TFTT     BSS    0
 TFTT     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
          SPACE  4,10 
*         CHECK FOR OVERFLOW. 
  
  
          ERRNG  17777-*-5   OVERFLOW PAST END OF PP
          SPACE  4,10 
          TTL    1DA/3DZ - *DAS* DRIVER PRESET (PART 2).
          TITLE 
          IDENT  3DZ,OVLP    *DAS* DRIVER PRESET (PART 2).
  
  
*COMMENT  1DA - *DAS* DRIVER PRESET (PART 2). 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1995. 
  
  
          ORG    OVLP 
          QUAL   3DZ
 BST      SPACE  4,15 
**        BST - BUILD STATE TABLES AND BML ERROR MESSAGE BUFFER.
* 
*         ENTRY  (CPCH) = CPP NUMBER AND CHANNEL NUMBER.
*                (PUTA - PUTA+1) = ADDRESS OF *PUT*.
*                (PUTN) = NUMBER OF *PUT* ENTRIES.
* 
*         EXIT   TO *MRS* WHEN PRESET COMPLETE. 
*                TO *DAS6* IF CHANNEL DOWN. 
* 
*         USES   T4.
* 
*         CALLS  CFD, DHE, IST, SMC.
  
  
 BST      SUBR               ENTRY
  
*         NOTE - THE FOLLOWING CALL TO *IST* DESTROYS *PPR* IN THIS PP. 
*         NO CALLS TO *PPR* MAY BE MADE AFTER THIS POINT. 
  
          RJM    IST         INITIALIZE DEVICE/CONTROLLER STATE TABLES
          RJM    DHE         DETERMINE HIGHEST EST ORDINAL
          RJM    SMC         SET MMF CONSTANTS
          RJM    CFD         CLEAR FLAGS AT DEADSTART 
  
*         PRESET BML ERROR MESSAGE BUFFER.
  
          LDC    EDBF 
          STDL   T4 
          LDN    0
 BST1     STI    T4 
          AODL   T4          ADVANCE BUFFER ADDRESS 
          SHN    0-15 
          ZJN    BST1        IF NOT END OF BUFFER 
          LDM    CPCH        SET CPP NUMBER AND CHANNEL NUMBER
          STM    PPCH 
          LDN    MLDY        SET DAYFILE CODE 
          STM    MSGT 
          LDC    **          (MAINFRAME ID) 
 BSTA     EQU    *-1
          STM    MFID 
  
*         RESERVE CHANNEL AND INITIATE DRIVER.
  
          LDM    DASB        CHECK IF ANY DEVICES FOUND 
          LMC    DSTB 
          ZJN    BST3        IF NO DEVICES FOR THIS DRIVER
          LJM    CCR2        RESERVE CHANNEL (RETURN TO *BST2*) 
  
 BST2     NJN    MRS         IF CHANNEL NOT DOWN
 BST3     LJM    DAS6        DROP CPP 
          TITLE  SUBROUTINES. 
 MRS      SPACE  4,10 
**        MRS - MASTER RESET SLAVES.
* 
*         EXIT   TO *CMP* IF RESET SUCCESSFUL.
*                TO *DAS1* IF NO UNIT COULD BE INTERLOCKED. 
* 
*         USES   DI, T1.
* 
*         CALLS  FCN, IDU, LDP, RCR.
* 
*         MACROS WAIT.
  
  
 MRS      BSS    0           ENTRY
          LDC    DSTB-DSTBE  FIRST DEVICE TABLE ADDRESS 
          STD    DI 
 MRS1     LDN    DSTBE
          RAD    DI 
          LMM    DASB 
          ZJP    DAS1        IF NO UNIT COULD BE INTERLOCKED
          RJM    LDP         LOAD DEVICE PARAMETERS 
          RJM    IDU         INTERLOCK DISK UNIT
          NJN    MRS1        IF UNIT NOT INTERLOCKED
          RJM    RCR         MASTER CLEAR CHANNEL 
          LDN    1
          STD    T1 
          SHN    13-0        POSITION PORT NUMBER 
 MRS3     LMML   PAS,CT 
          RJM    FCN         SELECT ADAPTER PORT
          LDC    F9213
          RJM    FCN         ISSUE MASTER RESET 
          WAIT   10 
          LDDL   LF          LAST FUNCTION
          SCN    2
          RJM    FCN         CLEAR SYNC OUT 
          SOD    T1 
          ZJN    MRS3        IF ANOTHER PORT TO PROCESS 
          LJM    CMP         EXIT/CLEAR UNIT INTERLOCK
          SPACE  4,10 
*         CHECK FOR OVERFLOW. 
  
  
          ERRNG  EDBF-*      OVERFLOW INTO BML ERROR MESSAGE BUFFER 
          TITLE  OVERLAYABLE SUBROUTINES. 
 CFD      SPACE  4,15 
**        CFD - CLEAR FLAGS AT DEADSTART. 
* 
*         CLEAR FLAGS THAT ARE LEFT SET AFTER LEVEL 3 DEADSTART.
*         THE CORRESPONDING *BDT* INTERLOCKS ARE CLEARED BY *MTE*.
* 
*         EXIT   FLAGS CLEARED IN *BDLL* AND *ACGL*.
* 
*         USES   DI, T4, UC, CM - CM+4, CW - CW+4.
* 
*         CALLS  CDS, CMC, IDU, IMR, LDP, LNE, RBD, UBP.
* 
*         MACROS CMSTF, MONITOR.
  
  
 CFD      SUBR               ENTRY/EXIT 
          LDC    DSTB-DSTBE 
          STD    DI 
 CFD1     LDN    DSTBE       PROCESS NEXT DEVICE
          RAD    DI 
          LMM    DASB 
          ZJN    CFDX        IF NO MORE DEVICES TO PROCESS
          RJM    LDP         LOAD DEVICE PARAMETERS 
          LDN    0           INITIALIZE PARTITION SEARCH
 CFD2     RJM    LNE         LOCATE NEXT EST FOR THIS DEVICE
          ZJN    CFD1        IF NO MORE PARTITIONS
          RJM    CDS         CHECK DEVICE STATUS
          MJN    CFD3        IF DEVICE NOT RECOVERED
          RJM    RBD         READ *BDLL*
          LDD    CM+3        CHECK FLAGS FOR ERROR/RESTORE INTERLOCKS 
          SHN    0-11 
          LPN    3
          NJN    CFD4        IF EITHER FLAG IS SET
 CFD3     LJM    CFD12       PROCESS NEXT PARTITION 
  
*         INTERLOCK DEVICE AND RECHECK FLAGS. 
  
 CFD4     RJM    IDU         INTERLOCK DEVICE 
          NJN    CFD1        IF INTERLOCK NOT AVAILABLE 
          RJM    RBD         READ *BDLL*
          LDD    CM+3        CHECK FLAGS FOR ERROR/RESTORE INTERLOCKS 
          SHN    0-11 
          LPN    3
          ZJP    CFD11       IF NEITHER FLAG IS SET 
          STD    T4          SAVE STATUS
          LDN    ZERL        CLEAR *BDT* ENTRY BUFFER 
          CRD    CW 
          LDML   DVTP,DI
          SHN    21-11
          PJN    CFD5        IF NOT SHARED DEVICE 
  
*         GET *BDT* ENTRY FROM *MTE*. 
  
          LDD    EO          SET EST ORDINAL
          STD    CM+4 
          LDN    GBDS        GET *BDT* ENTRY
          STD    CM+1 
          MONITOR  MTEM 
          LDD    MA          READ *BDT* ENTRY 
          CRD    CW 
  
*         PROCESS ERROR PROCESSING FLAG.
  
 CFD5     LDD    T4 
          LPN    2
          ZJN    CFD8        IF *BDLL* ERROR PROCESSING FLAG NOT SET
          LDD    CW          CHECK IF *BDT* ERROR INTERLOCK SET 
          ZJN    CFD6        IF NOT SET 
          LPN    77 
          LMN    **          (MACHINE INDEX)
 CFDA     EQU    *-1
          NJN    CFD7        IF SET FOR A DIFFERENT MF
          UJN    CFD8        DO NOT CLEAR FLAGS 
  
 CFD6     CMSTF  GDER        CLEAR *ERROR RECOVERY IN PROGRESS* FLAG
 CFD7     LDN    0           CLEAR FLAG THAT SAYS THIS MF HAS INTERLOCK 
          STD    CM+2 
          LDN    26          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
  
*         PROCESS RESTORE FLAG. 
  
 CFD8     LDD    T4 
          LPN    1
          ZJN    CFD11       IF *BDLL* RESTORE FLAG NOT SET 
          LDD    CW+1        CHECK IF *BDT* RESTORE SET 
          ZJN    CFD9        IF NOT SET 
          LPN    77 
          LMN    **          (MACHINE INDEX)
 CFDB     EQU    *-1
          NJN    CFD10       IF SET FOR A DIFFERENT MF
          UJN    CFD11       DO NOT CLEAR FLAGS 
  
 CFD9     CMSTF  GDUR        CLEAR *RESTORE IN PROGRESS* FROM *ACGL*
          CMSTF  GDRI        CLEAR *RESTORE INITIATION* FROM *ACGL* 
          LDD    EO          SET EST ORDINAL
          STD    CM+1 
          LDN    0
          STD    CM+2 
          LDN    SRCS        CLEAR REMAINING CYLINDERS / 100B IN *ACGL* 
          STD    CM+3 
          MONITOR  STBM 
 CFD10    LDN    0           CLEAR FLAG THAT SAYS THIS MF HAS INTERLOCK 
          STD    CM+2 
          LDN    25          BIT TO CHANGE
          RJM    UBP         UPDATE *BDLL* PARAMETER
  
*         CLEAR UNIT INTERLOCK. 
  
 CFD11    LDN    0           RELEASE UNIT INTERLOCK 
          STD    WB+4 
          LDC    4000 
          STD    WB+3 
          LDN    DCBS 
          RJM    IMR
*         LDN    0           CLEAR UNIT INTERLOCKED FLAG
          STM    RQLN,DI
          SOD    UC          ADJUST UNIT ACTIVITY COUNT 
          RJM    CMC         CHECK MONITOR COMPLETE 
 CFD12    LDD    EO 
          LJM    CFD2        PROCESS NEXT PARTITION 
 DHE      SPACE  4,10 
**        DHE - DETERMINE HIGHEST EST ORDINAL.
* 
*         ENTRY  (LNEA) = HIGHEST MASS STORAGE EST ORDINAL (+1).
* 
*         EXIT   (LNEA) = HIGHEST EST ORDINAL FOR THIS DRIVER (+1). 
* 
*         USES   DI.
* 
*         CALLS  LDP, LNE.
  
  
 DHE      SUBR               ENTRY/EXIT 
          LDC    DSTB 
          STD    DI 
 DHE1     RJM    LDP         LOAD DEVICE PARAMETERS 
          LDN    0           INITIALIZE PARTITION SEARCH
 DHE2     RJM    LNE         LOCATE NEXT EST ORDINAL
          ZJN    DHE4        IF NO MORE PARTITIONS
          SBM    DHEA 
          MJN    DHE3        IF NOT NEW HIGHEST EST ORDINAL 
          LDD    EO          SET HIGHEST EST ORDINAL
          STM    DHEA 
 DHE3     LDD    EO 
          UJN    DHE2        PROCESS NEXT PARTITION 
  
 DHE4     LDN    DSTBE       ADVANCE DEVICE STATE TABLE ADDRESS 
          RAD    DI 
          LMM    DASB 
          NJN    DHE1        IF NOT END OF DEVICE STATE TABLE 
          LDM    DHEA        SET HIGHEST EST ORDINAL FOR THIS DRIVER
          ADN    1
          STM    LNEA 
          UJN    DHEX        RETURN 
  
  
 DHEA     CON    0           HIGHEST EST ORDINAL FOR THIS DRIVER
 IST      SPACE  4,15 
**        IST - INITIALIZE DEVICE STATE TABLE.
* 
*         ENTRY  (PUTA - PUTA+1) = ADDRESS OF *PUT*.
*                (PUTN) = NUMBER OF *PUT* ENTRIES.
* 
*         USES   CI, DI, FC, T1, T2, T5, CM - CM+4, CW - CW+4,
*                WB - WB+4. 
* 
*         MACROS SFA. 
  
  
 IST11    LDD    DI          DEFINE END OF DEVICE STATE TABLE 
          STM    DASB 
  
 IST      SUBR               ENTRY/EXIT 
          LDC    CSTBL-1
          STDL   DI 
 IST1     LDN    0           CLEAR DEVICE AND CONTROLLER STATE TABLES 
          STI    DI 
          SOD    DI 
          LMC    DSTB 
          NJN    IST1        IF MORE TO CLEAR 
*         LDN    0
          STD    FC          UNITS NOT CHECKED FOR FORMAT REQUEST 
          STD    T5          INITIALIZE *PUT* ORDINAL 
  
*         PROCESS NEXT *PUT* ENTRY. 
  
 IST2     AOD    T5          CHECK NEXT *PUT* ENTRY 
          LMM    PUTN        NUMBER OF *PUT* ENTRIES
          ZJN    IST11       IF END OF PHYSICAL UNIT TABLE
          LDD    T5 
          SHN    PUTLS       CALCULATE *PUT* ADDRESS
          STD    T1 
          LDM    PUTA        FWA OF *PUT* 
          SHN    14 
          LMM    PUTA+1 
          ADD    T1 
          ADK    UNCT        GET UNIT CONTROL WORD
          CRD    WB 
          SFA    EST,WB+1    FETCH EST ENTRY
          ADK    EQDE 
          CRD    CM 
          ADK    EQAE-EQDE
          CRD    CW 
          LDD    CM+1        CHECK FIRST CHANNEL
          STD    T1 
          LMD    IR+4 
          LPN    77 
          ZJN    IST3        IF CHANNEL FOR THIS DRIVER 
          LDD    CM+2        CHECK SECOND CHANNEL 
          STD    T1 
          ZJN    IST2        IF SECOND CHANNEL NOT DEFINED
          LMD    IR+4 
          LPN    77 
          NJN    IST2        IF NOT CHANNEL FOR THIS DRIVER 
  
*         CREATE DEVICE STATE TABLE ENTRY FOR THIS DEVICE.
  
 IST3     LDD    T5          SET *PUT* ORDINAL IN STATE TABLE 
          STI    DI 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          LDD    T1 
          LPC    200         SET PORT NUMBER
          SHN    11-7 
          STM    PNUN,DI
          LDD    WB          GET EQUIPMENT AND UNIT NUMBERS 
          LPC    777
          RAM    PNUN,DI     APPEND TO PORT NUMBER
          LDN    EQNS        DETERMINE DEVICE TYPE
          STD    T1 
 IST4     SOD    T1          CHECK NEXT DEVICE MNEMONIC 
          LDM    DM,T1
          LMD    CM+3 
          NJN    IST4        IF DEVICE MNEMONIC DOES NOT MATCH
          LDD    T1          SET DEVICE TYPE INDEX
          LMC    1S13        SET *CHECK DRIVE TYPE* FLAG
          STML   DVTP,DI
          LDD    CM          CHECK FOR SHARED DEVICE
          LPC    1000 
          ZJN    IST5        IF NOT SHARED DEVICE 
          RAML   DVTP,DI     SET *MMF SHARED DEVICE* FLAG 
          LDML   DM,T1
          SHN    0-17        NONZERO IF PARITY DEVICE 
          SHN    12-0 
          RAML   DVTP,DI     SET *ENABLE MMF PARITY DEVICE ACCESS* FLAG 
 IST5     LDD    CW+3 
          SHN    0-13        NONZERO IF PARTITIONED DEVICE
          SHN    17-0 
          RAML   DVTP,DI     SET *PARTITIONED DEVICE* FLAG
  
*         FIND CONTROLLER STATE TABLE ENTRY FOR THIS DEVICE.
  
          LDN    0           INITIALIZE CONTROLLER STATE TABLE INDEX
          STD    T1 
 IST6     LDD    T1          CHECK NEXT CONTROLLER
          SHN    2
          ERRNZ  CSTBE-4     CODE DEPENDS ON VALUE
          ADC    CSTB 
          STD    CI          SET CONTROLLER STATE TABLE ADDRESS 
          LDML   CTST,CI
          NJN    IST7        IF CONTROLLER ALREADY IDENTIFIED 
          LDD    DI          SET *DSTB* ADDRESS OF FIRST DEVICE 
          LMC    1S14        SET *INITIAL RESET REQUIRED* FLAG
          STML   CTST,CI
          UJN    IST8        SET CONTROLLER STATE TABLE INDEX 
  
 IST7     LPC    7777        *DSTB* OF FIRST DEVICE ON CONTROLLER 
          STD    T2 
          LDM    PNUN,T2     COMPARE CONTROLLER AND PORT NUMBERS
          LMM    PNUN,DI
          SHN    -6 
          ZJN    IST8        IF SAME CONTROLLER AND PORT NUMBERS
          AOD    T1          CHECK NEXT CONTROLLER
          LMN    MXCN 
          NJN    IST6        IF NOT END OF CONTROLLER STATE TABLE 
          STI    DI          CLEAR DEVICE STATE TABLE ENTRY 
          ERRNZ  PUTO        CODE DEPENDS ON VALUE
          STM    PNUN,DI
          STM    DVTP,DI
          UJN    IST9        IGNORE DEVICE AND PROCESS NEXT *PUT* 
  
 IST8     LDD    T1          SET CONTROLLER STATE TABLE INDEX 
          SHN    14 
          RAML   PNUN,DI
          LDN    DSTBE       ADVANCE DEVICE STATE TABLE ADDRESS 
          RAD    DI 
          LMC    DSTBL
          ZJN    IST10       IF DEVICE STATE TABLE IS FULL
 IST9     LJM    IST2        PROCESS NEXT *PUT* ENTRY 
  
 IST10    LJM    IST11       DEFINE END OF DEVICE STATE TABLE 
 SMC      SPACE  4,10 
**        SMC - SET MMF CONSTANTS.
* 
*         PERFORM CODE MODIFICATION FOR MMF OPERATION.
* 
*         USES   CM - CM+4. 
* 
*         MACROS ISTORE.
  
  
 SMC      SUBR               ENTRY/EXIT 
          LDK    MMFL        GET MMF WORD 
          CRD    CM 
          LDD    CM          SET MAINFRAME ID 
          STM    BSTA 
          LDD    CM+1 
          SHN    21-11
          MJN    SMC1        IF SHARED BUFFERED DEVICES CONFIGURED
          ISTORE CRIA,(UJN CRIX)  DISABLE MMF SLAVE RESET INTERLOCK 
          ISTORE SRIA,(UJN SRIX)
          ISTORE CAAA,(UJN CAA8)  DISABLE CHECK FOR MMF PARITY RESTORE
          ISTORE CETA,(UJN CETX)
          UJN    SMCX        RESERVE CHANNEL
  
 SMC1     LDD    CM+3        SET MACHINE MASKS
          RAM    IPRB 
          LPN    77 
          RAM    CABA 
          LDD    CM+4        SET MACHINE INDEX
          RAM    CFDA 
          STM    CFDB 
          LDD    CM+4        MACHINE INDEX
          ADN    GPDA-1      *ACGL* BIT NUMBER
          LMC    LCNI 
          STM    DMPA 
          LMC    LDNI&LCNI
          STM    EMPA 
          UJP    SMCX        RETURN 
          SPACE  4,10 
*         CHECK FOR OVERFLOW. 
  
  
          ERRNG  17777-*-5   OVERFLOW PAST END OF PP
  
  
          QUAL   *
          TTL    1DA - DISK ARRAY SUBSYSTEM (DAS) DRIVER. 
  
  
          END 
