6DX 
          IDENT  6DX,MSFW 
          PERIPH
          BASE   MIXED
          SST 
          TITLE  6DX - UEM DRIVER.
*COMMENT  6DX - UEM DRIVER. 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          SPACE  4,10 
*****     6DX - UEM DRIVER. 
*         C. B. LOSCHEIDER.  81/03/04.
          SPACE  4,10 
***       6DX PROVIDES THE CAPABILITY TO ACCESS UEM.
          SPACE  4,10 
***       ORGANIZATION OF UEM.
*         UEM IS TREATED AS A SINGLE DEVICE.
* 
*         EQUIPMENT TYPE IS *DE*. 
* 
*         SECTORS/TRACK = SLDE (20B, 40B, 100B, OR 200B). 
* 
*         WORDS/TRACK = 101B*SLDE.
          SPACE  4,10 
**        ENTRY CONDITIONS. 
* 
* 
*         (T5) = EST ORDINAL. 
*         (T6) = TRACK. 
*         (T7) = SECTOR.
          SPACE  4,10 
*CALL     COMPMAC 
*CALL     COMSDFS 
*CALL     COMSMSP 
*CALL     COMSPIM 
          SPACE  4,10 
*         ASSEMBLY CONSTANTS. 
  
  
 DEC      MICRO  1,, 6DX     DECK NAME
          EJECT 
**        ENTRY POINT TRANSFERS.
  
  
          ORG    MSFW 
  
          CON    PRS         PRESET ADDRESS 
  
  
 RDS      CON    0           ENTRY
          UJN    RDS.        ENTER DRIVER 
  
  
 WDS      CON    0           ENTRY
          UJN    WDS.        ENTER DRIVER 
 EMS      SPACE  4,10 
**        EMS - END MASS STORAGE OPERATION. 
* 
*         EXIT   (A) = 0. 
*                (UEMG) = EM SHIFT FOR CALCULATING HEADER ADDRESS.
*                (UEMH) = EM SHIFT FOR CALCULATING EM ADDRESS.
  
  
 .EMS     SUBR               ENTRY/EXIT 
          LDN    0
          STM    CHRV 
          UJN    .EMSX       RETURN 
 RDS      SPACE  4,10 
**        RDS - READ SECTOR.
* 
*         ENTRY  (A) = BUFFER ADDRESS FOR SECTOR. 
* 
*         EXIT   (A) = 0 IF TRANSFER COMPLETE.
*                    = ERROR CODE IF ERROR OCCURRED.
* 
*         CALLS  UEM. 
  
  
 RDS.     LPC    7777 
          UJN    UEM         SET BUFFER ADDRESSES 
 WDS      SPACE  4,10 
**        WDS - WRITE SECTOR. 
* 
*         ENTRY  (A) = BUFFER ADDRESS FOR SECTOR. 
* 
*         EXIT   (A) = 0 IF TRANSFER COMPLETE.
*                    = ERROR CODE IF ERROR OCCURRED.
* 
*         CALLS  UEM. 
  
  
 WDS.     LPC    7777 
          LMC    1S15 
*         UJN    UEM         SET BUFFER ADDRESSES 
 UEM      SPACE  4,15 
**        UEM - UEM TRANSFER. 
* 
*         ENTRY  (A) = 3/ O,3/,12/ BUFFER ADDRESS.
*                      O = 0 FOR READ REQUEST.
*                        = 1 FOR WRITE REQUEST. 
*                (UEMG) = EM SHIFT FOR CALCULATING HEADER ADDRESS.
*                (UEMH) = EM SHIFT FOR CALCULATING EM ADDRESS.
* 
*         EXIT   (A) .LT. 0, IF UNRECOVERED ERROR.
* 
*         MACROS MSERR. 
  
  
 UEM      STM    UEMD        SET BUFFER ADDRESS FOR HEADER
          ADN    2
          STM    UEME 
          SHN    -17         SAVE READ/WRITE FLAG FOR *7DX* 
          STI    D1 
          SHN    1           SET RETURN INDEX 
          STD    CM 
          ERRNZ  RDS+2-WDS   CODE DEPENDS ON VALUE
          SHN    7-1         SET READ / WRITE INSTRUCTIONS
          LMC    CRMI+ON
          STM    UEMD-1 
          LMN    HN&ON
          STM    UEME-1 
          LDM    RDS,CM      SET RETURN ADDRESS 
          STM    UEMF 
          LDC    **          LARGEST TRACK VALUE
 UEMA     EQU    *-1
          SBD    T6 
          MJN    UEM1        IF TRACK TOO LARGE 
          LDD    T7 
          SBM    SLM
          MJN    UEM2        IF SECTOR OKAY 
  
*         INVALID MASS STORAGE ADDRESS. 
  
 UEM1     LDN    ADDE        SET ADDRESS ERROR
          STM    ERRA 
          MSERR  7DX         CALL *7DX* ERROR PROCESSOR 
  
*         VALID MASS STORAGE ADDRESS. 
  
 UEM2     LDD    T6          HEADER ADDRESS = TRACK*101B*SLDE+SECTOR
          LPC    3777 
          SHN    1
          STD    CM+1 
          SHN    6
          RAD    CM+1 
          SHN    -14
 UEMG     SHN    4-1
*         SHN    4-1+EMTS    (EMTS = TRACK SHIFT) 
          STD    CM 
          LDD    CM+1 
 UEMH     SHN    4-1
*         SHN    4-1+EMTS    (EMTS = TRACK SHIFT) 
          LMD    T7          ADD SECTOR NUMBER
          STD    CM+1 
          SHN    -14
          RAD    CM 
          LDC    0           CM ADDR = HEADER ADDR + UEM BASE ADDR
 UEMB     EQU    *-1
          RAD    CM+1 
          SHN    -14
          ADC    0
 UEMC     EQU    *-1
          RAD    CM 
          SRD    CM+2        SAVE R-REGISTER
          LDD    CM+1        PUT UPPER 18 ADDR BITS IN R-REGISTER 
          SCN    77 
          SHN    6
          LMD    CM 
          SHN    6
          STD    T2 
          SHN    -14
          STD    T1 
          LRD    T1 
          LDD    CM+1        PUT LOWER 6 ADDR BITS IN A-REGISTER
          LPN    77 
          STD    CM+1 
          LMC    400000 
          CRM    *,ON        READ/WRITE HEADER
 UEMD     EQU    *-1
          LDD    T7          DATA ADDRESS = HEADER + SLDE +77 * SECTOR
          SHN    6
          SBD    T7 
          ADM    SLM
          ADD    CM+1 
          LMC    400000 
          CRM    *,HN        READ/WRITE DATA
 UEME     EQU    *-1
          LRD    CM+2        RESTORE R-REGISTER 
          LDN    0           INDICATE NO ERRORS 
          STM    CHRV 
 UEM3     LJM    *           RETURN 
 UEMF     EQU    *-1
 PRS      SPACE  4,10 
**        PRS - PRESET. 
* 
*         ENTRY  (CM - CM+4) = EST ENTRY. 
  
  
 PRS      LDK    MEFL        SET EM SHIFT 
          CRM    PRSA,ON
          LDM    PRSA+2 
          SHN    -5 
          LPN    3
          ADC    SHNI+4-1 
          STM    UEMG        UPDATE SHIFT INSTRUCTIONS
          STM    UEMH 
          LDC    UEML        GET UEM BASE ADDRESS 
          CRM    PRSA,ON
          LDM    PRSA 
          SHN    21-2 
          STM    UEMC 
          SHN    13-21
          SCN    77 
          STM    UEMB 
          LDD    CM+4        SET LARGEST TRACK
          SHN    3
          ADK    TDGL 
          CRM    PRSA,ON
          SOM    PRSA 
          ADC    4000 
          STM    UEMA 
          LJM    SMSX        RETURN 
  
 PRSA     BSS    0           FIVE BYTES FOR READING LARGEST TRACK 
 .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 
 7DX      MSOVL  7702,T2,EPFW-1,(UEM ERROR PROCESSOR.)
          SPACE  4,10 
*****     7DX - UEM ERROR PROCESSOR.
*         C. B. LOSCHEIDER.  81/03/04.
          SPACE  4,10 
***       *7DX* IS CALLED WHEN AN UNRECOVERABLE UEM ABORT 
*         HAS OCCURRED. THE ONLY ERROR WHICH MAY OCCUR
*         IS AN ADDRESSING ERROR. 
          SPACE  4,10 
          QUAL
 BEGIN    BSSN   PRS
 ERRA     BSSN   1           ERROR FLAG WORD
          ERRNG  DEFW-*      *7DX*/COMMON ERROR PROCESSOR CONFLICT
 END      BSSN
          QUAL   *
 MSE      SPACE  4,25 
**        MSE - MASS STORAGE ERROR PROCESSOR. 
* 
*         ENTRY  ((D1)) = 0 IF READ, 1 IF WRITE.
*                (UEMD) = PP BUFFER ADDRESS OF HEADER.
*                (ERRA) = ERROR CODE AS DEFINED IN *COMSMSP*. 
*                (T1) = UEMD. 
*                (T2) = ERRA. 
*                (T5) = EQUIPMENT.
*                (T6) = LOGICAL TRACK.
*                (T7) = LOGICAL SECTOR. 
* 
*         EXIT   (T2) = READ BUFFER ADDRESS FOR *7EK*.
*                (DEDT) = 8/0, 4/*6DX* DRIVER TYPE. 
*                (DEEC) = ERROR CODE. 
*                (DENR) = 0.
*                (DERC) = 0.
*                (DERW) = 1 IF WRITE REQUEST, 0 IF READ REQUEST.
*                (DEST) = 0.
*                (DEWR) = 0.
*                (RDCT) = 5/0, 1/1, 6/0.
*                (MB+2) = DRIVER DEPENDENT PART OF BML MESSAGE. 
*                         24/0, 12/W, 24/A. 
*                         W = WORD COUNT. 
*                         A = EXTENDED MEMORY ERROR ADDRESS.
* 
*         USES   T2, CM - CM+4. 
* 
*         MACROS MSERR. 
  
  
 DDX      ENTRY              *7DX* ENTRY
  
          LDI    D1          SET READ/WRITE FLAG
          STM    DERW 
          LDK    /COMSDFS/D6DX  SAVE DRIVER TYPE
          STM    DEDT 
          LDD    HN          SET RECOVERY IN PROGRESS FLAG
          STM    RDCT 
          LDI    T2          SET ERROR CODE 
          STM    DEEC 
          LDK    MEFL 
          CRD    CM 
          LDD    CM+2 
          SHN    -5 
          LPN    3
          RAM    DDXA 
          LDD    T6          HEADER ADDRESS = TRACK*101B*SLDE+SECTOR
          LPC    3777 
 DDXA     SHN    4
*         SHN    4+EMTS      (EMTS = TRACK SHIFT) 
          STD    CM+4 
          SHN    -6 
          STD    CM+3 
          SHN    -6 
          RAD    CM+3 
          LDD    CM+4 
          LPN    77 
          SHN    6
          ADD    T7 
          RAD    CM+4 
          SHN    -14
          RAD    CM+3 
          LDN    1           SAVE WORD COUNT FOR BML MESSAGE
          STD    CM+2 
          LDN    0           CLEAR UNUSED FIELDS IN BML MESSAGE 
          STD    CM+1 
          STD    CM 
          STM    DENR        INITIALIZE *NON-RECOVERABLE ERROR* FLAG
          STM    DERC        INITIALIZE RETRY COUNT 
          STM    DEST        INITIALIZE ERROR PROCESSING CONTROL WORD 
          ERRNZ  RTC.AD      *7DX* ASSUMES NO RETRY WILL BE ATTEMPTED 
          STM    DEWR        INITIALIZE *DATA WRITTEN/READ* FLAG
          LDI    T1          SET ADDRESS OF BUFFER HEADER 
          STD    T2 
          LDD    MA          SAVE DEPENDENT PART OF BML MESSAGE 
          ADN    2
          CWD    CM 
          MSERR  7EK         EXECUTE *7EK*
  
  
          ERRNG  10000-*     *7DX* HAS OVERFLOWED 
          BSS    10000-*     SPARES (ADJUST ORIGIN BY 5 AS REQUIRED)
          CON    DDX-1       (T0) = ENTRY ADDRESS - 1 
          CON    UEMD        (T1) = BUFFER HEADER ADDRESS 
          CON    ERRA        (T2) = ADDRESS OF WORD CONTAINING
                                    ERROR FLAG
          ERRNZ  LN-*        ILLEGAL PROGRAM LENGTH 
          QUAL   *
          END 
