10 REM Graphics Demo
   20 DEF PROC_exit MODE 0:CLS:PRINT"Thanks for watching!":END
   30 ON ERROR OSCLI"REFRESH ON":IF ERR=17 PROC_exit ELSE MODE 0:CLS:REPORT:PRINT" at line ";ERL:END
   40 :
   50 REM Initialisation
   60 IF INKEY-256=&83 OR INKEY-256=&84 THEN MODE 4:OSCLI"GSCALE 16" ELSE FOR C%=0 TO 15:COLOUR C%,C%*17,C%*17,C%*17:NEXT
   70 VDU 23,1,0;0;0;0;
   80 REM Demo loop
   90 FOR demo%=1 TO 5
  100   W%=TRUE
  110   ON demo% PROC_colours,PROC_fill,PROC_pyramid,PROC_rose,PROC_sphere
  120   IF W% W%=INKEY(400)
  130 NEXT demo%
  140 PROC_exit
  150 :
  160 DEF PROC_rose
  170 VDU 29,768;512;:GCOL0:GCOL143:CLG
  180 S%=5:DA=0:R=500
  190 REPEAT
  200   FOR A%=1 TO S%
  210     A0=(A%-.5)/S%*2*PI+DA:A1=A%/S%*2*PI+DA:A2=(A%+.5)/S%*2*PI+DA
  220     MOVER*SINA0,R*COSA0:MOVER*SINA1,R*COSA1:PLOT85,R*SINA2,R*COSA2
  230   NEXT A%
  240   DA=DA+PI/S%:R=R*COS(PI/S%)
  250 UNTIL R<96
  260 ENDPROC
  270 :
  280 DEF PROC_fill
  290 VDU 29,768;512;:GCOL128:CLG
  300 FOR C%=1 TO 3
  310   GCOL 15
  320   FOR S%=0 TO 32
  330     A=S%/16*PI
  340     R=60*C%*(3+SIN(A*8))
  350     X=R*SIN(A):Y=R*COS(A)
  360     IF S%=0 MOVE X,Y ELSE DRAW X,Y
  370   NEXT S%
  380 NEXT C%
  390 GCOL 13:PLOT 133,0,0
  400 GCOL 7:PLOT 133,0,220
  410 GCOL 2:PLOT 133,0,430
  420 ENDPROC
  430 :
  440 DEF PROC_colours
  450 VDU 5
  460 FOR Y%=3 TO 0 STEP -1:FOR X%=0 TO 3
  470     VDU 29,X%*384;Y%*256;
  480     C%=(3-Y%)*4+X%:GCOL C%
  490     MOVE0,0:PLOT97,383,255
  500     C$=STR$C%
  510     VDU 29,X%*384+64+(2-LEN(C$))*64;Y%*256+176;
  520     *REFRESH OFF
  530     GCOL 0
  540     FOR A%=-1 TO 1:FOR B%=-1 TO 1
  550         MOVE A%*16,B%*16:PRINTC$;
  560     NEXT B%:NEXT A%
  570     GCOL 15:MOVE 0,0:PRINTC$;
  580     *REFRESH ON
  590 NEXT X%:NEXT Y%
  600 VDU 4
  610 ENDPROC
  620 :
  630 DEF PROC_sphere
  640 VDU 29,768;512;:GCOL 143:CLG
  650 FOR C%=15 TO 0 STEP -1
  660   GCOL C%
  670   s=500*SIN(C%/32*PI)
  680   MOVE0,-450:PLOT0,s,s/2:PLOT201,0,0
  690 NEXT C%
  700 FOR C%=0 TO 15
  710   GCOL C%
  720   MOVE-C%*5,C%*10:PLOT153,0,450*COS(C%/32*PI)
  730 NEXT C%
  740 ENDPROC
  750 :
  760 DEF PROC_pyramid
  770 VDU 29,768;512;:GCOL135
  780 DIM pyr(6,2)
  790 TIME=0
  800 *REFRESH OFF
  810 REPEAT
  820   CLG:R=TIME/200
  830   FOR S%=0 TO 3
  840     A=S%/3*2*PI+R:pyr(S%,0)=-16*COS(A+1.047)
  850     IF pyr(S%,0)<0 pyr(S%,0)=0
  860     IF pyr(S%,0)>15 pyr(S%,0)=15
  870     pyr(S%,1)=500*SINA:pyr(S%,2)=150*COSA-300
  880   NEXT S%
  890   pyr(4,0)=0:pyr(5,0)=0:pyr(6,1)=0:D%=0
  900   FOR S%=0 TO 2
  910     IF pyr(S%,1)<pyr(4,0) pyr(4,0)=pyr(S%,1):pyr(4,1)=pyr(S%,2)
  920     IF pyr(S%,1)>pyr(5,0) pyr(5,0)=pyr(S%,1):pyr(5,1)=pyr(S%,2)
  930     IF pyr(S%,2)<pyr(6,1) pyr(6,0)=pyr(S%,1):pyr(6,1)=pyr(S%,2)
  940     IF pyr(S%,1)>pyr(S%+1,1)D%=D%+1:GCOLpyr(S%,0):MOVE0,400:MOVEpyr(S%,1),pyr(S%,2):PLOT85,pyr(S%+1,1),pyr(S%+1,2)
  950   NEXT S%
  960   GCOL0
  970   MOVE0,400:DRAWpyr(4,0),pyr(4,1)
  980   IF D%=2:DRAWpyr(6,0),pyr(6,1)
  990   DRAWpyr(5,0),pyr(5,1):DRAW0,400
 1000   *REFRESH
 1010 UNTIL TIME>1200
 1020 *REFRESH ON
 1030 W%=FALSE
 1040 ENDPROC