10 REM       3D Animated Graphics
20 REM         by Ian C. Sharpe
30 REM (c) Computing with the Amstrad
40 REM ------------- CPC -------------
50 IF HIMEM<>8999 AND HIMEM<41900 THEN PRINT"Switch off all roms but rom 7":END ELSE GOSUB 680
60 BORDER 0:RESTORE 60:FOR i=0 TO 3:READ j:INK i,j:NEXT:DATA 0,26,11,15
70 store=9000:get=9035:MODE 1:WINDOW 12,29,10,17:PAPER 2:CLS
80 PRINT:PRINT" 1 .. Load Frames"
90 PRINT" 2 .. Draw Waves"
100 PRINT" 3 .. Draw Beads"
110 PRINT" 4 .. Animate"
120 PRINT:PRINT" Choice?":PAPER 0
130 WHILE INKEY$<>"":WEND
140 a$="":WHILE a$="":a$=INKEY$:WEND
150 IF a$<"1" OR a$>"4" THEN 140
160 ON VAL(a$) GOSUB 180,280,420,600
170 CLEAR:GOTO 70
180 REM *** Load Frames ***
190 MODE 1:WINDOW 10,30,8,13:PAPER 3:CLS
200 PRINT:PRINT" 1 .. Load Waves"
210 PRINT" 2 .. Load Beads"
220 PRINT:PRINT" Choice?"
230 WHILE INKEY$<>"":WEND
240 a$="":WHILE a$="":a$=INKEY$:WEND
250 IF a$="1" THEN ipf$="waves.bin" ELSE IF a$="2" THEN ipf$="beads.bin" ELSE 240
260 LOAD ipf$,9116
270 RETURN
280 REM *** Waves ***
290 DEG:MODE 1:ORIGIN 0,230
300 DEFINT a-z:DEFREAL s:cx=150:yc=125
310 DIM s(360):FOR i=0 TO 360:s(i)=SIN(i):NEXT
320 FOR z=1 TO 8:z5=z*5:CLS
330 FOR x=0 TO 150 STEP 2
340 m=-1000:x2=(x-cx)^2
350 FOR y=0 TO 250 STEP 2
360 a=z5*s((z*SQR(x2+(y-yc)^2)/2)MOD 360)+y/2
370 IF a>m THEN PLOT x,a,((y/16) MOD 3)+1:PLOT 300-x,a:m=a
380 NEXT y,x:CALL store,z
390 NEXT
400 ERASE s:LOCATE 1,15:SAVE"waves.bin",b,9116,&8000
410 RETURN
420 REM *** Beads ***
430 MODE 1:DIM a(90,2):r=20:k1=1:k2=2
440 FOR fr=1 TO 8:CLS:ORIGIN 0,200
450 FOR i=0 TO 200 STEP 10:MOVE 0,i:DRAWR 320,0,1:NEXT
460 DEG:FOR i=0 TO 90 STEP 2:a(i,0)=r*COS(i):a(i,1)=r*SIN(i):a(i,2)=2-2*a(i,0):NEXT
470 FOR z=1 TO 200 STEP 10:p=p XOR 1:cl=2+p:cx=150+100*SIN(k1*z):cy=100+150*COS(k2*z)/z-z/5
480 GOSUB 530:NEXT
490 CALL store,fr:k1=k1+0.1:NEXT
500 ERASE a:LOCATE 1,15:SAVE"beads.bin",b,9116,&8000
510 RETURN
520 :
530 ORIGIN cx,cy+200:FOR i=4 TO 90 STEP 2
540 PLOT a(i-2,0),a(i-2,1),1
550 DRAW a(i,0),a(i,1),1:MOVER -2,0:DRAWR a(i,2),0,cl:PLOTR 0,0,1
560 PLOT a(i-2,0),2-a(i-2,1),1:MOVER -2,0:DRAWR a(i,2),0,cl
570 PLOTR 0,0,1
580 NEXT
590 RETURN
600 REM *** Animate ***
610 RESTORE 610:FOR i=1 TO 4:fp(i,0)=1-2*ROUND(RND):READ fp(i,1):NEXT:DATA 1,3,6,8
620 WHILE 1
630 FOR f=1 TO 4
640 fp(f,1)=fp(f,1)+fp(f,0):IF fp(f,1)=9 OR fp(f,1)=0 THEN fp(f,0)=-fp(f,0):GOTO 660
650 CALL get,f,fp(f,1)
660 NEXT:IF INKEY$<>"" THEN RETURN
670 WEND
680 REM *** Machine code ***
690 MEMORY 8999:ln=790:RESTORE 790
700 FOR adr=&2328 TO &239B STEP 13
710 READ byte$:chk=0
720 FOR i=0 TO 12
730 v=VAL("&"+MID$(byte$,i*2+1,2))
740 POKE adr+i,v:chk=chk+v
750 NEXT
760 IF chk<>VAL("&"+RIGHT$(byte$,3)) THEN PRINT"ERROR in LINE";ln:STOP
770 ln=ln+4:NEXT
780 RETURN
790 DATA CD73235D542100C00664C5E50150A
800 DATA 2800EDB0E17CC60867D24723D5668
810 DATA 1150C019D1C110E8C9FE02C0CD71A
820 DATA 7323CD80230664CD19BDC5D5015AE
830 DATA 2800EDB0D17AC60857D26F23E567E
840 DATA 2150C019D1EBC110E7C9DD46006AA
850 DATA 21FC1311A00F1910FDC9DD4602504
860 DATA FD219223FD23FD2310FAFD5E00678
870 DATA FD5601C900C028C0C0E3E8E300733