home *** CD-ROM | disk | FTP | other *** search
- PROGRAM SphereRot
- C Create 2 sphere sprites and rotate them with selection of shapes
- C Copyright K.M. Crennell 1 Dec 1991
- C Last update prompts for new mode 3/6/92
- C Prev. update to check successful write to sprite file 18/5/92
- C
- C PD_f77 libraries needed Graphics SpriteOps Utils
- C
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- DIMENSION IREGS(0:7)
- LOGICAL SWIF77
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- C get screensize
- IREGS(0)=2
- IF(SWIF77(?I5C,IREGS,IFLAG))THEN
- C can't get screen size
- PRINT *,' Can not get screen size'
- STOP
- ENDIF
- C set screensize to 320K
- IREGS(0)=2
- IREGS(1)=320*1024-IREGS(1)
- IF(SWIF77(?I2A,IREGS,IFLAG))THEN
- C can't set screen size
- PRINT *,' Can not set screen size to 320K'
- PRINT *,' Try setting screen mode to 27, 12 or 9'
- STOP
- ENDIF
- CALL INIT
- N=1
- CALL SWAP(N)
- CALL CLS
- CALL SWAP(N)
- CALL ORIGIN (640,512 )
- CALL CURSOR(.FALSE.)
- C set default initial object to be shape 6
- ISH=6
- CALL NEW
- CALL OSBYTE(4,1,0)
- CALL OSBYTE(11,64,0)
- C Increment in x,y,z of image
- SS=20.
- C ------------start of main loop----------
- 10 CONTINUE
- CALL MOUSE (MY,MX,MB)
- C left mouse button
- IF(MB.EQ.1) ZP=ZP+SS
- C right mouse button
- IF(MB.EQ.4) ZP=ZP-SS
- IC=INKEY(0)
- IF(IC.GE.48 .AND.IC.LE.9+48)THEN
- C ask for a new object (INDEX by IC)
- ISH=IC-48
- CALL NEW
- ENDIF
- IF(IC.EQ.68.OR.IC.EQ.100)THEN
- C DUMP THE SCREEN
- CALL SCRDMP
- ENDIF
- IF(IC.EQ.136)XP=XP-SS
- C left arrow
- IF(IC.EQ.137)XP=XP+SS
- C right arrow
- IF(IC.EQ.138)YP=YP-SS
- C down arrow
- IF(IC.EQ.139)YP=YP+SS
- C up arrow
- IF(IC.EQ.81.OR.IC.EQ.113.OR.IC.EQ.27)CALL QUIT
- IF(MX.NE.MXO.OR.MY.NE.MYO) THEN
- CALL ROTAT
- CALL QSORTR(Z,IND,NPTS)
- ENDIF
- CALL CLS
- CALL PLOTP
- CALL TAB(0,0)
- CALL WOT(0,0,'Possible keys are 1 2 3 4 5 6 7 8 9 0 : Q')
- CALL WOT(0,2,'This is Shape '//CHAR(ISH+48))
- CALL swap(N)
- C ------------end of main loop-------
- GOTO10
- END
- SUBROUTINE GREYS
- DO 10 K=1,7
- IA=K*16
- C red balls
- CALL VDU19(K+7,16,IA+128,IA ,IA)
- C green balls
- CALL VDU19(K ,16,IA ,IA+128,IA)
- 10 CONTINUE
- C blue background colour
- CALL VDU19( 0,16,0,0,112)
- CALL VDU19(15,16,240,240,240)
- RETURN
- END
- SUBROUTINE INIT
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000,MAXSP=40)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:MAXSP-1)
- CHARACTER*3 SPR
- CHARACTER*19 SPFILE,ERRTXT*30
- LOGICAL SPOP12
- C sprite size ISP now in WORDS not BYTES (was &FBB)
- CALL INTRO
- C screen MODE
- 5 CALL WOG(200,80,' Screen Mode (27 or 12 or 9) ?')
- CALL VDU(5)
- READ(*,*,ERR=5)MODES
- IF(MODES.EQ.27) THEN
- SPFILE='<SphR$Dir>.SphRot27'
- ELSE IF(MODES.EQ.12) THEN
- SPFILE='<SphR$Dir>.SphRot12'
- ELSE IF(MODES.EQ.9) THEN
- SPFILE='<SphR$Dir>.SphRot9'
- ELSE
- CALL VDU(7)
- CALL CLS
- GO TO 5
- ENDIF
- CALL MODE(MODES)
- C get rasters to pixels ratio in x & y
- IXPIX=ISHFT(1,MODEVAR(-1,4))
- IYPIX=ISHFT(1,MODEVAR(-1,5))
- C ratio of y to x rasters (1 or 2)
- IYBYX=IYPIX/IXPIX
- Z0=1000
- ZMIN=-500
- ZMAX=2000
- MAXR=72/IXPIX
- RZMAX=Z0/(Z0+ZMAX)
- RZMIN=Z0/(Z0+ZMIN)
- MINR=MAXR*RZMAX/RZMIN
- NSPRIT=MAXR-MINR+1
- IF(NSPRIT.GT.MAXSP) THEN
- PRINT*,' Too many sprites, maxr,minr=',MAXR,MINR
- STOP
- ENDIF
- DS=NSPRIT/(RZMIN-RZMAX)
- MAXS=DS*RZMIN
- IS=16
- DO 20 IRX=MINR,MAXR
- IDX=IRX+IRX+1
- IRY=IRX/IYBYX
- IDY=IRY+IRY+1
- IS=IS+88
- IS=IS+16*IDY*((IDX+7)/8)
- I=MAXR-IRX
- DO 10 IB=0,1
- IF(I.GT.9) THEN
- SPR(IB,I)=CHAR(96+IB)//CHAR(48+I/10)//CHAR(48+MOD(I,10))
- ELSE
- SPR(IB,I)=CHAR(96+IB)//CHAR(48+I)//CHAR(0)
- ENDIF
- 10 CONTINUE
- 20 CONTINUE
- PRINT *,' Calculated sprite size: ',IS
- IF(IS.GT.ISPSIZ*4) STOP 'Sprite area too small'
- ISP(1)=ISPSIZ*4
- ISP(2)=0
- ISP(3)=16
- ISP(4)=16
- C make MOUSE STEP 1
- CALL OSWORD(21,?I010102)
- CALL GREYS
- C if file exists may as well use it, find out
- CALL GETDIR('<SphR$Dir>',SPFILE(12:17),N)
- C read the sprite file
- CALL SPOP10(ISP,SPFILE,*900)
- RETURN
- 900 PRINT 104,SPFILE
- 104 FORMAT(' cannot find sprite file ',A/$,
- +' Change mode, Make sprites or Quit')
- I=IG('CMQ')
- IF(I.EQ.1) GO TO 5
- IF(I.EQ.3)CALL QUIT
- 910 CALL MAKESP
- PRINT 103
- 103 FORMAT($' Save sprites to file')
- IF(IG('NY').EQ.2) THEN
- IF(SPOP12(ISP,SPFILE)) THEN
- CALL SPOPER(I,ERRTXT,N)
- PRINT 105,ERRTXT(1:N)
- 105 FORMAT(1X,A/' C to continue, Q to quit',$)
- IF(IG('CQ').EQ.2) CALL QUIT
- ENDIF
- ENDIF
- RETURN
- END
- SUBROUTINE INTRO
- C writes up the introductory screen.
- CALL VDU(26)
- CALL CLS
- LX=200
- LY=800
- CALL WOGBIG(LX+200,LY,'SphereRot',3)
- CALL WOG(LX,LY-100,
- 1 'A program demonstrating the use of SpriteOps from')
- CALL WOG(LX,LY-160,
- 1 'the "Fortran Friends" PD_F77 library, to manipulate')
- CALL WOG(LX,LY-220,
- 1 'objects made from groups of spheres.')
- CALL WOG(LX+300,LY-360, 'K.M.Crennell')
- CALL WOG(LX+348,LY-440,'1991')
- C 5 PRINT 101
- C 101 FORMAT($,)
- C CALL TAB(10,48)
- RETURN
- END
- SUBROUTINE MakeSp
- C makes the initial sprite
- PARAMETER (RTODEG=57.29578)
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C viewing angles in degrees
- DATA AL1,AL2/30.,30./
- CALL SPOP09(ISP)
- DO 40 IS=0,NSPRIT-1
- IRX=MAXR-IS
- IDX=IRX+IRX+1
- IRY=IRX/IYBYX
- IDY=IRY+IRY+1
- IR2=IRX*IRX+IRX
- IYBYX2=IYBYX*IYBYX
- DO 10 IB=0,1
- CALL SPOP15(ISP,SPR(IB,IS),0,IDX,IDY,MODES)
- CALL SPOP29(ISP,SPR(IB,IS))
- 10 CONTINUE
- PRINT 101,IS,IRX,ISP(4)
- 101 FORMAT(' Making Sprites',I3,', radius',I3,', space used',I6)
- C -------------------- start drawing sprite
- DO 30 IY=-IRY,IRY
- KY=IRY+IY
- DO 20 IX=-IRX,IRX
- KX=IRX+IX
- IF(IX*IX+IY*IY*IYBYX2.LE.IR2) THEN
- D1=ABS(RTODEG*ASIN(FLOAT(IX)/IRX)-AL1)
- D2=ABS(RTODEG*ASIN(FLOAT(IY)/IRY)-AL2)
- IC=6.99-SQRT(D1*D1+D2*D2)/14.-RND01()
- IF(IC.LT.0) IC=0
- CALL SPOP42(ISP,SPR(0,IS),KX,KY,IC+1)
- CALL SPOP42(ISP,SPR(1,IS),KX,KY,IC+8)
- ELSE
- CALL SPOP44(ISP,SPR(0,IS),KX,KY,0)
- CALL SPOP44(ISP,SPR(1,IS),KX,KY,0)
- ENDIF
- 20 CONTINUE
- 30 CONTINUE
- 40 CONTINUE
- C ------------------end of sprite creation
- RETURN
- END
- SUBROUTINE PLOTP
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- I=IND(NPTS)
- IF(Z(I)+ZP.GT.ZMAX) ZP=ZMAX-Z(I)
- I=IND(1)
- IF(Z(I)+ZP.LT.ZMIN) ZP=ZMIN-Z(I)
- DO 10 J=NPTS,1,-1
- I=IND(J)
- FACT=Z0/(Z0+ZP+Z(I))
- IS=MAXS-FACT*DS
- IF(IS.LT.0) IS=0
- CALL SPOP34(ISP,SPR(KOL(I),IS),INT(fact*(X(I)+XP)),
- 1 INT(fact*Y(I)+YP),8)
- 10 CONTINUE
- RETURN
- END
- SUBROUTINE ROTAT
- PARAMETER(DEGTOR=0.017453293)
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- CY=COS(DEGTOR*(MY-MYO))
- SY=SIN(DEGTOR*(MY-MYO))
- C=COS(DEGTOR*(MX-MXO))
- S=SIN(DEGTOR*(MX-MXO))
- DO 20 I=1, NPTS
- Z2=Z(I)*cy+X(I)*SY
- X(I)=X(I)*CY-Z(I)*SY
- Y2=Y(I)*C-Z2*S
- Z(I)=Z2*C+Y(I)*S
- Y(I)=Y2
- 20 CONTINUE
- MYO=MY
- MXO=MX
- RETURN
- END
- SUBROUTINE SCRDMP
- C dumps the screen to a file
- C used to save the picture to file name FSAVE
- CHARACTER *40 FSAVE
- C ask user whether to save screen
- CALL TWIND(0,3,79,0)
- CALL WOT(0,0,
- +' enter filename to save plot, or <RETURN> to stop')
- READ(*,101)FSAVE
- 101 FORMAT(A)
- I=LEN(FSAVE)
- IF(I.GT.0)THEN
- CALL CLS
- CALL VDU(26)
- LL= OSCLI('Screensave '//FSAVE)
- ENDIF
- RETURN
- END
- SUBROUTINE swap(N)
- CALL OSBYTE(19,0,0)
- C WAIT for sync
- C swap the shadow memory
- CALL OSBYTE(113,N,0)
- N= 3-N
- CALL OSBYTE(112,N,0)
- RETURN
- END
- SUBROUTINE NEW
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- NPTS=0
- IRAD=30
- IF(ISH.EQ.0)CALL RDDTMM
- IF(ISH.EQ.1)CALL PLANE
- IF(ISH.EQ.2)CALL DISC(.FALSE.)
- IF(ISH.EQ.3)CALL DISC(.TRUE.)
- IF(ISH.EQ.4)CALL shapes(0,270,90,90,270,180)
- IF(ISH.EQ.5)CALL shapes(30,330,60,30,330,60)
- IF(ISH.EQ.6)CALL Cubic
- IF(ISH.EQ.7)CALL BCC
- IF(ISH.EQ.8)CALL RDdata
- IF(ISH.EQ.9)CALL RDshak
- XP=0.
- YP=0.
- ZP=0.
- DO 10 I=1,NPTS
- 10 IND(I)=I
- CALL QSORTR(Z,IND,NPTS)
- CALL MOUSE(MYO,MXO,MBO)
- RETURN
- END
- SUBROUTINE plane
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- DO 20 JX=-200,200,200
- DO 20 JY=-200,200,200
- NPTS=NPTS+1
- X(NPTS)=JX
- Y(NPTS)=JY
- Z(NPTS)=0
- KOL(NPTS)=0
- 20 CONTINUE
- RETURN
- END
- SUBROUTINE disc(NF)
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- LOGICAL NF
- PARAMETER(DEGTOR=0.017453293,IRAD=300)
- DO 10 IA=0,330,30
- NPTS=NPTS+1
- X(NPTS)=IRAD*SIN(DEGTOR*IA)
- Y(NPTS)=IRAD*COS(DEGTOR*IA)
- Z(NPTS)=0
- KOL(NPTS)=0
- IF (IA.NE.0. AND.IA.NE.180. AND. NF) THEN
- NPTS=NPTS+1
- Z(NPTS)=X(NPTS-1)
- Y(NPTS)=Y(NPTS-1)
- X(NPTS)=0
- KOL(NPTS)=1
- ENDIF
- 10 CONTINUE
- RETURN
- END
- SUBROUTINE shapes(Ib1,If1,Is1,Ib2,If2,Is2)
- PARAMETER(DEGTOR=0.017453293,IRAD=200)
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- DO 10 IA=Ib1,If1,Is1
- NPTS=NPTS+1
- X(NPTS)=IRAD*SIN(DEGTOR*IA)
- Y(NPTS)=IRAD*COS(DEGTOR*IA)
- KOL(NPTS)=1
- 10 Z(NPTS)=0
- DO 20 IA=Ib2,If2,Is2
- NPTS=NPTS+1
- Z(NPTS)=IRAD*SIN(DEGTOR*IA)
- Y(NPTS)=IRAD*COS(DEGTOR*IA)
- KOL(NPTS)=0
- 20 X(NPTS)=0
- RETURN
- END
- SUBROUTINE Cubic
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- IC=0
- DO 10 JX=-240,240,160
- IC=1-IC
- DO 10 JY=-240,240,160
- IC=1-IC
- DO 10 JZ=-240,240,160
- IC=1-IC
- NPTS=NPTS+1
- KOL(NPTS)=IC
- X(NPTS)=JX
- Y(NPTS)=JY
- 10 Z(NPTS)=JZ
- RETURN
- END
- SUBROUTINE BCC
- C body-centred cubic
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- DO 10 JX=-160,160,160
- DO 10 JY=-160,160,160
- DO 10 JZ=-160,160,160
- NPTS=NPTS+1
- KOL(NPTS)=0
- X(NPTS)=JX
- Y(NPTS)=JY
- 10 Z(NPTS)=JZ
- DO 20 JX=-80,80,160
- DO 20 JY=-80,80,160
- DO 20 JZ=-80,80,160
- NPTS=NPTS+1
- KOL(NPTS)=1
- X(NPTS)=JX
- Y(NPTS)=JY
- 20 Z(NPTS)=JZ
- RETURN
- END
- SUBROUTINE RDdata
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- COMMON/SPNAM/SPR(0:1,0:19)
- CHARACTER*3 SPR
- C
- C face centred cube
- DIMENSION IB(4,15)
- DATA IB/ 150,-150,-150,0, 150, 150,-150,0,
- 1 150, 150, 150,0, 150,-150, 150,0,
- 1 -150,-150,-150,0, -150, 150,-150,0,
- 2 -150, 150, 150,0, -150,-150, 150,0,
- 2 0, 0,-150,1, 0, 0, 150,1,
- 3 0, 150, 0,1, 0,-150, 0,1,
- 3 150, 0, 0,1, -150, 0, 0,1,
- 4 999,999,999,0/
- C
- 10 NPTS=NPTS+1
- X(NPTS)=IB(1,NPTS)
- Y(NPTS)=IB(2,NPTS)
- Z(NPTS)=IB(3,NPTS)
- KOL(NPTS)=IB(4,NPTS)
- IF(X(NPTS).NE.999.AND.NPTS.NE.(MXPNTS-1))GOTO10
- NPTS=NPTS-1
- RETURN
- END
- SUBROUTINE RDDTMM
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- PARAMETER(SCALE=50.0)
- CHARACTER CARD*72,EL*2,NAME*30,EL1*2,FRED*30
- CALL MODE(MODES)
- CALL GREYS
- CALL ORIGIN (640,512 )
- XC=0.
- YC=0.
- ZC=0.
- C show user possible files
- CALL GETDIR('<SphR$Dir>','DTM',N)
- IF(N.LT.1)THEN
- WRITE(*,*)' Sorry, no DTM files in directory'
- RETURN
- ENDIF
- 10 PRINT 101
- 101 FORMAT($,'DTMM file name? ')
- READ (*,102,ERR=10) NAME
- 102 FORMAT(A)
- OPEN(9,FILE='<SphR$Dir>.'//NAME,STATUS='OLD',FORM='FORMATTED'
- 1 ,ERR=99)
- C read unit cell sizes
- READ(9,103,ERR=99,END=99)A,B,C
- 103 FORMAT(40X,3F8.3)
- C skip angles lines for now
- READ(9,102,ERR=98)CARD
- C A,B,C are unit cell size, now scale to screen
- A=A*SCALE
- B=B*SCALE
- C=C*SCALE
- READ(9,104,ERR=98)NPTS
- 104 FORMAT(I4)
- IF(NPTS.GT.MXPNTS)THEN
- PRINT *,' max points exceeded'
- NPTS=MXPNTS
- CALL VDU(7)
- ENDIF
- C skip blank card
- READ(9,102,ERR=98)CARD
- C read the atom positions
- DO 20 I=1,NPTS
- READ(9,105,ERR=98)EL,X1,Y1,Z1
- 105 FORMAT(4X,A2,4X,3F10.5)
- X(I)=X1*A
- XC=XC+X(I)
- Y(I)=Y1*B
- YC=YC+Y(I)
- Z(I)=Z1*C
- ZC=ZC+Z(I)
- IF(I.EQ.1)EL1=EL
- J=0
- IF(EL.EQ.EL1) J=1
- KOL(I)=J
- 20 CONTINUE
- 90 CLOSE(9)
- XC=XC/NPTS
- YC=YC/NPTS
- ZC=ZC/NPTS
- DO 92 I=1,NPTS
- X(I)=X(I)-XC
- Y(I)=Y(I)-YC
- Z(I)=Z(I)-ZC
- 92 CONTINUE
- RETURN
- 98 PRINT 110,NPTS,CARD
- 110 FORMAT(' bad data, NPTS =',I4,' card is'/' ',A)
- STOP 'bad read'
- 99 PRINT *,'can not read file ',NAME,' try another (T) or stop (S)'
- IF(IG('TS').EQ.2)CALL QUIT
- GO TO 10
- END
- SUBROUTINE RDshak
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- PARAMETER(SCALE=50.0)
- CHARACTER CARD*72,EL*2,NAME*30
- CALL MODE(MODES)
- CALL GREYS
- CALL ORIGIN (640,512 )
- XC=0.
- YC=0.
- ZC=0.
- C show user possible files
- CALL GETDIR('<SphR$Dir>','SH',N)
- IF(N.LT.1)THEN
- WRITE(*,*)' Sorry, no SH files in directory'
- RETURN
- ENDIF
- 10 PRINT 101
- 101 FORMAT($,'Schakal file name? ')
- READ (*,102,ERR=10) NAME
- 102 FORMAT(A)
- OPEN(9,FILE='<SphR$Dir>.'//NAME,STATUS='OLD',FORM='FORMATTED',
- 1 ERR=99)
- C ignore the title card
- READ(9,102,ERR=99,END=99)CARD
- 20 READ(9,102,ERR=98,END=90)CARD
- IF(CARD(1:4).EQ.'CELL') THEN
- READ(CARD(6:),105,ERR=98)A,B,C
- 105 FORMAT(3F9.3)
- C A,B,C are unit cell size, now scale to screen
- A=A*SCALE
- B=B*SCALE
- C=C*SCALE
- ELSE IF(CARD(1:4).EQ.'ATOM') THEN
- READ(CARD(6:),103,ERR=98)EL,X1,Y1,Z1
- 103 FORMAT(A2,2X,F7.4,F8.4,F9.4)
- NPTS=NPTS+1
- IF(NPTS.GT.MXPNTS) GO TO 80
- X(NPTS)=X1*A
- XC=XC+X(NPTS)
- Y(NPTS)=Y1*B
- YC=YC+Y(NPTS)
- Z(NPTS)=Z1*C
- ZC=ZC+Z(NPTS)
- I=0
- IF(EL.EQ.'O ') I=1
- KOL(NPTS)=I
- ELSE
- IF(CARD(1:4).EQ.'END ') GO TO 90
- ENDIF
- GO TO 20
- 80 PRINT *,' max points exceeded'
- 90 CLOSE(9)
- XC=XC/NPTS
- YC=YC/NPTS
- ZC=ZC/NPTS
- DO 92 I=1,NPTS
- X(I)=X(I)-XC
- Y(I)=Y(I)-YC
- Z(I)=Z(I)-ZC
- 92 CONTINUE
- RETURN
- 98 PRINT 104,NPTS,CARD
- 104 FORMAT(' bad data, NPTS =',I4,' card is'/' ',A)
- STOP 'bad read'
- 99 PRINT *,'can not read file ',NAME,' try another (T) or stop (S)'
- IF(IG('TS').EQ.2)CALL QUIT
- GO TO 10
- END
- FUNCTION IG(CHR)
- CHARACTER*(*) CHR
- PRINT 101,CHR
- 101 FORMAT($,'(',A,')? ')
- 10 I=IGET()
- IF(I.EQ.27) STOP 'Escape'
- IF(I.GT.96) I=I-32
- IG=INDEX(CHR,CHAR(I))
- IF(IG.EQ.0) GO TO 10
- PRINT 102,CHR(IG:IG)
- 102 FORMAT(A)
- RETURN
- END
- SUBROUTINE QUIT
- C COMMON BLOCK
- PARAMETER(MXPNTS=200,ISPSIZ=40000)
- COMMON IND(MXPNTS),X(MXPNTS),Y(MXPNTS),Z(MXPNTS),ISP(ISPSIZ),
- 2 KOL(MXPNTS),XP,YP,ZP,Z0,DS,ZMIN,ZMAX,ISH,MAXR,NSPRIT,MAXS,
- 3 IYBYX,MODES,MX,MY,MB,MXO,MYO,MBO,NPTS
- CALL MODE(MODES)
- C put cursor keys back to arrow operation
- CALL OSBYTE(4,0,0)
- CALL OSBYTE(11,32,0)
- C put MOUSE STEP back to 2
- CALL OSWORD(21,?I020202)
- STOP'OK'
- END
- SUBROUTINE GETDIR(DIR,STR,N)
- C uses SWIF77 with OS_GBPB to read and print file names in
- C directory DIR which contain the string STR, returns N number found
- CHARACTER * (*) DIR,STR
- CHARACTER *52 BIR,BTR
- CHARACTER *16 FNAME
- DIMENSION IREGS(0:7)
- LOGICAL SWIF77
- C
- I=LNBLNK(DIR)
- BIR(1:I)=DIR(1:I)
- N=0
- IREGS(0)=9
- IREGS(1)=LOCC(BIR//?H00)
- IREGS(2)=LOCC(FNAME)
- IREGS(3)=1
- IREGS(4)=0
- IREGS(5)=11
- IREGS(6)=0
- WRITE(*,*)' files in ',DIR,' are:'
- J=LNBLNK(STR)
- BTR(1:J)=STR(1:J)
- 2 IF(SWIF77(?I0C,IREGS,IFLAG)) GO TO 90
- IF(IREGS(4).LT.0) GO TO 4
- IF(IREGS(3).LE.0) GO TO 2
- I=INDEX(FNAME,?H00)
- IF(INDEX(FNAME(1:I-1),BTR(1:J)).EQ.0) GO TO 2
- WRITE(*,*)FNAME(1:I-1)
- N=N+1
- GO TO 2
- 4 WRITE(*,*)' number of files = ',N
- RETURN
- 90 WRITE(*,*)' error reading file names after ',N
- STOP 'FAIL'
- END
-