C V1A Edit #11 3-Aug-84 Autor: -tf- File: CPRD.FOR C C C P R D . F O R : READ A RECORD FROM CP/M - SD FLOPPIES C C C H.P. STOEHREL C C *** V1 *** 3-DEC-81 C SUBROUTINE CPRD (IB,IREC) C INTEGER*2 IB(1024),ITYP(13),IFL(256) INTEGER*2 ISEC,ITR,IFUNC,IUNIT,IDENS,IERR C C IB MUST BE DIMENSIONED IN CALLING PROGRAM TO 1024 (INTEGERS) C IREC IS THE RECORD-# TO BE READ C C CP/M RECORDS CONSIST OF 8 SECTORS @ 128 BYTES = 1024 BYTES C C CP/M RECORDS START FROM TRACK 2 WITH C 6 SECTOR INTERLEAVING AND SOME SPECIALITIES C C CP/M DIRECORIES ARE CONTAINED IN RECS 0 & 1 C C TYPICAL RECORD FIRST SECTOR : C DATA ITYP/1,23,20,16,11,8,4,25,21,18,13,9,6/ C IFUNC=0 IDENS=0 C ITR=(IREC*8)/26+2 ! CALCULATE TRACK# C ITY=IREC-(IREC/13)*13 ! CALCULATE TYPICAL RECORD ISEC=ITYP(ITY+1) ! GET START SECTOR C ISCT=0 ! SECTOR COUNTER C 100 IPT=ISCT*128 ! BUFFER POINTER ISCT=ISCT+1 ! COUNT SECTORS IF (ISCT.GT.8) RETURN ! WE'RE READY C C TYPE 999,ITR,ISEC,IPT,IFUNC,IUNIT,IDENS C999 FORMAT(' TRACK=',I4,' SECT= ',I4,' IPT= ',I8,' IFUNC=',I3, C 1' IUNIT=',I3,' IDENS=',I3) C CALL SSEC (IFL,ISEC,ITR,IFUNC,IUNIT,IDENS,IERR) IF (IERR.NE.0) GOTO 9000 C C TYPE 201,(IFL(K),K=1,256) C201 FORMAT(X,64A1) C DO 500 K=1,128 500 IB(IPT+K)=IFL(K) C IF (ISEC.NE.21) GOTO 110 ISEC=2 GOTO 100 110 IF (ISEC.NE.22) GOTO 120 ISEC=1 ITR=ITR+1 GOTO 100 120 ISEC=ISEC+6 ! 6 SECTOR INTERLEAVING... IN GENERAL ! IF (ISEC.LE.26) GOTO 100 ISEC=ISEC-26 GOTO 100 C 9000 TYPE 9001,IERR 9001 FORMAT(/' ?CPMRT-F-Unknown DY-Error ',I3,/) CALL EXIT C END