COMPVEI 
COMMON
          CTEXT  COMPVEI - VALIDATE EOI FOR MASS STORAGE FILE.
          SPACE  4,10 
          IF     -DEF,QUAL$,1 
          QUAL   COMPVEI
          BASE   M
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          SPACE  4,10 
***       VEI - VALIDATE EOI FOR MASS STORAGE FILE. 
* 
*         P. D. HAAS.        79/09/21.
          SPACE  4,10 
***              *COMPVEI* CONTAINS SEVERAL SUBROUTINES USED TO 
*         VALIDATE EOI FOR A DISK FILE. 
* 
*         XREF   COMSCPS, COMPC2D, COMPSEI, COMPSNT, COMPIRA. 
          SPACE  4,10 
*         ASSEMBLY CONSTANTS. 
  
  
 NT       DEFC   FS          NUMBER OF TRACKS 
 SBUF     DEFC   BFMS        SECTOR BUFFER
 CLF      SPACE  4,15 
**        CLF - CHANGE LENGTH OF FILE IN TRT. 
* 
*         ENTRY  (T5) = EST ORDINAL.
*                (T6) = TRACK FOR EOI.
*                (T7) = SECTOR FOR EOI. 
* 
*         EXIT   EOI IN TRT CHANGED.
* 
*         USES   CM - CM+4. 
* 
*         MACROS ENDMS, MONITOR.
  
  
 CLF      SUBR               ENTRY/EXIT 
          ENDMS 
          LDD    T6 
          LPC    3777 
          STD    CM+2 
          LDD    T7          SET UP MONITOR REQUEST 
          STD    CM+3 
          LDD    T5          ADJUST EOI IN TRT
          LMC    4000 
          STD    CM+1 
          MONITOR DTKM
          UJN    CLFX        RETURN 
 RDC      SPACE  4,20 
**        RDC - READ DISK CHAIN.
* 
*         ENTRY  (A) .GE. 0 IF EOI PARAMETERS SET.
*                (T5) = EST ORDINAL.
*                (FS+1) = FIRST TRACK OF PRESERVED FILE.
*                (FS+4) NONZERO.
*                (RDCA) = ADDRESS AT WHICH TO WRITE THE STATUS MESSAGE. 
*                *SETMS IO* PERFORMED.
* 
*         EXIT   (A) = 0 IF EOI ON DISK MATCHES EOI IN TRT. 
*                (A) .NE. 0 IF LENGTH/LINKAGE/DISK ERROR. 
*                (T6) = EOI TRACK.
*                (T7) = EOI SECTOR. 
*                (FS+4) = 0, IF EOI SECTOR MUST BE REWRITTEN. 
* 
*         USES   NT, FS+2 - FS+4, T2 - T7.
* 
*         CALLS  C2D, RDS, SEI, VSL.
* 
*         MACROS SETMS. 
  
  
 RDC      SUBR               ENTRY/EXIT 
          PJN    RDC1        IF EOI LOCATED 
*         LDN    (NONZERO)   (DO NOT FORCE CURRENT TRT) 
          RJM    SEI         SEARCH FOR EOI IN TRT
          STD    NT          SET NUMBER OF TRACKS 
          LDD    T6          SAVE EOI TRACK 
          STD    FS+2 
          LDD    T7          SAVE EOI SECTOR
          STD    FS+3 
 RDC1     SETMS  POSITION 
          LDD    TH          SET *READSTR* STATUS 
          RAM    CHRV 
          SETMS  =,READSTR
          LDC    SBUF        SET BUFFER ADDRESS 
          STD    T3 
          LDN    FSMS        SET FIRST DATA SECTOR
          STD    T7 
          STM    RDCC 
          LDD    FS+1        SET FIRST TRACK
          STM    RDCD 
 RDC2     STD    T6 
          SHN    -6          CONVERT TO DISPLAY CODE
          RJM    C2D
          STM    RDCB+1      SET IN MESSAGE 
          LDD    T6 
          RJM    C2D
          STM    RDCB+2 
          LDC    DSCP*CPAS+MS1W  STORE STATUS MESSAGE 
 RDCA     EQU    *-1
          CWM    RDCB,ON
 RDC3     LDD    T3          READ NEXT SECTOR 
          RJM    RDS
          PJN    RDC3.1      IF NO ERROR
          LDC    **          (LAST SECTOR BEFORE ERROR) 
 RDCC     EQU    *-1
          STD    T7 
          LDC    **          (LAST TRACK BEFORE ERROR)
 RDCD     EQU    *-1
          STD    T6 
          UJN    RDC4.1      SET REWRITE OF EOI SECTOR
  
 RDC3.1   LDD    T7          SAVE SECTOR/TRACK
          STM    RDCC 
          LDD    T6 
          STM    RDCD 
          LDI    T3          CHECK LINKAGE
          NJN    RDC4        IF NOT EOF/EOI SECTOR
          ADM    1,T3 
          ZJN    RDC5        IF EOI SECTOR
          STI    T3          SAVE LINKAGE BYTE FOR EOF SECTOR 
 RDC4     RJM    VSL         VALIDATE SECTOR LINKAGE
          ZJN    RDC3        IF NORMAL SECTOR LINKAGE 
          PJP    RDC2        IF CROSSING TRACK BOUNDARY 
 RDC4.1   LDN    0           SET REWRITE OF EOI SECTOR
          STD    FS+4 
          LDN    1
          UJN    RDC6        RETURN ERROR STATUS
  
 RDC5     LDD    T6          COMPARE EOI ON DISK WITH TRT EOI 
          LMD    FS+2 
          NJN    RDC6        IF NOT SAME TRACK
          LDD    T7 
          LMD    FS+3 
 RDC6     STD    T2          SAVE STATUS
          LDC    -1000       CLEAR *READSTR* STATUS 
          RAM    CHRV 
          SETMS  =,IO 
          LDD    T2          RETURN STATUS
          LJM    RDCX        RETURN 
  
  
 RDCB     DATA   C* T0000.* 
 VFL      SPACE  4,15 
**        VFL - VERIFY FILE LENGTH. 
* 
*         ENTRY  (T5) = EST ORDINAL.
*                *SETMS IO* PERFORMED.
* 
*         EXIT   (A) = 0 IF NO LENGTH ERRORS. 
*                (A) .LT. 0 IF READ ERROR.
*                (NT) = NUMBER OF TRACKS TO EOI.
*                (FS+2) = EOI TRACK.
*                (FS+3) = EOI SECTOR. 
* 
*         CALLS  RDS, SEI.
* 
*         MACROS ENDMS, SETMS.
  
  
 VFL      SUBR               ENTRY EXIT 
          RJM    SEI
          STD    NT          SET NUMBER OF TRACKS 
          LDD    T6          SAVE EOI TRACK 
          STD    FS+2 
          LDD    T7          SAVE EOI SECTOR
          STD    FS+3 
          SETMS  POSITION 
          LDC    SBUF        READ EOI SECTOR
          RJM    RDS
          MJN    VFLX        IF READ ERROR
          ENDMS 
  
*         DETERMINE IF EOI SECTOR WAS READ. 
  
          LDM    SBUF 
          ADM    SBUF+1 
          UJN    VFLX 
 VSL      SPACE  4,25 
**        VSL - VALIDATE SECTOR LINKAGE.
* 
*         ENTRY  (T3) = BUFFER ADDRESS. 
*                (T6) = CURRENT TRACK.
*                (T7) = CURRENT SECTOR. 
*                (NT) = TRACK COUNT TO EOI. 
*                (FS+2) = EOI TRACK FROM TRT. 
*                (FS+3) = EOI SECTOR FROM TRT.
* 
*         EXIT   (A) = 0 IF NORMAL SECTOR LINKAGE.
*                (A) = NEXT TRACK IF CROSSING TRACK BOUNDARY. 
*                (A) = -0 IF LINKAGE ERROR. 
*                (T6) = NEXT TRACK. 
*                (T6) = EOI TRACK, IF LINKAGE ERROR.
*                (T7) = NEXT SECTOR.
*                (T7) = EOI SECTOR, IF LINKAGE ERROR. 
*                (NT) DECREMENTED IF TRACK BOUNDARY CROSSED.
* 
*         USES   NT, T6, T7.
* 
*         CALLS  SNT. 
  
  
 VSL3     LDI    T3          CHECK SECTOR LINKAGE 
          SHN    21-13
          PJN    VSL1        IF LINKAGE DOESNT INDICATE NEW TRACK 
          SOD    NT          DECREMENT TRACK COUNT FOR FILE 
          ZJN    VSL2        IF BEYOND EOI IN TRT 
          RJM    SNT         GET NEXT TRACK FROM TRT
          LMI    T3 
          NJN    VSL1        IF NOT SAME TRACK IN LINKAGE 
          STD    T7          SET FIRST SECTOR FOR NEXT TRACK
          LDI    T3          RETURN WITH (A) = NEXT TRACK 
  
 VSL      SUBR               ENTRY/EXIT 
          AOD    T7          ADVANCE SECTOR NUMBER
          LMM    SLM
          ZJN    VSL3        IF SECTOR LIMIT
          LDD    T7 
          LMI    T3 
          ZJN    VSLX        IF VALID SECTOR LINKAGE
 VSL1     SOD    T7          SET EOI SECTOR 
          LCN    0           INDICATE LINKAGE ERROR 
          UJN    VSLX        RETURN 
  
 VSL2     LDD    FS+3        SET EOI SECTOR 
          STD    T7 
          LDD    FS+2        SET EOI TRACK
          STD    T6 
          LCN    0           INDICATE LINKAGE ERROR 
          UJN    VSLX        RETURN 
          SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 CLF      EQU    /COMPVEI/CLF 
 RDC      EQU    /COMPVEI/RDC 
 RDCA     EQU    /COMPVEI/RDCA
 VFL      EQU    /COMPVEI/VFL 
 QUAL$    ENDIF 
          ENDX
