home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Archive Magazine 1996
/
ARCHIVE_96.iso
/
discs
/
shareware
/
share_44
/
sphererot
/
!SphereRot
/
f77
/
SphereRot
Wrap
Text File
|
1992-09-14
|
21KB
|
707 lines
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=99,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'
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.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=99,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=99,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=99,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=99,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 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=99,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=99,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=99,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=99,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=99,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=99,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=99,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=99,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=99,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=99,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 *50 BIR,BTR
CHARACTER *12 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