6DE 
          IDENT  6DE,MSFW 
          PERIPH
          BASE   MIXED
          SST 
*COMMENT  6DE - *PIOM* DEVICE DRIVER. 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          TITLE  6DE - *PIOM* DEVICE DRIVER.
          SPACE  4,10 
***       6DE - *PIOM* DEVICE DRIVER. 
*         G. R. MANSFIELD.  70/04/07. 
*         W. E. GOEBEL.      78/04/29.
          SPACE  4,10 
***       *6DE* PROVIDES ACCESS TO EXTENDED MEMORY AND BUFFERED DISK
*         DEVICES THROUGH THE *PIOM* *CPUMTR* INTERFACE.
          SPACE  4,10 
**        ENTRY CONDITIONS. 
* 
* 
*         (T5) = EST ORDINAL. 
*         (T6) = TRACK. 
*         (T7) = SECTOR.
          SPACE  4,10 
**        EXIT CONDITIONS.
* 
* 
*         NONE. 
          SPACE  4
**        COMMON DECKS. 
  
  
*CALL     COMPMAC 
*CALL     COMSCPS 
*CALL     COMSDFS 
          LIST   X
*CALL     COMSMSP 
          LIST   *
*CALL     COMSPIM 
          SPACE  4,10 
**        ASSEMBLY CONSTANTS. 
  
  
 DEC      MICRO  1,, 6DE     DECK NAME
          TITLE 
          ORG    MSFW 
          SPACE  4
**        ENTRY POINT TRANSFERS.
  
  
          CON    PRS         PRESET ADDRESS 
  
  
 RDS      CON    0           ENTRY
          UJN    RDS.        ENTER DRIVER 
  
  
 WDS      CON    0           ENTRY
          UJN    WDS0        ENTER DRIVER 
 EMS      SPACE  4,20 
**        EMS - END MASS STORAGE OPERATION. 
* 
*         ENTRY  (CHRV, BIT 6) = 0, IF NO PP BUFFER TO RELEASE. 
*                (T4) = INCREMENT OF PP BUFFER IF ASSIGNED. 
* 
*         EXIT   PP I/O BUFFER RELEASED.
*                (CHRV) = 0.
*                (A) = 0. 
* 
*         CALLS  SEA. 
* 
*         NOTE - THE *.EMS* ENTRY POINT IS SUPPORTED ONLY VIA THE 
*         *ENDMS* MACRO DEFINED IN *COMPMAC*.  IF THIS LOCATION 
*         CHANGES, THE DEFINITION OF *.EMS* MUST BE CHANGED IN
*         *PPCOM* AND ALL PROGRAMS USING THE *ENDMS*
*         MACRO MUST BE REASSEMBLED.
  
  
 .EMS     SUBR               ENTRY/EXIT 
          LDM    CHRV 
          LPN    1
          ZJN    EMS1        IF BUFFER NOT RESERVED 
          RJM    SEA         SET ECS BUFFER ADDRESS 
          CWM    ZERO,ON     CLEAR BUFFER RESERVATION 
 EMS1     LDM    CHRV        CLEAR BUFFER RESERVATION/LINK FLAGS
          LPC    -201 
          STM    CHRV 
          LDN    0           SET EXIT CONDITION 
          UJN    .EMSX       RETURN 
  
  
 WDS0     LJM    WDS.        ENTER DRIVER 
 RDS      SPACE  4,10 
**        RDS - READ SECTOR.
* 
*         ENTRY  (A) = 5/0, 1/S, 12/ BA.
*                   S = SKIP TRANSFER OF DATA IF SET. 
*                   BA = BUFFER ADDRESS FOR SECTOR. 
* 
*         EXIT   (A) .LT. 0 IF UNRECOVERED ERROR. 
* 
*         CALLS  ECS, SEA.
  
  
 RDS.     STM    RDSA        SET BUFFER ADDRESS 
          ADN    2
          STM    RDSC 
          SHN    -14
          ERRNZ  DTSF-10000  ERROR IF VALUE CHANGES 
          ZJN    RDS1        IF NOT SKIP DATA TRANSFER
          LDC    UJNI+RDS2-RDSB 
          ERRPL  RDS2-RDSB-37  CHECK JUMP IN RANGE
 RDS1     STM    RDSB        MODIFY CODE FOR SKIP 
          LDD    HN          READ SECTOR
          ERRNZ  RESS*100B-100B  ERROR IF VALUE CHANGES 
          RJM    ECS
          LDM    CHRV        CHECK IF BUFFER ASSIGNED 
          SHN    21-0 
          PJN    RDS3        IF BUFFER NOT ASSIGNED 
          RJM    SEA         SET ECS BUFFER ADDRESS 
          ADN    1
          CRM    *,ON 
 RDSA     EQU    *-1
 RDSB     PSN 
*         UJN    RDS2        (SKIP DATA TRANSFER) 
          CRM    *,HN 
 RDSC     EQU    *-1
          SBD    HN 
 RDS2     SBN    2
          CWM    ZERO,ON     CLEAR BUFFER RESERVATION 
          SOM    CHRV        CLEAR BUFFER RESERVATION FLAG
 RDS3     LDM    RDS         RETURN ADDRESS 
          LJM    CST         CHECK STATUS 
 WDS      SPACE  4,10 
**        WDS - WRITE SECTOR. 
* 
*         ENTRY  (A) = 6/ LSI, 12/ BA.
*                   LSI = WLSF, IF LAST SECTOR WRITE. 
*                       = WCSF, IF CONSECUTIVE SECTOR WRITE.
*                   BA = BUFFER ADDRESS FOR SECTOR. 
* 
*         EXIT   (A) .LT. 0 IF UNRECOVERED ERROR. 
* 
*         CALLS  ECS, SEA.
  
  
 WDS.     STM    WDSB        SET BUFFER ADDRESS 
          ADN    2
          STM    WDSC 
          SHN    -16         SAVE WRITE LAST SECTOR FLAG
          LPN    3
          LMN    3
          STM    WDSA 
          ERRNZ  WLSF        ERROR IF VALUE CHANGES 
          ERRNZ  WCSF-300000 ERROR IF VALUE CHANGES 
          LDM    UERR        GET REWRITE AND DISABLE BUFFER FLUSH FLAGS 
          SHN    -6 
          ERRNZ  EPRW-100    ADJUST IF VALUE CHANGES
          ERRNZ  EPNF-200    ADJUST IF VALUE CHANGES
          LMN    2
          LPC    ** 
*         LPC    3           (WRITE LAST SECTOR)
*         LPC    1           (WRITE CONSECUTIVE SECTOR) 
 WDSA     EQU    *-1
          STM    WDSD 
          LDM    CHRV 
          SHN    21-0 
          MJN    WDS3        IF BUFFER RESERVED 
 WDS2     LDC    ** 
 WDSD     EQU    *-1
          ADK    REBS*100    RESERVE WRITE BUFFER 
          RJM    ECS
          LDD    CM+1 
          NJN    CST1        IF ERROR STATUS SET
 WDS3     RJM    SEA         SET ECS BUFFER ADDRESS 
          ADN    1
          CWM    *,ON 
 WDSB     EQU    *-1
          CWM    *,HN 
 WDSC     EQU    *-1
          LDM    WDSD 
          ADC    WESS*100    WRITE SECTOR 
          RJM    ECS
          LDM    WDS         RETURN ADDRESS 
*         UJN    CST         CHECK STATUS 
 CST      SPACE  4,15 
**        CST - CHECK STATUS. 
* 
*         ENTRY  (A) = RETURN ADDRESS.
*                (CM+1) = STATUS RETURNED BY *PIOM* TRANSFER. 
*                (MB+1) = PHYSICAL DATA RETURNED BY *PIOM* IF ERROR.
* 
*         EXIT   RETURN TO CALLER IF NO ERROR.
* 
*         EREXIT TO *7DE*.
* 
*         USES   T1, T2.
  
  
 CST      BSS    0           ENTRY
          STD    T1          SAVE BIAS FOR EXIT ADDRESS 
          LDD    CM+1 
          NJN    CST1        IF ERROR 
          LJM    0,T1        RETURN 
  
*         PROCESS ERROR.
  
 CST1     STM    STSA        SAVE STATUS
          MSERR  7DE
 ECS      SPACE  4,15 
**        ECS - ECS TRANSFER. 
* 
*         ENTRY  (A) = 6/ *PIOM* SUBFUNCTION, 6/ FUNCTION FLAGS.
* 
*         EXIT   (A) = 0. 
*                (CM+1) = ERROR CODE IF NONZERO.
*                (CM+3 - CM+4) = PHYSICAL DATA IF ERROR.
*                TO *WDS2* IF WRITE BUFFER MUST BE RE-RESERVED. 
* 
*         USES   T4, T5, T6, T7, CM - CM+4. 
* 
*         MACROS DELAY, MONITOR, PAUSE. 
  
  
 ECS5     LDM    CHRV 
          STD    CM 
          LPN    20 
          ZJN    ECS6        IF CHANNEL NOT SELECTED BY CALLER
          LDM    STSB        STORE CHANNEL NUMBER 
          STD    CM+4 
 ECS6     LDD    MA          STORE PARAMETERS IN MESSAGE BUFFER 
          CWD    T4 
          LDC    **          SET FUNCTION CODE
 ECSA     EQU    *-1
          STD    CM+1        SET FUNCTION CODE AND FLAGS
          MONITOR  PIOM 
          LDD    MA          UPDATE PARAMETERS
          CRD    T4 
          LDD    CM 
          STM    CHRV 
          LDD    CM+1        CHECK RETURN STATUS
          SHN    -13
          NJN    ECS4        IF RETRY REQUIRED
  
 ECS      SUBR               ENTRY/EXIT 
          STM    ECSA        SAVE FUNCTION CODE 
 ECS1     LDD    OA          WAIT OUTPUT REGISTER CLEAR 
          CRD    CM 
          LDD    CM 
          ZJP    ECS5        IF NO MONITOR FUNCTION PENDING 
          DELAY 
          UJN    ECS1        LOOP 
  
*         RETRY FUNCTION. 
  
 ECS2     LDM    ECSA        CHECK FOR WRITE REJECT 
          SHN    -7 
          ZJN    ECS1        IF RESERVE BUFFER OR READ SECTOR 
          LDM    CHRV 
          SHN    21-6 
          MJN    ECS1        IF RECALL AFTER FLUSH
          SHN    21-0-21+6
          MJN    ECS1        IF WRITE BUFFER RESERVED 
          LJM    WDS2        RE-RESERVE WRITE BUFFER
  
*         WAIT FOR PENDING BUFFERED I/O.
  
 ECS3     DELAY  1*8D        DELAY 1 MILLISECOND
 ECS4     PAUSE  NE 
          LDD    OA          WAIT FOR REISSUE ALLOWED STATUS
          ADN    2
          CRD    CM 
          LDD    CM+1 
          SHN    21-12
          PJN    ECS3        IF PENDING I/O NOT COMPLETE
          UJN    ECS2        RETRY FUNCTION 
 SEA      SPACE  4,10 
**        SEA - SET ECS ADDRESS.
* 
*         ENTRY  (T4) = RELATIVE ECS BUFFER ADDRESS.
* 
*         EXIT   (A) = ECS BUFFER ADDRESS.
  
  
 SEA      SUBR               ENTRY/EXIT 
 SEAA     LDC    ** 
          ADD    T4 
          UJN    SEAX        RETURN 
 PRS      SPACE  4,10 
**        PRS - PRESET DRIVER.
* 
*         ENTRY  (CM - CM+4) = EST ENTRY. 
* 
*         EXIT   NONE.
  
  
 PRS      LDC    EPBP        GET FWA ECS PP BUFFERS 
          CRM    ZERO,ON
          LDM    ZERO+4 
          STM    SEAA+1 
          LDM    ZERO+3 
          LPN    77 
          ADC    LDCI 
          STM    SEAA 
          LDN    ZERL        ZERO BUFFER
          CRM    ZERO,ON
          LJM    SMSX        RETURN 
  
 ZERO     BSS    0           FIVE BYTES FOR READING BUFFER ADDRESS
 .1       SET    *+5+4-MSFW  CHECK FOR OVERFLOW 
 .1       SET    .1/5 
 .1       SET    MSFW+.1*5
 .2       SET    PPFW-5-*-5  BYTES AVAILABLE BEFORE OVERFLOW
          ERRNG  PPFW-5-.1   DRIVER OVERFLOWS INTO *PPFW*-5 
  
  
*         THE FOLLOWING CHECK VERIFIES THAT CELLS *ZERO* - *ZERO*+4 
*         ARE NOT DESTROYED BY THE ERROR PROCESSOR. 
  
          ERRPL  ZERO+4-DEFW  CODE IS DESTROYED BY ERROR PROCESSOR
 7DE      MSOVL  7644,T2,EPFW-1,(MASS STORAGE ERROR PROCESSOR.) 
          SPACE  4
***       *7DE* IS CALLED BY *6DE* WHEN AN UNRECOVERED ERROR HAS
*         OCCURRED. 
 MSE      SPACE  4,35 
**        MSG - PROCESS MASS STORAGE ERROR. 
* 
*         ENTRY  (T1) = RDCT. 
*                (T2) = DEST. 
*                (T4 - T7) = DRIVER PARAMETERS. 
*                (RDCT) = ERROR PROCESSOR INTERFACE WORD. 
*                         BIT 4 = 0 IF FIRST RETRY ATTEMPT. 
*                (STSA) = ERROR CODE RETURNED BY *CPUMTR*.
*                (MB+1) = PHYSICAL DATA RETURNED BY *PIOM* FUNCTION.
* 
*         EXIT   TO *7EK*.
*                (T2) = READ BUFFER ADDRESS.
*                (T4 - T7) = UNCHANGED. 
*                (DEDT) = 8/0, 4/*6DE* DRIVER TYPE. 
*                (DEEC) = ERROR CODE. 
*                (DENR) = 0 IF NOT 819 DEVICE OR IF 819 DEVICE AND *NOT 
*                         READY* ERROR. 
*                (DENR) = 1 IF 819 DEVICE AND NOT *NOT READY* ERROR.
*                (DERC) = 0 IF FIRST RETRY ATTEMPT, ELSE UNCHANGED. 
*                (DERW) = 1 IF WRITE REQUEST, 0 IF READ REQUEST.
*                (DEST) = 2000 (UNRECOVERED ERROR). 
*                (DEWR) = 0 IF FIRST RETRY ATTEMPT, ELSE UNCHANGED. 
*                (DEXA) = ERROR PROCESSOR EXIT ADDRESS. 
*                (RDCT) = ERROR PROCESSOR INTERFACE WORD. 
*                         BITS AFFECTED BY THIS OVERLAY - 
*                         BIT 4 = 1 IF FIRST RETRY ATTEMPT, OTHERS 0. 
*                (MB+2) = DRIVER DEPENDENT PART OF BML MESSAGE. 
*                         12/, 12/S, 12/W, 24/E.
*                         S = ERROR STATUS. 
*                         W = WORD COUNT. 
*                         E = EXTENDED MEMORY ADDRESS.
* 
*         USES   T1, T2, CM - CM+4. 
* 
*         MACROS MSERR. 
  
  
 MSG      ENTRY              *7DE* ENTRY
  
*         PRESET ERROR PROCESSING CELLS.  THE *DEST* UNRECOVERED ERROR
*         FLAG IS PRESET *ON* TO AVOID ERROR RETRIES ON BUFFERED DISK 
*         OR EXTENDED MEMORY DEVICES.  THE BUFFERED DISK DRIVER OR
*         *CPUMTR* WILL HAVE ALREADY PERFORMED ANY APPROPRIATE RETRY
*         SEQUENCE FOR THE ERROR. 
  
          SFA    EST,T5      GET EST ENTRY
          ADK    EQDE 
          CRD    CM 
          LDM    STSA        PRESET ERROR CODE
          STM    DEEC 
          ERRPL  DEEC-*      CODE DESTROYED 
          LDC    2000        SET UNRECOVERED FLAG 
          STI    T2 
          LDK    /COMSDFS/D6DE  SAVE DRIVER TYPE
          STM    DEDT 
          ERRPL  DEDT-*      STORE DESTROYS CODE
          LDM    ECSA        SET READ/WRITE FLAG
          SHN    -6 
          LPN    1
          LMN    1
          STM    DERW        SAVE READ/WRITE FLAG 
          ERRPL  DERW-*      STORE DESTROYS CODE
          ERRNZ  REBS 
          ERRNZ  RESS-1 
          ERRNZ  WESS-2 
          ERRNZ  WRIP-1 
          ERRNZ  REDP 
          LDI    T1 
          LPC    100
          NJN    MSG2        IF ERROR RECOVERY ALREADY IN PROGRESS
          STM    DERC        INITIALIZE RETRY COUNT 
          STM    DENR        INITIALIZE NON-RECOVERABLE FLAG
          LDD    HN          SET RECOVERY IN PROGRESS FLAG
          STI    T1 
 MSG2     LDM    DERW        SET/CLEAR DATA WRITTEN FLAG
          STM    DEWR 
  
*         SINCE THE 819 INTERRUPT HANDLER DOES NOT ATTEMPT TO 
*         ACCURATELY ASSESS THE RECOVERABILITY OF THE FAILURE, FORCE
*         THE ERROR NON-RECOVERABLE UNLESS IT-S A *NOT READY* 
*         CONDITION.
  
          LDD    CM+3 
          LPN    77 
          LMN    1RV
          ZJN    MSG3        IF 819 DEVICE
          LMN    1RW&1RV
          NJN    MSG4        IF NOT 819 DEVICE
 MSG3     LDM    DEEC 
          LMK    NRDE 
          ZJN    MSG4        IF DEVICE NOT READY ERROR
          LMK    LNRE&NRDE
          ZJN    MSG4        IF LOGICAL NOT READY ERROR 
          AOM    DENR        SET ERROR NOT RECOVERABLE
 MSG4     LDC    ECS2        SET RETURN ADDRESS 
          STM    DEXA 
          ERRPL  DEXA-*      STORE DESTROYS CODE
          LDD    CM+3        CHECK EQUIPMENT TYPE 
          LPN    77 
          LMN    1RE
  
*         *7DE* AND ASSOCIATED *PPR* ERROR PROCESSING OVERLAYS ISSUE NO 
*         BML, ERROR LOG OR DAYFILE MESSAGES FOR BUFFERED DISK DEVICES. 
*         BUFFERED DEVICE DRIVERS ISSUE ALL SUCH MESSAGES.
  
          NJN    MSG8        IF BUFFERED DISK 
          LDD    MA          GET PHYSICAL DATA FOR MESSAGE
          ADN    1
          CRD    CM 
          LDN    0           CLEAR UNUSED FIELDS IN BML MESSAGE 
          STD    CM 
          LDM    STSA        ADD *PIOM* STATUS TO MESSAGE 
          LMK    ADDE 
          ZJN    MSG7        IF ADDRESS ERROR 
          LDN    1&10        SET *HARDWARE ERROR* FLAG
 MSG7     LMN    10 
          STD    CM+1 
          LDC    101         SAVE WORD COUNT
          STD    CM+2 
 MSG8     LDM    RDSA        SET READ BUFFER ADDRESS
          STD    T2 
          LDD    MA          WRITE *7EK* PARAMETERS 
          ADN    2
          CWD    CM 
          MSERR  7EK         EXECUTE *7EK*
          SPACE  4,10 
          ERRNG  10000-*     *7DE* HAS OVERFLOWED 
          BSS    10000-*     SPARES (ADJUST ORIGIN BY 5 AS REQUIRED)
          CON    MSG-1       (T0) = ENTRY ADDRESS - 1 
          CON    RDCT        (T1) = RDCT
          CON    DEST        (T2) = DEST
          ERRNZ  LN-*        INCORRECT OVERLAY LENGTH 
          QUAL   *
          SPACE  4
          END 
