COMPDDT 
COMMON
          CTEXT  COMPDDT - DIRECT DISK TRANSFER.
          IF     -DEF,QUAL$,1 
          QUAL   COMPDDT
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          SPACE  4,10 
***       DDT - DIRECT DISK TRANSFER. 
*         S. L. BETH         79/12/21.
          SPACE  4,10 
***       DDT - PROCESS THE DIRECT TRANSFER *PIOM* SUBFUNCTIONS.
* 
*         ENTRY  (T5) = EST ORDINAL.
*                (T6) = TRACK.
*                (T7) = SECTOR. 
*                (CM+2 - CM+4) = 18/ LWA, 18/ FWA.
*                     LWA = LAST WORD ADDRESS OF TRANSFER IF *EOR* READ.
*                     FWA = FIRST WORD ADDRESS OF TRANSFER. 
*                (CM+3 - CM+4) = CM ADDRESS.
*                (A) = 6/ SF, 12/ SC. 
*                      SF = *PIOM* SUBFUNCTION. 
*                      SC = SECTOR COUNT. 
*                      7777 = READ TO EOR.
*                *6DE* LOADED (CHVR) + (UERR) SET BY *SETMS* MACRO. 
* 
*         EXIT   (A) = 0 IF TRANSFER SUCCESSFUL.
*                    = 1/1, 1/L, 4/0, 12/(RDCT)  IF TRANSFER FAILED.
*                      L = 0 IF THE FAILURE WAS DUE TO AN I/O ERROR,
*                          AN ADDRESS ERROR OR AN INACCESSIBLE DEVICE.
*                          THE ERROR CODE, AND OTHER ERROR PROCESSING 
*                          INFORMATION IS IN CELL *RDCT* AND IN THE 
*                          LOWER 12 BITS OF THE ACCUMULATOR.  SEE 
*                          *COMSMSP* FOR A DESCRIPTION OF THE FORMAT OF 
*                          *RDCT*.
*                      L = 1 IF INSUFFICIENT FIELD LENGTH FOR TRANSFER. 
*                          *RDCT* INFORMATION IS NOT MEANINGFUL IF THIS 
*                          BIT IS SET.
*                (T4) = SECTORS TRANSFERED. 
*                (T6, T7) UPDATED TO CURRENT POSITION.
* 
*         USES   T0, CM - CM+4, T4 - T7.
* 
*         MACROS MONITOR, PAUSE.
  
  
 DDT      SUBR               ENTRY/EXIT 
          STM    DDTA        SAVE SECTOR COUNT
          SHN    -6          SAVE SUBFUNCTION 
          SCN    77 
          STM    DDTB 
          LDM    CHRV        SET CHANNEL CONTROL
          STD    CM 
 DDT1     LDD    OA          CHECK OUTPUT REGISTER CLEAR
          CRM    DDTC,ON
          LDM    DDTC 
          NJN    DDT1        IF OUTPUT REGISTER NOT CLEAR 
          LDD    MA 
          CWD    T4 
          LDC    **          CHECK FOR *EOR* TRANSFER 
 DDTA     EQU    *-1
          LMC    7777 
          NJN    DDT2        IF NOT *EOR* TRANSFER
          LDN    4           SET *EOR* READ FLAG
          RAM    DDTB 
          UJN    DDT3        SET UP CALL
  
 DDT2     LDM    DDTA        SET SECTOR COUNT 
          STD    CM+2 
 DDT3     LDC    **          SET SUBFUNCTION
 DDTB     EQU    *-1
          STD    CM+1 
          SHN    -6 
          LMN    WDDS 
          NJN    DDT3.1      IF NOT DIRECT WRITE
          LDM    UERR        SET REWRITE AND BUFFER FLUSH FLAGS 
          SHN    0-6
          LPN    3
          LMN    2
          RAD    CM+1 
          ERRNZ     EPRW-100           CODE ASSUMES VALUE 
          ERRNZ     EPNF-200           CODE ASSUMES VALUE 
 DDT3.1   MONITOR  PIOM      INITIATE TRANSFER
          LDD    MA 
          CRD    T4 
          LDD    CM 
          STM    CHRV 
          LDD    CM+1        CHECK STATUS 
          SHN    21-13
          PJN    DDT5        IF FUNCTION NOT TO BE REISSUED 
 DDT4     PAUSE  NE 
          LDD    MA 
          ADN    1
          CRD    CM 
          LDD    CM+1 
          SHN    21-12
          MJN    DDT3        IF TIME TO REISSUE 
 DDT4.1   UJN    DDT4        WAIT FOR I/O COMPLETION
  
 DDT5     ZJN    DDT6        IF NO ERROR
          LPC    40000
          ERRNZ  IFLS-400    CODE IS VALUE DEPENDENT
          SHN    20-16
          NJN    DDT6        IF INSUFFICIENT FL 
          LDM    DDTB        SET READ/WRITE FLAG
          SHN    -6+1 
          SBN    RDDS*2 
          STD    T0 
          ZJN    DDT7        IF READ FUNCTION 
          LDD    CM+1 
          LMK    NRDE 
          NJN    DDT7        IF NOT *NOT READY* 
          LDM    UERR 
          LPN    EPNR 
          NJN    DDT7        IF RETURN ON NOT READY SELECTED
          LDC    6000        RETRY OPERATION
          RAD    CM+1 
          LDD    MA 
          ADN    1
          CWD    CM 
          UJN    DDT4.1      PAUSE AND REISSUE OPERATION
  
 DDT6     LJM    DDTX        RETURN 
  
 DDT7     LDM    DDTD,CM+1   DETERMINE RECOVERABILITY OF ERROR
          SBN    1
          ZJN    DDT8        IF RECOVERABLE ERROR 
          SHN    0-21 
          NJN    DDT8        IF NON-RECOVERABLE ERROR 
          LDD    T0 
          SHN    -1 
 DDT8     LMD    T0          BUILD REPLY STATUS 
          SHN    13-1 
          LMC    1S17D+1S8D 
          LMD    CM+1 
          STM    RDCT 
          UJN    DDT6        RETURN 
  
  
 DDTC     BSS    5
  
  
*         THE FOLLOWING TABLE IS USED TO DETERMINE MASS STORAGE ERROR 
*         RECOVERABILITY.  IT IS INDEXED BY THE ERROR CODE.  ENTRY
*         FORMAT -
*                VFD    10/0
*                VFD    2/RECOVERABILITY INDICATOR
*                            0    NON-RECOVERABLE.
*                            1    RECOVERABLE.
*                            2    RECOVERABLE IF READ REQUEST.
  
  
          LIST   G
 DDTD     EQU    *-1
          ECHO   1,EC=("DREC")
          VFD    10/0,2/REC._EC 
          LIST   *
  
  
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 DDT      EQU    /COMPDDT/DDT 
 QUAL$    ENDIF 
          ENDX
