1XM 
          IDENT  1XM,MXM
 1XM      TITLE  1XM - 7165/895 (CCC) DRIVER. 
          PERIPH
          BASE   MIXED
          SST 
*COMMENT  1XM - 7165/895 (CCC) DRIVER.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 1XM      SPACE  4,15 
***       1XM - 7165/895 (CCC) DRIVER.
* 
*         G. S. ANDERSON.    04/30/84.
*         R. M. DANISCH.     02/01/86.
 1XM      SPACE  4,15 
***       *1XM* IS THE CYBER CHANNEL COUPLER (CCC) DRIVER FOR THE 
*         7165/895 DISK STORAGE SUBSYSTEM.
* 
*         THE 7165/895 DISK DRIVES ARE SUPPORTED AS BUFFERED I/O
*         DEVICES.  THE REQUESTS THAT ARE PROCESSED BY *1XM* ARE
*         POSTED BY *CPUMTR* IN THE BUFFERED I/O TABLES IN *CMR*. 
*         *1XM* INTERLOCKS THE UNITS, LINKS THE REQUESTS, AND COMPLETES 
*         THE REQUESTS BY ISSUING APPROPRIATE *BIOM* REQUESTS.
* 
*         EACH *1XM* MASTER/SLAVE PP PAIR WILL SUPPORT ONE CHANNEL AND
*         WILL BE THE SOLE DRIVER FOR THE *CCC* ON THAT CHANNEL.  *1XM* 
*         WILL BE CHECKING THE PHYSICAL UNIT TABLE (PUT) FOR REQUESTS 
*         ON UNITS THAT ARE SUPPORTED THROUGH THE *CCC* THAT *1XM* IS 
*         DRIVING.
* 
*         *1XM* SCANS THROUGH THE *PUT* ENTRIES IN A CIRCULAR FASHION 
*         LOOKING FOR REQUESTS TO PROCESS.  ONCE A REQUEST IS FOUND 
*         AND LINKED *1XM* USES THE PHYSICAL DISK AND UEM ADDRESSES IN
*         THE CORRESPONDING *CBT* ENTRY TO DETERMINE THE ACTION TO BE 
*         TAKEN.  *1XM* WILL ATTEMPT TO PROCESS CONSECUTIVE SECTOR
*         REQUESTS ON THE CURRENT UNIT UNTIL THE END OF THE CYLINDER
*         OR A CONSECUTIVE SECTOR REQUEST WAS NOT FOUND.  AT THIS 
*         POINT *1XM* WILL RESUME ITS SEARCH THROUGH THE *PUT* WITH THE 
*         *PUT* ENTRY IMMEDIATELY FOLLOWING THE ONE JUST PROCESSED. 
          EJECT 
***       CALLING SEQUENCE FOR MASTER AND SLAVE.
* 
*         MASTER PP COMMUNICATION AREA: 
* 
*         WORD 0       18/*1XM*, 6/CP, 6/CCTO, 6/0, 12/MAS, 12/CHAN 
*         WORD 1-7      USED FOR MONITOR REQUESTS 
* 
*         SLAVE PP COMMUNICATION AREA:  
* 
*         WORD 0        18/*1XM*,6/CP,12/SU,12/SL,12/CHAN 
*         WORD 1        NOT USED
*         WORD 2        12/REQU,12/0,12/LSB,24/UEM ADDR 
*         WORD 3        12/SEC,48/0 
*         WORD 4        12/MEF,48/0 
*         WORD 5        12/ROC,48/0 
*         WORD 6-7      NOT USED
* 
*         CCTO       *CCT* ORDINAL. 
*         MAS        DEFINES THE MASTER *1XM* DRIVER (0). 
*         CHAN       THE CHANNEL BEING DRIVEN BY THIS PP. 
*         SU         NON-ZERO WHEN THE SLAVE IS INITIALIZED.
*         SL         DEFINES THE SLAVE *1XM* DRIVER (1).
*         REQU       REQUEST FOR SLAVE TO PROCESS.
*                         1 = READ
*                         2 = WRITE 
*                         3 = DROP
*         LSB        LAST BLOCK OF SECTOR FLAG. 
*                         0 = LEAVE CHANNEL ACTIVE AFTER READ/WRITE.
*                         1 = DISCONNECT CHANNEL AFTER READ/WRITE.
*         UEM ADDR   UEM ADDRESS/100B TO READ/WRITE DATA FROM/TO. 
*         SEC        SLAVE ERROR CODE.  SET BY SLAVE.  CLEARED BY 
*                    MASTER.
*                         0 = NO ERROR ENCOUNTERED. 
*                         NON-ZERO = ACTUAL ERROR CODE OF SLAVE ERROR.
*         MEF        MASTER ERROR FLAG.  SET BY MASTER.  CLEARED BY 
*                    SLAVE. 
*                         0 = NO ERROR ENCOUNTERED. 
*                         1 = MASTER ENCOUNTERED AN ERROR.
*         ROC        READ OPERATION COMPLETE.  ALL DATA TRANSFERRED 
*                    TO UEM.  SET AND CLEARED BY SLAVE. 
          SPACE  4,10 
**        MESSAGES. 
* 
*         * 1XM - UNAUTHORIZED CALL.* 
*         ISSUED TO THE SYSTEM DAYFILE IF *1XM* WAS NOT CALLED FROM 
*         THE SYSTEM. 
          SPACE  4,10 
***       ERRLOG MESSAGES.
* 
*         *EQXXX,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.
          SPACE  4,10 
***       ORGANIZATION OF 7165/895 (MEASUREMENTS IN DECIMAL). 
* 
*         EQUIPMENT TYPE                    *DC*
* 
*         PHYSICAL ORGANIZATION:  
* 
*           CM WORDS/PHYSICAL SECTOR        2048
*           PHYSICAL SECTORS/PHYSICAL TRACK  3
*           PHYSICAL TRACKS/CYLINDER        15
*           CYLINDERS/DEVICE                885 * N (0<N<3) 
*           CM WORDS/DEVICE                 79,749,120 * N
* 
*         LOGICAL ORGANIZATION: 
* 
*           CM WORDS/LOGICAL SECTOR         64
*           LOGICAL SECTORS/PHYSICAL SECTOR 32
*           LOGICAL SECTORS/LOGICAL TRACK   704 * N 
*           LOGICAL TRACKS/CYLINDER         2 
*           LOGICAL TRACKS/DEVICE           1770
* 
*         MAXIMUM DATA RATE                 400.00 K CM WORDS/SECOND
          EJECT 
***       MASTER - SLAVE CONCEPTS.
* 
*         THE PHYSICAL SECTOR SIZE OF 32 LOGICAL SECTORS AND A
*         24 MEGABIT MAXIMUM TRANSFER RATE THAT MUST BE ACHIEVED
*         WHILE TRANSFERRING DATA THROUGH A PP, HAVE DICTATED THE 
*         NECESSITY FOR A MASTER(1XM)/SLAVE(2XM) PP SETUP.  THE 
*         MASTER IS INITIATED BY *STL* AT DEADSTART TIME AND THE
*         SLAVE IS STARTED UP BY THE MASTER ONCE THE MASTER HAS 
*         INITIALIZED ITSELF.  BOTH PROGRAMS WILL REMAIN IN A PP
*         UNTIL THE SYSTEM IS DEADSTARTED, THE CONTROLLER THEY ARE
*         FUNCTIONING IS NO LONGER OPERATIONAL, OR THE CHANNEL IS 
*         GLOBALLY DOWNED.
* 
*         THE PHYSICAL SECTOR IS TRANSFERRED IN FOUR BLOCKS (6+10+
*         6+10=32).  THE MASTER TRANSFERS THE TWO SHORT BLOCKS AND
*         THE SLAVE TRANSFERS THE TWO LARGE BLOCKS. 
* 
*         THE MASTER POSTS A REQUEST OR ERROR TO THE SLAVE
*         BY SETTING THE CORRESPONDING FIELD IN THE SLAVE-S COMMUNI-
*         CATION AREA NON-ZERO, AND THE SLAVE POSTS AN ERROR TO THE 
*         MASTER BY SETTING THE ERROR CODE FIELD NON-ZERO IN THE
*         SLAVE-S  COMMUNICATION AREA.  THE FOLLOWING STATE CHART 
*         SHOWS THE POSSIBLE STATES, THE POSSESSOR OF THE LOGICAL 
*         CHANNEL RESERVE, AND THE STATUS OF THE REQUEST AND ERROR
*         CODE FIELDS.
* 
*                                                SLAVE       MASTER 
*     STATE           CHANNEL  REQUEST FIELD  ERROR FIELD  ERROR FIELD
* --------------------------------------------------------------------
* MASTER IDLE        !        !              !            !          !
* SLAVE IDLE         ! MASTER !     ZERO     !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
* MASTER BEGIN I/O   !        !              !            !          !
* SLAVE IDLE         ! MASTER ! NEXT REQUEST !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
* MASTER TO/FROM UEM !        !              !            !          !
* SLAVE TO/FROM DISK ! SLAVE  !     ZERO     !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
* MASTER TO/FROM DISK!        !              !            !          !
* SLAVE TO/FROM UEM  ! MASTER ! NEXT REQUEST !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
* MASTER END I/O     !        !              !            !          !
* SLAVE TO/FROM DISK ! SLAVE  !     ZERO     !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
* MASTER TO/FROM UEM !        !              !            !          !
* SLAVE ERROR        ! SLAVE  !     ZERO     ! ERROR CODE !   ZERO   !
* --------------------------------------------------------------------
* MASTER LOG ERROR   !        !              !            !          !
* SLAVE IDLE         ! MASTER !     ZERO     !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
* MASTER ERROR       !        !              !            !          !
* SLAVE WAIT CHANNEL ! MASTER !     ZERO     !    ZERO    !ERROR FLAG!
* --------------------------------------------------------------------
* MASTER WAIT CHANNEL!        !              !            !          !
* SLAVE CLEAR ERROR  ! SLAVE  !     ZERO     !    ZERO    !   ZERO   !
* --------------------------------------------------------------------
          EJECT 
***       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)  *1XM*, *1XY* AND *1HP* ARE VERY SIMILAR IN DESIGN.  MOST
*             FIXES APPLIED TO ONE OF THESE DRIVERS WILL ALSO APPLY TO
*             THE OTHERS. 
* 
*         2)  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. 
* 
*         3)  *1XM* ASSUMES THAT ONLY 70 MICROSECONDS CAN BE USED 
*             TO PERFORM ALL THE CHANNEL PASSING (FROM THE TIME THE 
*             READ/WRITE FUNCTION IS ISSUED UNTIL THE LAST PART OF THE
*             SECTOR IS BEING READ/WRITTEN).
* 
*         4)  THIS DRIVER ALSO ASSUMES THAT THE TRANSFER RATE TO/FROM 
*             CENTRAL MEMORY IS TWICE AS FAST AS THE TRANSFER RATE
*             TO/FROM THE *CCC*.  USING THIS ASSUMPTION THE MASTER HAS
*             APPROXIMATELY 500 MICROSECONDS (ON A 4XPP) TO PERFORM 
*             ITS INNER BLOCK FUNCTIONS.
* 
*         5)  THE DRIVER HAS APPROXIMATELY 70 MICROSECONDS TO 
*             PERFORM THE NECESSARY INTER-SECTOR CALCULATIONS.
*             THE INTER-SECTOR GAP IS THE TIME FROM WHEN THE SLAVE
*             COMPLETES THE READ/WRITE FROM/TO DISK UNTIL THE 
*             MASTER ISSUES THE NEXT READ/WRITE FUNCTION. 
*             (ON PHYSICAL TRACK SWITCHES THE DRIVER HAS 300
*             MICROSECONDS).
* 
*         6)  THE SLAVE MUST CHECK FOR A REQUEST EVERY 60 MICROSECONDS
*             TO MAKE SURE IT HAS TIME TO READ FROM UEM IN THE CASE 
*             OF A WRITE TO DISK. 
* 
*         7)  ALTHOUGH CODE CAN BE ADDED WITHOUT EXCEEDING A TIMING 
*             THRESHOLD, ONE SHOULD NOTE THAT THE CODE COULD AFFECT 
*             *1XM-S* TOLERANCE FOR CENTRAL MEMORY CONFLICTS. 
* 
*         8)  BECAUSE *1XM* ISSUES ALL *BIOM* COMPLETION REQUESTS 
*             WITHOUT WAITING FOR FUNCTION COMPLETION, THE *MONITOR*
*             MACRO HAS BEEN REDEFINED TO ENSURE THERE IS NO PENDING
*             MONITOR REQUEST AT THE TIME ANOTHER IS ABOUT TO BE
*             ISSUED. 
          EJECT 
  
*         COMMON DECKS. 
  
  
*CALL     COMPMAC 
 RICHI$   EQU    1           SELECT DEFERRED INSTRUCTION MODIFICATION 
*CALL     COMPCHI 
*CALL     COMSCPS 
*CALL     COMSDFS 
          LIST   X
*CALL     COMSHIO 
          LIST   *
*CALL     COMSLSD 
*CALL     COMSMSC 
          LIST   X
*CALL     COMSMSP 
          LIST   *
*CALL     COMSPIM 
*CALL     COMS1DS 
          TITLE  CONSTANTS, DEFINITIONS, AND MACROS.
 1XM      SPACE  4,10 
****      DIRECT CELL ASSIGNMENTS.
  
  
 BS       EQU    15          BLOCK SIZE FOR DATA TRANSFER 
 RS       EQU    16          ERROR RECOVERY STATUS
 ER       EQU    17          ERROR RECOVERY IN PROGRESS 
 CC       EQU    20          COMPLETION COUNT 
 S1       EQU    21          SCRATCH
 EC       EQU    22          ERROR CODE 
 RW       EQU    23          READ/WRITE FLAG
 IL       EQU    24          *PUT* INTERLOCK FLAG 
 SR       EQU    25 - 31     SLAVE REQUEST (5 CELLS)
 WB       EQU    SR - SR+4   FOR *COMPIMB* COMPATIBILITY
 BL       EQU    32          DATA BLOCK LENGTH
 CN       EQU    33 - 37     SCRATCH (5 CELLS)
 SB       EQU    40          SLAVE BUFFER ADDRESS 
 FU       EQU    41 - 42     UEM FWA (2 CELLS)
 UA       EQU    43 - 44     UEM ADDRESS (2 CELLS)
 EP       EQU    45          ERROR ON PREVIOUS SECTOR 
 CS       EQU    46          CHANNEL STATUS 
 NB       EQU    47          NEXT BUFFER ORDINAL
 PB       EQU    50          PREVIOUS BUFFER ORDINAL
 CB       EQU    51          CURRENT BUFFER ORDINAL 
 TB       EQU    52          TOTAL CBT COUNT
 GS       EQU    53          GENERAL STATUS 
*         EQU    54          CHANNEL NUMBER (FROM INPUT REGISTER) 
 TI       EQU    57          *TPOR* INDEX 
 CA       EQU    60 - 64     CURRENT PHYSICAL ADDRESS (5 CELLS) 
 RC       EQU    65          RETRY COUNT
 PO       EQU    66          CURRENT *PUT* ORDINAL
 S2       EQU    67          SCRATCH
 1XM      SPACE  4,10 
**        DRIVER FUNCTION CODES.
  
  
 FCSK     EQU    1           SEEK 1 TO 1 INTERLACE
 FCRD     EQU    4           READ 
 FCWR     EQU    5           WRITE
 FCOC     EQU    10          OPERATION COMPLETE 
 FCGS     EQU    12          GENERAL STATUS 
 FCCO     EQU    14          CONTINUE 
 FCDS     EQU    23          DETAILED STATUS
 FCAL     EQU    414         AUTOLOAD 
 1XM      SPACE  4,10 
          SPACE  4,15 
**        DETAILED STATUS CONSTANTS.
  
  
 SB0      EQU    0           SENSE BYTE 0 
 SB7      EQU    4           SENSE BYTE 7 STATUS WORD OFFSET
 DCF      EQU    1           DEVICE CHECK FORMAT
 FM6      EQU    6           FORMAT 6 MESSAGE 
          SPACE  4,15 
**        ASSEMBLY CONSTANTS. 
  
  
 BFRL     EQU    10          *EMB* FLUSH RETRY LIMIT
 CH       EQU    0           MASS STORAGE CHANNEL 
 FCSKL    EQU    4           SEEK PARAMETER WORD COUNT
 HLEN     EQU    4*5         LENGTH OF SECTOR HEADER
 MAXU     EQU    64D         MAXIMUM NUMBER OF UNITS PER CHANNEL
 MFRL     EQU    10          MONITOR FUNCTION RETRY LIMIT 
 MPRU     EQU    6           NUMBER OF PRUS TRANSFERRED BY MASTER 
 MMXN     EQU    10D         MAXIMUM NUMBER OF EXCHANGE RETRIES 
 DLEN     EQU    MPRU*100*5  LENGTH OF DATA TRANSFERRED BY MASTER 
 PCRL     EQU    10          PP CALL RETRY LIMIT
 PSLT     EQU    26          PHYSICAL SECTORS PER LOGICAL TRACK 
 PSPT     EQU    3           PHYSICAL SECTORS PER PHYSICAL TRACK
 SBME     EQU    2           MASTER ERROR WORD IN SLAVE REQUEST BUFFER
 SBRC     EQU    3           READ COMPLETE WORD IN SLAVE REQUEST BUFFER 
 SBRQ     EQU    0           REQUEST WORD IN SLAVE REQUEST BUFFER 
 SBSE     EQU    1           SLAVE ERROR WORD IN SLAVE REQUEST BUFFER 
 SDLY     EQU    50D         SLAVE DELAY TIME (APPROX. 25 MICS) 
 SDRP     EQU    3           SLAVE REQUEST TO DROP
 SLRD     EQU    1           SLAVE REQUEST TO READ
 SLWR     EQU    2           SLAVE REQUEST TO WRITE 
 SPRU     EQU    12          PRUS TRANSFERRED BY SLAVE
 SSIZ     EQU    1000        SECTOR SIZE FLAG FOR SEEK
 TPORE    EQU    1           LENGTH OF *TPOR* ENTRY 
****
          SPACE  4,20 
**        MACROS. 
 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 
          CON    A
          RMT 
 TBLM     ENDM
 CBTE     SPACE  4,10 
**        CBTE - CONTROL BUFFER TABLE ENTRY.
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TCBT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE CONTROL BUFFER TABLE. 
* 
*         CBTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TCBT*. 
  
  
 CBT      TBLM
 CCBA     SPACE  4,15 
**        CCBA - COMPUTE *CBT* ENTRY ADDRESS. 
* 
*         THIS MACRO SETS (A) TO THE REQUESTED *CBT* ENTRY ADDRESS. 
* 
*         CCBA   W,A
* 
*                *W* - OPTIONAL WORD OFFSET TO BE ADDED TO ADDRESS. 
*                *A* - IF NON-BLANK, BUFFER ORDINAL IS IN ACCUMULATOR.
* 
*         ENTRY  (A) = BUFFER ORDINAL IF *A* PARAMETER IS NON-BLANK.
*                (CB) = CURRENT BUFFER ORDINAL. 
* 
*         EXIT   (A) = *CBT* ENTRY ADDRESS + WORD OFFSET. 
  
  
          PURGMAC  CCBA 
  
 CCBA     MACRO  W,A
          MACREF CCBA 
          IFC    EQ,$A$$,1
          LDD    CB 
          SHN    CBTLS
          CBTE   *
          ADC    W
 CCBA     ENDM
 PUTE     SPACE  4,10 
**        PUTE - PHYSICAL UNIT TABLE ENTRY. 
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TPUT* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE PHYSICAL UNIT TABLE.
* 
*         PUTE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TPUT*. 
  
  
 PUT      TBLM
 CPTA     SPACE  4,10 
**        CPTA - COMPUTE *PUT* ENTRY ADDRESS. 
* 
*         THIS MACRO SETS (A) TO THE REQUESTED *PUT* ENTRY ADDRESS. 
* 
*         CPTA   W,A
* 
*                *W* - OPTIONAL WORD OFFSET TO BE ADDED TO ADDRESS. 
*                *A* - IF NON-BLANK, *PUT* ORDINAL IS IN ACCUMULATOR. 
* 
*         ENTRY  (A) = *PUT* ORDINAL IF *A* PARAMETER IS NON-BLANK. 
*                (PO) = *PUT* ORDINAL.
* 
*         EXIT   (A) = *PUT* ENTRY ADDRESS + WORD OFFSET. 
  
  
          PURGMAC  CPTA 
  
 CPTA     MACRO  W,A
          MACREF CPTA 
          IFC    EQ,$A$$,1
          LDD    PO 
          SHN    PUTLS
          PUTE   *
          ADC    W
 CPTA     ENDM
 EMBE     SPACE  4,10 
**        EMBE - ERROR MESSAGE TABLE ENTRY. 
* 
*         THIS MACRO GENERATES AN ENTRY IN REMOTE LIST *TEMB* 
*         THAT CONTAINS THE ADDRESS OF AN INSTRUCTION WHICH 
*         REQUIRES THE FWA OF THE ERROR MESSAGE TABLE.
* 
*         EMBE   ADDR 
* 
*         ENTRY  (ADDR) = ADDRESS OF INSTRUCTION. 
* 
*         EXIT   ADDRESS IS ADDED TO THE REMOTE BLOCK *TEMB*. 
  
  
 EMB      TBLM
 MONITOR  SPACE  4,15 
**        MONITOR - ISSUE MONITOR FUNCTION. 
* 
*         THIS MACRO PROVIDES FUNCTIONALITY IDENTICAL TO THAT OF THE
*         *MONITOR* MACRO DEFINED IN *COMPMAC*, WHILE ENSURING ANY
*         PENDING *BIOM* MONITOR FUNCTION IS COMPLETED BEFORE THE NEXT
*         MONITOR FUNCTION IS ISSUED. 
* 
*         MONITOR  F
* 
*                  *F* - MONITOR FUNCTION CODE. 
* 
*         EXIT   (A) = 0. 
*                (CM - CM+4) = COMPLETED PP OUTPUT REGISTER IMAGE.
* 
*         CALLS  IMF. 
  
  
          PURGMAC  MONITOR
  
 MONITOR  MACRO  F
          MACREF MONITOR
          LDK    F
          RJM    IMF
 MONITOR  ENDM
 1XM      SPACE  4
          RICHI              REDEFINE CHANNEL INSTRUCTIONS
          TITLE  MASTER DRIVER. 
**        MXM - 895 DRIVER. 
  
  
          ORG    MSFW+5 
 MXM      RJM    PRS         PRESET 
 MXM      SPACE  4
**        MST - MASTER MAIN PROGRAM.
  
  
 MST      RJM    CCR         CHECK FOR CHANNEL REQUESTED/DOWN 
          MJN    MST1        IF CHANNEL GLOBALLY DOWN 
          RJM    SUQ         SCAN UNIT QUEUE
          ZJN    MST         IF NO ELIGIBLE ENTRY FOUND 
          RJM    ISF         ISSUE SEEK FUNCTION
          NJN    MST         IF UNIT NOT ON CYLINDER
          RJM    PDT         PERFORM DATA TRANSFER
          UJN    MST         LOOP 
  
 MST1     RJM    DCH         RELEASE CHANNEL
          MONITOR  DPPM      DROP PP
          LJM    PPR         ENTER IDLE LOOP
 TPOR     SPACE  4,10 
**        TPOR - TABLE OF *PUT* ORDINALS. 
* 
*         THIS TABLE CONTAINS THE ORDINALS OF THE *PUT* ENTRIES FOR ALL 
*         UNITS ACCESSED BY THIS DRIVER-S CHANNEL.
* 
*         ENTRY = 1 WORD. 
* 
*T        11/ PUT ,1/I
*         PUT    *PUT* ORDINAL OF DEVICE. 
*         I      EST CHANNEL BYTE INDEX.
* 
*         TABLE IS TERMINATED BY A ZERO BYTE. 
  
  
 TPOR     BSSZ   TPORE*MAXU 
          CON    0           TERMINATE *TPOR* TABLE 
 AUA      SPACE  4,15 
**        AUA - ADVANCE UEM ADDRESS.
* 
*         ENTRY  (BS) = LENGTH OF DATA BLOCK AND HEADER.
*                (RW) = READ/WRITE FLAG.
*                (SR+3 - SR+4) = CURRENT UEM ADDRESS FOR SLAVE. 
*                (UA - UA+1) = CURRENT UEM ADDRESS FOR MASTER.
* 
*         EXIT   (BS) = LENGTH OF DATA BLOCK WITHOUT HEADER.
*                (SR+3 - SR+4) = UEM ADDRESS FOR NEXT PART OF SECTOR
*                                FOR USE BY SLAVE.
*                (UA - UA+1) = UEM ADDRESS FOR NEXT PART OF SECTOR FOR
*                              USE BY MASTER. 
* 
  
*         USES   BS, T1, SR+3 - SR+4, UA - UA+1.
  
  
 AUA      SUBR               ENTRY/EXIT 
          LDK    SPRU+MPRU   ADVANCE MASTER UEM ADDRESS 
          RAD    UA+1 
          SHN    -14
          RAD    UA 
          LDK    MPRU        ADVANCE SLAVE UEM ADDRESS
          ADD    UA+1 
          STD    SR+4 
          SHN    -14
          ADD    UA 
          STD    SR+3 
          LCN    HLEN        EXCLUDE HEADER FROM BLOCK LENGTH 
          RAD    BS 
          LDM    AUAA,RW     ADJUST BUFFER ADDRESS
          STD    T1 
          LDN    HLEN 
          RAI    T1 
          UJN    AUAX        RETURN 
  
 AUAA     CON    RIOB 
          CON    WIOB 
 CCR      SPACE  4,20 
**        CCR - CHECK FOR CHANNEL REQUESTED OR DOWN.
* 
*         THIS ROUTINE CHECKS TO SEE IF THE CHANNEL TO WHICH THIS PP IS 
*         DEDICATED IS BEING REQUESTED BY ANOTHER PP OR IS GLOBALLY 
*         DOWN.  IF THE CHANNEL IS REQUESTED BY ANOTHER PP, IT WILL BE
*         RELEASED AND WILL BE REQUESTED AGAIN FOLLOWING A ONE SECOND 
*         DELAY.  IF THE CHANNEL IS GLOBALLY DOWN, THE DRIVER DROP FLAG 
*         WILL BE SET IN THE CONTROLWARE TABLE AND THE CHANNEL WILL BE
*         RELEASED. 
* 
*         ENTRY  (SB) = SLAVE MESSAGE BUFFER ADDRESS. 
* 
*         EXIT   (A) .LT. 0 IF CHANNEL IS GLOBALLY DOWN.
* 
*         USES   SR, CM - CM+4. 
* 
*         CALLS  DCH, RCH, SCD. 
* 
*         MACROS DELAY. 
  
  
 CCR2     RJM    SCD         SET DRIVER DROP FLAG 
          LDN    3           ISSUE DROP REQUEST TO SLAVE
          STD    SR 
          LDD    SB 
          ADK    SBRQ 
          CWD    SR 
          LCN    0           SET DROPOUT REPLY
  
 CCR      SUBR               ENTRY/EXIT 
          LDC    **          READ CHANNEL TABLE 
 CCRA     EQU    *-1         (CM ADDRESS OF ENTRY)
          CRD    CM 
          LDD    CM+**       CHECK REQUESTED FLAG 
 CCRB     EQU    *-1         (BYTE ADDRESS OF ENTRY)
          SHN    21-5 
          MJN    CCR2        IF CHANNEL IS GLOBALLY DOWN
          SHN    22+5-13
          PJN    CCRX        IF CHANNEL NOT REQUESTED 
          RJM    DCH         RELEASE CHANNEL
 CCR1     DELAY 
          RJM    RCH         REQUEST CHANNEL
          ZJN    CCR1        IF CHANNEL NOT ASSIGNED
          UJN    CCRX        RETURN 
 CCS      SPACE  4,15 
**        CCS - CHECK FOR CONSECUTIVE SECTOR REQUEST. 
* 
*         THIS ROUTINE CHECKS THE NEXT BUFFER IN THE I/O QUEUE TO 
*         DETERMINE IF IT IS CONSECUTIVE WITH THE REQUEST CURRENTLY 
*         BEING PROCESSED.
* 
*         ENTRY  (CB) = CURRENT BUFFER ORDINAL. 
*                (NB) = NEXT BUFFER ORDINAL IF CONSECUTIVE REQUEST
*                       ALREADY FOUND.
*                (RW) = READ/WRITE FLAG.
*                (TB) = TOTAL BUFFER COUNT. 
* 
*         EXIT   (NB) = NEXT BUFFER ORDINAL.
*                    = 0 IF CONSECUTIVE TRANSFER NOT POSSIBLE.
*                (TB) = TOTAL BUFFER COUNT. 
* 
*         USES   NB, TB, CM - CM+4, CN - CN+4, TO - TO+4. 
* 
*         MACROS CCBA.
  
  
 CCS3     LDN    0           INDICATE NO CONSECUTIVE REQUEST
          STD    NB 
  
 CCS      SUBR               ENTRY/EXIT 
          LDD    NB 
          NJN    CCSX        IF NEXT REQUEST ALREADY FOUND
          CCBA   PAD4        READ CURRENT *CBT* ENTRY 
          CRD    CM 
          ADK    IOLK-PAD4
          CRD    CN 
          LDD    CN+2        NEXT BUFFER ORDINAL
          ZJN    CCSX        IF THIS BUFFER IS LAST IN QUEUE
          STD    NB          STORE NEW CURRENT BUFFER ORDINAL 
          CCBA   PAD1,A      GET DISK ADDRESS FOR THIS BUFFER 
          CRD    CN 
          ADK    IOLK-PAD1   GET WRITE FLAG 
          CRD    T0 
          LDD    T0 
          SHN    0-11 
          LPN    1
          LMD    RW 
          NJN    CCS3        IF TRANSFER NOT IN SAME DIRECTION
          LDD    CM+1 
          LMD    CN+1 
 CCS1     NJN    CCS3        IF NO CYLINDER MATCH 
          LDD    CM+2 
          ADN    1
          LMD    CN+2 
          ZJN    CCS2        IF CONSECUTIVE SECTOR NOT ON SAME TRACK
          LDD    CM+2 
          ADD    HN 
          SCN    77 
          LMD    CN+2 
          NJN    CCS1        IF NOT FIRST SECTOR OF CONSECUTIVE TRACK 
          LDD    CM+2 
          LPN    77 
          LMN    PSPT-1 
          NJN    CCS1        IF CONSECUTIVE REQUEST 
 CCS2     AOD    TB          INCREMENT TOTAL BUFFER COUNT 
          LJM    CCSX        RETURN 
 CDS      SPACE  4,20 
**        CDS - CRACK DETAILED STATUS.
* 
*         THIS ROUTINE DETERMINES WHAT ERROR CODE TO SET BY EXAMINING 
*         DETAILED STATUS.
* 
*         ENTRY  (GS) = GENERAL STATUS. 
*                (RW) = READ/WRITE FLAG.
* 
*         USES   EC, RS, T1.
* 
*         CALLS  FNC, GDS, GGS. 
  
  
 CDS      SUBR               ENTRY/EXIT 
          RJM    GDS         GET DETAILED STATUS
          MJN    CDSX        IF ERROR 
          LDD    GS 
          SHN    21-10
          PJN    CDS1        IF ERROR NOT RECOVERABLE BY SUBSYSTEM
          LDM    CDSA,RW     PREPARE FOR *CONTINUE* SEQUENCE
          STD    T1 
          LDC    LDNI+FCCO
          STI    T1 
          LCN    1           INDICATE CONTROLLER RECOVERY IN PROGRESS 
          STD    RS 
          UJN    CDS1.1      SET STATUS ERROR CODE
  
 CDS1     SHN    10-13+22 
          MJN    CDS2        IF ABNORMAL TERMINATION
          LDD    EC 
          NJN    CDSX        IF ERROR CODE ALREADY SET
 CDS1.1   UJN    CDS4        SET STATUS ERROR CODE
  
*         CHECK FOR *NOT READY* CONDITION.
  
 CDS2     SHN    13-4 
          PJN    CDS3        IF NOT *NOT READY* 
          LDM    DST+SB0
          SHN    0-12 
          LPN    1
          LMN    1
          ZJN    CDS5        IF DRIVE NOT READY 
  
*         CHECK FOR STATISTICAL MESSAGE.  THIS IS NOT A TRUE ERROR
*         CONDITION.
  
          LDM    DST+SB7
          LPN    17 
          LMN    FM6
          ZJN    CDS5.1      IF FORMAT 6 MESSAGE
  
*         CHECK FOR MEDIA ERROR.
  
 CDS3     LDM    DST
          LPC    210
          LMC    210
          ZJN    CDS6        IF MEDIA ERROR 
          LDM    DST+21 
          SHN    21-6 
          MJN    CDS8        IF CHANNEL PARITY ERROR ON OUTPUT
          SHN    6-2
          MJN    CDS9        IF DATA TRANSFER ERROR 
          SHN    2-21+22
          LPN    50 
          NJN    CDS10       IF ADAPTOR MEMORY PARITY ERROR 
 CDS4     LDK    DSTE&NRDE
 CDS5     LMK    NRDE&STAE
 CDS5.1   LMK    STAE&PARE
 CDS6     LMK    PARE 
 CDS7     STD    EC 
          LJM    CDSX        RETURN 
  
 CDS8     LDN    CHPE        SET *CHANNEL PARITY* ERROR CODE
          UJN    CDS7        SET ERROR CODE 
  
 CDS9     LDN    IDTE        SET *DATA TRANSFER* ERROR CODE 
          UJN    CDS7        SET ERROR CODE 
  
 CDS10    LDN    RAME        SET *CONTROLLER MEMORY* ERROR CODE 
          UJN    CDS7        SET ERROR CODE 
  
  
 CDSA     BSS    0
          CON    RIOA 
          CON    WIOA 
 CRL      SPACE  4,15 
**        CRL - CHECK FOR ERROR RETRY LIMIT REACHED.
* 
*         ENTRY  (EC) = ERROR CODE. 
*                (ER) = *RECOVERY IN PROGRESS* FLAG.
*                (RC) = RETRY COUNT.
*                (T5) = EST ORDINAL.
* 
*         EXIT   (A) .GE. 0 IF RETRY LIMIT REACHED. 
*                    .LT. 0 IF NOT AT RETRY LIMIT.
*                (RC) INCREMENTED.
*                MESSAGE ISSUED TO *MS2W* OF SYSTEM CONTROL POINT FOR 
*                B-DISPLAY PRESENTATION IF HALF WAY TO RETRY LIMIT. 
* 
*         USES   RC.
* 
*         CALLS  C2D. 
  
  
 CRL      SUBR               ENTRY/EXIT 
          LDD    ER 
          LMC    SHNI+1 
          STM    CRLA 
          AOD    RC          INCREMENT RETRY COUNT
          LDM    TREC,EC
          SHN    -1 
          SBD    RC 
          PJN    CRL1        IF TOO EARLY TO NOTIFY OPERATOR
          LDD    T5          STORE EST ORDINAL IN MESSAGE 
          SHN    -3 
          RJM    C2D
          STM    CRLB+1 
          LDD    T5 
          LPN    7
          SHN    6
          ADC    2R0
          STM    CRLB+2 
          LDM    TMNE,EC     STORE ERROR MNEMONIC IN MESSAGE
          STM    CRLB+3 
          LDD    CP 
          ADK    MS2W 
          CWM    CRLB,TR
 CRL1     LDD    RC 
  
*         IF *RECOVERY IN PROGRESS* IS NOT SET, THE RETRY COUNT IS
*         SHIFTED SO THAT THE LIMIT CHECK IS MADE AGAINST N/2 (WHERE N
*         IS THE RETRY LIMIT FOR THE ERROR TYPE IN CELL *EC*).  THIS
*         CAUSES HALF OF THE RETRY ATTEMPTS TO BE PERFORMED ON EACH 
*         CHANNEL, IF AN ALTERNATE ACCESS IS AVAILABLE.  IF NO
*         ALTERNATE ACCESS IS AVAILABLE, ALL RETRIES WILL BE PERFORMED
*         ON THIS CHANNEL.
  
          SHN    0
*         SHN    1           (RECOVERY NOT IN PROGRESS) 
 CRLA     EQU    *-1
          SBM    TREC,EC
          SBN    2
          UJP    CRLX        RETURN 
  
  
 CRLB     DATA   C*EQ000 XX ERROR RETRY UNDERWAY.*
 CRQ      SPACE  4,20 
**        CRQ - CHECK REQUEST QUEUE.
* 
*         THIS ROUTINE ATTEMPTS TO CALL *CPUMTR* TO COMPLETE REQUESTS 
*         IN THE UNIT QUEUE THAT HAVE ALREADY BEEN PROCESSED. 
* 
*         ENTRY  (CC) = COMPLETION REQUEST COUNT. 
*                (PO) = *PUT* ORDINAL.
* 
*         EXIT   (A) .EQ. 0 IF NO REQUESTS PRESENT. 
*                    .NE. 0 IF *CPUMTR* IS STILL BUSY WITH PREVIOUS 
*                           FUNCTION OR AN EXCHANGE WAS JUST ISSUED 
*                           FOR THE CURRENT FUNCTION. 
* 
*         USES   CC, CN - CN+4, T0 - T4.
  
  
 CRQ      SUBR               ENTRY/EXIT 
          LDC    **          READ XP
 CRQA     EQU    *-1         FWA OF XP
          CRD    T0 
          LDD    OA          READ OUTPUT REGISTER 
          CRD    CN 
          LDD    T0+4        (B0) 
          NJN    CRQ1        IF MISSED EXCHANGE 
          STD    CN+3 
          LDD    CN 
          SHN    21-13
          MJN    CRQ1        IF REISSUE REQUIRED
          NJN    CRQX        IF FUNCTION BEING PROCESSED
          LDD    CC 
          ZJN    CRQX        IF NO PENDING COMPLETION REQUESTS
          LDC    ** 
 CRQE     EQU    *-1
          CRD    T0 
          LDD    T0 
          ADD    T0+1 
          NJN    CRQX        IF FUNCTION IN PROGRESS
          LDN    DCBS        SET *BIOM* SUBFUNCTION 
          STD    CN+1 
          LDD    PO 
          STD    CN+2 
 CRQ1     LDD    CC 
          RAD    CN+3 
          LDN    0
          STD    CC 
          LDK    BIOM 
          STD    CN 
          LDD    OA 
          CWD    CN 
          LDC    ** 
 CRQB     EQU    *-1         ADDRESS OF EXCHANGE PACKAGE
          CWM    CRQD,ON     WRITE FIRST WORD 
          SBN    1           SET EXCHANGE ADDRESS 
          MXN    0           EXCHANGE CPU 
 CRQC     EQU    *-1         CPU NUMBER 
          UJP    CRQX        RETURN 
  
  
 CRQD     VFD    24/0        (P)
          VFD    18/0        (A0) 
          VFD    18/0        (B0) 
 DCH      SPACE  4,15 
**        DCH - RELEASE CHANNEL.
* 
*         THIS ROUTINE RELEASES THE CHANNEL IF IT IS CURRENTLY
*         RESERVED. 
* 
*         ENTRY  (CS) = CHANNEL RESERVATION STATUS. 
*                (IR+4) = CHANNEL NUMBER. 
* 
*         EXIT   (A) = (CS) = 0.
* 
*         USES   CM+1, CS.
* 
*         MACROS MONITOR. 
  
  
 DCH      SUBR               ENTRY/EXIT 
          LDD    CS 
          LPN    1
          ZJN    DCHX        IF CHANNEL NOT RESERVED
          LDD    IR+4        RELEASE CHANNEL
          STD    CM+1 
          MONITOR  DCHM 
          SOD    CS          CLEAR CHANNEL RESERVATION FLAG 
          UJN    DCHX        RETURN 
 ERR      SPACE  4,20 
**        ERR - PROCESS ERROR.
* 
*         THIS ROUTINE IS CALLED TO PERFORM ALL ERROR PROCESSING. 
* 
*         ENTRY  (EC) = 0 IF THIS IS THE FIRST RETRY OF A RECOVERY
*                       SEQUENCE AND THE CALLER DID NOT SET THE ERROR 
*                       CODE. 
*                     = ERROR CODE IF NOT THE FIRST RETRY OF A RECOVERY 
*                       SEQUENCE AND NOT A CALLER SPECIFIED ERROR CODE. 
*                     = COMPLEMENT OF ERROR CODE IF SPECIFIED BY THE
*                       CALLER. 
*                (RC) = RETRY COUNT.
* 
*         EXIT   (EC) = 0.
*                (RC) = 0.
*                TO *MST*.
* 
*         USES   EC, RC, RS, T1.
* 
*         CALLS  CDS, CRL, CRQ, GGS, IBM, IIC, ISF, PDT, PFR, 
*                PRE, RLC, SSF, TEP.
  
  
 ERR      SUBR               ENTRY
 ERR1     RJM    PRE         PRESET ERROR PROCESSOR 
          NJP    ERR11       IF INTERLOCK/VERIFICATION FAILURE
          RJM    GGS         GET GENERAL STATUS 
          MJN    ERR1.1      IF GENERAL STATUS UNAVAILABLE
          RJM    CDS         CHECK DETAILED STATUS
 ERR1.1   LDD    RC 
          ZJN    ERR1.2      IF FIRST RETRY 
          LDD    ER 
          ZJN    ERR2        IF NOT RECOVERY IN PROGRESS
          AOM    ERRA 
          LMN    2
          NJN    ERR2        IF NOT FIRST *ERR* CALL
 ERR1.2   LDD    GS 
          STM    BMLGS
 ERR2     LCN    0
          LMD    EC 
          STD    EC 
          SHN    21-13
          MJN    ERR2        IF COMPLEMENTED ERROR CODE 
          LDD    TH          FORCE IMMEDIATE COMPLETION 
          ERRNZ  SHNI-1000   CODE DEPENDS ON VALUE
          STM    IICA 
          RJM    IIC         ISSUE I/O COMPLETION REQUEST 
 ERR4.1   RJM    CRQ         ENSURE COMPLETION OF PENDING REQUEST 
          NJN    ERR4.1      IF FUNCTION STILL PENDING
          RJM    IBM         ISSUE BML MESSAGE IF NECESSARY 
          AOD    RS          INCREMENT RECOVERY STATUS
          SHN    21-13
          MJN    ERR10       IF *CCC* ERROR RECOVERY IN PROGRESS
  
*         SET THE SUSPECT FLAG IF APPROPRIATE FOR THIS ERROR TYPE.
  
          LDK    STAE 
          LMD    EC 
          ZJN    ERR7        IF STATISTICAL DATA (NOT AN ERROR) 
          RJM    SSF         SET SUSPECT FLAG (IF APPROPRIATE)
          RJM    CRL         CHECK FOR RETRY LIMIT REACHED
          MJN    ERR7        IF RETRY LIMIT NOT REACHED 
          SOD    RC          ADJUST FINAL RETRY COUNT 
 ERR6     AOD    RS          SET RECOVERY STATUS
          UJN    ERR11       TERMINATE ERROR PROCESSING 
  
*         CHECK FOR CONTROLWARE RELOAD. 
  
 ERR7     RJM    RHR         RELEASE HARDWARE RESERVE 
          RJM    RLC         LOAD CONTROLWARE IF NECESSARY
  
*         RETRY I/O SEQUENCE. 
  
 ERR9     RJM    ISF         ISSUE SEEK FUNCTION
          ZJN    ERR10       IF ON CYLINDER AND NO ERROR
          LDD    GS 
          LMN    2
          ZJN    ERR9        IF POSITIONER BUSY 
          UJP    ERR1        RESTART ERROR PROCESSING 
  
 ERR10    RJM    PFR         PREPARE FOR RETRY ATTEMPT
          RJM    PDT         PERFORM READ/WRITE OPERATION 
  
*         CONTROL RETURNS TO THIS POINT ONLY IF THE ERROR WAS 
*         RECOVERED.
  
 ERR11    AOD    RS          SET RECOVERY STATUS
          SHN    6
          RAD    RC          ADJUST FOR CONTROLLER RECOVERY 
  
*         TERMINATE ERROR PROCESSING.  INSTRUCTIONS MODIFIED FOR ERROR
*         PROCESSING WILL BE RESTORED TO THEIR ORIGINAL VALUES, VARIOUS 
*         DATA CELLS WILL BE RESTORED TO THEIR INITIAL STATES, ETC. 
  
          RJM    TEP         TERMINATE ERROR PROCESSING 
          LJM    MST         EXIT ERROR PROCESSOR 
  
  
 ERRA     CON    0           RECOVERY PASS COUNTER
 TEPF     SPACE  4,30 
**        TEPF - TABLE OF ERROR PROCESSING FLAGS. 
* 
*         THIS TABLE CONTAINS INFORMATION RELATED TO EACH ERROR TYPE. 
*         EACH ENTRY HAS THE FOLLOWING FORMAT - 
*                VFD    2/ERROR COUNT INCREMENT, BML MESSAGE INDICATOR
*                            0   DO NOT INCREMENT ERROR COUNTS AND DO 
*                                NOT ISSUE BML MESSAGE. 
*                            1   INCREMENT ERROR COUNTS AND ISSUE BML 
*                                MESSAGE. 
*                            2   INCREMENT ERROR COUNTS AND ISSUE BML 
*                                MESSAGE IF UNRECOVERED ERROR.
*                VFD    2/UNUSED (ZERO) 
*                VFD    1/SUSPECT FLAG
*                            0   DO NOT SET SUSPECT FLAG. 
*                            1   SET SUSPECT FLAG.
*                VFD    7/UNUSED (ZERO) 
  
  
          LIST   G
 TEPF     EQU    *-1
          ECHO   1,EC=("DREC")
          VFD    2/IEC._EC,2/0,1/SUS._EC,7/0
          LIST   *
 TMNE     SPACE  4,10 
**        TMNE - TABLE OF ERROR CODE MNEMONICS. 
  
  
          LIST   G
 TMNE     EQU    *-1
          ECHO   1,ERRCODE=("DREC") 
          CON    EMN._ERRCODE          "TXT._ERRCODE" ERROR 
          LIST   *
 TREC     SPACE  4,10 
**        TREC - TABLE OF RETRY COUNTS. 
  
  
          LIST   G
 TREC     EQU    *-1
          ECHO   1,ERRCODE=("DREC") 
          CON    RTC._ERRCODE          "TXT._ERRCODE" ERROR 
          LIST   *
 TSYM     SPACE  4,10 
**        TSYM - TABLE OF BML SYMPTOM CODES.
  
  
          LIST   G
 TSYM     EQU    *-1
          ECHO   1,ERRCODE=("DREC") 
          CON    SYM._ERRCODE          "TXT._ERRCODE" ERROR 
          LIST   *
 FNC      SPACE  4,10 
**        FNC - FUNCTION CHANNEL. 
* 
*         ENTRY  (A) = FUNCTION CODE. 
* 
*         EXIT   (A) .LT. 0 IF CHANNEL ACTIVE UPON ENTRY OR FUNCTION
*                           TIMEOUT.  (EC) = COMPLEMENT OF ERROR CODE.
*                    .EQ. 0 IF NO ERROR, CHANNEL ACTIVE.
* 
*         USES   EC.
  
  
 FNC6     ACN    CH          ACTIVATE CHANNEL 
          LDN    0           SET REPLY STATUS 
  
 FNC      SUBR               ENTRY/EXIT 
          STM    FNCA        SAVE FUNCTION CODE 
          AJM    FNC5,CH     IF CHANNEL IS STILL ACTIVE 
          FAN    CH          FUNCTION CHANNEL 
  
*         THE DRIVER MUST WAIT AT LEAST 300 MS BEFORE TIMING OUT THE
*         FUNCTION. 
  
 FNC1     ADD    ON 
          IJM    FNC6,CH     IF FUNCTION ACCEPTED 
          NJN    FNC1        IF NOT TIMEOUT YET 
          LCN    FTOE 
 FNC3     STD    EC 
          EJM    FNC4,CH     IF CHANNEL IS EMPTY
          LDN    1           SAVE LAST FUNCTION ISSUED
          IAM    FNCA,CH
 FNC4     LCN    0           SET ERROR REPLY STATUS 
          DCN    CH+40
          UJN    FNCX        RETURN 
  
 FNC5     LCN    CHFE        SET *CHANNEL FAILURE* ERROR CODE 
          UJN    FNC3        INPUT DATA/FUNCTION FROM CHANNEL 
  
  
 FNCA     CON    -0          CURRENT FUNCTION 
 GDS      SPACE  4,15 
**        GDS - GET DETAILED STATUS.
* 
*         THIS ROUTINE OBTAINS THE DETAILED STATUS FROM THE CONTROLLER. 
* 
*         EXIT   (A) .EQ. 0 IF STATUS OBTAINED. 
*                    .LT. 0 IF STATUS NOT OBTAINED. 
*                (EC) = COMPLEMENT OF ERROR CODE IF STATUS NOT
*                       OBTAINED. 
* 
*         USES   EC, T1.
* 
*         CALLS  FNC. 
  
  
 GDS2     LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
 GDS3     STD    EC 
 GDS4     LDN    MXSL-1      INVALIDATE DETAILED STATUS 
          STD    T1 
 GDS5     LCN    0
          STM    DST,T1 
          SOD    T1 
          PJN    GDS5        IF MORE BYTES
 GDS6     DCN    CH+40
  
 GDS      SUBR               ENTRY/EXIT 
          LDN    FCDS        ISSUE DETAILED STATUS FUNCTION 
          RJM    FNC
          MJN    GDS4        IF ERROR 
          LDN    MXSL 
          IAM    DST,CH      INPUT DETAILED STATUS
          NJN    GDS2        IF INCOMPLETE DATA TRANSFER
          SFM    GDS1,CH     IF CHANNEL PARITY ERROR
          UJN    GDS6        RETURN 
  
 GDS1     LCN    CHPE        SET *CHANNEL PARITY* ERROR CODE
          UJN    GDS3        SET ERROR CODE 
 GGS      SPACE  4,20 
**        GGS - GET GENERAL STATUS. 
* 
*         THIS ROUTINE OBTAINS GENERAL STATUS FROM THE CONTROLLER.
* 
*         EXIT   (A) .EQ. 0 IF GENERAL STATUS OBTAINED.  (GS) = STATUS. 
*                    .LT. 0 IF STATUS NOT OBTAINED.  (GS) = 7777. 
*                (EC) = COMPLEMENT OF *IDET* ERROR CODE IF INCOMPLETE 
*                       DATA TRANSFER OCCURRED. 
*                     = COMPLEMENT OF *CHPE* ERROR CODE IF CHANNEL
*                       PARITY ERROR OCCURRED.
* 
*         USES   EC, GS.
* 
*         CALLS  FNC. 
  
  
 GGS1     LCN    CHPE        SET *CHANNEL PARITY* ERROR CODE
          UJN    GGS3        SET ERROR CODE 
  
 GGS2     LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
 GGS3     STD    EC 
 GGS4     LCN    0           INVALIDATE GENERAL STATUS
          STD    GS 
 GGS5     DCN    CH+40
  
 GGS      SUBR               ENTRY/EXIT 
          LDN    FCGS        ISSUE GENERAL STATUS FUNCTION
          RJM    FNC
          MJN    GGS4        IF FUNCTION TIMEOUT
          LDN    1           INPUT STATUS 
          IAM    GS,CH
          NJN    GGS2        IF INCOMPLETE TRANSFER 
          SFM    GGS1,CH     IF CHANNEL PARITY ERROR
          LDD    GS 
          UJN    GGS5        RETURN 
 IBM      SPACE  4,25 
**        IBM - ISSUE BML MESSAGE.
* 
*         THIS ROUTINE BUILDS A BML MESSAGE AND CALLS ROUTINE *IMB* TO
*         ISSUE THE MESSAGE TO THE BML. 
* 
*         ENTRY  (CA - CA+3) = SEEK PARAMETERS. 
*                (EC) = ERROR CODE. 
*                (ER) = RECOVERY IN PROGRESS FLAG.
*                (RC) = RETRY COUNT.
*                (RS) = RECOVERY STATUS.
*                       777X INITIAL RETRY. 
*                       0    RECOVERED BY CONTROLLER. 
*                       1    RECOVERED BY DRIVER. 
*                       2    UNRESOLVED.
*                       3    UNRECOVERED. 
*                (RW) = READ/WRITE FLAG.
*                (T5) = EST ORDINAL.
*                (BMLGS) = GENERAL STATUS.
*                (DST - DST+23) = DETAILED STATUS IF APPLICABLE.
* 
*         EXIT   (RC) INCREMENTED IF FIRST RETRY. 
* 
*         USES   RC, T1, CM+1 - CM+3. 
* 
*         CALLS  IMB. 
* 
*         MACROS MONITOR. 
  
  
 IBM      SUBR               ENTRY/EXIT 
          LDM    TEPF,EC
          SHN    0-12 
          ZJN    IBMX        IF NO BML MESSAGE/ERROR COUNT INCREMENT
          LDD    RS 
          LMN    2
          ZJN    IBMX        IF UNRESOLVED ERROR
          SHN    21-13
          PJN    IBM1        IF FINAL RETRY 
          LDD    RC 
          NJN    IBMX        IF NOT INITIAL RETRY 
          AOD    RC          INCREMENT RETRY COUNT
          UJN    IBM3        CONTINUE 
  
 IBM1     SHN    13-1 
          PJN    IBM2        IF UNRECOVERED 
          LDN    2
          SBD    RC 
          MJN    IBM2        IF NOT RECOVERED ON FIRST RETRY
          LDK    STAE 
          LMD    EC 
          ZJN    IBM3        IF ERROR NOT TO BE COUNTED 
  
*         INCREMENT ERROR COUNTER.
  
 IBM2     LDD    T5          SET EST ORDINAL
          STD    CM+1 
          LDD    RS          SET BYTE NUMBER
          SHN    -1 
          ADN    3
          STD    CM+2 
          LDK    ICTS        SET SUBFUNCTION
          STD    CM+3 
          MONITOR  SMDM 
 IBM3     LDD    RS          SET RECOVERED/UNRECOVERED FLAG 
          ADN    5
          SHN    -3 
          LPN    1
          STD    T1 
          LDC    /COMSDFS/D1XM*400  STORE SYMPTOM CODE
          LMM    TSYM,EC
          STM    BMLSC
          LMK    /COMSDFS/HS0040+/COMSDFS/D1XM*400
          NJN    IBM4        IF NOT A MEDIA ERROR 
          LDD    RW 
          ERRNZ  /COMSDFS/HS0041-/COMSDFS/HS0040-1  ERROR 
          RAM    BMLSC
 IBM4     LDD    RC          STORE RETRY COUNT
          SHN    6-1
          ADD    RW          ADD READ/WRITE FLAG
          SHN    1
          ADD    T1          ADD RECOVERY STATUS
          STM    BMLRC
          LDD    CA          UNIT NUMBER
          LPN    77 
          STM    BMLUN
          LDD    T5          EST ORDINAL
          STM    BMLEO
          LDD    EC          ERROR CODE 
          STM    BMLEC
          LDD    CA+1        CYLINDER 
          STM    BMLCY
          LDD    CA+2        TRACK AND SECTOR 
          SHN    6
          LMD    CA+3 
          STM    BMLTS
          LDC    BML         ISSUE  *BML* MESSAGE 
          RJM    IMB         ISSUE MESSAGE TO BUFFER
          UJP    IBMX        RETURN 
 BML      SPACE  4,10 
*         BINARY MAINTENANCE LOG MESSAGE. 
  
 BML      BSS    0
  
 HDR1     VFD    36/0        RESERVED 
          VFD    12/BMS1LC   LENGTH OF MESSAGE
          VFD    12/MLDY     MESSAGE TYPE 
  
          VFD    12//COMSDFS/RM0115   MESSAGE ID
  
 BMLSC    VFD    4//COMSDFS/D1XM      DRIVER TYPE 
          VFD    1/0         RESERVED 
          VFD    7/0         SYMPTOM CODE 
  
 BMLPP    VFD    6/          PP NUMBER
          VFD    6/          CHANNEL NUMBER 
  
 BMLUN    VFD    6/0         EQUIPMENT NUMBER 
          VFD    6/          UNIT NUMBER
  
          VFD    12/0        RESERVED 
  
 BMLEO    VFD    12/         EST ORDINAL
  
 BMLRC    VFD    6/          RETRY COUNT
          VFD    4/0         RESERVED 
          VFD    1/0         READ OPERATION 
*         VFD    1/1         WRITE OPERATION
          VFD    1/0         RECOVERED ERROR
*         VFD    1/1         UNRECOVERED ERROR
  
 BMLCR    VFD    6/          CHANNEL USED FOR RECOVERY
          VFD    6/0         RESERVED 
  
 BMLMF    VFD    12/         MAINFRAME ID 
  
          VFD    12/0        RESERVED 
  
 HDR1L    EQU    *-HDR1      HEADER LENGTH (PP WORDS) 
 HDR1LC   EQU    HDR1L/5     HEADER LENGTH (CM WORDS) 
  
 BMLEC    VFD    12/         ERROR CODE 
  
 BMLCY    VFD    12/         CYLINDER 
  
 BMLTS    VFD    12/         TRACK AND SECTOR 
  
 BMLLF    VFD    12/         LAST FUNCTION
  
 BMLGS    VFD    12/         GENERAL STATUS 
  
*         DETAILED STATUS.
  
 DST      BSS    MXSL 
  
  
*         DRIVER TRACE DATA.
  
          BSS    5
 BMS1L    EQU    *-BML       LENGTH OF MESSAGE (PP WORDS) 
 .A       SET    BMS1L+4
 BMS1LC   EQU    .A/5        LENGTH OF MESSAGE (CM WORDS) 
 IFI      SPACE  4,30 
**        IFI - INITIALIZE FOR I/O. 
* 
*         THIS ROUTINE IS CALLED BY THE READ AND WRITE PROCESSORS TO
*         PREPARE FOR THE READ OR WRITE OPERATION.
* 
*         ENTRY  (CB) = BUFFER ORDINAL. 
*                (FU - FU+1) = FIRST WORD ADDRESS OF UEM. 
*                (RW) = READ/WRITE FLAG.
* 
*         EXIT   (BS) = BLOCK SIZE (SIZE OF DATA TRANSFER TO BE 
*                       PERFORMED ON INPUT/OUTPUT INSTRUCTION). 
*                (SR - SR+4) = SLAVE REQUEST. 
*                (UA - UA+1) = UEM ADDRESS FOR MASTER.
* 
*         USES   BS, CM - CM+4, SR - SR+4, UA - UA+1. 
* 
*         MACROS CCBA.
  
  
 IFI      SUBR               ENTRY/EXIT 
          LDC    HLEN+DLEN   SET TRANSFER SIZE
          STD    BS 
          LDM    IFIA,RW     SET BUFFER ADDRESS 
          STD    T1 
          LDC    BUFF 
          STI    T1 
  
*         SET UEM ADDRESS.
  
          CCBA   IOLK 
          CRD    CM 
          LDD    CM+4 
          ADD    FU+1 
          SHN    -6 
          STD    UA+1 
          LDD    CM+3 
          ADD    FU 
          SHN    6
          RAD    UA+1 
          SHN    -14
          STD    UA 
  
*         BUILD SLAVE REQUEST.
  
          LDN    ZERL 
          CRD    SR          CLEAR SLAVE REQUEST BLOCK
          LDD    RW          SET REQUEST TYPE 
          ADN    1
          ERRNZ  SLRD-1      CODE DEPENDS ON VALUE
          ERRNZ  SLWR-2      CODE DEPENDS ON VALUE
          STD    SR 
          LDK    MPRU        SET SLAVE UEM ADDRESS
          ADD    UA+1 
          STD    SR+4 
          SHN    -14
          ADD    UA 
          STD    SR+3 
          UJP    IFIX        RETURN 
  
 IFIA     CON    RIOB 
          CON    WIOB 
 IIC      SPACE  4,10 
**        IIC - ISSUE I/O COMPLETION REQUEST. 
* 
*         ENTRY  (CC) = COMPLETION COUNT. 
*                (PB) = PREVIOUS BUFFER ORDINAL, IF ANY.
* 
*         EXIT   (PB) = 0.
* 
*         USES   CC, PB, S1.
* 
*         CALLS  CRQ. 
  
  
 IIC      SUBR               ENTRY/EXIT 
          LDD    PB 
          ZJN    IIC1        IF NO PREVIOUS BUFFER ORDINAL
          AOD    CC          INCREMENT COMPLETION COUNT 
          LDN    0           CLEAR PREVIOUS BUFFER ORDINAL
          STD    PB 
 IIC1     LDD    CC 
          SHN    ** 
 IICA     EQU    *-1
          ZJN    IICX        IF NOT AT THRESHOLD
          LDK    MMXN        SET EXCHANGE RETRY LIMIT 
          STD    S1 
 IIC2     RJM    CRQ         ISSUE COMPLETION REQUEST 
          ZJN    IICX        IF NO PENDING REQUEST
          SOD    S1 
          PJN    IIC2        IF NOT AT EXCHANGE RETRY LIMIT 
          UJN    IICX        RETURN 
  
  
 IICB     BSS    0
          CON    SHNI+77-0
          CON    SHNI+77-1
 IMF      SPACE  4,10 
**        IMF - ISSUE MONITOR FUNCTION. 
* 
*         ENTRY  (A) = MONITOR FUNCTION CODE. 
* 
*         EXIT   (A) = 0. 
*                (CM - CM+4) = COMPLETED PP OUTPUT REGISTER IMAGE.
* 
*         USES   S1.
* 
*         CALLS  CRQ, FTN.
  
  
 IMF      SUBR               ENTRY/EXIT 
          STD    S1          SAVE MONITOR FUNCTION CODE 
 IMF1     RJM    CRQ         CHECK FOR FUNCTION REISSUE REQUIRED
          NJN    IMF1        IF PREVIOUS FUNCTION NOT YET COMPLETE
          LDD    S1 
          RJM    FTN         ISSUE MONITOR FUNCTION 
          UJN    IMFX        RETURN 
 ISF      SPACE  4,25 
**        ISF - ISSUE SEEK OPERATION. 
* 
*         THIS ROUTINE ISSUES THE SEEK FUNCTION.
* 
*         ENTRY  (CB) = BUFFER ORDINAL. 
*                (CS) = CHANNEL RESERVATION STATUS. 
* 
*         EXIT   (A) .EQ. 0 IF UNIT ON-CYLINDER.
*                    .NE. 0 IF DRIVE RESERVED TO OTHER CONTROLLER, OR 
*                           POSITIONER BUSY.
*                (CS) = BIT 3 SET IF CONTROLLER HARDWARE RESERVE IS 
*                         HELD.  BIT 3 IS CLEAR IF *OPERATION COMPLETE* 
*                         FUNCTION WAS ISSUED.
*                (CA - CA+2) = PHYSICAL ADDRESS OF SECTOR.
*                TO *ERR* IF ERROR. 
* 
*         USES   CS, EC, CA - CA+4. 
* 
*         CALLS  ERR, FNC, GGS, RHR.
* 
*         MACROS CCBA.
  
  
 ISF      SUBR               ENTRY/EXIT 
          CCBA   PAD1        GET PHYSICAL ADDRESS FROM CBT ENTRY
          CRD    CA 
          LDD    CA+2        SET HEAD NUMBER
          SHN    14 
          LMD    TH          SET SECTOR SIZE FIELD
          ERRNZ  SSIZ-1000   CODE DEPENDS ON VALUE
          STD    CA+2 
          SHN    -14         SET SECTOR NUMBER
          STD    CA+3 
          LDN    FCSK        ISSUE SEEK FUNCTION
          RJM    FNC
          MJN    ISF3        IF FUNCTION TIMEOUT
          LDN    FCSKL       OUTPUT SEEK PARAMETERS 
          OAM    CA,CH
          ZJN    ISF1        IF ALL DATA WAS TAKEN
          LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
          UJN    ISF2        PROCESS ERROR
  
 ISF1     EJM    ISF4,CH     IF LAST BYTE TRANSFERRED 
          SBN    1
          NJN    ISF1        IF NOT TIMEOUT 
          LCN    CHFE        SET *CHANNEL FAILURE* ERROR CODE 
 ISF2     STD    EC 
 ISF3     RJM    ERR         PROCESS ERROR
  
 ISF4     DCN    CH+40
          RJM    GGS         GET GENERAL STATUS 
          MJN    ISF3        IF STATUS WAS NOT OBTAINED 
          ZJN    ISF5        IF NO ERROR AND ON-CYLINDER
          SHN    21-13
          MJN    ISF3        IF ABNORMAL TERMINATION
          SHN    21-3-21+13 
          MJN    ISF6        IF DRIVE RESERVED TO OPPOSITE ACCESS 
 ISF5     LDD    CS          SET HARDWARE RESERVE FLAG
          SCN    10 
          LMN    10 
          STD    CS 
          LDD    GS 
          ZJN    ISF6        IF ON-CYLINDER 
          SHN    21-1 
          PJN    ISF3        IF NOT BUSY STATUS 
          RJM    RHR         RELEASE HARDWARE RESERVES
          NJN    ISF3        IF ERROR 
          LDN    1           SET EXIT STATUS
 ISF6     LJM    ISFX        RETURN 
 RLC      SPACE  4,10 
**        RLC - RELOAD CCC CONTROLWARE IF NECESSARY.
* 
*         RLC WILL CALL OVERLAY *2XN* TO RELOAD CONTROLWARE BEFORE THE
*         FINAL RETRY FOR EACH ACCESS, PROVIDED THAT THE ERROR CODE IS
*         LESS THAN *NRVE*. 
* 
*         EXIT   (A) .EQ. 0 IF LOAD WAS SUCCESSFUL OR UNNECESSARY.
*                (A) .NE. 0 IF LOAD WAS ATTEMPTED AND FAILED. 
* 
*         CALLS  2XN. 
* 
*         MACROS EXECUTE. 
  
  
 RLC2     LDN    0           INDICATE NO ERROR
          DCN    CH+40
  
 RLC      SUBR               ENTRY/EXIT 
          LDD    EC 
          SBK    NRVE 
          PJN    RLC2        IF NOT A CANDIDATE FOR CONTROLWARE RELOAD
          LDM    TREC,EC
          SBD    RC 
          ZJN    RLC1        IF TIME FOR RELOAD ON SECONDARY ACCESS 
          SBD    RC 
          NJN    RLC2        IF NOT TIME FOR RELOAD ON PRIMARY ACCESS 
 RLC1     EXECUTE  2XN       RELOAD CONTROLWARE IF POSSIBLE 
          UJN    RLCX        RETURN 
 OVI      SPACE  4,25 
**        OVI - OBTAIN AND VERIFY *PUT* INTERLOCK.
* 
*         THIS ROUTINE ATTEMPTS TO OBTAIN THE *PUT* INTERLOCK AND IF
*         SUCCESSFUL, VERIFIES THAT THE BUFFER FOR WHICH THE SEEK WAS 
*         ISSUED IS STILL CURRENT IN THE QUEUE. 
* 
*         ENTRY  (CA+1 - CA+3) = ADDRESS USED FOR SEEK. 
*                (CB) = BUFFER ORDINAL. 
*                (ER) = RECOVERY IN PROGRESS FLAG.
*                (IL) = NONZERO IF THE *PUT* INTERLOCK IS ALREADY HELD. 
*                (PO) = *PUT* ORDINAL.
* 
*         EXIT   (A) = 0 IF *PUT* ENTRY IS INTERLOCKED AND BUFFER IS
*                        STILL CURRENT IN QUEUE.
*                    = NONZERO IF *PUT* ENTRY IS INTERLOCKED BY OTHER 
*                        DRIVER OR THE BUFFER FOR WHICH THE SEEK WAS
*                        PERFORMED HAS ALREADY BEEN PROCESSED BY THE
*                        OTHER DRIVER.
*                (IL) = 1 IF (A) = 0. 
* 
*         USES   IL, CM+1 - CM+2, CN - CN+4.
* 
*         CALLS  RPI. 
* 
*         MACROS CCBA, CPTA, MONITOR. 
  
  
 OVI2     LDN    0           INDICATE *PUT* INTERLOCKED AND BUFFER OK 
  
 OVI      SUBR               ENTRY/EXIT 
          LDD    IL 
          NJN    OVI2        IF THIS DRIVER ALREADY HAS *PUT* INTERLOCK 
          LDK    SUIS 
          STD    CM+1 
          LDD    PO 
          STD    CM+2 
          MONITOR  BIOM      ISSUE INTERLOCK REQUEST
          LDD    CM+1 
          NJN    OVIX        IF *PUT* IS INTERLOCKED BY OTHER DRIVER
          AOD    IL          SET *PUT* INTERLOCK FLAG 
          LDC    CREQ        UPDATE *CCT* TABLE 
 OVIA     EQU    *-2         (*CCT* FWA SET BY *PRS*) 
          CWD    IL 
          LDD    ER 
          NJN    OVI2        IF RECOVERY IN PROGRESS
  
*         VERIFY THAT THE BUFFER FOR WHICH THE SEEK WAS ISSUED IS STILL 
*         CURRENT IN THE QUEUE. 
  
          CPTA   UNCT 
          CRD    CN 
          LDD    CN+3 
          LMD    CB 
          NJN    OVI1        IF CURRENT CBT ORDINAL CHANGED 
          CCBA   HSLK        GET *PUT* ORDINAL FROM CBT ENTRY 
          CRD    CN 
          LDD    CN+4 
          LMD    PO 
          NJN    OVI1        IF *PUT* ORDINALS DO NOT MATCH 
          CCBA   PAD1        GET PHYSICAL ADDRESS FROM CBT ENTRY
          CRD    CN 
          LDD    CN+1 
          LMD    CA+1 
          NJN    OVI1        IF NO CYLINDER MATCH 
          LDD    CA+2        TRACK
          LPN    77 
          SHN    6
          LMD    CA+3        SECTOR 
          LMD    CN+2 
          ZJN    OVI1.1      IF BUFFER OK 
 OVI1     RJM    RPI         RELEASE *PUT* INTERLOCK
          LDN    1           INDICATE VERIFICATION FAILURE
 OVI1.1   UJP    OVIX        RETURN 
 PDT      SPACE  4,20 
**        PDT - PROCESS DATA TRANSFER.
* 
*         THIS ROUTINE PREPARES FOR AND STARTS THE DATA TRANSFER WHEN A 
*         REQUEST IS FOUND IN THE *PUT* AND THE SEEK HAS COMPLETED.  IT 
*         WILL CALL THE PROPER ROUTINE FOR THE DIRECTION OF THE I/O.
*         THIS ROUTINE WILL RETURN TO THE MAIN LOOP ONLY WHEN THE 
*         TRANSFER CANNOT CONTINUE ON THE CURRENT UNIT. 
* 
*         ENTRY  (EC) = ERROR CODE IF ERROR RECOVERY IS IN PROGRESS.
*                (PO) = *PUT* ORDINAL.
*                (RW) = READ/WRITE FLAG.
* 
*         USES   NB, PB, TB, T1.
* 
*         CALLS  ERR, OVI, RHR, RIO, RPI, WIO.
  
  
 PDT      SUBR               ENTRY/EXIT 
          RJM    OVI         OBTAIN *PUT* INTERLOCK AND VERIFY BUFFER 
          NJN    PDT1        IF UNABLE TO INTERLOCK *PUT*/WRONG BUFFER
          STD    NB          CLEAR NEXT BUFFER ORDINAL
          STD    PB          CLEAR PREVIOUS BUFFER ORDINAL
          LDM    IICB,RW     SET COMPLETION REQUEST THRESHOLD 
          STM    IICA 
          LDM    PDTA,RW     STORE SUBROUTINE ADDRESS 
          STD    T1 
          RJM    0,T1        ENTER DATA TRANSFER ROUTINE
  
*         CONTROL RETURNS HERE AFTER THE DATA TRANSFER IS COMPLETED.
  
 PDT1     RJM    RHR         RELEASE HARDWARE RESERVES
          ZJN    PDT2        IF NO ERROR
          LDD    EC 
          NJN    PDT2        IF ERROR RECOVERY IS IN PROGRESS 
          RJM    ERR         CALL ERROR PROCESSOR 
  
 PDT2     RJM    RPI         RELEASE *PUT* INTERLOCK
          UJP    PDTX        RETURN 
  
  
 PDTA     BSS    0           PROCESSOR ADDRESS TABLE
          CON    RIO
          CON    WIO
 PFR      SPACE  4,15 
**        PFR - PREPARE FOR RETRY ATTEMPT.
* 
*         THIS ROUTINE DOES WHATEVER IS NECESSARY TO PREPARE FOR THE
*         NEXT RETRY ATTEMPT.  ITS DUTIES INCLUDE PLUGGING INSTRUCTIONS 
*         TO FORCE RETURN TO THE ERROR PROCESSOR FOLLOWING RECOVERY.
* 
*         ENTRY  (RW) = READ/WRITE FLAG.
* 
*         USES   T1, T2.
  
  
 PFR      SUBR               ENTRY/EXIT 
          LDD    RW 
          SHN    1
          STD    T1 
          LDM    PFRA,T1
          STD    T2 
          LDM    PFRA+1,T1
          STI    T2 
          UJN    PFRX        RETURN 
  
  
 PFRA     BSS    0
          CON    RIOC,UJNI+RIO12-RIOC 
          CON    WIOC,UJNI+WIO8-WIOC
  
          ERRNG  RIO12-RIOC  CODE DEPENDS ON VALUE
          ERRNG  WIO8-WIOC   CODE DEPENDS ON VALUE
 PRE      SPACE  4,20 
**        PRE - PRESET ERROR PROCESSOR. 
* 
*         THIS ROUTINE PERFORMS OPERATIONS NECESSARY TO PREPARE THE 
*         DRIVER FOR ERROR PROCESSOR EXECUTION. 
* 
*         EXIT   (A) = 0 IF ERROR PROCESSING SHOULD CONTINUE. 
*                (EC) = 1 IF ERROR ON PREVIOUS SECTOR.
*                (PB) = PREVIOUS BUFFER ORDINAL.
*                (RS) = RECOVERY STATUS.
*                (T5) = EST ORDINAL.
*                (TEPA) = 1 IF VERIFICATION/INTERLOCK REJECT. 
* 
*         USES   CB, EC, PB, RS, T5, CM - CM+4. 
* 
*         CALLS  CRQ, OVI.
* 
*         MACROS CPTA.
  
  
 PRE4     AOM    TEPA        SET VERIFICATION/INTERLOCK FAILURE FLAG
  
 PRE      SUBR               ENTRY/EXIT 
          DCN    CH+40       DISCONNECT CHANNEL 
          LDM    FNCA        SAVE CURRENT FUNCTION
          STM    BMLLF
          LCN    0           INITIALIZE RECOVERY STATUS 
          STD    RS 
          RJM    OVI         GET *PUT* INTERLOCK (IF NOT ALREADY HELD)
          NJN    PRE4        IF INTERLOCK NOT OBTAINED
          LDC    LDNI+FCRD
          STM    RIOA 
          ADN    FCWR-FCRD
          STM    WIOA 
          CPTA   UNCT        GET EST ORDINAL
          CRD    CM 
          LDD    CM+1 
          STD    T5 
          LDD    EP 
          ZJN    PRE3        IF NOT PREVIOUS SECTOR ERROR 
          LDD    EC 
          LMC    7777-FTOE
          NJN    PRE3        IF NOT PREVIOUS SECTOR ERROR 
          LDN    FTOE 
          STD    EC 
          LDD    PB          RESET CURRENT BUFFER TO PREVIOUS 
          ZJN    PRE3        IF NO PREVIOUS BUFFER
          STD    CB 
          LDN    0           CLEAR PREVIOUS BUFFER ORDINAL
          STD    PB 
 PRE3     RJM    CRQ         IDLE PENDING MONITOR FUNCTIONS 
          NJN    PRE3        IF FUNCTION PENDING
          STD    EP          CLEAR PREVIOUS SECTOR ERROR FLAG 
          LJM    PREX        RETURN 
 RCH      SPACE  4,15 
**        RCH - REQUEST CHANNEL.
* 
*         ENTRY  (IR+4) = CHANNEL NUMBER. 
*                (CS) = CHANNEL RESERVATION STATUS. 
* 
*         EXIT   (A) .NE. 0 IF CHANNEL ASSIGNED.
*                    .EQ. 0 IF CHANNEL NOT ASSIGNED.
* 
*         USES   CM+1, CS.
* 
*         MACROS MONITOR. 
  
  
 RCH      SUBR               ENTRY/EXIT 
          LDD    CS 
          LPN    1
          NJN    RCHX        IF CHANNEL ALREADY ASSIGNED
          LDD    IR+4 
          STD    CM+1 
          MONITOR  CCHM 
          LDD    CM+2 
          ZJN    RCHX        IF CHANNEL NOT ASSIGNED
          SCF    *+2,CH      UNCONDITIONALLY SET CHANNEL FLAG 
          AOD    CS          SET CHANNEL RESERVED FLAG
          UJN    RCHX        RETURN 
 RFU      SPACE  4,30 
**        RFU - READ FROM UEM.
* 
* 
*         ENTRY  (BL) = MASTER BUFFER LENGTH (IN CM WORDS). 
*                (CB) = BUFFER ORDINAL. 
*                (SR+2) = 0 IF PROCESSING FIRST PART OF SECTOR. 
*                (UA - UA+1) = UEM ADDRESS/100B TO READ FROM. 
* 
*         EXIT   (BUFF) = HEADER + DATA FROM UEM. 
* 
*         USES   T1 - T3. 
* 
*         MACROS CCBA.
  
  
 RFU      SUBR               ENTRY/EXIT 
          LDD    SR+2 
          NJN    RFU1        IF SECOND HALF OF BLOCK
          LDN    HLEN/5 
          STD    T1          SET LENGTH OF HEADER 
          CCBA   PAD1        READ HEADER INTO BUFFER
          CRM    BUFF,T1
 RFU1     SRD    T2          SAVE R-REGISTER
          LRD    UA          SET ADDRESS TO READ FROM 
          LDC    400000      USE R-REGISTER FOR READ ADDRESS
          CRM    BUFF+HLEN,BL  READ DATA INTO BUFFER
          LRD    T2          RESTORE R-REGISTER 
          UJN    RFUX        RETURN 
 RHR      SPACE  4,10 
**        RHR - RELEASE HARDWARE RESERVES.
* 
*         ENTRY  (CS) = CHANNEL STATUS. 
* 
*         EXIT   (A) = 0 IF NO ERROR. 
* 
*         USES   CS, S1.
* 
*         CALLS  FNC. 
  
  
 RHR      SUBR               ENTRY/EXIT 
          LDD    CS 
          LPN    10 
          ZJN    RHRX        IF CONTROLLER NOT RESERVED 
          LDN    FCOC        ISSUE *OPERATION COMPLETE* FUNCTION
          RJM    FNC
          SHN    0-21        SAVE ERROR STATUS
          STD    S1 
          DCN    CH+40
          LCN    10          CLEAR CONTROLLER RESERVE FLAG
          RAD    CS 
          LDD    S1          SET REPLY STATUS 
          UJN    RHRX        RETURN 
 RIO      SPACE  4,40 
**        RIO - PERFORM READ I/O OPERATIONS.
* 
*         ENTRY  (CB) = CURRENT BUFFER ORDINAL. 
*                (EP) = 0.
*                (NB) = 0.
*                (PB) = 0.
*                (SB) = FWA OF SLAVE REQUEST BUFFER.
* 
*         EXIT   (PB) = ORDINAL OF LAST BUFFER PROCESSED. 
* 
*         USES   CB, EC, EP, NB, PB, SR+2.
* 
*         CALLS  AUA, CCS, ERR, FNC, GGS, IFI, RSS, WFS, WTU. 
* 
*         MACROS CCBA.
  
  
 RIO      SUBR               ENTRY/EXIT 
          RJM    IFI         INITIALIZE FOR I/O 
 RIO1     LDN    FCRD        ISSUE READ FUNCTION
*         LDN    FCCO        (CONTROLLER ERROR RECOVERY IN PROGRESS)
 RIOA     EQU    *-1
          RJM    FNC
          PJN    RIO2        IF NO ERROR
          AOD    EP          SET PREVIOUS SECTOR ERROR FLAG 
          UJN    RIO5        CALL ERROR PROCESSOR 
  
 RIO2     LDD    SB          POST SLAVE REQUEST 
          ADK    SBRQ 
          CWD    SR          POST SLAVE REQUEST 
 RIO3     FJM    RIO6,CH     IF CHANNEL FULL
          SBN    1
          NJN    RIO3        IF NOT TIMEOUT 
          LCN    CHFE        SET *CHANNEL FAILURE* ERROR CODE 
 RIO4     STD    EC 
          RJM    RSS         RESET SLAVE TO IDLE LOOP 
 RIO5     RJM    ERR         CALL ERROR PROCESSOR 
  
 RIO6     LDD    BS          INPUT DATA 
          IAM    BUFF,CH
*         IAM    BUFF+HLEN   (SECOND HALF OF SECTOR)
 RIOB     EQU    *-1
          ZJN    RIO8        IF DATA TRANSFER COMPLETE
          SFM    RIO7,CH     IF CHANNEL PARITY ERROR
          LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
          UJN    RIO4        SET ERROR CODE 
  
 RIO7     LCN    CHPE        SET *CHANNEL PARITY* ERROR CODE
          UJN    RIO4        SET ERROR CODE 
  
 RIO8     CCF    *,CH        PASS CHANNEL TO SLAVE
          RJM    WTU         WRITE DATA TO UEM/STORE LINKAGE BYTES
          AOD    SR+2        SET *CHANNEL DISCONNECT* FLAG
          LMN    2
          ZJN    RIO11       IF LAST BLOCK TRANSFERRED
          RJM    AUA         ADVANCE MASTER/SLAVE UEM ADDRESSES 
          RJM    WFS         WAIT FOR SLAVE COMPLETION
          PJP    RIO2        IF SLAVE DID NOT ENCOUNTER ERROR 
 RIO8.1   STD    EC          STORE ERROR CODE 
 RIO9     UJN    RIO5        CALL ERROR PROCESSOR 
  
 RIO11    RJM    WFS         WAIT FOR SLAVE COMPLETION
          MJN    RIO8.1      IF SLAVE ENCOUNTERED ERROR 
          ZJN    RIO12       IF NO CONSECUTIVE REQUEST
*         UJN    RIO12       (ERROR RECOVERY IN PROGRESS) 
 RIOC     EQU    *-1
          LDN    0           CLEAR NEXT BUFFER ORDINAL
          STD    NB 
          LJM    RIO1        PROCESS NEXT REQUEST 
  
 RIO12    RJM    GGS         GET GENERAL STATUS 
          ZJP    RIOX        IF NO ERROR
          LDD    PB          BACKUP TO PREVIOUS BUFFER
          STD    CB 
          LDN    0           AVOID BUFFER COMPLETION
          STD    PB 
          UJN    RIO9        CALL ERROR PROCESSOR 
 RPI      SPACE  4,10 
**        RPI - RELEASE *PUT* INTERLOCK.
* 
*         ENTRY  (CC) = COMPLETION COUNT. 
*                (IL) = *PUT* INTERLOCK FLAG. 
*                (PB) = PREVIOUS BUFFER ORDINAL.
*                (PO) = *PUT* ORDINAL.
*                (RW) = READ/WRITE FLAG.
*                (SB) = SLAVE MESSAGE BUFFER ADDRESS. 
*                (TB) = TOTAL BUFFER COUNT. 
* 
*         USES   CC, IL, PB, CM - CM+4. 
* 
*         MACROS MONITOR. 
  
  
 RPI2     LDD    PB 
          ZJN    RPI3        IF NO PREVIOUS BUFFER
          LDN    1           ACCOUNT FOR PREVIOUS BUFFER
 RPI3     ADD    CC 
          LMC    4000        SET *RELEASE INTERLOCK* FLAG 
          STD    CM+3 
          LDD    TB          SET TOTAL BUFFER COUNT 
          STD    CM+4 
          LDD    PO 
          STD    CM+2 
          LDN    DCBS        CLEAR UNIT INTERLOCK 
          STD    CM+1 
          LDN    0           CLEAR COMPLETION COUNT BEFORE *CRQ* CALL 
          STD    CC 
          MONITOR  BIOM 
*         LDN    0
          STD    IL          CLEAR *PUT* INTERLOCK FLAG 
          STD    PB          CLEAR PREVIOUS BUFFER ORDINAL
          LDC    CREQ        UPDATE *CCT* TABLE 
 RPIA     EQU    *-2         (*CCT* FWA SET BY *PRS*) 
          CWD    IL 
  
 RPI      SUBR               ENTRY/EXIT 
          LDD    IL 
          ZJN    RPIX        IF *PUT* NOT INTERLOCKED 
 RPI1     LDD    SB 
          ADK    SBRC 
          CRD    CM 
          LDD    CM 
          NJP    RPI2        IF SLAVE FINISHED
          LDK    SDLY 
          SBN    1
          NJN    *-1         IF DELAY NOT FINISHED
          UJN    RPI1        CHECK FOR SLAVE COMPLETION 
 RSS      SPACE  4,25 
**        RSS - RESET SLAVE TO IDLE LOOP. 
* 
* 
*         ENTRY  (SB) = FWA OF SLAVE REQUEST BUFFER.
* 
*         USES   CM - CM+4. 
  
  
 RSS      SUBR               ENTRY/EXIT 
          LDN    1
          STD    CM          ERROR FLAG 
          LDD    SB 
          ADK    SBME 
          CWD    CM          SET MASTER ERROR FLAG
          CCF    *,CH        CLEAR CHANNEL FLAG 
 RSS1     LDK    SDLY 
          SBN    1
          NJN    *-1         IF DELAY NOT COMPLETE
          LDD    SB 
          ADK    SBME 
          CRD    CM          REREAD MASTER ERROR FLAG WORD
          LDD    CM 
          NJN    RSS1        IF SLAVE HAS NOT CLEARED ERROR FLAG
          SCF    *,CH        SET CHANNEL FLAG 
          UJN    RSSX        RETURN 
 RTM      SPACE  4,25 
**        RTM - REQUEST TRACK FLAW IF MEDIA ERROR.
* 
*         THIS ROUTINE DETERMINES IF THE ERROR RESULTED FROM A MEDIA
*         FAILURE.  IF IT DID, *CPUMTR* WILL BE CALLED TO PLACE THE 
*         LOGICAL TRACK NUMBER IN THE MST SO *1MV* CAN PERFORM A MEDIA
*         VERIFICATION WHEN THE TRACK IS RELEASED.  AN ERROR LOG
*         MESSAGE IS ISSUED INFORMING THE OPERATOR THAT A MEDIA FAILURE 
*         OCCURRED BUT THE TRACK HAS NOT YET BEEN FLAWED BY THE SYSTEM. 
* 
*         ENTRY  (CA - CA+3) = PHYSICAL ADDRESS.
*                (CB) = BUFFER ORDINAL. 
*                (EC) = ERROR CODE. 
*                (T5) = EST ORDINAL.
* 
*         USES   T1, CM - CM+4. 
* 
*         CALLS C2D, IMB. 
* 
*         MACROS MONITOR. 
  
  
 RTM      SUBR               ENTRY/EXIT 
          LDD    EC 
          LMK    PARE 
          NJN    RTMX        IF NOT MEDIA ERROR 
          LDD    T5          CONVERT AND STORE EST ORDINAL IN MESSAGE 
          SHN    -3 
          RJM    C2D
          STM    RTMB+1 
          LDD    T5 
          STD    CM+1        STORE EST ORDINAL FOR *SMDM* 
          LPN    7
          SHN    6
          ADC    2R0, 
          STM    RTMB+2 
          LDD    CA+1 
          SHN    1
          ADC    4000 
          STD    CM+2 
          LDD    CA+2        PHYSICAL TRACK 
          LPN    77 
          STD    T1 
          SHN    1
          ADD    T1 
          ERRNZ  PSPT-3      CODE DEPENDS ON VALUE
          ADD    CA+3 
          SBK    PSLT 
          MJN    RTM1        IF FIRST LOGICAL TRACK OF CYLINDER 
          AOD    CM+2 
 RTM1     LDD    CM+2        CONVERT AND STORE TRACK NUMBER IN MESSAGE
          SHN    -6          CONVERT UPPER 6 BITS 
          RJM    C2D
          STM    RTMB+4      STORE RESULT IN DISPLAY BUFFER 
          LDD    CM+2        CONVERT LOWER 6 BITS 
          LPN    77 
          RJM    C2D
          STM    RTMB+5      STORE RESULT IN DISPLAY BUFFER 
          LDK    SFTS        SET SUBFUNCTION
          STD    CM+3 
          MONITOR  SMDM 
          LDD    CM+1 
          NJN    RTM2        IF THIS TRACK FLAW ALREADY REQUESTED 
          LDC    RTMA        ISSUE ERROR LOG MESSAGE
          RJM    IMB
 RTM2     UJP    RTMX        RETURN 
  
  
 RTMA     VFD    24/0        RESERVED 
          VFD    12/1        ERRLOG ALERT FLAG
          VFD    12/RTMAL    MESSAGE LENGTH 
          VFD    12/ELDY     ERRLOG DAYFILE 
  
 RTMB     DATA   C*EQXXX,TKNNNN, MEDIA DEFECT ENCOUNTERED.* 
  
 .1       SET    *-RTMA+4 
 RTMAL    EQU    .1/5 
 SCD      SPACE  4,10 
**        SCD - SET DRIVER DROPPED FLAG.
* 
*         THIS ROUTINE SETS A FLAG IN THE CONTROLWARE TABLE INDICATING
*         THAT THE DRIVER OF THIS CHANNEL HAS DROPPED.
* 
*         EXIT   (A) = 0. 
* 
*         USES   CM+1 - CM+4. 
* 
*         MACROS MONITOR. 
  
  
 SCD      SUBR               ENTRY/EXIT 
          LDD    MA          STORE *UTEM* PARAMETERS
          CWM    SCDB,ON
          LDC    ** 
 SCDA     EQU    *-1         (CONTROLWARE TABLE ADDRESS)
          STD    CM+4 
          SHN    -14
          STD    CM+3 
          LDN    1
          STD    CM+1 
          LDN    0
          STD    CM+2 
          MONITOR  UTEM      SET DRIVER DROP FLAG 
          UJN    SCDX        RETURN 
  
  
 SCDB     VFD    1/0,5/0,6/1,6/,42/1
 SSF      SPACE  4,15 
**        SSF - SET SUSPECT FLAG. 
* 
*         THIS ROUTINE SETS THE SUSPECT FLAG AND THE *E,M* DISPLAY
*         ERROR CODE IN THE MST ENTRY VIA *SEQM* FUNCTIONS, PROVIDED
*         THAT THE *SET SUSPECT* FLAG IS SET IN TABLE *TEPF* FOR THE
*         PARTICULAR TYPE OF ERROR ENCOUNTERED. 
* 
*         ENTRY  (EC) = ERROR CODE. 
*                (RC) = RETRY COUNT.
*                (T5) = EST ORDINAL.
* 
*         USES   CM+1 - CM+3. 
* 
*         CALLS  RTM. 
* 
*         MACROS MONITOR. 
  
  
 SSF1     LDK    SURT 
 SSF2     SBD    RC 
          NJN    SSFX        IF NOT TIME TO SET SUSPECT FLAG
          RJM    RTM         CHECK FOR MEDIA FAILURE
          LDM    TEPF,EC
          SHN    21-7 
          PJN    SSFX        IF SUSPECT FLAG NOT TO BE SET
          LDD    T5          SET SUSPECT FLAG 
          STD    CM+1 
          LDN    SSES 
          STD    CM+2 
          MONITOR  SEQM 
          LDD    T5          SET ERROR CODE IN MST
          STD    CM+1 
          LDN    STDE 
          STD    CM+2 
          LDN    SERS 
          STD    CM+3 
          MONITOR  SMDM 
  
 SSF      SUBR               ENTRY/EXIT 
          LDD    ER 
          NJN    SSFX        IF RECOVERY IN PROGRESS
          LDD    EC 
          SBK    NRVE 
          PJP    SSF1        IF NO CONTROLWARE RELOAD 
          LDM    TREC,EC
          SHN    -1 
          ADN    1
          UJP    SSF2        SEE IF TIME TO SET SUSPECT 
  
 SUQ      SPACE  4,30 
**        SUQ - SCAN UNIT QUEUE.
* 
*         THIS ROUTINE SCANS THE *PUT* ENTRIES OF UNITS ACCESSED BY 
*         THIS CHANNEL UNTIL IT HAS SCANNED THE ENTIRE TABLE OR FINDS 
*         AN ENTRY ELIGIBLE FOR PROCESSING. 
* 
*         ENTRY  (TI) = CURRENT *TPOR* INDEX. 
* 
*         EXIT   (A) .EQ. 0 IF ENTIRE TABLE SCANNED AND NO ELIGIBLE 
*                           ENTRY FOUND.
*                    .NE. 0 IF ENTRY SELECTED.
*                (CB) = CURRENT BUFFER ORDINAL. 
*                (ER) = 1 IF ERROR RECOVERY IS IN PROGRESS. 
*                (PO) = ORDINAL OF SELECTED *PUT* ENTRY.
*                (RC) = 0 IF ELIGIBLE ENTRY FOUND AND *RECOVERY IN
*                         PROGRESS* FLAG IS CLEAR.
*                     = N/2+1 WHERE N IS THE RETRY LIMIT FOR THE ERROR
*                         CODE SET IN *EC* IF *RECOVERY IN PROGRESS*
*                         FLAG IS SET.
*                (RW) = READ/WRITE FLAG.
*                TO *ERR* IF ERROR RECOVERY IS IN PROGRESS FOR
*                   SELECTED BUFFER.
*                (TB) = TOTAL BUFFER COUNT. 
* 
*         USES   CB, EC, ER, PO, RC, RW, S1, TB, TI, CM - CM+4, 
*                CN - CN+4, T1 - T5.
* 
*         MACROS CCBA, CPTA, SFA. 
  
  
 SUQ7     LDD    TI 
          LMN    1
 SUQA     EQU    *-1
          NJN    SUQ1        IF NOT FINISHED WITH *PUT* SCAN
  
 SUQ      SUBR               ENTRY/EXIT 
 SUQ1     AOD    TI          ADVANCE *TPOR* INDEX 
          ERRNZ  TPORE-1     CODE IS VALUE DEPENDENT
          LDM    TPOR-1,TI
          NJN    SUQ2        IF NOT END OF *TPOR* TABLE 
          STD    TI          RESET INDEX
          UJN    SUQ1        CONTINUE 
  
 SUQ2     SHN    21          SET *PUT* ORDINAL
          STD    PO 
          SHN    -21         SET CHANNEL INDEX BYTE 
          STD    S1 
          CPTA   UNCT        READ *PUT* ENTRY 
          CRD    CM 
          LDD    CM 
          SHN    21-13
          MJN    SUQ7        IF UNIT INTERLOCK SET
          LDD    CM+3 
          NJN    SUQ3        IF REQUEST IN QUEUE
 SUQ2.1   UJN    SUQ7        PROCESS NEXT *PUT* 
  
 SUQ3     STD    CB          SAVE BUFFER ORDINAL
          CCBA   IOLK,A      READ *CBT* ENTRY 
          CRD    CN 
          ADK    HSLK-IOLK
          CRD    T1 
          SFA    EST,CM+1    READ EST ENTRY 
          ADK    EQDE 
          CRD    CM 
          LDM    CM+1,S1
          SHN    -11
          LPN    3
          STD    T2          SAVE CHANNEL STATE INDICATOR 
          LMN    3
          NJN    SUQ4        IF CHANNEL NOT DOWN
 SUQ3.1   UJN    SUQ2.1      PROCESS NEXT *PUT* 
  
 SUQ4     LDD    T1 
          SHN    0-12 
          ZJN    SUQ4.1      IF NOT CHANNEL SPECIFIC REQUEST
          CCBA   PAD4        GET CHANNEL FROM CBT ENTRY 
          CRD    CM 
          LDD    CM          CHECK IF OTHER CHANNEL SPECIFIED 
          SHN    -6 
          LMD    IR+4 
          STD    T2 
 SUQ4.1   LDD    T2 
          NJN    SUQ3.1      IF IDLE STATE OR OTHER CHANNEL SPECIFIED 
          LDD    CN          SET/CLEAR READ/WRITE FLAG
          SHN    0-11 
          LPN    1
          STD    RW 
          SHN    13-0 
          ADN    1
          STD    TB 
          LDD    T1 
          SHN    0-13 
          STD    ER          SET/CLEAR RECOVERY IN PROGRESS FLAG
          ZJN    SUQ6        IF NOT ERROR RECOVERY
          LDD    T1          SAVE ERROR CODE
          LPN    77 
          STD    T1 
          LMC    7777        COMPLEMENT ERROR CODE
          STD    EC 
          LDM    TREC,T1     SET RETRY COUNT = LIMIT/2+1
          SHN    -1 
          ADN    1
          STD    RC          INITIALIZE RETRY COUNT 
          LDN    0           INITIALIZE PASS COUNTER
          STM    ERRA 
          RJM    ERR         CALL ERROR PROCESSOR 
*         LJM    MST         ERROR PROCESSOR RETURNS TO *MST* 
  
 SUQ6     LDD    TI          SET SCAN LIMIT 
          LMC    LMNI 
          STM    SUQA 
          LJM    SUQX        RETURN 
 TEP      SPACE  4,30 
**        TEP - TERMINATE ERROR PROCESSING. 
* 
*         THIS ROUTINE PERFORMS OPERATIONS NECESSARY TO RESTORE THE 
*         DRIVER TO ITS NORMAL STATE (NON-ERROR PROCESSING).
* 
*         ENTRY  (EC) = ERROR CODE. 
*                (PO) = *PUT* ORDINAL.
*                (RS) = RECOVERY STATUS.
*                (RW) = READ/WRITE FLAG.
* 
*         EXIT   (EC) = 0.
*                (ER) = 0.
*                (RC) = 0.
*                (RS) = RECOVERY STATUS.
*                       0    RECOVERED BY CONTROLLER. 
*                       1    RECOVERED BY DRIVER. 
*                       2    UNRESOLVED.
*                       3    UNRECOVERED. 
* 
*         USES   EC, ER, IL, RC, RS, S2, T1, T2, CM - CM+4. 
* 
*         CALLS  IBM, RHR, RPI. 
* 
*         MACROS MONITOR. 
  
  
 TEP4     LDN    0
          STD    EC          CLEAR ERROR CODE 
          STD    ER          CLEAR RECOVERY IN PROGRESS FLAG
          STD    RC          CLEAR RETRY COUNT
          STM    TEPA        CLEAR VERIFICATION/INTERLOCK REJECT FLAG 
  
 TEP      SUBR               ENTRY/EXIT 
          LDD    RW 
          SHN    1
          STD    T1 
          LDM    TEPB,T1     RESTORE INSTRUCTIONS 
          STD    T2 
          LDM    TEPB+1,T1
          STI    T2 
          LDM    TEPC,T1
          STD    T2 
          LDM    TEPC+1,T1
          STI    T2 
          LDC    ** 
 TEPA     EQU    *-1
          NJP    TEP4        IF OTHER DRIVER IS HANDLING ERROR
          LDD    EC          SAVE ERROR CODE IN CASE FUNCTION TIMEOUT 
          STD    S2 
          RJM    RHR         RELEASE HARDWARE RESERVES
          LDD    S2          RESTORE ERROR CODE 
          STD    EC 
          LDD    RS 
          LMN    2
          NJN    TEP2        IF NOT UNRESOLVED ERROR
  
*         ISSUING SUBFUNCTION *IOES* OF THE *BIOM* MONITOR FUNCTION 
*         CAUSES ONE OF THE FOLLOWING TO OCCUR -
*                A. IF THE RECOVERY IN PROGRESS FLAG IS SET IN THE CBT
*                   ENTRY, THE REQUEST WILL BE TERMINATED WITH STATUS 
*                   RETURNED TO THE PROGRAM THAT ISSUED THE REQUEST.
*                   IN THIS CASE IT IS THE RESPONSIBILITY OF THIS 
*                   DRIVER TO ISSUE MESSAGES TO THE BML, ERROR LOG, JOB 
*                   DAYFILE AND SYSTEM DAYFILE INDICATING AN
*                   UNRECOVERED ERROR OCCURRED. 
*                B. IF THE RECOVERY IN PROGRESS FLAG IS CLEAR AND AN
*                   ALTERNATE CHANNEL EXISTS (WITH AN ACTIVE DRIVER), 
*                   THE REQUEST WILL BE MODIFIED TO FORCE CONTINUATION
*                   OF ERROR RECOVERY BY THE OTHER DRIVER.
*                C. IF THE RECOVERY IN PROGRESS FLAG IS CLEAR BUT 
*                   EITHER THERE IS NO ALTERNATE ACCESS PATH OR IT HAS
*                   BEEN DOWNED, THE REQUEST WILL BE MODIFIED TO FORCE
*                   CONTINUATION OF ERROR PROCESSING ON THIS CHANNEL. 
  
          LDN    SETS        SET SUBFUNCTION
          STD    CM+1 
          LDD    PO          SET *PUT* ORDINAL
          STD    CM+2 
          LDN    1
          STD    CM+3 
          LDD    EC          SET ERROR CODE 
          STD    CM+4 
          MONITOR  BIOM 
          STD    IL          CLEAR *PUT* INTERLOCK FLAG 
          LDD    CM+1 
          ZJN    TEP2        IF PROCESSING WILL RESUME ON OTHER CHANNEL 
          AOD    RS          SET UNRECOVERED STATUS 
  
*         ISSUE THE BML MESSAGE AND INCREMENT ERROR COUNTERS IF 
*         APPROPRIATE FOR THIS ERROR TYPE AND RESOLUTION OF THE ERROR 
*         HAS BEEN DETERMINED.
  
 TEP2     LDD    RS 
          LMN    2
          ZJN    TEP3        IF UNRESOLVED ERROR
          RJM    RPI         RELEASE *PUT* INTERLOCK
 TEP3     RJM    IBM         ISSUE BML MESSAGE
  
*         CLEAR B-DISPLAY MESSAGE.
  
          LDK    ZERL 
          CRD    CM 
          LDD    CP 
          ADK    MS2W 
          CWD    CM 
          UJP    TEP4        CONTINUE CLEARING AND RETURN 
  
  
 TEPB     BSS    0
          CON    RIOC,ZJNI+RIO12-RIOC 
          CON    WIOC,ZJNI+WIO8-WIOC
  
          ERRNG  RIO12-RIOC  CODE DEPENDS ON VALUE
          ERRNG  WIO8-WIOC   CODE DEPENDS ON VALUE
  
 TEPC     BSS    0
          CON    RIOA,LDNI+FCRD 
          CON    WIOA,LDNI+FCWR 
 WFS      SPACE  4,25 
**        WFS - WAIT FOR SLAVE TO PASS THE CHANNEL. 
* 
*         THIS ROUTINE WAITS FOR THE SLAVE TO TAKE THE CHANNEL AND
*         CHECKS FOR AN ERROR STATUS FROM THE SLAVE.
* 
*         ENTRY  (RW) = READ/WRITE FLAG.
*                (SB) = FWA OF SLAVE REQUEST BUFFER.
*                (SR+2) = 2 IF END OF CURRENT TRANSFER. 
* 
*         EXIT   (A) .LT. 0  IF SLAVE ENCOUNTERED ERROR.
*                    .EQ. 0  IF NO CONSECUTIVE REQUEST FOUND. 
*                    .GT. 0  IF CONSECUTIVE REQUEST FOUND.
* 
*         USES   CB, PB, CM - CM+4, CN - CN+4.
* 
*         CALLS  CCS, IFI, IIC, RFU.
  
  
 WFS5     LDD    NB 
  
 WFS      SUBR               ENTRY/EXIT 
          RJM    IIC         ISSUE I/O COMPLETION REQUEST IF NECESSARY
          RJM    CCS         CHECK FOR CONSECUTIVE REQUEST
          LDD    SR+2 
          LMN    2
          NJN    WFS1        IF NOT END OF CURRENT TRANSFER 
          LDD    CB          ADVANCE BUFFER POINTERS
          STD    PB 
          LDD    NB 
          STD    CB 
          RJM    IFI         INITIALIZE FOR NEXT REQUEST
          LDD    NB 
          ZJN    WFS1        IF NO CONSECUTIVE REQUEST
          LDD    RW 
          ZJN    WFS1        IF READ OPERATION
          RJM    RFU         READ NEXT BLOCK FROM UEM 
 WFS1     LDD    SB 
          ADK    SBRQ 
          CRD    CM 
          LDD    CM 
          ZJN    WFS3        IF SLAVE HAS TAKEN CHANNEL 
          LDK    SDLY 
 WFS2     SBN    1
          NJN    WFS2        IF NOT END OF DELAY
          UJN    WFS1        CHECK IF SLAVE HAS CHANNEL 
  
 WFS3     LDD    SB 
          ADK    SBSE 
          SCF    *,CH        HANG WAITING FOR CHANNEL FLAG
          CRD    CN          CHECK FOR SLAVE ERROR
          LDD    CN 
          ZJP    WFS5        IF NO ERROR
          LDD    SR+2 
          NJN    WFS4        IF NOT AT END OF CURRENT TRANSFER
          LDD    PB          RESTORE CURRENT BUFFER ORDINAL 
          STD    CB 
          LDN    0           AVOID COMPLETION OF CURRENT REQUEST
          STD    PB 
 WFS4     LDD    SB 
          ADK    SBSE 
          CWD    CM          REWRITE CLEARED SLAVE ERROR FIELD
          LCN    0
          LMD    CN          COMPLEMENT ERROR CODE
          UJP    WFSX        RETURN 
 WIO      SPACE  4,40 
**        WIO - PERFORM WRITE I/O OPERATIONS. 
* 
* 
*         ENTRY  (CB) = CURRENT BUFFER ORDINAL. 
*                (EP) = 0.
*                (PB) = 0.
*                (SB) = FWA OF SLAVE REQUEST AREA.
* 
*         EXIT   (PB) = ORDINAL OF LAST BUFFER PROCESSED. 
* 
*         USES   CB, EC, EP, NB, PB, SR+2.
* 
*         CALLS  AUA, ERR, FNC, GGS, IFI, RFU, RSS, WFS.
* 
*         MACROS CCBA.
  
  
 WIO      SUBR               ENTRY/EXIT 
          RJM    IFI         INITIALIZE FOR I/O 
          RJM    RFU         READ DATA FROM UEM 
 WIO1     LDN    FCWR        ISSUE WRITE FUNCTION 
*         LDN    FCCO        (CONTROLLER ERROR RECOVERY IN PROGRESS)
 WIOA     EQU    *-1
          RJM    FNC
          PJN    WIO2        IF NO ERROR
          AOD    EP          SET PREVIOUS SECTOR ERROR FLAG 
          UJN    WIO3        CALL ERROR PROCESSOR 
  
 WIO2     LDD    SB          POST SLAVE REQUEST 
          ADK    SBRQ 
          CWD    SR 
          LDD    BS          OUTPUT DATA
          OAM    BUFF,CH
*         OAM    BUFF+HLEN,CH  (SECOND HALF OF SECTOR)
 WIOB     EQU    *-1
          ZJN    WIO4        IF NO DATA TRANSFER ERROR
          LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
          STD    EC 
          RJM    RSS         RESET SLAVE TO IDLE LOOP 
 WIO3     RJM    ERR         CALL ERROR PROCESSOR 
  
 WIO4     CCF    *,CH        PASS CHANNEL TO SLAVE
          AOD    SR+2        SET *CHANNEL DISCONNECT* FLAG
          LMN    2
          ZJN    WIO7        IF LAST BLOCK TRANSFERRED
          RJM    AUA         ADVANCE MASTER/SLAVE UEM ADDRESSES 
          RJM    RFU         READ DATA FROM UEM 
          RJM    WFS         WAIT FOR SLAVE COMPLETION
          PJP    WIO2        IF SLAVE DID NOT ENCOUNTER ERROR 
 WIO4.1   STD    EC          SET ERROR CODE 
 WIO5     UJN    WIO3        CALL ERROR PROCESSOR 
  
 WIO7     RJM    WFS         WAIT FOR SLAVE 
          MJN    WIO4.1      IF SLAVE ENCOUNTERED ERROR 
          ZJN    WIO8        IF NO CONSECUTIVE REQUEST
*         UJN    WIO8        (ERROR RECOVERY IN PROGRESS) 
 WIOC     EQU    *-1
          LDN    0           CLEAR NEXT BUFFER ORDINAL
          STD    NB 
          LJM    WIO1        PROCESS NEXT REQUEST 
  
 WIO8     RJM    GGS         GET GENERAL STATUS 
          ZJP    WIOX        IF NO ERROR
          LDD    PB          BACK UP TO PREVIOUS BUFFER 
          STD    CB 
          LDN    0           AVOID BUFFER COMPLETION
          STD    PB 
          UJN    WIO5        CALL ERROR PROCESSOR 
 WTU      SPACE  4,25 
**        WTU - WRITE TO UEM. 
* 
*         THIS ROUTINE WRITES THE BLOCK OF DATA TO UEM AFTER THE DISK 
*         READ.  WHEN WRITING THE FIRST DATA BLOCK ROUTINE *SLB* IS 
*         CALLED TO STORE LINKAGE BYTES AND SHORT PRU FLAGS IN THE CBT
*         ENTRY.
* 
*         ENTRY  (BL) = LENGTH OF DATA BLOCK IN CM WORDS. 
*                (SR+2) = 0 IF FIRST BLOCK OF SECTOR. 
*                (UA - UA+1) = UEM ADDRESS. 
*                (BUFF) = HEADER AND DATA.
* 
*         USES   CM - CM+4, T1 - T4.
* 
*         CALLS  SLB. 
  
  
 WTU      SUBR               ENTRY/EXIT 
          LDD    SR+2 
          NJN    WTU2        IF NOT FIRST BLOCK OF SECTOR 
          ERRNZ  PAD1        CODE DEPENDS ON VALUE
          STD    T1 
          LDC    BUFF+3-4 
          STD    T2 
  
*         GET SHORT PRU FLAGS, VALID DATA FLAGS AND LINKAGE BYTES FROM
*         SECTOR HEADER AND STORE THEM IN THE CBT ENTRY.
  
 WTU1     LDN    4           ADVANCE SECTOR BUFFER ADDRESS
          RAD    T2 
          CCBA   PAD1 
          ADD    T1 
          CRD    CM 
          STD    T4 
          SHN    -14
          STD    T3 
          LDI    T2          STORE SHORT PRU AND VALID DATA FLAGS 
          STD    CM+3 
          AOD    T2 
          LDI    T2          STORE LINKAGE BYTE 
          STD    CM+4 
          LDD    T3 
          SHN    14 
          LMD    T4 
          CWD    CM 
          AOD    T1          INCREMENT WORD INDEX 
          LMN    PAD4+1 
          NJN    WTU1        IF NOT FINISHED
  
*         WRITE DATA TO UEM.
  
 WTU2     SRD    T2          SAVE R-REGISTER
          LRD    UA 
          LDC    400000      USE R-REGISTER FOR WRITE ADDRESS 
          CWM    BUFF+HLEN,BL  WRITE DATA TO UEM
          LRD    T2          RESTORE R-REGISTER 
          UJP    WTUX        RETURN 
 1XM      SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMPIMB 
*CALL     COMPC2D 
 1XM      SPACE  4
          USE    PRESET      DEFINE LITERAL BLOCK BEFORE PRESET 
 BUFF     EQU    *           DATA BUFFER
          ERRPL  BUFF+DLEN+HLEN-10000  BUFFER OVERFLOWS PP
 PRS      TITLE  PRESET MASTER PROGRAM. 
 PRS      SPACE  4,10 
**        PRS - PRESET *1XM*. 
* 
*         EXIT   (BL) = MASTER BLOCK LENGTH IN CM WORDS.
*                (CC) = 0.
*                (CS) = 1.
*                (EC) = 0.
*                (EP) = 0.
*                (ER) = 0.
*                (FU - FU+1) = UEM BASE ADDRESS.
*                (IL) = 0.
*                (PB) = 0.
*                (RC) = 0.
*                (TI) = 0.
*                (BMLCR) = 6/ CHANNEL, 6/0. 
*                (BMLMF) = MAINFRAME ID.
*                (BMLPP) = 6/ PP NUMBER, 6/ CHANNEL.
*                (CCRA) = WORD ADDRESS OF CHANNEL TABLE ENTRY.
*                (CCRB) = BYTE ADDRESS OF CHANNEL TABLE ENTRY + LDDI. 
*                (CRQA) = FWA OF PP EXCHANGE PACKAGE. 
*                (CRQB) = FWA OF PP EXCHANGE PACKAGE. 
*                (CRQC) = CPU EXCHANGE INSTRUCTION (MXN). 
*                (CRQD) = FIRST WORD OF PP EXCHANGE PACKAGE.
*                (MSD) = 0. 
*                (SCDA) = WORD ADDRESS OF CONTROLWARE TABLE ENTRY.
*                (SCDB) = BIT NUMBER OF DRIVER DROP FLAG. 
*                ALL *CCBA* REFERENCES TO *CBT* PLUGGED.
*                ALL *CPTA* REFERENCES TO *PUT* PLUGGED.
*                ALL *EMBE* REFERENCES TO *EMB* PLUGGED.
* 
*         USES   BL, CC, CS, EC, EP, ER, IL, PB, RC, TI, CM - CM+4, 
*                CN - CN+4, T0 - T7.
* 
*         CALLS  DFM, RCH, SSL. 
* 
*         MACROS CPTA, MONITOR, SETMS, SFA. 
  
  
 PRS      SUBR               ENTRY/EXIT 
          SETMS  NODRIVER    FORCE DRIVER LOAD ON NEXT *SETMS*
          LDK    NCPL        VALIDATE CALLER
          CRD    CM 
          AOD    CM+1        NUMBER OF CONTROL POINTS 
          SHN    7
          LMD    CP 
          ZJN    PRS1        IF SYSTEM CONTROL POINT
          LDC    =C* 1XM - UNAUTHORIZED CALL.*
          RJM    DFM         ISSUE DAYFILE MESSAGE
          MONITOR  ABTM      ABORT CONTROL POINT
          LJM    PPR         RETURN 
  
 PRS1     LDD    IR+3 
          ZJN    PRS2        IF MASTER
          EXECUTE  2XM,PPFW-5 
  
 PRS2     STD    CC          CLEAR COMPLETION REQUEST COUNT 
          STD    CS          CLEAR CHANNEL STATUS 
          STD    EC          CLEAR ERROR CODE 
          STD    EP          CLEAR ERROR ON PREVIOUS SECTOR FLAG
          STD    ER          CLEAR RECOVERY IN PROGRESS FLAG
          STD    IL          CLEAR *PUT* INTERLOCK FLAG 
          STD    RC          CLEAR RETRY COUNT
          STD    TI          INITIALIZE *TPOR* INDEX
          LDK    DLEN/5      SET MASTER BLOCK SIZE
          STD    BL 
          LDD    IR+4        CHANNEL NUMBER 
          STM    BMLPP
  
*         PLUG CHANNEL INSTRUCTIONS.
  
          LDC    PRSD        SET FWA OF CHANNEL TABLE 
          STD    T1 
 PRS3     LDI    T1 
          ZJN    PRS4        IF END OF CHANNEL TABLE
          STD    T2 
          LDD    IR+4        CHANNEL
          RAI    T2          STORE CHANNEL IN INSTRUCTION 
          AOD    T1          ADVANCE CHANNEL TABLE POINTER
          UJN    PRS3        CONTINUE 
  
*         REQUEST CHANNEL AND SET CHANNEL FLAG. 
  
 PRS4     RJM    RCH         REQUEST CHANNEL
          ZJN    PRS4        IF CHANNEL NOT ASSIGNED
  
*         PLUG EXCHANGE PACKAGE LOCATIONS.
  
 PRS5     LDK    PXPP        READ PPU STATUS
          CRD    CN 
          ADN    1
          CRM    CRQD,ON     READ FIRST WORD OF PP XP 
          AOM    CRQD+4 
          LDK    PPCP        READ PP COMMUNICATIONS AREA POINTER
          CRD    CM 
          ADK    MMFL-PPCP
          CRD    T1 
          LDD    T1          SAVE MAINFRAME ID
          STM    BMLMF
          LDD    IA          GET ((PP NUMBER - 2) * 10B)
          SBD    CM+4 
          SBN    20 
          SHN    -3 
          STD    T1          PP NUMBER - 2
          SBN    10 
          MJN    PRS5.1      IF PP 0-11 
          ADN    6           ADJUST FOR PP 20-31
 PRS5.1   ADN    12 
          SHN    6
          RAM    BMLPP       SET PP NUMBER
          SHN    6
          STM    BMLCR       SET RECOVERY CHANNEL 
          LDD    T1          PP NUMBER - 2
          SHN    4
          ADD    T1          (PP NUMBER - 2) * 21B
          RAD    CN+4        SET EXCHANGE ADDRESS 
          STM    CRQA 
          STM    CRQB 
          SHN    -14
          RAD    CN+3 
          RAM    CRQA-1 
          STM    CRQB-1 
          LDD    CN+4        SET *MA* ADDRESS 
          ADN    6
          STM    CRQE 
          SHN    -14
          ADD    CN+3 
          RAM    CRQE-1 
          LDD    IR+4 
          STD    T2 
          LDK    ACPL        CHECK CPU STATUS 
          CRD    CM 
          LCN    0
          STD    T1          PRESET CHANNEL TABLE WORD INDEX
          LDN    60D         PRESET BIT POSITION FOR LOAD REQUEST 
          STD    T3 
          LDD    CM 
          SHN    21-13
          PJN    PRS6        IF CPU 0 ON
          AOM    CRQC        SET EXCHANGE TO CPU 1
          LDD    HN 
          RAM    CRQD+3      SET (A0) TO 1
  
*         PLUG CHANNEL TABLE ADDRESSES. 
  
 PRS6     AOD    T1          ADVANCE CM TABLE INDEX 
          LCN    5
          RAD    T2 
          PJN    PRS6        IF NOT TO PROPER INDEX 
          ADN    5
          RAM    CCRB        PRESET CHANNEL TABLE BYTE INDEX
          LPN    7           BYTE ADDRESS 
          STD    T2 
 PRS7     LCN    12D
          RAD    T3          DECREMENT POSITION 
          SOD    T2 
          PJN    PRS7        IF NOT TO PROPER POSITION
          LDD    T3          BIT POSITION 
          ADN    13          ADD OFFSET WITHIN BYTE 
          SHN    6
          SBK    200
          STM    SCDB+1 
          LDK    CHTP        CHANNEL TABLE(S) POINTER 
          CRD    CM 
          LDD    CM+2        FWA OF CHANNEL TABLE 
          SHN    14 
          LMD    CM+3 
          ADD    T1          ADD WORD INDEX 
          STM    CCRA        CM ADDRESS OF CHANNEL TABLE ENTRY
          SHN    -14
          RAM    CCRA-1 
          LDD    CM+2        COMPUTE FWA OF CONTROLWARE TABLE 
          SHN    14 
          LMD    CM+3 
          ADN    CTALL*2
          ADD    T1          ADD WORD INDEX 
          STM    SCDA 
          SHN    -14
          RAM    SCDA-1 
  
*         SET UEM BASE ADDRESS. 
  
          LDK    UEML 
          CRD    CM 
          LDD    CM 
          SHN    21-2 
          STD    FU 
          SHN    2-21 
          SHN    11 
          STD    FU+1 
  
*         PLUG *EMB* ADDRESSES. 
  
          LDK    EMBP        FETCH *EMB* POINTER
          CRD    CM 
 .CM1     EQU    CM+1 
          LDC    .CM1*10000+PRSC
          RJM    STA         SET *EMB* ADDRESSES
  
*         READ BUFFERED I/O TABLE POINTERS. 
  
          LDK    BIOL 
          CRD    CM 
          LDD    CM+1 
          SHN    14 
          LMD    CM+2 
          ADK    CCTP        GET *CCT* DESCRIPTOR 
          CRD    CA 
          ADK    PUTP-CCTP   GET *PUT* DESCRIPTOR 
          CRD    T3 
          ADN    CBTP-PUTP   GET *CBT* DESCRIPTOR 
          CRD    CN 
          AOD    T3 
  
*         PLUG *CCT* ADDRESS. 
  
          LDD    IR+2        SET ADDRESS OF *CCT* 
          SHN    CCTLS-6
          ADD    CA+4 
          RAM    OVIA+1 
          STM    RPIA+1 
          SHN    -14
          ADD    CA+3 
          RAM    OVIA 
          STM    RPIA 
  
*         PLUG *CBT* ADDRESSES. 
  
 .CN3     EQU    CN+3 
          LDC    .CN3*10000+PRSA
          RJM    STA         SET *CBT* ADDRESSES
  
*         PLUG *PUT* ADDRESSES. 
  
          LDC    T6*10000+PRSB
          RJM    STA         SET *PUT* ADDRESSES
  
*         BUILD *TPOR* TABLE. 
  
 PRS11    STD    T1          INITIALIZE *TPOR* INDEX
 PRS12    SOD    T3          DECREMENT *PUT* ORDINAL
          ZJP    PRS14       IF SCAN COMPLETE 
          CPTA   UNCT,A      READ *PUT* ENTRY 
          CRD    CM 
          SFA    EST,CM+1    READ EST ENTRY 
          ADK    EQDE 
          CRD    CM 
          LDN    0           INITIALIZE EST CHANNEL BYTE INDEX
          STD    T2 
          LDD    CM+1 
          LPN    77 
          LMD    IR+4 
          ZJN    PRS13       IF DEVICE SUPPORTED BY THIS DRIVER 
          LDD    CM+2 
          ZJN    PRS12       IF SINGLE ACCESS DEVICE
          LPN    77 
          LMD    IR+4 
          NJN    PRS12       IF DEVICE NOT SUPPORTED BY THIS DRIVER 
          AOD    T2          INCREMENT CHANNEL BYTE INDEX 
 PRS13    AOD    T1          INCREMENT *TPOR* INDEX 
          ERRNZ  TPORE-1     CODE DEPENDS ON VALUE
          LMK    MAXU+1 
          ZJN    PRS13.1     IF TOO MANY UNITS ON CHANNEL 
          LDD    T3          POSITION *PUT* ORDINAL 
          SHN    1
          LMD    T2          SET CHANNEL BYTE INDEX 
          STM    TPOR-1,T1
          UJP    PRS12       CONTINUE SCAN
  
 PRS13.1  LDC    =C* 1XM - TOO MANY UNITS ON CHANNEL.*
          RJM    DFM         ISSUE SYSTEM DAYFILE MESSAGE 
          MONITOR  HNGM 
          UJN    *           HANG 
  
 PRS14    RJM    SSL         START SLAVE
          LDN    0           CLEAR PREVIOUS BUFFER ORDINAL
          STD    PB 
          LJM    PRSX        RETURN 
 1XM      SPACE  4
 PRSA     BSS    0           TABLE OF *CBT* ADDRESSES 
 TCBT     HERE
          CON    0           TERMINATE TABLE
  
 PRSB     BSS    0           TABLE OF *PUT* ADDRESSES 
 TPUT     HERE
          CON    0           TERMINATE TABLE
  
 PRSC     BSS    0           TABLE OF *EMB* ADDRESSES 
          QUAL   COMPIMB
 TEMB     HERE
          QUAL   *
          CON    0           TERMINATE TABLE
  
 PRSD     BSS    0           TABLE OF CHANNEL INSTRUCTION ADDRESSES 
          CHTB
 SSL      SPACE  4,20 
**        SSL - START SLAVE.
* 
*         SET UP SLAVE INPUT REGISTER.
*         CALL MONITOR TO START SLAVE.
*         FIND SLAVE PP COMMUNICATION AREA. 
*         WAIT FOR SLAVE TO INITIALIZE. 
* 
*         ENTRY  (IR - IR+4) = INPUT REGISTER.
* 
*         EXIT   (SB) = SLAVE REQUEST BUFFER ADDRESS. 
* 
*         USES   IR+2, IR+3, T1 - T7, CM - CM+4.
*         CALLS  C2D. 
* 
*         MACROS DELAY, MONITOR.
  
  
 SSL      SUBR               ENTRY/EXIT 
          LDD    IR+4        STORE CHANNEL NUMBER IN MESSAGE
          RJM    C2D
          STM    SSLA+7 
          LDD    CP          ISSUE WAIT MESSAGE 
          ADK    MS2W 
          CWM    SSLA,TR
          LDN    0
          STD    IR+2 
          LDN    1
          STD    IR+3        SET SLAVE FLAG 
          LDD    MA 
          CWD    IR          PUT SLAVE INPUT REGISTER IN MESSAGE BUFFER 
 SSL1     LDN    0
          STD    CM+1        CLEAR MONITOR REPLY BYTE 
          MONITOR  RPPM      START SLAVE
          LDD    CM+1 
          NJN    SSL2        IF SLAVE STARTED 
          DELAY 
          UJN    SSL1        RETRY SLAVE STARTUP
  
 SSL2     LDK    PPUL 
          CRD    CM          GET NUMBER OF PPS
          LDD    CM+2 
          STD    T1          SAVE NUMBER OF PPS 
          LDK    PPCP 
          CRD    T2          GET FWA OF PP COMMUNICATION AREA 
 SSL3     DELAY              GIVE PP A CHANCE TO INITIALIZE 
          LDN    2
          STD    T7          START SEARCH WITH PP 2 
 SSL4     LDD    T7 
          SHN    3
          ADD    T2+4 
          STD    T2 
          CRD    CM          READ PP INPUT REGISTER 
          LDD    CM 
          LMD    IR 
          NJN    SSL5        IF NOT *1XM* 
          LDD    CM+1 
          LMD    IR+1 
          NJN    SSL5        IF NOT *1XM* 
          LDD    CM+4 
          LMD    IR+4 
          NJN    SSL5        IF NOT PROCESSING SAME CHANNEL 
          LDD    CM+3 
          NJN    SSL6        IF SLAVE FOUND 
 SSL5     AOD    T7          CHECK NEXT PP
          SBD    T1 
          ZJN    SSL3        IF ALL PPS CHECKED 
          UJN    SSL4        CHECK NEXT PP
  
 SSL6     LDD    CM+2 
          NJN    SSL7        IF SLAVE IS INITIALIZED
          DELAY 
          LDD    T2 
          CRD    CM          READ PP INPUT REGISTER 
          UJN    SSL6        WAIT FOR SLAVE TO START
  
 SSL7     LDD    T2 
          ADN    2
          STD    SB          SAVE SLAVE REQUEST BUFFER ADDRESS
          LDD    CP          CLEAR WAIT MESSAGE 
          ADK    MS2W 
          CWD    IR+2 
          LJM    SSLX        RETURN 
  
  
 SSLA     DATA   C*WAITING FOR CH00 SLAVE PP.*
 STA      SPACE  4,10 
**        STA - SET TABLE ADDRESSES.
* 
*         ENTRY  (A) = 6/ TP, 12/ TA
*                      TP = TABLE POINTER.
*                      TA = INSTRUCTION TABLE ADDRESS.
* 
*         EXIT   (A) = 0. 
* 
*         USES   T0, T1, T2.
  
  
 STA1     STD    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 
          AOD    T0          ADVANCE INSTRUCTION LIST 
 STA2     LDI    T0 
          NJN    STA1        IF NOT END OF TABLE
  
 STA      SUBR               ENTRY/EXIT 
          STD    T0 
          SHN    -14         SET ADDRESS POINTER
          STD    T1 
          UJN    STA2        ENTER LOOP 
 1XM      SPACE  4
          OVERFLOW
  
          USE    *
  
          TTL    1XM/2XM - 7195/895 (CCC) DRIVER. 
 2XM      TITLE  SLAVE DRIVER.
          QUAL   2XM
          IDENT  2XM,SXMX 
*COMMENT  1XM - SLAVE FOR THE 7165/895 DRIVER.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 2XM      EJECT 
          ORG    PPFW 
 SXM      SUBR               ENTRY
          RJM    PRS         PRESET 
 2XM      SPACE  4
**        SLV - SLAVE MAIN PROGRAM. 
  
  
 SLV      LDN    0           CLEAR ERROR CODE 
          STD    EC 
          RJM    WFR         WAIT FOR REQUEST 
          LMK    SLRD 
          ZJN    SLV1        IF READ REQUEST
          LMK    SLWR&SLRD
          ZJN    SLV2        IF WRITE REQUEST 
          LDK    DPPM        DROP PP
          RJM    FTN
          LJM    PPR         RETURN TO IDLE LOOP
  
 SLV1     RJM    RPR         PROCESS READ REQUEST 
          UJN    SLV         PROCESS NEXT FUNCTION
  
 SLV2     RJM    WPR         PROCESS WRITE REQUEST
          UJN    SLV         PROCESS NEXT FUNCTION
 PER      SPACE  4,20 
**        PER - POST ERROR MESSAGE FOR MASTER.
* 
*         THIS ROUTINE STORES THE ERROR CODE IN THE SLAVE ERROR 
*         BUFFER FOR THE MASTER TO SEE. 
* 
*         ENTRY  (A) = COMPLEMENTED ERROR CODE. 
* 
*         EXIT   (EC) = ERROR CODE. 
* 
*         USES   EC, CM - CM+4. 
  
  
 PER      SUBR               ENTRY/EXIT 
          LMC    777777 
          STD    EC          STORE ERROR CODE 
          LDK    ZERL 
          CRD    CM 
          LDD    EC 
          STD    CM          PLUG ERROR CODE
          LDD    MA 
          ADK    SBSE 
          CWD    CM          POST ERROR IN SLAVE ERROR BUFFER 
          UJN    PERX        RETURN 
 RPR      SPACE  4,30 
**        RPR - READ REQUEST PROCESSOR. 
* 
*         ENTRY  (BS) = BLOCK SIZE. 
*                (SR - SR+4) = READ REQUEST FROM MASTER.
* 
*         USES   CM, T2 - T3. 
* 
*         CALLS  PER, WFC.
  
  
 RPR      SUBR               ENTRY/EXIT 
          RJM    WFC         WAIT FOR CHANNEL 
          NJN    RPRX        IF MASTER ENCOUNTERED AN ERROR 
          LDC    BUFLGTH     INPUT DATA BLOCK 
          IAM    BUFFER,CH
          ZJN    RPR1        IF ALL DATA TRANSFERRED
          LCN    IDTE        SET *DATA TRANSFER* ERROR CODE 
          UJN    RPR3        CONTINUE 
  
 RPR1     LDD    SR+2 
          ZJN    RPR4        IF NOT TIME TO DISCONNECT
          SFM    RPR2,CH     IF CHANNEL PARITY ERROR
          DCN    CH+40
          UJN    RPR4        CONTINUE 
  
 RPR2     LCN    CHPE        SET *CHANNEL PARITY* ERROR CODE
 RPR3     RJM    PER         POST ERROR TO MASTER 
 RPR4     LDD    MA          SET READ INCOMPLETE
          ADK    SBRC 
          CWD    CM 
          CCF    *,CH        PASS CHANNEL TO MASTER 
          LDD    EC 
          NJN    RPR5        IF ERROR ENCOUNTERED 
          SRD    T2          SAVE R-REGISTER
          LRD    SR+3        LOAD R-REGISTER WITH UEM ADDRESS 
          LDC    400000      USE R-REGISTER FOR WRITE ADDRESS 
          CWM    BUFFER,BS   WRITE BLOCK TO UEM 
          LRD    T2 
 RPR5     AOD    CM          SET READ COMPLETE
          LDD    MA 
          ADK    SBRC 
          CWD    CM          POST COMPLETE MESSAGE TO MASTER
          UJP    RPRX        RETURN 
 WFC      SPACE  4,25 
**        WFC - WAIT FOR CHANNEL FLAG.
* 
*         THIS ROUTINE OBTAINS CONTROL OF THE CHANNEL AND NOTIFIES
*         THE MASTER THAT IT HAS THE CHANNEL. 
* 
*         ENTRY  (CM) = 0.
* 
*         EXIT   (A) = 0 IF READY FOR I/O.
*                    .NE. 0 IF MASTER REPORTED ERROR. 
*                (CM) = 0.
* 
*         USES   CM - CM+4. 
  
  
 WFC      SUBR               ENTRY/EXIT 
          LDD    MA 
          ADK    SBRQ 
          SCF    *,CH        GET CHANNEL FLAG 
          CWD    CM          INDICATE CHANNEL TAKEN 
          ADK    SBME-SBRQ
          CRD    CM          READ MASTER ERROR FLAG WORD
          LDD    CM 
          ZJN    WFCX        IF NO ERROR ENCOUNTERED
          LDN    0
          STD    CM          CLEAR MASTER ERROR FLAG
          LDD    MA 
          ADK    SBME 
          CWD    CM          UPDATE MASTER ERROR FLAG WORD
          CCF    *,CH        RETURN CHANNEL TO MASTER 
          UJN    WFCX        RETURN 
 WFR      SPACE  4,20 
**        WFR - WAIT FOR REQUEST FROM MASTER. 
* 
* 
*         EXIT   (A) = SLAVE REQUEST TO PROCESS.
*                (CM) = 0.
*                (SR - SR+4) = REQUEST BUFFER.
* 
*         USES   CM - CM+4, SR - SR+4.
  
  
 WFR      SUBR               ENTRY/EXIT 
          LDK    ZERL 
          CRD    CM 
 WFR1     LDD    MA 
          ADK    SBRQ 
          CRD    SR          READ SLAVE REQUEST BUFFER
          LDD    SR 
          NJN    WFRX        IF REQUEST TO PROCESS
          LDK    SDLY 
 WFR2     SBN    1
          NJN    WFR2        IF DELAY NOT FINISHED
          UJN    WFR1        LOOK FOR REQUEST 
 WPR      SPACE  4,30 
**        WPR - WRITE REQUEST PROCESSOR.
* 
*         ENTRY  (BS) = BLOCK SIZE. 
*                (SR - SR+4) = WRITE REQUEST FROM MASTER. 
* 
*         USES   T2 - T3. 
* 
*         CALLS  PER, WFC.
  
  
 WPR      SUBR               ENTRY/EXIT 
          SRD    T2          SAVE R-REGISTER
          LRD    SR+3        LOAD UEM ADDRESS INTO R-REGISTER 
          LDC    400000      USE R-REGISTER FOR READ ADDRESS
          CRM    BUFFER,BS   READ BLOCK FROM UEM
          LRD    T2          RESTORE R-REGISTER 
          RJM    WFC         WAIT FOR CHANNEL 
          NJN    WPRX        IF MASTER ERROR ENCOUNTERED
          LDC    BUFLGTH     OUTPUT DATA BLOCK
          OAM    BUFFER,CH
          ZJN    WPR1        IF DATA TRANSFER COMPLETE
          LCN    IDTE        SET *DATA TRANSFER* ERROR CODE 
          UJN    WPR3        POST ERROR TO MASTER 
  
 WPR1     LDD    SR+2 
          ZJN    WPR5        IF NOT TIME TO DISCONNECT CHANNEL
 WPR2     EJM    WPR4,CH     IF LAST BYTE ACCEPTED
          ADN    1
          NJN    WPR2        IF NOT TIMEOUT 
          LCN    CHFE        SET *CHANNEL FAILURE* ERROR CODE 
 WPR3     RJM    PER         POST ERROR 
 WPR4     DCN    CH+40       DISCONNECT CHANNEL 
 WPR5     CCF    *,CH        PASS CHANNEL TO MASTER 
          UJP    WPRX        RETURN 
 2XM      SPACE  4
          USE    PRESET      DEFINE LITERALS BLOCK BEFORE PRESET
  
 BUFLGTH  EQU    SPRU*100*5  BUFFER LENGTH
 BUFFER   EQU    10000-BUFLGTH
  
          ERRNG  BUFFER-*    CODE OVERFLOWS INTO BUFFER AREA
  
 PRS      TITLE  PRESET SLAVE PROGRAM.
**        PRS - PRESET SLAVE FOR PROCESSING.
* 
*         ENTRY  (IR - IR+4) = PP INPUT REGISTER. 
* 
*         EXIT   (BS) = BUFFER LENGTH IN CM WORDS.
*                (IR+2) = 1.
* 
*         USES   BS, IR+2, T1, T2, CM - CM+4. 
  
  
 PRS      SUBR               ENTRY/EXIT 
  
*         PLUG CHANNEL INSTRUCTIONS.
  
          LDC    PRSA        SET FWA OF CHANNEL TABLE 
          STD    T1 
 PRS1     LDI    T1 
          ZJN    PRS2        IF END OF CHANNEL TABLE
          STD    T2 
          LDD    IR+4        CHANNEL
          RAI    T2          STORE CHANNEL IN INSTRUCTION 
          AOD    T1          ADVANCE CHANNEL TABLE POINTER
          UJN    PRS1        CONTINUE 
  
 PRS2     LDK    ZERL 
          CRD    CM 
          LDD    MA 
          ADK    SBRQ 
          CWD    CM          CLEAR SLAVE REQUEST BUFFER 
          ADK    SBSE-SBRQ
          CWD    CM          CLEAR SLAVE ERROR BUFFER 
          ADK    SBME-SBSE
          CWD    CM          CLEAR MASTER ERROR BUFFER
          AOD    CM          SET READ COMPLETE FLAG 
          LDD    MA 
          ADK    SBRC 
          CWD    CM 
          AOD    IR+2        SET SLAVE STARTED FLAG 
          LDD    IA          TELL MASTER SLAVE IS UP
          CWD    IR 
          LDK    BUFLGTH/5   SET BLOCK LENGTH 
          STD    BS 
          UJP    PRSX        RETURN 
 TCHA     SPACE  4,10 
 PRSA     BSS    0           TABLE OF CHANNEL INSTRUCTION ADDRESSES 
          CHTB
 2XM      SPACE  4
          OVERFLOW
  
          USE    *
  
          TTL    1XM/2XN - 7195/895 (CCC) DRIVER. 
 2XN      TITLE  RELOAD CONTROLWARE.
          QUAL   2XN
          IDENT  2XN,RLCX 
*COMMENT  1XM - RELOAD CONTROLWARE FOR THE 7165/895 DRIVER. 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 2XN      SPACE  4,10 
          ORG    BUFF+505B
 RLC      SPACE  4,10 
**        RLC - RELOAD CONTROLWARE. 
* 
*         EXIT   (A) .EQ. 0 IF RELOAD SUCCESSFUL. 
*                (A) .NE. 0 IF RELOAD ATTEMPT FAILED. 
  
  
 RLC      SUBR               ENTRY/EXIT 
          RJM    PRS         PRESET 
  
*         CHECK FOR SYSEDIT IN PROGRESS AND DELAY IF NECESSARY. 
  
 RLC1     LDK    PLDP        CHECK PERIPHERAL DIRECTORY POINTER 
          CRD    CM 
          LDD    CM 
          ADD    CM+1 
          NJN    RLC2        IF SYSEDIT NOT IN PROGRESS 
          DELAY 
          UJN    RLC1        RECHECK SYSEDIT IN PROGRESS
  
*         FIND CONTROLWARE. 
  
 RLC2     LDN    ZERL 
          CRD    CM 
          LDD    MA          PUT CONTROLWARE ID IN MESSAGE BUFFER 
          CWM    RLCA,ON
          MONITOR  SCDM      SEARCH CENTRAL DIRECTORY 
          LDD    CM+3 
          SHN    14 
          LMD    CM+4 
          CRD    CM          READ *PST* ENTRY 
          LDD    CM+1 
          SHN    21-12
          PJN    RLC3        IF NOT CM RESIDENT 
          LDD    CM+3        GET ADDRESS OF *RCL* ENTRY 
          SHN    14 
          LMD    CM+4 
          ADN    1
          CRD    CN          READ 5200 RECORD HEADER
          ADN    1           SET FWA OF 5200 RECORD DATA
          STD    CM+4 
          SHN    -14
          STD    CM+3 
          LCN    1           ADJUST WORD COUNT FOR HEADER 
          RAD    CN+4 
  
*         LOAD CONTROLWARE. 
  
          LDK    FCAL        AUTOLOAD FUNCTION
          RJM    FNC         ISSUE FUNCTION AND ACTIVATE CHANNEL
          ZJN    RLC4        IF NO ERROR ON FUNCTION
 RLC3     DCN    CH+40
          UJP    RLCX        RETURN WITH ERROR INDICATION 
  
 RLC4     LDD    CN+4 
 RLC5     SBD    HN 
          MJN    RLC6        IF LESS THAN 100B WORDS LEFT 
          LDN    0
 RLC6     ADD    HN 
          STD    T1 
          LDD    CM+3 
          SHN    14 
          LMD    CM+4 
          CRM    BUFF,T1     READ BLOCK OF CONTROLWARE FROM CM
          STD    CM+4        UPDATE BLOCK ADDRESS 
          SHN    -14
          STD    CM+3 
          LDD    T1          SET BYTES TO TRANSFER
          SHN    2
          ADD    T1 
          OAM    BUFF,CH     LOAD BLOCK OF CONTROLWARE TO CCC 
          FJM    *,CH        IF TRANSFER NOT COMPLETE 
          NJN    RLC3        IF INCOMPLETE TRANSFER 
          LDD    CN+4 
          SBD    T1 
          STD    CN+4 
          NJN    RLC5        IF MORE WORDS TO TRANSFER
          DCN    CH+40
          DELAY 
          RJM    GGS         GET GENERAL STATUS 
          UJP    RLCX        RETURN 
  
  
 RLCA     VFD    42/0LMA464,18/0  CONTROLWARE NAME
 PRS      SPACE  4,10 
**        PRS - PRESET RELOAD CONTROLWARE OVERLAY.
* 
*         EXIT   CHANNEL INSTRUCTIONS SET UP. 
* 
*         USES   T1, T2.
  
  
 PRS      SUBR               ENTRY/EXIT 
          LDC    PRSA        SET FWA OF CHANNEL TABLE 
          STD    T1 
 PRS1     LDI    T1 
          ZJN    PRSX        IF END OF CHANNEL TABLE
          STD    T2 
          LDD    IR+4        CHANNEL
          RAI    T2          STORE CHANNEL IN INSTRUCTION 
          AOD    T1          ADVANCE CHANNEL TABLE POINTER
          UJN    PRS1        CONTINUE 
 TCHA     SPACE  4,10 
 PRSA     BSS    0           TABLE OF CHANNEL INSTRUCTION ADDRESSES 
          CHTB
 2XN      SPACE  4,10 
          OVERFLOW  RLCX,EPFW 
          END 
