10 REM Copyright (C) 2022 L.C. Benschop, The Netherlands 20 REM You are free to copy and use this program under the 'zlib' license 30 REM v0.01 (unnumbered) initial version 40 REM v0.02 let Y coordinate start at bottom, add more figures. 50 iscerberus%=PAGE < 65536 60 REM If not on Cerberus hardware, reserve areas for video RAM and char RAM 70 REM If on Cerberus hardware, use video RAM and character RAM addresses directly. 80 IF iscerberus%=0 THEN MODE4:DIM charmem% 2048:DIM videomem% 1200:ELSE charmem%=&F000:videomem%=&F800 90 DIM bitmaps%(7) 100 firstchar%=128: REM Utilize character codes 128..255 110 v%=1 120 FOR i% = 7 TO 0 STEP -1 130 bitmaps%(i%)=v% 140 v%=v%+v% 150 NEXT 160 PROCclearscreen 170 REM draw some lines 180 PROCdrawline(0,8,319,239) 190 PROCdrawline(0,120,319,120) 200 PROCdrawline(170,60,150,180) 210 PROCdrawline(160,60,160,180) 220 PROCnextscreen 230 REM Draw a square (diagonally) and 2 triangles 240 PROCdrawline(100,100,150,150) 250 PROCdrawline(150,150,200,100) 260 PROCdrawline(200,100,150,50) 270 PROCdrawline(150,50,100,100) 280 PROCdrawline(0,100,50,150) 290 PROCdrawline(50,150,50,50) 300 PROCdrawline(50,50,0,100) 310 PROCdrawline(250,200,300,150) 320 PROCdrawline(300,150,275,50) 330 PROCdrawline(275,50,250,200) 340 PROCnextscreen 350 REM draw a sine curve one dot at at time. 360 FOR x%=0 TO 319 370 y%=120+70*SIN(x%/20) 380 PROCplotdot(x%,y%) 390 NEXT 400 PROCnextscreen 410 REM draw the same curve with line segments 420 FOR x%=0 TO 319 430 y%=120+70*SIN(x%/20) 440 IF x%>0 THEN PROCdrawline(x%-1,oldy%,x%,y%) 450 oldy%=y% 460 NEXT 470 PROCnextscreen 480 REM draw a different curve (sine plus second harmonic) 490 FOR x%=0 TO 319 500 y%=120+70*SIN(x%/20)+20*SIN(x%/10+1) 510 IF x%>0 THEN PROCdrawline(x%-1,oldy%,x%,y%) 520 oldy%=y% 530 NEXT 540 PROCnextscreen 550 REM draw a different curve (damped sine wave) 560 FOR x%=0 TO 319 570 y%=120+120*SIN(x%/10)*EXP(-x%/60) 580 IF x%>0 THEN PROCdrawline(x%-1,oldy%,x%,y%) 590 oldy%=y% 600 NEXT 610 PROCnextscreen 620 REM draw a 'lissajous' shape (x=sine, y=3rd harmonic) 630 oldx%=-1:oldy%=-1 640 FOR t=0 TO 2*PI STEP 0.05 650 x%=160+50*SIN(t) 660 y%=120+50*COS(3*t) 670 IF oldx%>=0 THEN PROCdrawline(oldx%,oldy%,x%,y%) 680 oldx%=x%:oldy%=y% 690 NEXT 700 PROCnextscreen 710 END 720 DEF PROCnextscreen 730 PRINT TAB(0,29);nextchar%-firstchar%;" chars. Press any key to continue";:A$=INKEY$(10000) 740 PROCclearscreen 750 ENDPROC 760 REM graphics procedures 770 REM 780 REM Clear the screen and definable characters. 790 DEF PROCclearscreen 800 LOCAL i% 810 CLS 820 nextchar%=firstchar% 830 FOR i%=firstchar%*8 TO 2047 STEP 4 840 charmem%!i% = 0 850 NEXT 860 IF iscerberus% THEN ENDPROC 870 FOR i%=0 TO 1199 STEP 4 880 videomem%!i% = &20202020 890 NEXT 900 ENDPROC 910 REM Plot a single dot at x,y 920 DEF PROCplotdot(x%,y%) 930 IF (x% AND &FFFF) > 319 OR (y% AND &FFFF) > 239 THEN ENDPROC 940 LOCAL cr%,cc%,cn%,addr%,i% 950 cy%=(239-y%) DIV 8 960 cx%=x% DIV 8 970 cn% = videomem%?(cy%*40+cx%) 980 IF cn% >= firstchar% THEN GOTO 1040:REM Definable character already there 990 IF nextchar%=256 THEN ENDPROC:REM No more characters available. 1000 REM Reserve a new character and put it in the video RAM. 1010 cn%=nextchar% 1020 videomem%?(cy%*40+cx%)=cn% 1030 nextchar% = nextchar% + 1 1040 addr% = charmem% + 8*cn% + 7 - y% MOD 8 1050 REM Set the desired dot in the character memory. 1060 ?addr% = ?addr% OR bitmaps%(x% MOD 8) 1070 IF iscerberus% THEN ENDPROC 1080 REM If not on cerberus hardware, redefine the character 1090 REM and print it on the screen at desired position. 1100 REM On Cerberus we operate on char and video RAM directly 1110 VDU 23,cn% 1120 FOR i%=0 TO 7 1130 VDU charmem%?(8*cn%+i%) 1140 NEXT 1150 VDU 31,cx%,cy%,cn% 1160 ENDPROC 1170 REM draw line between points x1,y1 and x2,y2 1180 DEFPROCdrawline(x1%,y1%,x2%,y2%) 1190 LOCAL dx%,dy%,xs%,ys%,t%,i%,j% 1200 dx%=ABS(x1%-x2%) 1210 dy%=ABS(y1%-y2%) 1220 ys%=1+2*(y2%dx% THEN GOTO 1340 1250 REM draw line one step in x direction 1260 t%=-(dx% DIV 2) 1270 j%=y1% 1280 FOR i%=x1% TO x2% STEP xs% 1290 PROCplotdot(i%,j%) 1300 t%=t% + dy% 1310 IF t%>0 THEN j%=j%+ys%:t%=t%-dx% 1320 NEXT 1330 ENDPROC 1340 REM draw line one step in y direction 1350 t%=-(dy% DIV 2) 1360 j%=x1% 1370 FOR i%=y1% TO y2% STEP ys% 1380 PROCplotdot(j%,i%) 1390 t%=t% + dx% 1400 IF t%>0 THEN j%=j%+xs%:t%=t%-dy% 1410 NEXT 1420 ENDPROC