1HP 
          IDENT  1HP,FHP
 1HP      TITLE  1HP - 885-42 DRIVER. 
          PERIPH
          BASE   MIXED
          SST 
*COMMENT  1HP - 885-42 DRIVER.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 1HP      SPACE  4,10 
***       1HP - 885-42 DRIVER.
* 
*         P. T. BARNETT.     83/09/04.
*         R. M. DANISCH.     85/12/23.
 1HP      SPACE  4,10 
***       1HP PROVIDES THE CAPABILITY TO ACCESS THE 885-42 DRIVE
*         THROUGH THE 7155-401 (FA211-C) CONTROLLER.  1HP IS A
*         DEDICATED PROGRAM THAT IS INITIATED AT DEADSTART AND REMAINS
*         ACTIVE AS LONG AS ITS CHANNEL IS UP AND FUNCTIONAL.  1HP USES 
*         THE *BIOM* MONITOR FUNCTION TO COMMUNICATE WITH *CPUMTR*. 
 1HP      SPACE  4,10 
***       CALL FORMAT - 
* 
*T,IR     18/*1HP*, 1/0, 5/CP, 6/CCTO, 18/0, 12/CH
* 
*         CP     CONTROL POINT NUMBER (MUST BE SYSTEM CP).
* 
*         CCTO   CCT ORDINAL. 
*         CH     CHANNEL NUMBER.
 1HP      SPACE  4,35 
***       ORGANIZATION OF 885-42. 
* 
*         UP TO THREE 885-42 UNITS CAN BE COMBINED TO FORM
*         A LOGICAL DEVICE. 
* 
*         EQUIPMENT TYPE = *DB*.
* 
*         SECTORS/TRACK = 640 LOGICAL / 160 PHYSICAL. 
*           (4 LOGICAL SECTORS FORM 1 PHYSICAL SECTOR)
* 
*         CM WORDS/PHYSICAL SECTOR = 400B.
* 
*         LOGICAL SECTORS/PHYSICAL SECTOR = 4.
* 
*         LOGICAL SECTORS/LOGICAL TRACK = 1200B (640D). 
* 
*         LOGICAL SECTORS/BUFFER = 40B. 
* 
*         TRACKS/UNIT = 3222B (1682D).
* 
*         WORDS/UNIT = 68,894,720.
* 
*         UNITS/DEVICE = 1-3. 
* 
*         WORDS/DEVICE = 68,894,720 - 206,684,160.
* 
*         MAXIMUM DATA RATE = 491.52 K WORDS/SECOND.
 1HP      SPACE  4,20 
**        MESSAGES. 
* 
*         * EQXXX CC ERROR RETRY UNDERWAY.* 
*         ISSUED TO THE SYSTEM CONTROL POINT FOR PRESENTATION ON THE
*         B-DISPLAY TO ALERT THE OPERATOR THAT ERROR RECOVERY IS BEING
*         PERFORMED ON THE DEVICE WHOSE EST ORDINAL IS XXX.  THE TWO
*         CHARACTER MNEMONIC CC DESCRIBES THE ERROR TYPE. 
* 
*         * 1HP - UNAUTHORIZED CALL.* 
*         ISSUED TO THE SYSTEM DAYFILE IF 1HP WAS NOT CALLED FROM 
*         THE SYSTEM. 
 1HP      SPACE  4,65 
**        IMPLEMENTATION NOTES. 
* 
*         THE 7155-401 CONTROLLER IS CONNECTED TO ESM THROUGH A LOW 
*         SPEED PORT, AND THE DATA TRANSFER IS DONE THROUGH THAT
*         CONNECTION.  THEREFORE, UPON ISSUING A READ OR WRITE
*         FUNCTION, A 2-BYTE ESM ADDRESS IS SENT TO THE CONTROLLER
*         THROUGH THE CHANNEL, AND THEN THE CHANNEL IS DISCONNECTED.
*         *1HP* IS THEN FREE TO DO AS IT PLEASES WHILE THE CONTROLLER 
*         READS/WRITES THE DATA FROM/TO ESM.  SOMETIME BEFORE ISSUING 
*         THE NEXT READ/WRITE FUNCTION *1HP* WILL ISSUE A GENERAL 
*         STATUS FUNCTION.  THE CONTROLLER WILL PROVIDE STATUS ONLY 
*         AFTER COMPLETION OF THE DATA TRANSFER.
* 
*         IN ORDER TO MAXIMIZE THE TRANSFER RATE, *1HP* WILL SCAN THE 
*         UNIT QUEUE WHILE WAITING FOR I/O COMPLETION TO SEE IF THE 
*         CURRENT TRANSFER CAN BE CONTINUED.  IF THE 10B SECTORS
*         IMMEDIATELY FOLLOWING THE CURRENT 10B SECTORS ARE TO
*         BE USED IN THE SAME TRANSFER DIRECTION, *1HP* WILL CONTINUE 
*         THE OPERATION, WITHOUT LOSING A DISK REVOLUTION.
*         DURING THE SUCCEEDING TRANSFER, *1HP* WILL ATTEMPT TO NOTIFY
*         *CPUMTR* OF COMPLETION ON THE PREVIOUS BUFFER.
 1HP      SPACE  4,10 
*         COMMON DECKS. 
  
*CALL     COMPMAC 
 RICHI$   EQU    1           SELECT DEFERRED INSTRUCTION REDEFINITION 
*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.
 1HP      SPACE  4,10 
**        DIRECT CELL ASSIGNMENTS.
  
  
 RS       EQU    16          ERROR RECOVERY STATUS
 ER       EQU    17          ERROR RECOVERY IN PROGRESS 
 CC       EQU    20          COMPLETION REQUEST 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     SCRATCH
 WB       EQU    SR - SR+4   FOR *COMPIMB* COMPATIBILITY
 PI       EQU    32          *PADN* WORD INDEX
 CN       EQU    33 - 37     SCRATCH (5 CELLS)
 CD       EQU    40 - 45     CURRENT DATA (6 CELLS) 
 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          *PUT* ORDINAL
 S2       EQU    67          SCRATCH
 1HP      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 
 FCCO     EQU    14          CONTINUE 
 FCDS     EQU    23          DETAILED STATUS
 FCES     EQU    66          EXTENDED GENERAL STATUS
 FCAL     EQU    414         AUTOLOAD 
 1HP      SPACE  4,10 
**        STATUS AND CONTROL REGISTER FUNCTION CODE(S). 
  
 FCTC     EQU    3000        TEST AND CLEAR *SCR* BIT 
 1HP      SPACE  4,10 
**        ASSEMBLY CONSTANTS. 
  
  
 BFRL     EQU    10          *EMB* FLUSH RETRY COUNT
 CH       EQU    0           MASS STORAGE CHANNEL 
 EMAI     EQU    400         EXTENDED MEMORY ADDRESS INCREMENT
 FCESL    EQU    5           LENGTH OF EXTENDED GENERAL STATUS
 FCRDL    EQU    2           NUMBER OF PARAMETER BYTES FOR READ 
 FCSKL    EQU    4           NUMBER OF PARAMETER BYTES FOR SEEK 
 FCWRL    EQU    6           NUMBER OF PARAMETER BYTES FOR WRITE
 MAXU     EQU    16D         MAXIMUM NUMBER OF UNITS PER CHANNEL
 PCRL     EQU    10          PP CALL RETRY LIMIT
 MFRL     EQU    10          MONITOR FUNCTION RETRY LIMIT 
 PPSLB    EQU    10          PHYSICAL SECTORS PER BUFFER
 PSPT     EQU    40          PHYSICAL SECTORS PER PHYSICAL TRACK
 SOSF     EQU    100         SEEK OPTION SELECT FLAGS 
 TPORE    EQU    1           LENGTH OF *TPOR* ENTRY 
          SPACE  4,10 
**        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
 1HP      SPACE  4
          TITLE  MAIN PROGRAM.
 FHP      SPACE  4,10 
**        FHP - 885-42 DRIVER.
  
  
          ORG    PPFW 
 FHP      RJM    PRS         PRESET 
 MST      SPACE  4,10 
**        MST - 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        5/ 0, 1/ I, 6/ *PUT* ORDINAL
*                I    EST CHANNEL BYTE INDEX. 
* 
*         TABLE IS TERMINATED BY A ZERO BYTE. 
  
  
 TPOR     BSSZ   TPORE*MAXU 
          CON    0           TERMINATE *TPOR* TABLE 
          TITLE  SUBROUTINES. 
 CCP      SPACE  4,10 
**        CCP - CHECK FOR CHANNEL PARITY ERROR. 
* 
*         EXIT   (A) .EQ. 0 IF NO CHANNEL PARITY ERROR. 
*                    .LT. 0 = COMPLEMENT OF *CHPE* ERROR CODE IF
*                         CHANNEL PARITY ERROR. 
  
  
 CCP1     LDN    0
  
 CCP      SUBR               ENTRY/EXIT 
          LDC    FCTC+30     TEST AND CLEAR SCR BIT 
 CCPA     EQU    *-1         (BIT NUMBER) 
          FJM    CCP1,CHSC   IF MAINTENANCE CHANNEL IN USE
 CCPB     EQU    *-2
          OAN    CHSC        ISSUE REQUEST
 CCPC     EQU    *-1
          IAN    CHSC        INPUT RESULT 
 CCPD     EQU    *-1
          ZJN    CCPX        IF NO CHANNEL PARITY ERROR 
          LCN    CHPE 
          UJN    CCPX        RETURN 
 1HP      SPACE  4
          RICHI              REDEFINE CHANNEL INSTRUCTIONS
 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. 
* 
*         EXIT   (A) .LT. 0 IF CHANNEL IS GLOBALLY DOWN.
* 
*         USES   CM - CM+4. 
* 
*         CALLS  DCH, RCH, SCD. 
* 
*         MACROS DELAY. 
  
  
 CCR2     RJM    SCD         SET DRIVER DROP FLAG 
          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 CONSECUTIVE SECTORS.
* 
*         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.
*                (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, T0 - T4. 
* 
*         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 NO BUFFER 
          STD    NB          STORE BUFFER ORDINAL OF NEXT REQUEST 
          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    2
          LMD    CN+2 
          ZJN    CCS2        IF CONSECTUTIVE SECTOR ON SAME TRACK 
          LDD    CM+2 
          ADD    HN 
          SCN    77 
          LMD    CN+2 
          NJN    CCS1        IF NOT FIRST SECTOR ON CONSECUTIVE TRACK 
          LDD    CM+2 
          LPN    77 
          SBN    PSPT-2 
          NJN    CCS1        IF NOT CONSECUTIVE REQUEST 
 CCS2     AOD    TB          INCREMENT TOTAL BUFFER COUNT 
          LJM    CCSX        RETURN 
 CDS      SPACE  4,25 
**        CDS - CRACK DETAILED STATUS.
* 
*         THIS ROUTINE DETERMINES WHAT ERROR CODE TO SET BY EXAMINING 
*         DETAILED STATUS.  IT WILL ALSO ATTEMPT TO RECOVER BY ISSUING
*         A *CONTINUE* FUNCTION IF GENERAL STATUS INDICATES THE ERROR 
*         IS RECOVERABLE BY THE CONTROLLER. 
* 
*         ENTRY  (EC) = ERROR CODE. 
*                (GS) = GENERAL STATUS. 
*                (RW) = READ/WRITE FLAG.
*                (T7) = SECTOR COUNT. 
* 
*         EXIT   (A) .EQ. 0 IF ERROR WAS RECOVERED BY CONTROLLER. 
*                    .LT. 0 IF A FUNCTION TIMEOUT, CHANNEL PARITY 
*                           ERROR, OR DATA TRANSFER ERROR OCCURRED
*                           WHILE TRYING TO OBTAIN STATUS.
*                    .GT. 0 OTHERWISE.
*                (EC) = ERROR CODE. 
* 
*         USES   CB, EC, PB, RS.
* 
*         CALLS  GDS, GGS, PCH. 
  
  
 CDS      SUBR               ENTRY/EXIT 
 CDS1     RJM    GDS         GET DETAILED STATUS
          MJN    CDSX        IF ERROR 
          LDD    GS 
          SHN    21-13
          PJP    CDS6        IF NOT ABNORMAL TERMINATION
          SHN    13-10
          PJN    CDS3        IF ERROR NOT RECOVERABLE BY CONTROLLER 
  
*         ATTEMPT CONTROLLER RECOVERY.
  
          LDK    FCCO        ISSUE *CONTINUE* FUNCTION
          RJM    PCH
          MJN    CDSX        IF TIMEOUT/DATA TRANSFER ERROR 
          RJM    GGS         GET GENERAL STATUS 
          MJN    CDSX        IF STATUS NOT OBTAINED 
          NJN    CDS1        IF NOT YET RECOVERED 
          LCN    1           INDICATE CONTROLLER RECOVERY 
          STD    RS 
          LDN    0
          UJN    CDSX        RETURN 
  
*         CHECK FOR *NOT READY* CONDITION.
  
 CDS3     SHN    10-4 
          PJN    CDS4        IF NOT *NOT READY* 
          LDM    DST+7
          LPN    1
          NJN    CDS4        IF NOT *NOT READY* 
          LDM    DST+10 
          SHN    0-7
          LPN    1
          ZJP    CDS8        IF DRIVE *NOT READY* 
  
*         DURING SPINUP, THE STATUS OF THE DRIVE CHANGES SO AS TO 
*         APPEAR NOT TO BE A *NOT READY* CONDITION.  TO AVOID 
*         MISHANDLING THIS SITUATION THE ERROR PROCESSOR CHECKS FOR 
*         PRIOR DETECTION OF *NOT READY* AND ASSUMES NO CHANGE IN 
*         THE SITUATION UNTIL GENERAL STATUS BECOMES ZERO.
  
 CDS4     LDD    EC 
          LMK    NRDE 
          ZJP    CDS8        IF *NOT READY* ALREADY DETECTED
  
*         CHECK FOR *BUFFER TO DISK* ERROR. 
  
          LDD    RW 
          ZJN    CDS5        IF READ OPERATION
          LDM    DST+14 
          SHN    21-13
          PJN    CDS5        IF NOT ERROR ON PREVIOUS SECTOR
          LDD    T7 
          LMK    PPSLB-1
          NJN    CDS5        IF NOT AT BUFFER BOUNDARY
          LDD    PB          BACKUP TO PREVIOUS BUFFER
          STD    CB 
          LDN    0
          STD    PB 
          UJN    CDS6        SET ERROR CODE 
  
*         CHECK FOR MEDIA ERROR.
  
 CDS5     LDM    DST+17 
          LPN    40 
          NJN    CDS6        IF PROCESSOR INSTRUCTION TIMEOUT 
          LDM    DST
          LPN    17 
          LMN    10 
          ZJN    CDS7        IF MEDIA ERROR 
          LDM    DST+1
          SHN    21-13
          MJN    CDS7        IF MEDIA ERROR 
          SHN    13-11
          MJN    CDS7        IF MEDIA ERROR 
          LDM    DST+20 
          SHN    21-10
          MJN    CDS7        IF MEDIA ERROR 
          LDM    DST+17 
          SHN    21-6 
          MJN    CDS9        IF CHANNEL PARITY ERROR ON OUTPUT
 CDS6     LDN    DSTE 
          UJN    CDS10       SET ERROR CODE 
  
 CDS7     LDK    PARE&NRDE
 CDS8     LMK    NRDE 
          UJN    CDS10       SET ERROR CODE 
  
 CDS9     LDN    CHPE        SET ERROR CODE 
 CDS10    STD    EC 
          LJM    CDSX        RETURN 
 CRL      SPACE  4,10 
**        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.
  
  
 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    1
          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 NOW 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  (IR+4) = CHANNEL NUMBER. 
*                (CS) = CHANNEL RESERVATION STATUS. 
* 
*         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 
          UJN    DCHX        RETURN 
 ERR      SPACE  4,30 
**        ERR - PROCESS ERROR.
* 
*         THIS ROUTINE IS CALLED TO PERFORM 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 THE POINT OF CALL IF THE ERROR WAS RECOVERED BY THE 
*                CONTROLLER.
*                TO *MST* IN ALL OTHER CASES. 
* 
*         USES   EC, RC, RS, T1.
* 
*         CALLS  CDS, CRL, CRQ, GGS, IBM, ISF, PDT, PFR, PRE, 
*                RLC, SSF, TEP. 
  
  
 ERR      SUBR               ENTRY/EXIT 
          RJM    PRE         PRESET ERROR PROCESSOR 
          NJP    ERR11       IF INTERLOCK/VERIFICATION FAILURE
          LDD    EC 
          SHN    21-13
          PJN    ERR3        IF ERROR CODE NOT SET BY CALLER
 ERR2     LCN    0           STORE ERROR CODE 
          LMD    EC 
          STD    EC 
          UJN    ERR3.1      CHECK FOR RETRY LIMIT
  
 ERR3     RJM    GGS         GET GENERAL STATUS 
          MJN    ERR2        IF STATUS NOT OBTAINED 
          RJM    CDS         CRACK DETAILED STATUS
          MJN    ERR2        IF STATUS NOT OBTAINED 
 ERR3.1   LDD    RC 
          NJN    ERR4        IF NOT FIRST RETRY 
          LDD    GS          SAVE INITIAL GENERAL STATUS
          STM    BMLGS
 ERR4     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 NO PENDING MONITOR FUNCTION 
          NJN    ERR4.1      IF FUNCTION STILL PENDING
          RJM    IBM         ISSUE BML MESSAGE IF FIRST RETRY 
          AOD    RS 
          SHN    21-13
          MJN    ERR6.1      IF ERROR RECOVERED BY CONTROLLER 
          RJM    CRL         CHECK FOR RETRY LIMIT REACHED
          MJN    ERR7        IF RETRY LIMIT NOT REACHED 
  
*         ATTEMPT TO RELOAD THE CONTROLLER IF THE ERROR TYPE IS 
*         APPROPRIATE FOR SUCH AN ACTION. 
  
          LDM    TEPF,EC
          SHN    21-5 
          PJN    ERR5        IF RELOAD INAPPROPRIATE FOR ERROR TYPE 
          RJM    RLC         RELOAD CONTROLLER
 ERR5     SOD    RC          ADJUST FINAL RETRY COUNT 
          AOD    RS          SET RECOVERY STATUS
 ERR6.1   UJN    ERR11       TERMINATE ERROR PROCESSING 
  
*         SET THE SUSPECT FLAG IF APPROPRIATE FOR THIS ERROR TYPE.
  
 ERR7     RJM    SSF         SET SUSPECT FLAG (IF APPROPRIATE)
  
*         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 
          LMN    10&2 
          NJN    ERR9.1      IF DRIVE NOT RESERVED ON OTHER CHANNEL 
          LDC    4000        CAUSE PRIORITY OVERRIDE ON SEEK
          RAM    ISFA 
          UJN    ERR9        REISSUE SEEK 
  
 ERR9.1   LDD    CS 
          LPN    10 
          ZJN    ERR11       IF CONTROLLER WAS NOT CONNECTED
          LDK    DSTE        SET ERROR CODE FOR LOST CONTROLLER RESERVE 
          STD    EC 
          UJP    ERR4        RETRY OPERATION
  
 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 
          LDM    ERRA,RS
          STD    T1 
          LJM    0,T1        EXIT ERROR PROCESSOR 
  
 ERRA     INDEX              TABLE OF EXIT ADDRESSES
          INDEX  0,ERRX 
          INDEX  1,MST
          INDEX  2,MST
          INDEX  3,MST
          INDEX  4
 TEPF     SPACE  4,25 
**        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/ERROR LOG MESSAGE INDICATOR 
*                            0   DO NOT ISSUE ERROR LOG MESSAGE.
*                            1   ISSUE ERROR LOG MESSAGE WITH DETAILED
*                                STATUS.
*                            2   ISSUE ERROR LOG MESSAGE WITHOUT
*                                DETAILED STATUS. 
*                VFD    1/SUSPECT FLAG
*                            0   DO NOT SET SUSPECT FLAG. 
*                            1   SET SUSPECT FLAG.
*                VFD    1/DOWN CHANNEL FLAG 
*                            0   DO NOT DOWN CHANNEL. 
*                            1   DOWN CHANNEL.
*                VFD    1/CONTROLLER RELOAD FLAG
*                            0   DO NOT RELOAD CONTROLLER.
*                            1   RELOAD CONTROLLER. 
*                VFD    5/UNUSED (ZERO) 
  
          LIST   G
 TEPF     EQU    *-1
          ECHO   1,EC=("DREC")
          VFD    2/IEC._EC,2/IEM._EC,1/SUS._EC,1/IDC._EC,1/CWR._EC,5/0
          LIST   *
 TEPO     SPACE  4,10 
**        TEPO - TABLE OF IMMEDIATE RETURN ERROR PROCESSING OPTIONS.
  
          LIST   G
 TEPO     EQU    *-1
          ECHO   1,ERRCODE=("DREC") 
          CON    EPO._ERRCODE          "TXT._ERRCODE" ERROR 
          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.
*                    .GE. 0 IF NO ERROR.
* 
*         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 
 FNC2     LCN    FTOE        SET COMPLEMENT OF *FTOE* ERROR CODE
 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 *IDTE* ERROR CODE IF INCOMPLETE 
*                       TRANSFER OCCURS.
* 
*         USES   EC, T1.
* 
*         CALLS  CCP, FNC.
  
  
 GDS1     LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
 GDS2     STD    EC 
 GDS3     LDN    MXSL-1      INVALIDATE DETAILED STATUS 
          STD    T1 
 GDS4     LCN    0
          STM    DST,T1 
          SOD    T1 
          PJN    GDS4        IF MORE BYTES
  
 GDS      SUBR               ENTRY/EXIT 
          LDN    FCDS        ISSUE DETAILED STATUS FUNCTION 
          RJM    FNC
          MJN    GDS3        IF ERROR 
          LDN    MXSL 
          IAM    DST,CH      INPUT DETAILED STATUS
          NJN    GDS1        IF INCOMPLETE DATA TRANSFER
          RJM    CCP         CHECK FOR CHANNEL PARITY ERROR 
          ZJN    GDSX        IF NO CHANNEL PARITY ERROR 
          UJN    GDS2        INVALIDATE STATUS AND RETURN 
 GGS      SPACE  4,15 
**        GGS - GET GENERAL STATUS. 
* 
*         THIS ROUTINE OBTAINS THE EXTENDED GENERAL STATUS FROM THE 
*         CONTROLLER. 
* 
*         EXIT   (A) .GE. 0 IF GENERAL STATUS OBTAINED.  (GS) = STATUS. 
*                    .LT. 0 IF STATUS NOT OBTAINED.  (GS) = 7777. 
*                (EC) = COMPLEMENT OF *IDTE* ERROR CODE IF INCOMPLETE 
*                       TRANSFER OCCURRED.
*                     = COMPLEMENT OF *CHPE* ERROR CODE IF CHANNEL
*                       ERROR OCCURRED. 
* 
*         USES   EC, GS, T1.
* 
*         CALLS  CCP, FNC.
  
  
 GGS1     LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
 GGS2     STD    EC 
 GGS3     LDN    FCESL-1     INVALIDATE EXTENDED GENERAL STATUS 
          STD    T1 
 GGS4     LCN    0
          STM    GGSA,T1
          SOD    T1 
          PJN    GGS4        IF MORE BYTES
          LCN    0           INVALIDATE GENERAL STATUS
 GGS5     STD    GS 
  
 GGS      SUBR               ENTRY/EXIT 
          LDM    FNCA        SAVE FUNCTION BEFORE GENERAL STATUS
          STM    GGSB 
          LDN    FCES        ISSUE EXTENDED GENERAL STATUS FUNCTION 
          RJM    FNC
          MJN    GGS3        IF ERROR 
          LDN    FCESL
          IAM    GGSA,CH
          NJN    GGS1        IF INCOMPLETE TRANSFER 
          RJM    CCP         CHECK FOR CHANNEL PARITY ERROR 
          MJN    GGS2        IF CHANNEL PARITY ERROR
          LDM    GGSB        RESTORE LAST FUNCTION FOR ERROR PROCESSOR
          STM    FNCA 
          LDM    GGSA 
          UJN    GGS5        SAVE FIRST STATUS BYTE 
  
 GGSA     BSS    FCESL       EXTENDED GENERAL STATUS BUFFER 
 GGSB     BSS    1           LAST FUNCTION BEFORE GENERAL STATUS
 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    IBM2        IF FINAL RETRY 
          LDD    RC 
          NJN    IBMX        IF NOT INITIAL RETRY 
          AOD    RC          INCREMENT RETRY COUNT
          UJN    IBM3        CONTINUE 
  
*         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/D1HP*400  STORE SYMPTOM CODE
          LMM    TSYM,EC
          STM    BMLSC
          LMK    /COMSDFS/HS0040+/COMSDFS/D1HP*400
          NJN    IBM4        IF NOT A MEDIA ERROR 
          LDD    RW          SET WRITE MEDIA ERROR SYMPTOM CODE 
          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/RM0014   MESSAGE ID
  
 BMLSC    VFD    4//COMSDFS/D1HP      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 
  
 BMS1L    EQU    *-BML       LENGTH OF MESSAGE (PP WORDS) 
 .A       SET    BMS1L+4
 BMS1LC   EQU    .A/5        LENGTH OF MESSAGE (CM WORDS) 
 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.
* 
*         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
          RJM    CRQ         ISSUE COMPLETION REQUEST 
          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 CONTROLLER RESERVED TO OPPOSITE ACCESS,
*                           DRIVE RESERVED TO OTHER CONTROLLER, OR
*                           POSITIONER BUSY.
*                (CA - CA+2) = PHYSICAL ADDRESS OF FIRST SECTOR IN
*                              BUFFER.
*                (CS) = BIT 3 SET IF CONTROLLER HARDWARE RESERVE IS 
*                       HELD.  BIT 3 IS CLEAR IF *OPERATION COMPLETE* 
*                       FUNCTION WAS ISSUED.
*                TO *ERR* IF ERROR. 
* 
*         USES   CS, EC, CA - CA+4, CM - CM+4.
* 
*         CALLS  ERR, FNC, GGS, RHR.
* 
*         MACROS CCBA.
  
  
 ISF      SUBR               ENTRY/EXIT 
          CCBA   PAD1        GET DISK ADDRESS FROM CBT ENTRY
          CRD    CA 
          LDD    CA          SET OPTION SELECT FLAGS
          LMC    SOSF 
*         LMC    SOSF+4000   (PRIORITY OVERRIDE REQUIRED) 
 ISFA     EQU    *-1
          STD    CA 
          LDD    CA+2        SET HEAD NUMBER
          SHN    14 
          STD    CA+2 
          SHN    -14         SET SECTOR NUMBER
          STD    CA+3 
          LDD    CS 
          LPN    10 
          NJN    ISF1        IF CONTROLLER ALREADY CONNECTED
          RJM    GGS         GET GENERAL STATUS 
          MJN    ISF2        IF GENERAL STATUS WAS NOT OBTAINED 
          SHN    21-12
          MJP    ISFX        IF COUPLER RESERVED ON OTHER ACCESS
          LDN    10          SET HARDWARE RESERVE FLAG
          RAD    CS 
 ISF1     LDN    FCSK        ISSUE SEEK FUNCTION
          RJM    FNC
 ISF2     MJN    ISF5        IF ERROR 
          LDN    FCSKL       OUTPUT SEEK PARAMETERS 
          OAM    CA,CH
          ZJN    ISF3        IF ALL DATA WAS TAKEN
          LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
          UJN    ISF4        PROCESS ERROR
  
 ISF3     EJM    ISF6,CH     IF LAST BYTE TRANSFERRED 
          SBN    1
          NJN    ISF3        IF NOT TIMEOUT 
          LCN    CHFE        SET *CHANNEL FAILURE* ERROR CODE 
 ISF4     STD    EC 
 ISF5     RJM    ERR         CALL ERROR PROCESSOR 
  
 ISF6     DCN    CH+40
          RJM    GGS         GET GENERAL STATUS 
          ZJN    ISF8        IF NO ERROR AND ON-CYLINDER
          MJN    ISF5        IF STATUS WAS NOT OBTAINED 
          SHN    21-3 
          MJN    ISF7        IF UNIT IS RESERVED TO OTHER ACCESS
          SHN    3-1
          PJN    ISF5        IF ERROR 
 ISF7     RJM    RHR         RELEASE HARDWARE RESERVES
          NJN    ISF5        IF ERROR 
          LDN    1           INDICATE NOT ON CYLINDER 
 ISF8     LJM    ISFX        RETURN 
 OVI      SPACE  4,15 
**        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 
          ERRNZ  SUIS        CODE DEPENDS ON VALUE
          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
          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 
 PCH      SPACE  4,20 
**        PCH - PROCESS CHANNEL REQUEST.
* 
*         THIS ROUTINE IS CALLED TO ISSUE A READ, WRITE OR CONTINUE 
*         FUNCTION TO THE CONTROLLER. 
* 
*         ENTRY  (A) = FUNCTION CODE. 
*                (CD - CD+1) = EXTENDED MEMORY ADDRESS. 
*                (CD+2 - CD+5) = SHORT PRU FLAGS IF WRITE REQUEST.
*                (RW) = READ/WRITE FLAG.
* 
*         EXIT   (A) .EQ. 0 IF COMPLETED SUCCESSFULLY.
*                    .LT. 0 IF FUNCTION TIMEOUT, INCOMPLETE DATA
*                           TRANSFER OR CHANNEL FAILURE.
*                (EC) = COMPLEMENT OF *IDTE* ERROR CODE IF DATA 
*                       TRANSFER ERROR. 
* 
*         USES   EC.
* 
*         CALLS  FNC. 
  
  
 PCH3     LCN    IDTE        SET *INCOMPLETE DATA TRANSFER* ERROR CODE
 PCH4     STD    EC 
  
 PCH      SUBR               ENTRY/EXIT 
          RJM    FNC         FUNCTION CHANNEL 
          MJN    PCHX        IF ERROR 
          LDC    **          OUTPUT PARAMETERS
 PCHA     EQU    *-1         (PARAMETER BLOCK SIZE) 
          OAM    CD,CH
          NJN    PCH3        IF INCOMPLETE DATA TRANSFER
 PCH1     EJM    PCH2,CH     IF LAST BYTE ACCEPTED
          SBN    1
          NJN    PCH1        IF NOT TIMEOUT 
          LCN    CHFE        SET *CHANNEL FAILURE* ERROR CODE 
          UJN    PCH4        SET ERROR CODE 
  
 PCH2     DCN    CH+40B 
          LDN    0           SET REPLY = SUCCESSFUL 
          UJN    PCHX        RETURN 
 PDT      SPACE  4,15 
**        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 RECOVERY IS IN PROGRESS. 
*                (PO) = *PUT* ORDINAL.
*                (RW) = READ/WRITE FLAG.
* 
*         USES   NB, PB, PI, T1, T7, CD - CD+1, CN+2 - CN+4.
* 
*         CALLS  ERR, OVI, RHR, RIO, RPI, WIO.
* 
*         MACROS CCBA.
  
  
 PDT      SUBR               ENTRY/EXIT 
          LDM    PDTB,RW     STORE PARAMETER BLOCK LENGTH 
          STM    PCHA 
          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
          STD    PI          SET *PADN* WORD OFFSET 
          LDM    IICB,RW
          STM    IICA 
          LDM    PDTA,RW     STORE SUBROUTINE ADDRESS 
          STD    T1 
          CCBA   IOLK 
          CRD    CD-3 
          ERRNZ  CD-CN-5     CODE IS VALUE DEPENDENT
          LDN    PPSLB       SET SECTOR COUNT 
          STD    T7 
          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 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
  
 PDTB     BSS    0           PARAMETER BLOCK LENGTH TABLE 
          CON    FCRDL
          CON    FCWRL
 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    RIOA,RIOX
          CON    WIOA,WIO6.1
 PRE      SPACE  4,15 
**        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. 
*                (RS) = RECOVERY STATUS.
*                (T5) = EST ORDINAL.
*                (TEPA) = 1 IF VERIFICATION/INTERLOCK REJECT. 
* 
*         USES   RS, T5, CM - CM+4. 
* 
*         CALLS  CRQ, OVI.
* 
*         MACROS CPTA.
  
  
 PRE2     AOM    TEPA        SET VERIFICATION/INTERLOCK REJECT FLAG 
          STD    RS          FORCE EXIT TO *MST*
  
 PRE      SUBR               ENTRY/EXIT 
          DCN    CH+40       DISCONNECT CHANNEL IN CASE STILL ACTIVE
          LDM    FNCA        SAVE CURRENT FUNCTION
          STM    BMLLF
          LCN    0           INITIALIZE RECOVERY STATUS 
          STD    RS 
          LDD    HN 
          ERRNZ  SOSF-100    CODE DEPENDS ON VALUE
          STM    ISFA 
          RJM    OVI         GET *PUT* INTERLOCK (IF NOT ALREADY HELD)
          NJN    PRE2        IF INTERLOCK NOT OBTAINED
          CPTA   UNCT        GET EST ORDINAL
          CRD    CM 
          LDD    CM+1 
          STD    T5 
 PRE1     RJM    CRQ         ENSURE NO PENDING MONITOR FUNCTIONS
          NJN    PRE1        IF FUNCTION STILL PENDING
          UJN    PREX        RETURN 
 RCH      SPACE  4,10 
**        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
          AOD    CS          SET CHANNEL RESERVATION FLAG 
          UJN    RCHX        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,15 
**        RIO - PERFORM READ OPERATION. 
* 
*         ENTRY  (CB) = CURRENT BUFFER ORDINAL. 
*                (CD - CD+1) = BUFFER ADDRESS.
*                (NB) = 0.
*                (PB) = 0.
*                (PI) = 0.
*                (T7) = *PPSLB*.
* 
*         EXIT   (PB) = ORDINAL OF LAST BUFFER PROCESSED. 
* 
*         USES   CB, PB, PI, T7, CD - CD+1, CM - CM+4, CN+2 - CN+4. 
* 
*         CALLS  CCS, CRQ, ERR, GGS, IIC, PCH.
* 
*         MACROS CCBA.
  
  
 RIO      SUBR               ENTRY/EXIT 
 RIO1     LDN    FCRD        ISSUE READ FUNCTION
          RJM    PCH
          MJN    RIO4        IF ERROR 
          RJM    IIC         CHECK FOR NEED TO ISSUE COMPLETION REQUEST 
          LDD    T7 
          LPN    1
          ZJN    RIO3        IF FIRST SECTOR OF CONTROL WORD
          CCBA   PAD1        UPDATE PRU FLAGS 
          ADD    PI 
          CRD    CM 
          LDM    GGSA+3 
          STD    CM+3 
          LDM    GGSA+4      UPDATE LINKAGE BYTE
          STD    CM+4 
          CCBA   PAD1 
          ADD    PI 
          CWD    CM 
          AOD    PI          INCREMENT *PADN* WORD OFFSET 
 RIO3     RJM    CCS         CHECK FOR CONSECUTIVE REQUEST
          RJM    GGS         GET GENERAL STATUS 
          ZJN    RIO5        IF NO ERROR
 RIO4     RJM    ERR         PROCESS ERROR
 RIO5     AOD    CA+3        ADVANCE CURRENT POSITION 
          LMN    PSPT 
          NJN    RIO6        IF NOT END OF TRACK
          STD    CA+3        RESET TO SECTOR 0
          AOD    CA+2        ADVANCE TO NEXT TRACK
 RIO6     SOD    T7          DECREMENT SECTOR COUNT 
          ZJN    RIO7        IF FINISHED WITH BUFFER
          LDC    EMAI        INCREMENT EXTENDED MEMORY ADDRESS
          RAD    CD+1 
          SHN    -14
          RAD    CD 
          LJM    RIO1        READ NEXT SECTOR 
  
 RIO7     STD    PI          RESET *PADN* WORD OFFSET 
          RJM    CCS         CHECK FOR CONSECUTIVE REQUEST
          LDD    CB          ADVANCE BUFFER POINTERS
          STD    PB 
          LDD    NB 
          STD    CB 
          ZJP    RIOX        IF NO CONSECUTIVE REQUEST FOUND
          CCBA   IOLK,A      INITIALIZE EXTENDED MEMORY ADDRESS 
          CRD    CD-3 
          ERRNZ  CD-CN-5     CODE IS VALUE DEPENDENT
          LDN    PPSLB       RESET SECTOR COUNT 
          STD    T7 
          LDN    0           CLEAR NEXT BUFFER ORDINAL
          STD    NB 
          LJM    RIO1        CONTINUE TRANSFER
*         LJM    RIOX        (ERROR RECOVERY IN PROGRESS) 
 RIOA     EQU    *-1
 RLC      SPACE  4,15 
**        RLC - RELOAD CONTROLWARE. 
* 
*         THIS ROUTINE CALLS *1DS* TO INITIATE THE CONTROLWARE RELOAD.
* 
*         EXIT   (A) = 0 IF CONTROLWARE RELOADED. 
* 
*         USES   S2, CM - CM+4, CN - CN+4.
* 
*         CALLS  *1DS*. 
* 
*         MACROS DELAY, EXECUTE, MONITOR. 
  
  
 RLC6     LDN    1           INDICATE CONTROLWARE NOT RELOADED
  
 RLC      SUBR               ENTRY/EXIT 
          LDC    ** 
 RLCJ     EQU    *-1
          NJN    RLCX        IF RELOAD WAS ALREADY ATTEMPTED
          LDK    DSSL        AVOID CONTROLWARE LOAD DURING DEADSTART
          CRD    CM 
          LDD    CM+4 
          LPN    4
          NJN    RLCX        IF DEADSTART IN PROGRESS 
          LDC    **          READ CONTROLWARE TABLE 
 RLCA     EQU    *-1         CM ADDRESS OF TABLE ENTRY
          CRD    CM 
          LDD    CM+**
 RLCB     EQU    *-1         BYTE ADDRESS OF TABLE ENTRY
          SHN    21-13
          MJN    RLCX        IF RELOAD IN PROGRESS
          SHN    13-21-6
          LPN    7           CONTROLWARE LOAD COUNT 
          LMK    CRTH 
          ZJN    RLC6        IF RELOAD LIMIT REACHED
          AOM    RLCJ        SET RELOAD ATTEMPTED FLAG
  
*         SET RELOAD REQUEST BIT IN CONTROLWARE TABLE.
  
          LDN    0
          STD    CM+2 
          LDD    MA          MESSAGE BUFFER ADDRESS 
          CWM    RLCG,ON     REQUEST WORD 
          LDC    ** 
 RLCC     EQU    *-1         ADDRESS OF CONTROLWARE TABLE ENTRY 
          STD    CM+4 
          SHN    -14
          STD    CM+3 
          LDN    1           NUMBER OF REQUESTS TO PROCESS
          STD    CM+1 
          MONITOR  UTEM 
*         LDN    0           INITIALIZE RETRY COUNT 
          STD    S2 
  
*         CALL *1DS* TO INITIATE CONTROLWARE LOAD JOB.
  
 RLC1     DELAY 
          LDD    MA          MESSAGE BUFFER ADDRESS 
          CWM    RLCH,ON     *1DS* REQUEST
          EXECUTE  1DS,=
          MONITOR  RPPM      REQUEST PP 
          LDD    CM+1 
          NJN    RLC2        IF PP ASSIGNED 
          AOD    S2          INCREMENT RETRY COUNT
          LMK    PCRL 
          NJN    RLC1        IF NOT RETRY LIMIT 
 RLC2     LJM    RLCX        RETURN 
  
  
 RLCG     VFD    1/0,5/0,6/1,6/,42/1 *UTEM* REQUEST 
 RLCH     VFD    18/3L1DS,6/,12/ILJF,24/0  *1DS* REQUEST
 RPI      SPACE  4,10 
**        RPI - RELEASE *PUT* INTERLOCK.
* 
*         ENTRY  (CC) = COMPLETION COUNT. 
*                (IL) = *PUT* INTERLOCK FLAG. 
*                (PB) = PREVIOUS BUFFER ORDINAL.
*                (PO) = *PUT* ORDINAL.
*                (TB) = TOTAL CBT COUNT.
* 
*         USES   CC, IL, PB, CM - CM+4. 
* 
*         MACROS MONITOR. 
  
  
 RPI      SUBR               ENTRY/EXIT 
          LDD    IL 
          ZJN    RPIX        IF *PUT* NOT INTERLOCKED 
          LDD    TB          SET TOTAL BUFFER COUNT 
          STD    CM+4 
          LDD    PB 
          ZJN    RPI1        IF NO PREVIOUS BUFFER
          LDN    1           ACCOUNT FOR PREVIOUS BUFFER
 RPI1     ADD    CC 
          LMC    4000        SET *RELEASE INTERLOCK* FLAG 
          STD    CM+3 
          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 
          UJP    RPIX        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        COMPUTE LOGICAL TRACK
          SHN    1
          ADC    4000 
          STD    CM+2 
          LDD    CA+2        PHYSICAL TRACK 
          LPN    77 
          SHN    5
          ERRNZ  PSPT-40     CODE DEPENDS ON VALUE
          ADD    CA+3 
          SBK    PSLTDB 
          MJN    RTM1        IF FIRST LOGICAL TRACK OF CYLINDER 
          AOD    CM+2 
 RTM1     LDD    CM+2 
          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,15 
**        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 IN THE MST ENTRY VIA 
*         AN *SEQM* MONITOR FUNCTION IF CERTAIN CRITERIA ARE MET.  IT 
*         ALSO SETS AN ERROR CODE IN THE MST THAT APPEARS ON THE *E,M*
*         DISPLAY.
* 
*         ENTRY  (EC) = ERROR CODE. 
*                (RC) = RETRY COUNT.
*                (T5) = EST ORDINAL.
* 
*         USES   CM+1 - CM+3. 
* 
*         CALLS  RTM. 
* 
*         MACROS MONITOR. 
  
  
 SSF      SUBR               ENTRY/EXIT 
          LDD    RC 
          LMK    SURT 
          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 
          UJN    SSFX        RETURN 
 SUQ      SPACE  4,15 
**        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 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.
* 
*         CALLS  ERR. 
* 
*         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    14          SET CHANNEL BYTE INDEX 
          STD    S1 
          SHN    -14         SET *PUT* ORDINAL
          STD    PO 
          CPTA   UNCT,A      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 
          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        SET TOTAL BUFFER COUNT 
          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
          SHN    -1 
          STD    RC 
          RJM    ERR         CALL ERROR PROCESSOR 
          LJM    SUQ1        CONTINUE SCAN
  
 SUQ6     LDD    TI          SET SCAN LIMIT 
          LMC    LMNI 
          STM    SUQA 
          LJM    SUQX        RETURN 
 TEP      SPACE  4,25 
**        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    RLCJ        CLEAR RELOAD ATTEMPTED FLAG
          STM    TEPA        CLEAR VERIFICATION/INTERLOCK REJECT FLAG 
          LDD    HN          RESET SEEK SELECTION OPTIONS 
          ERRNZ  SOSF-100    CODE DEPENDS ON VALUE
          STM    ISFA 
  
 TEP      SUBR               ENTRY/EXIT 
          LDD    RW 
          SHN    1
          STD    T1 
          LDM    TEPB,T1     RESTORE INSTRUCTIONS 
          STD    T2 
          LDM    TEPB+1,T1
          STI    T2 
          LDC    ** 
 TEPA     EQU    *-1
          NJP    TEP4        IF OTHER DRIVER HANDLING ERROR 
          LDD    RS 
          ZJN    TEP1        IF RECOVERED BY CONTROLLER 
          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 
 TEP1     LMN    2
          NJN    TEP2        IF NOT UNRESOLVED ERROR
  
*         ISSUING SUBFUNCTION *SETS* 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           SET BUFFER COUNT 
          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 
          LPN    1
          ZJN    TEP3        IF UNRESOLVED OR RECOVERED BY CONTROLLER 
          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    RIOA,RIO1
          CON    WIOA,WIO1
 WIO      SPACE  4,10 
**        WIO - PERFORM WRITE OPERATION.
* 
*         ENTRY  (CB) = CURRENT BUFFER ORDINAL. 
*                (CD - CD+1) = BUFFER ADDRESS.
*                (NB) = 0.
*                (PB) = 0.
*                (PI) = 0.
*                (T7) = *PPSLB*.
* 
*         EXIT   (PB) = ORDINAL OF LAST BUFFER PROCESSED. 
* 
*         USES   CB, PB, PI, T1, T7, CA+2 - CA+3, CD - CD+5,
*                CN+2 - CN+4. 
* 
*         CALLS  CCS, CRQ, ERR, GGS, IIC, PCH.
* 
*         MACROS CCBA.
  
  
 WIO      SUBR               ENTRY/EXIT 
 WIO1     LDD    T7 
          LPN    1
          NJN    WIO2        IF NOT FIRST SECTOR OF CONTROL WORD
          LDD    CD+1        SAVE EXTENDED MEMORY ADDRESS BYTE
          STD    T1 
          CCBA   PAD1        GET LINKAGE BYTES FROM *CBT* ENTRY 
          ADD    PI 
          CRD    CD+1 
          LDD    T1          RESTORE EXTENDED MEMORY ADDRESS BYTE 
          STD    CD+1 
          AOD    PI          INCREMENT *PADN* INDEX 
 WIO2     LDN    FCWR        ISSUE WRITE FUNCTION 
          RJM    PCH
          MJN    WIO4.1      IF ERROR 
          AOD    CA+3        ADVANCE CURRENT POSITION 
          LMN    PSPT 
          NJN    WIO3        IF NOT END OF TRACK
          STD    CA+3        RESET TO SECTOR ZERO 
          AOD    CA+2        ADVANCE TO NEXT TRACK
 WIO3     SOD    T7          DECREMENT SECTOR COUNT 
          ZJN    WIO5        IF FINISHED WITH BUFFER
          LMK    PPSLB-1
          ZJN    WIO4        IF FIRST SECTOR OF BUFFER
          RJM    IIC         ISSUE I/O COMPLETION REQUEST IF REQUIRED 
 WIO4     LDC    EMAI        INCREMENT EXTENDED MEMORY ADDRESS
          RAD    CD+1 
          SHN    -14
          RAD    CD 
          RJM    CCS         CHECK FOR CONSECUTIVE REQUEST
          RJM    GGS         GET GENERAL STATUS 
          ZJP    WIO1        IF NO ERROR
 WIO4.1   UJN    WIO8        CALL ERROR PROCESSOR 
  
 WIO5     STD    PI          RESET *PADN* WORD INDEX
          RJM    CCS         CHECK FOR CONSECUTIVE REQUEST
          LDD    CB          ADVANCE BUFFER POINTERS
          STD    PB 
          LDD    NB 
          STD    CB 
          ZJN    WIO6        IF NO CONSECUTIVE REQUEST
          CCBA   IOLK,A      SET EXTENDED MEMORY ADDRESS
          CRD    CD-3 
          ERRNZ  CD-CN-5     CODE IS VALUE DEPENDENT
          LDN    PPSLB       RESET SECTOR COUNT 
          STD    T7 
          RJM    GGS         GET GENERAL STATUS 
          NJN    WIO7        IF ERROR 
          STD    NB          CLEAR NEXT BUFFER ORDINAL
          LJM    WIO1        CONTINUE TRANSFER
*         LJM    WIO6.1      (ERROR RECOVERY IN PROGRESS) 
 WIOA     EQU    *-1
  
 WIO6     RJM    GGS         GET GENERAL STATUS 
          NJN    WIO7        IF ERROR ON LAST SECTOR
 WIO6.1   RJM    GGS         GET GENERAL STATUS 
          ZJN    WIO9        IF NO ERROR
 WIO7     LDD    PB          BACKUP TO PREVIOUS BUFFER
          STD    CB 
          LDN    0           AVOID BUFFER COMPLETION
          STD    PB 
 WIO8     RJM    ERR         CALL ERROR PROCESSOR 
 WIO9     LJM    WIOX        RETURN 
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMPC2D 
*CALL     COMPIMB 
          SPACE  4,10 
 PRS      TITLE  PRESET PROGRAM.
 PRS      SPACE  4,10 
**        PRS - PRESET *1HP*. 
* 
*         EXIT   (CC) = 0.
*                (CS) = 0.
*                (EC) = 0.
*                (ER) = 0.
*                (IL) = 0.
*                (PB) = 0.
*                (RC) = 0.
*                (TI) = 0.
*                (BMLCR) = 6/ CHANNEL, 6/0. 
*                (BMLMF) = MAINFRAME ID.
*                (BMLPP) = 6/ PP NUMBER, 6/ CHANNEL.
*                (CCPA) = *SCR* CHANNEL PARITY BIT + FCTC + 30B.
*                (CCPB) = *SCR* CHANNEL OUTPUT INSTRUCTION (OAN). 
*                (CCPC) = *SCR* CHANNEL INPUT INSTRUCTION (IAN).
*                (CCRA) = WORD ADDRESS OF CHANNEL TABLE ENTRY.
*                (CCRB) = BYTE ADDRESS OF CHANNEL TABLE ENTRY + LDDI. 
*                (CHRV) = 1.
*                (CRQA) = FWA OF PP EXCHANGE PACKAGE. 
*                (CRQB) = FWA OF PP EXCHANGE PACKAGE. 
*                (CRQC) = CPU EXCHANGE INSTRUCTION (MXN). 
*                (CRQD) = FIRST WORD OF PP EXCHANGE PACKAGE.
*                (RLCA) = WORD ADDRESS OF CONTROLWARE TABLE ENTRY.
*                (RLCB) = BYTE ADDRESS OF CONTROLWARE TABLE ENTRY.
*                (RLCC) = WORD ADDRESS OF CONTROLWARE TABLE ENTRY.
*                (RLCG) = BIT NUMBER OF LOAD REQUESTED FLAG.
*                (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   CC, CS, EC, ER, IL, PB, RC, TI, CM - CM+4, CN - CN+4,
*                T0 - T7. 
* 
*         CALLS  DFM, RCH.
* 
*         MACROS CPTA, MONITOR, SFA.
  
  
 PRS      SUBR               ENTRY/EXIT 
          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* 1HP - UNAUTHORIZED CALL.*
          RJM    DFM         ISSUE DAYFILE MESSAGE
          MONITOR  ABTM      ABORT CONTROL POINT
          LJM    PPR         RETURN 
  
 PRS1     STD    CC          CLEAR COMPLETION REQUEST COUNT 
          STD    CS          CLEAR CHANNEL/CONTROLLER STATUS
          STD    EC          CLEAR ERROR CODE 
          STD    ER          CLEAR RECOVERY IN PROGRESS FLAG
          STD    IL          CLEAR *PUT* INTERLOCK FLAG 
          STD    PB          CLEAR PREVIOUS BUFFER ORDINAL
          STD    RC          CLEAR RETRY COUNT
          STD    TI          INITIALIZE *TPOR* INDEX
          LDD    IR+4        CHANNEL NUMBER 
          STM    BMLPP
 PRS2     RJM    RCH         REQUEST CHANNEL
          ZJN    PRS2        IF CHANNEL NOT ASSIGNED
  
*         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 
  
 PRS4     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    PRS4.1      IF PP 0-11 
          ADN    6           ADJUST FOR PP 20-31
 PRS4.1   ADN    12 
          SHN    6
          RAM    BMLPP       SET PP NUMBER
          SHN    6
          STM    BMLCR       SET RECOVERY CHANNEL 
          LDD    IR+4 
          STD    T2 
          SBN    20 
          PJN    PRS5        IF IN SECOND PPS 
          ADN    20 
          RAM    CCPA        SET *SCR* BIT NUMBER 
          LDK    CHSC        *SCR* - FIRST PPS
          UJN    PRS6        CONTINUE 
  
 PRS5     RAM    CCPA        SET *SCR* BIT NUMBER 
          LDK    CHSC+20     *SCR* - SECOND PPS 
 PRS6     ADC    FJMI 
          STM    CCPB 
          ADC    IANI-FJMI
          STM    CCPD 
          ADC    OANI-IANI
          STM    CCPC 
          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 
          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    6
          PJN    PRS7        IF CPU 0 ON
          AOM    CRQC        SET EXCHANGE TO CPU 1
          LDD    HN 
          RAM    CRQD+3      SET (A0) TO 1
 PRS7     AOD    T1          ADVANCE CM TABLE INDEX 
          LCN    5
          RAD    T2 
          PJN    PRS7        IF NOT TO PROPER INDEX 
          ADN    5
          RAM    CCRB        PRESET CHANNEL TABLE BYTE INDEX
          STM    RLCB        PRESET CONTROLWARE TABLE BYTE INDEX
          LPN    7           BYTE ADDRESS 
          STD    T2 
 PRS8     LCN    12D
          RAD    T3          DECREMENT POSITION 
          SOD    T2 
          PJN    PRS8        IF NOT TO PROPER POSITION
          LDD    T3          BIT POSITION 
          ADN    13          ADD OFFSET WITHIN BYTE 
          SHN    6
          STM    RLCG+1 
          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    RLCA        CM ADDRESS OF CONTROLWARE TABLE ENTRY
          STM    RLCC 
          STM    SCDA 
          SHN    -14
          RAM    RLCA-1 
          STM    RLCC-1 
          STM    SCDA-1 
  
*         PLUG *EMB* ADDRESSES. 
  
          LDN    EMBP        FETCH *EMB* POINTER
          CRD    CM 
 .CM1     EQU    CM+1 
          LDC    .CM1*10000+PRSC
          RJM    STA         SET *EMB* ADDRESSES
  
*         GET BUFFERED I/O TABLE POINTERS.
  
          LDK    BIOL        READ BUFFERED I/O TABLE POINTERS 
          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. 
  
 PRS12    STD    T1          INITIALIZE *TPOR* INDEX
 PRS13    SOD    T3          DECREMENT *PUT* ORDINAL
          ZJP    PRSX        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    37 
          LMD    IR+4 
          ZJN    PRS14       IF DEVICE SUPPORTED BY THIS DRIVER 
          LDD    CM+2 
          ZJN    PRS13       IF SINGLE ACCESS DEVICE
          LPN    37 
          LMD    IR+4 
          NJN    PRS13       IF DEVICE NOT SUPPORTED BY THIS DRIVER 
          AOD    T2          INCREMENT CHANNEL BYTE INDEX 
 PRS14    AOD    T1          INCREMENT *TPOR* INDEX 
          ERRNZ  TPORE-1     CODE DEPENDS ON VALUE
          LMK    MAXU+1 
          ZJN    PRS14.1     IF TOO MANY UNITS ON CHANNEL 
          LDD    T2          POSITION CHANNEL BYTE INDEX
          SHN    6
          LMD    T3          SET *PUT* ORDINAL
          STM    TPOR-1,T1
          UJP    PRS13       CONTINUE SCAN
  
 PRS14.1  LDC    =C* 1HP - TOO MANY UNITS ON CHANNEL.*
          RJM    DFM         ISSUE SYSTEM DAYFILE MESSAGE 
          MONITOR  HNGM 
          UJN    *           HANG 
  
 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
 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 
 1HP      SPACE  4,10 
          OVERFLOW
 1HP      SPACE  4,10 
          END 
