home *** CD-ROM | disk | FTP | other *** search
- PROGRAM Tspritop
- C tests all the SpriteOp library
- C needs 'utils', 'graphics' and 'spriteop' libraries
- C COMMON BLOCK
- PARAMETER(ISPSIZ=2014)
- COMMON IX1,IY1,IZ1,
- 2 ISCALE(5),ISP(ISPSIZ),JSP(ISPSIZ),KSP(ISPSIZ),
- 3 IXP,IYP,IZP,IPROS,IZCUT,ISH,ISIZE,IRAD,IDIA,
- 4 MODES,MX1,MY1,MZ1,NPTS
- CHARACTER *4 SPR,FRED,MARY
- COMMON/CHRS/SPR(2)
- C
- INTEGER MMOUSE(3)
- LOGICAL OSCLI
- C
- DATA MMOUSE/2,1,1/
- C
- CALL INIT
- CALL MODE (MODES)
- CALL MAKES1
- CALL MAKES2
- CALL TESTSP
- CALL CLS
- CALL ORIGIN (640,512)
- CALL CURSOR(.FALSE.)
- ISS=4
- C ------------start of main loop----------
- 10 CONTINUE
- CALL MOUSE (IX1,IY1,MB1)
- C left mouse button
- IF(MB1.EQ.1) IZP=IZP+ISS
- C right mouse button
- IF(MB1.EQ.4) IZP=IZP-ISS
- IC=INKEY(0)
- IF(IC.EQ.81.OR.IC.EQ.113)THEN
- C put cursor keys back to arrow operation
- CALL CURSOR(.TRUE.)
- STOP'OK'
- ENDIF
- CALL CLS
- CALL PLOTP
- C ------------end of main loop-------
- GOTO10
- END
- SUBROUTINE SPERR
- CHARACTER*80 ERRTXT
- CALL SPOPER(IERR,ERRTXT,LERR)
- CALL COLOUR(1)
- PRINT 112,IERR,LERR
- 112 FORMAT(' Error code ',Z6,I3)
- IF(LERR.GT.0) PRINT *,ERRTXT(1:LERR)
- CALL COLOUR(7)
- RETURN
- END
- SUBROUTINE WHAT(JSP)
- CHARACTER*12 SPNAME
- LOGICAL SPOP08,SPOP13
- IF(SPOP08(JSP,ISPSIZ,NSPRIT,ISPR1,IFREE)) CALL SPERR
- PRINT 101,NSPRIT
- 101 FORMAT(I4,' sprites are:',$)
- DO 10 I=1,NSPRIT
- IF(SPOP13(JSP,I,SPNAME,L)) CALL SPERR
- PRINT 102,SPNAME(1:L)
- 102 FORMAT($,' ',A)
- 10 CONTINUE
- PRINT *
- CALL KEYX
- RETURN
- END
- SUBROUTINE INIT
- C COMMON BLOCK
- PARAMETER(ISPSIZ=2014)
- COMMON IX1,IY1,IZ1,
- 2 ISCALE(5),ISP(ISPSIZ),JSP(ISPSIZ),KSP(ISPSIZ),
- 3 IXP,IYP,IZP,IPROS,IZCUT,ISH,ISIZE,IRAD,IDIA,
- 4 MODES,MX1,MY1,MZ1,NPTS
- CHARACTER *4 SPR
- COMMON/CHRS/SPR(2)
- LOGICAL SPOP08
- C
- C sprite size ISP now in WORDS not BYTES (was &FBB)
- C DIM sp ssize%
- MX1=0
- MY1=0
- MZ1=0
- IXP=0
- IYP=0
- IZP=100
- Ipros=1000
- Iscale(3)=100
- Iscale(4)=100
- Izcut=10
- Isize=6
- ISH=1
- C screen MODE
- MODES=27
- IX1=0
- IY1=0
- IZ1=0
- IF(SPOP08(0,ISPSIZ,NSPRIT,ISPR1,IFREE)) CALL SPERR
- PRINT *,' system sprite area size ',ISPSIZ,' #sprites ',NSPRIT
- PRINT *,' offset to first sprite ',ISPR1,' free space',IFREE
- I=IGET()
- RETURN
- END
- SUBROUTINE MakeS1
- C makes the initial sprite
- PARAMETER (RTODEG=57.29578)
- C COMMON BLOCK
- PARAMETER(ISPSIZ=2014)
- COMMON IX1,IY1,IZ1,
- 2 ISCALE(5),ISP(ISPSIZ),JSP(ISPSIZ),KSP(ISPSIZ),
- 3 IXP,IYP,IZP,IPROS,IZCUT,ISH,ISIZE,IRAD,IDIA,
- 4 MODES,MX1,MY1,MZ1,NPTS
- CHARACTER *4 SPR
- COMMON/CHRS/SPR(2)
- C LSAVE size increased 02 Nov 1992
- PARAMETER (LSAVE=96)
- INTEGER IW(2),IREGS(4),ISAVE(LSAVE)
- LOGICAL SPOP09,SPOP15,SPOP24,SPOP29,SPOP41,SPOP44,SPOP60,NPOP60
- +, SPOP61,SPOP62
- SPR(1)='Bal1'
- C set up sprite block header
- ISP(1)=4027
- Isp(2)=0
- Isp(3)=16
- Isp(4)=16
- IPX=2
- IPY=2
- IRAD=35
- IDIA=IRAD+IRAD
- PRINT *,' opening sprite area ISP'
- IF(SPOP09(ISP)) CALL SPERR
- C 9= set up sprite area 15= create sprite in area
- PRINT *,' Making Bal1 sprite'
- IF(SPOP15(ISP,SPR(1),0,IDIA/IPX+1,IDIA/IPY+1,MODES)) CALL SPERR
- PRINT *,' creating mask area'
- IF(SPOP29(ISP,SPR(1))) CALL SPERR
- C 29=create mask 60=set up VDUs to draw into sprite not screen
- IF(SPOP62(ISP,SPR(1),NBYTES)) CALL SPERR
- PRINT *,' save area of ',NBYTES,' bytes would be required'
- IF(NBYTES.GT.LSAVE*4) STOP 'LSAVE'
- PRINT *,' redirect VDU to spriteop (60), using save area'
- ISAVE(1)=2
- IF(SPOP60(ISP,SPR(1),ISAVE,IREGS)) CALL SPERR
- C -------------------- start drawing sprite
- CALL GCOL(0,7)
- CALL CIRCLE(IRAD,IRAD,IRAD-IPX,.TRUE.)
- IF(NPOP60(IREGS)) CALL SPERR
- C get mask from screen
- IF(SPOP61(ISP,SPR(1),0,IREGS)) CALL SPERR
- CALL GCOL(0,0)
- DO 50 JX=0, IDIA, IPX
- DO 40 JY=0, IDIA, IPY
- IF(SPOP41(ISP,SPR(1),JX/IPX,JY/IPY,ICOL,ITNT)) CALL SPERR
- IF(ICOL.EQ.0) THEN
- C IF(SPOP44(ISP,SPR(1),JX/IPX,JY/IPY,0)) CALL SPERR
- CALL SPOT(JX,JY)
- ENDIF
- 40 CONTINUE
- 50 CONTINUE
- C 60=set VDU drivers to draw on screen 24=select sprite
- IF(NPOP60(IREGS)) CALL SPERR
- PRINT *,' select sprite'
- IF(SPOP24(ISP,SPR,IPTR)) CALL SPERR
- C ------------------end of sprite creation
- RETURN
- END
- SUBROUTINE MakeS2
- C makes another sprite
- PARAMETER (RTODEG=57.29578)
- C COMMON BLOCK
- PARAMETER(ISPSIZ=2014)
- COMMON IX1,IY1,IZ1,
- 2 ISCALE(5),ISP(ISPSIZ),JSP(ISPSIZ),KSP(ISPSIZ),
- 3 IXP,IYP,IZP,IPROS,IZCUT,ISH,ISIZE,IRAD,IDIA,
- 4 MODES,MX1,MY1,MZ1,NPTS
- CHARACTER *4 SPR(2)
- COMMON/CHRS/SPR
- LOGICAL SPOP15,SPOP29,SPOP42,SPOP44
- SPR(2)='Bal2'
- C set up sprite Bal2 in ISP
- C radius in PIXELS
- IR=17
- C NPIX = size of sprite
- NPIX=IR+IR+1
- IR2=IR*IR+IR
- PRINT *,' Making Bal2 sprite'
- IF(SPOP15(ISP,SPR(2),0,NPIX,NPIX,MODES)) CALL SPERR
- C set up mask
- IF(SPOP29(ISP,SPR(2))) CALL SPERR
- DO 20 IX=0,NPIX-1
- IIX=IX-IR
- DO 10 IY=0,NPIX-1
- IIY=IY-IR
- IF(IIX*IIX+IIY*IIY.GT.IR2) THEN
- IF(SPOP44(ISP,SPR(2),IX,IY,0)) CALL SPERR
- ELSE
- IF(SPOP42(ISP,SPR(2),IX,IY,6,0)) CALL SPERR
- ENDIF
- 10 CONTINUE
- 20 CONTINUE
- RETURN
- END
- SUBROUTINE PLOTP
- C COMMON BLOCK
- PARAMETER(ISPSIZ=2014)
- COMMON IX1,IY1,IZ1,
- 2 ISCALE(5),ISP(ISPSIZ),JSP(ISPSIZ),KSP(ISPSIZ),
- 3 IXP,IYP,IZP,IPROS,IZCUT,ISH,ISIZE,IRAD,IDIA,
- 4 MODES,MX1,MY1,MZ1,NPTS
- CHARACTER *4 SPR(2)
- COMMON/CHRS/SPR
- LOGICAL SPOP52,SPOP34
- C
- PROS=Ipros
- IF (IZP.GT.IZCUT) THEN
- fact=pros/IZP
- IS=fact/ISIZE*100
- Iscale(1)=IS
- Iscale(2)=IS
- IF(SPOP52(JSP,SPR(1),INT(fact*IX1),INT(fact*IY1),8,Iscale,0))
- + CALL SPERR
- ENDIF
- IF(SPOP34(JSP,SPR(2),0,0,8)) CALL SPERR
- RETURN
- END
- SUBROUTINE TESTSP
- PARAMETER(ISPSIZ=2014)
- COMMON IX1,IY1,IZ1,
- 2 ISCALE(5),ISP(ISPSIZ),JSP(ISPSIZ),KSP(ISPSIZ),
- 3 IXP,IYP,IZP,IPROS,IZCUT,ISH,ISIZE,IRAD,IDIA,
- 4 MODES,MX1,MY1,MZ1,NPTS
- CHARACTER *4 SPR(2)
- COMMON/CHRS/SPR
- LOGICAL SPOP02,SPOP03,SPOP08,SPOP09,SPOP10,SPOP11,SPOP12,SPOP14
- +, SPOP16,SPOP24,SPOP25,SPOP26,SPOP27,SPOP28,SPOP30,SPOP31
- 1, SPOP32,SPOP33,SPOP34,SPOP35,SPOP36,SPOP40,SPOP41,SPOP43
- 2, SPOP45,SPOP46,SPOP47,SPOP48,SPOP49,SPOP50,SPOP51,SPOP53
- 3, SPOP54
- C
- C spriteops used in other subroutines are
- C 13,15,29,42,44,52,60,60',61,62
- C
- C spriteop not yet tested
- C 36
- C
- INTEGER ISPP(ISPSIZ)
- CHARACTER FRED*4,MARY*4,PPTR*26
- DATA FRED/'FRED'/,MARY/'MARY'/
- DATA PPTR/'f77.Pointer'/
- IF(SPOP40(ISP,'bal1',IWID,IHITE,MASK,MOD)) CALL SPERR
- PRINT*,' sprite bal1 has width ',IWID,', height ',IHITE,
- +', mask ',MASK,', MODE ',MOD
- PRINT*,'Saving sprites in file',FRED
- IF(SPOP12(ISP,FRED)) CALL SPERR
- CALL KEYX
- PRINT*,'Reading sprites back from',MARY
- KSP(1)=4027
- KSP(2)=0
- KSP(3)=16
- KSP(4)=16
- IF(SPOP09(KSP)) CALL SPERR
- JSP(1)=4027
- IF(SPOP10(JSP,MARY)) CALL SPERR
- CALL KEYX
- PRINT *,' reading pointer sprite'
- ISPP(1)=4027
- IF(SPOP10(ISPP,PPTR)) CALL SPERR
- IF(SPOP34(ISPP,'ptr_default',500,0,0)) CALL SPERR
- CALL KEYX
- IF(SPOP36(ISPP,'ptr_default',1,2,2,0,0)) CALL SPERR
- PRINT*,'turn pointer on, click "adjust" to turn off'
- CALL GCOL(0,3)
- 5 CALL MOUSE(IXP,IYP,IZP)
- IF(IZP.EQ.4) CALL SPOT(IXP,IYP)
- IF(IZP.NE.1) GO TO 5
- CALL OSCLI('POINTER 0')
- PRINT*,'Reading sprites back from',FRED
- JSP(1)=4027
- JSP(2)=0
- JSP(3)=16
- JSP(4)=16
- IF(SPOP09(JSP)) CALL SPERR
- IF(SPOP10(JSP,FRED)) CALL SPERR
- CALL OSCLI('REMOVE FRED')
- IF(SPOP08(JSP,ISPSIZ,NSPRIT,ISPR1,IFREE)) CALL SPERR
- PRINT *,' sprite area size ',ISPSIZ,' #sprites ',NSPRIT
- PRINT *,' offset to first sprite ',ISPR1,' free space',IFREE
- CALL WHAT(JSP)
- CALL MOVE(0,896)
- CALL MOVE(60,956)
- IF(SPOP14(KSP,'RECTAN1',0,IADD1)) CALL SPERR
- IF(SPOP14(JSP,'RECTAN1',0,IADD1)) CALL SPERR
- PRINT *,' rectangular area saved as sprite at address ',IADD1
- CALL WHAT(JSP)
- IF(SPOP16(JSP,'RECTAN2',0,64,896,124,956,IADD2)) CALL SPERR
- PRINT *,' rectangular area saved as sprite at address ',IADD2
- CALL WHAT(JSP)
- CALL WHAT(KSP)
- PRINT*,'Saving sprites KSP in file',MARY
- IF(SPOP12(KSP,MARY)) CALL SPERR
- CALL KEYX
- IF(SPOP16(KSP,'RECTAN2',0,64,896,124,956,IADD3)) CALL SPERR
- PRINT *,' rectangular area saved as sprite in KSP at ',IADD3
- CALL WHAT(KSP)
- IF(SPOP34(JSP,'RECTAN1',1000,0,0)) CALL SPERR
- IF(SPOP34(JSP,'RECTAN2',1000,200,0)) CALL SPERR
- PRINT *,' plot rectans 1&2 '
- CALL WHAT(JSP)
- IF(SPOP35(KSP,'RECTAN1','RECTAN2',0)) CALL SPERR
- IF(SPOP34(KSP,'RECTAN1',100,100,0)) CALL SPERR
- PRINT *,' merge 1&2 horizontally and plot'
- CALL WHAT(KSP)
- PRINT *,' try to copy another sprite, should not work'
- IF(SPOP27(JSP,'Rectan1','Rectan3')) CALL SPERR
- CALL WHAT(JSP)
- IF(SPOP24(JSP,'rectan1',IADD1)) CALL SPERR
- IF(SPOP25(JSP,IADD1)) CALL SPERR
- PRINT *,' remove sprite rectan1 '
- CALL WHAT(JSP)
- IF(SPOP26(JSP,'RECTAN2','Rectan1')) CALL SPERR
- PRINT *,' sprite RECTAN2 renamed as Rectan1'
- CALL WHAT(JSP)
- IF(SPOP33(JSP,'Rectan1')) CALL SPERR
- IF(SPOP34(JSP,'RECTAN1',1000,400,0)) CALL SPERR
- PRINT *,' rectan1 flipped top to bottom'
- CALL WHAT(JSP)
- CALL MOVE(1000,800)
- IF(SPOP47(JSP,'Rectan1')) CALL SPERR
- IF(SPOP34(JSP,'RECTAN1',1000,600,0)) CALL SPERR
- PRINT *,' and side to side'
- CALL WHAT(JSP)
- CALL MOVE(1000,800)
- IF(SPOP28(JSP,'bal1',0)) CALL SPERR
- PRINT *,' bal1 plotted at 1000,800'
- CALL KEYX
- IF(SPOP24(JSP,'rectan1',IADD1)) CALL SPERR
- IF(SPOP25(JSP,IADD1)) CALL SPERR
- PRINT *,' remove sprite rectan1 '
- CALL WHAT(JSP)
- PRINT *,' now add Mary (spop11)'
- IF(SPOP11(JSP,MARY)) CALL SPERR
- CALL OSCLI('REMOVE MARY')
- CALL WHAT(JSP)
- PRINT *,' testing spop02 - screen save to FRED'
- IF(SPOP02('FRED',1)) CALL SPERR
- PRINT *,' now clear screen and restore with spop03'
- CALL KEYX
- CALL CLS
- IF(SPOP03('FRED')) CALL SPERR
- CALL KEYX
- CALL OSCLI('REMOVE FRED')
- CALL CLS
- PRINT *,' testing sprite editing *****'
- IF(SPOP31(ISP,'bal1',10)) CALL SPERR
- IF(SPOP34(ISP,'bal1',1000,800,8)) CALL SPERR
- PRINT *,' insert line into bal1'
- CALL KEYX
- IF(SPOP32(ISP,'bal1',10)) CALL SPERR
- IF(SPOP34(ISP,'bal1',1000,600,8)) CALL SPERR
- PRINT *,' delete the line from bal1'
- CALL KEYX
- IF(SPOP45(ISP,'bal1',10)) CALL SPERR
- IF(SPOP34(ISP,'bal1',1000,400,8)) CALL SPERR
- PRINT *,' insert column into bal1'
- CALL KEYX
- IF(SPOP46(ISP,'bal1',10)) CALL SPERR
- IF(SPOP34(ISP,'bal1',1000,200,8)) CALL SPERR
- PRINT *,' delete the column from bal1'
- CALL KEYX
- IF(SPOP41(ISP,'bal1',1,1,ICOL1,ITT1)) CALL SPERR
- IF(SPOP43(ISP,'bal1',1,1,MASK)) CALL SPERR
- PRINT *,' colour/tint at 1,1 ',ICOL1,' ',ITT1,', mask ',MASK
- CALL KEYX
- IF(SPOP41(ISP,'bal1',20,20,ICOL1,ITT1)) CALL SPERR
- IF(SPOP43(ISP,'bal1',20,20,MASK)) CALL SPERR
- PRINT *,' colour/tint at 20,20 ',ICOL1,' ',ITT1,', mask ',MASK
- IF(SPOP34(ISP,'bal2',980,580,8)) CALL SPERR
- PRINT *,' plot bal2 with mask'
- CALL KEYX
- PRINT *,' remove mask and plot again'
- IF(SPOP30(ISP,'bal2')) CALL SPERR
- IF(SPOP34(ISP,'bal2',980,180,8)) CALL SPERR
- CALL KEYX
- CALL GCOL(0,130)
- CALL MOVE(200,100)
- PRINT *,'set background colour green and plot bal1 mask'
- IF(SPOP48(ISP,'bal1')) CALL SPERR
- CALL KEYX
- PRINT *,' and again at user coords'
- IF(SPOP49(ISP,'bal1',300,100)) CALL SPERR
- CALL KEYX
- PRINT *,' and again scaled'
- Iscale(1)=200
- Iscale(2)=200
- IF(SPOP50(ISP,'bal1',500,100,ISCALE)) CALL SPERR
- CALL GCOL(0,128)
- CALL KEYX
- PRINT *,' double sized text'
- DO 10 I=1,10
- IF(SPOP51(I+64,I*32,0,ISCALE)) CALL SPERR
- 10 CONTINUE
- CALL KEYX
- CALL CLS
- DO 20 I=0,15
- CALL VDU19(I,16,16*I,16*I,16*I)
- 20 CONTINUE
- CALL COLOUR(15)
- PRINT *,' plot sprite grey-scaled'
- ISCALE(1)=400
- ISCALE(2)=400
- IF(SPOP53(ISP,'bal1',800,600,ISCALE,0)) CALL SPERR
- CALL KEYX
- IF(SPOP08(KSP,ISPSIZ,NSPRIT,ISPR1,IFREE)) CALL SPERR
- PRINT *,' before SpriteOp54'
- PRINT *,' sprite area size ',ISPSIZ,' #sprites ',NSPRIT
- PRINT *,' offset to first sprite ',ISPR1,' free space',IFREE
- IF(SPOP54(KSP,'RECTAN1')) CALL SPERR
- PRINT *,' after SpriteOp54'
- IF(SPOP08(KSP,ISPSIZ,NSPRIT,ISPR1,IFREE)) CALL SPERR
- PRINT *,' sprite area size ',ISPSIZ,' #sprites ',NSPRIT
- PRINT *,' offset to first sprite ',ISPR1,' free space',IFREE
- CALL KEYX
- CALL VDU(20)
- RETURN
- END
- SUBROUTINE KEYX
- IF(IGET().EQ.27) STOP 'ESCAPE'
- RETURN
- END
-