100 ; REM PROG NAME IS 'MONOGRDEMO' 11 JUN '87
110 ;
120 CLS:PEEK $FFFA01,C%:IF C%>127 THEN PRINT " NOT A MONOCHROME SYSTEM":END
130 C%=0:MODE 2:VTAB 4:PRINT " THIS IS A MONOCHROME GRAPHICS DEMONSTRATION PROGRAM.  ENTER THE NUMBER"
140 PRINT " CORRESPONDING TO YOUR CHOICE TO START A PARTICULAR DEMO.  TO STOP A DEMO,"
150 PRINT " SIMULTANEOUSLY PRESS THE 'CONTROL' AND 'C' KEYS":PRINT:PRINT
160 PRINT " 1 = HEX                  2 = GRID"
170 PRINT " 3 = PROP                 4 = LINES"
180 PRINT " 5 = CIRCLE               6 = CIRCLES"
190 PRINT " 7 = RNDLINES             8 = RNDLINES2"
200 PRINT " 9 = RECTANGLE           10 = XOVER":PRINT
210 INPUT "WHICH ? ",N%:IF N%<1 GOTO 210 ELSE IF N%>10 GOTO 210
220 ON N% GOTO HEX,GRID,PROP,LINES,CIRCLE,CIRCLES,RNDLINES,RNDLINES2,RECTANGLE,XOVER
230 ;
240  "HEX"
250 CLS:PI=4*ATN(1):C=COS(PI/3):S=SIN(PI/3)
260 C1=COS(PI/36):S1=SIN(PI/36):SF=.95
270 ;
280 MODE 2:FOR H%=1 TO 3:GOSUB 310:NEXT H%
290 MODE 3:FOR H%=1 TO 3:GOSUB 310:NEXT H%:GOTO 280
300 ;
310 X=200:Y=0:CX=320:CY=200:SC=1.16
320 FOR J%=1 TO 70:FOR I%=0 TO 6:SX=X*SC+CX:SY=CY+Y
330 IF I%=0 THEN SX1%=FIX(SX):SY1%=FIX(SY)
340 LSET (SX1%,SY1%)-(FIX(SX),FIX(SY))
350 SX1%=FIX(SX):SY1%=FIX(SY)
360 XN=X*C-Y*S:Y=X*S+Y*C:X=XN:NEXT I%
370 XN=SF*(X*C1-Y*S1):Y=SF*(X*S1+Y*C1):X=XN:NEXT J%
380 ;
390 X=200:Y=0:CX=320:CY=200:SC=1.16
400 FOR J%=1 TO 70:FOR I%=0 TO 6:SX=X*SC+CX:SY=CY+Y
410 IF I%=0 THEN SX1%=FIX(SX):SY1%=FIX(SY)
420 LCLR (SX1%,SY1%)-(FIX(SX),FIX(SY))
430 SX1%=FIX(SX):SY1%=FIX(SY)
440 XN=X*C-Y*S:Y=X*S+Y*C:X=XN:NEXT I%
450 XN=SF*(X*C1-Y*S1):Y=SF*(X*S1+Y*C1):X=XN:NEXT J%:RETURN
460 ;
470 ;
480  "GRID"
490 CLS:GOSUB 520:FOR I=0 TO 120 STEP 20
500 FOR X=0 TO 190+I STEP 1:Y=(X*X-2*I*X)/190:X%=FIX(X):Y%=FIX(Y)
510 PSET X%+320,200-Y%:PSET 320-X%,Y%+200:NEXT X:NEXT I:STOP
520 FOR X%=40 TO 600 STEP 40:FOR Y%=4 TO 396 STEP 4:PSET X%,Y%:NEXT Y%:NEXT X%
530 FOR Y%=40 TO 360 STEP 40:FOR X%=4 TO 636 STEP 4:PSET X%,Y%:NEXT X%:NEXT Y%
540 RETURN
550 ;
560 ;
570  "PROP"
580 CLS:DIM X%[360],Y%[360]:K=ATN(1)/90
590 FOR I%=0 TO 180:X%[I%]=FIX(100.5*COS(D)):D=D+K:NEXT I%
600 FOR I%=359 TO 181 STEP -1:J%=J%+1:X%[I%]=-X%[J%]:NEXT I%
610 FOR I%=180 TO 359:Y%[K%]=-X%[I%]:K%=K%+1:NEXT I%
620 FOR I%=0 TO 179:Y%[K%]=X%[I%]:K%=K%+1:NEXT I%
630 FOR I%=0 TO 359:X%[I%]=X%[I%]+319:Y%[I%]=Y%[I%]+199:NEXT I%
640 ;
650 FOR I%=0 TO 4:FOR J%=72*I%+36 TO 72*I%+71:X%=X%[J%]:Y%=Y%[J%]
660 LSET (X%,Y%)-(638-X%,398-Y%):NEXT J%:NEXT I%
670 ;
680 FOR H%=0 TO 35:FOR I%=H% TO 359 STEP 72
690 X%=X%[I%]:Y%=Y%[I%]:LSET (X%,Y%)-(638-X%,398-Y%)
700 X%=X%[I%+36]:Y%=Y%[I%+36]:LCLR (X%,Y%)-(638-X%,398-Y%)
710 NEXT I%:NEXT H%
720 ;
730 FOR H%=0 TO 35:FOR I%=H% TO 359 STEP 72
740 X%=X%[I%]:Y%=Y%[I%]:LCLR (X%,Y%)-(638-X%,398-Y%)
750 X%=X%[I%+36]:Y%=Y%[I%+36]:LSET (X%,Y%)-(638-X%,398-Y%)
760 NEXT I%:NEXT H%:GOTO 680
770 ;
780 ;
790  "LINES"
800 CLS:S%=8
810 FOR X%=0 TO 639 STEP S%:LSET (X%,100)-(639-X%,300):NEXT X%
820 FOR X%=0 TO 639 STEP S%:LCLR (X%,100)-(639-X%,300):NEXT X%
830 FOR Y%=300 TO 100 STEP -S%:LSET (0,Y%)-(639,400-Y%):NEXT Y%
840 FOR Y%=300 TO 100 STEP -S%:LCLR (0,Y%)-(639,400-Y%):NEXT Y%
850 GOTO 810
860 ;
870 ;
880  "CIRCLE"
890 CLS
900 FOR I%=1 TO 200:CIRSET (320,200),I%:NEXT I%
910 FOR I%=1 TO 200:CIRCLR (320,200),I%:NEXT I%:GOTO 900
920 ;
930 ;
940  "CIRCLES"
950 CLS:DIM A%[396]:INIT A%[]=-1:J%=1:CNT%=20
960 K%=J%:FOR I%=1 TO 200:IF A%[I%]=K% GOTO 990
970 A%[I%]=K%:IF K%=1 THEN CIRSET (319,199),I% ELSE CIRCLR (319,199),I%
980 K%=-K%:I%=I%+19
990 NEXT I%:CNT%=CNT%-1:IF CNT%>0 GOTO 960
1000 J%=-J%:CNT%=20:GOTO 960
1010 ;
1020 ;
1030  "RNDLINES"
1040 DIM C%[251],X1%[251],X2%[251],Y1%[251],Y2%[251]
1050 FOR I%=1 TO 250
1060 E=640:GOSUB 1120:X1%[I%]=R%:GOSUB 1120:X2%[I%]=R%
1070 E=400:GOSUB 1120:Y1%[I%]=R%:GOSUB 1120:Y2%[I%]=R%:NEXT I%
1080 CLS:FOR I%=1 TO 250
1090 LSET (X1%[I%],Y1%[I%])-(X2%[I%],Y2%[I%]):NEXT I%
1100 HTAB FIX(66*RND(0)):VTAB FIX(25*RND(0))
1110 PRINT "SHORT DELAY";:FOR D=1 TO 12000:NEXT D:GOTO 1050
1120 R%=FIX(RND(0)*E):RETURN
1130 ;
1140 ;
1150  "RNDLINES2"
1160 DIM C%[251],X%[251],Y%[251]
1170 FOR I%=1 TO 200
1180 E=640:GOSUB 1230:X%[I%]=R%:E=400:GOSUB 1230:Y%[I%]=R%:NEXT I%
1190 CLS:FOR I%=1 TO 200
1200 LSET (639-X%[I%],399-Y%[I%])-(X%[I%],Y%[I%]):NEXT I%
1210 HTAB FIX(66*RND(0)):VTAB FIX(25*RND(0))
1220 PRINT "SHORT DELAY";:FOR D=1 TO 8000:NEXT D:GOTO 1170
1230 R%=FIX(RND(0)*E):RETURN
1240 ;
1250 ;
1260  "RECTANGLE"
1270 CLS:DIM A%[640]:INIT A%[]=-1:J%=1:CNT%=20
1280 K%=J%:FOR I%=0 TO 200:IF A%[I%]=K% GOTO 1320 ELSE A%[I%]=K%:K%=-K%
1290 IF K%=-1 THEN RECTSET (200-I%,200-I%)-(I%+440,200+I%)
1300 IF K%=1 THEN RECTCLR (200-I%,200-I%)-(I%+440,200+I%)
1310 I%=I%+19
1320 NEXT I%:CNT%=CNT%-1:IF CNT%>0 GOTO 1280
1330 J%=-J%:CNT%=20:GOTO 1280
1340 ;
1350 ;
1360  "XOVER"
1370 CLS:DIM F[640]:FOR I%=0 TO 639:I=FLT(I%):F[I%]=(I-320)/320:NEXT I%
1380 VTAB 5:PRINT " THIS DEMO SHOWS THE RESPONSE OF EITHER A 6dB/OCTAVE OR A 12dB/OCTAVE "
1390 PRINT " LOUDSPEAKER CROSSOVER.  THE FREQUENCY IS NORMALIZED IN THE CENTER OF THE"
1400 PRINT " DISPLAY, AND GOES LOGARITHMICALLY FROM 1/10 f0 AT THE LEFT OF THE DISPLAY TO"
1410 PRINT " 10 f0 AT THE RIGHT OF THE DISPLAY.":PRINT
1420 PRINT " THE PHASE RESPONSE OF BOTH THE HIGH PASS AND THE LOW PASS SECTIONS OF THE"
1430 PRINT " CROSSOVERS IS SHOWN, AND A HORIZONTAL LINE IS DRAWN INDICATING 0 degrees.":PRINT
1440 PRINT " THE AMPLITUDE IS DISPLAYED IN deciBels, from 0 dB AT THE TOP OF THE DISPLAY"
1450 PRINT " TO -40 dB AT THE BOTTOM.  A HORIZONTAL LINE IS DRAWN AT THE -3 dB POINT.":PRINT:PRINT
1460 INPUT "WHICH RESPONSE (0 = 6 dB,  1 = 12 dB) ? ",R%:YK=-200/180
1470 IF R%<0 GOTO 1460 ELSE IF R%>1 GOTO 1460 ELSE IF R%=0 THEN YK=-200/90
1480 CLS:PK=45/ATN(1):VTAB 2:PRINT " -3 dB":VTAB 12:PRINT "   0 deg"
1490 VTAB 0:IF R%=0 THEN PRINT " +90 deg" ELSE PRINT " +180 deg"
1500 VTAB 24:IF R%=0 THEN PRINT " -90 deg"; ELSE PRINT " -180 deg";
1510 VTAB 21:LSET (0,30)-(639,30):LSET (0,200)-(639,200):LSET (320,0)-(320,399)
1520 a=SQR(2):FOR X%=0 TO 639:F=EXP10(F[X%])
1530 IF R%=0 THEN GOSUB RESP1 ELSE GOSUB RESP3
1540 Y%=FIX(-200*LOG10(MAG)):PSET X%,Y%:Y%=FIX(200+PH*YK):PSET X%,Y%
1550 ;
1560 IF R%=0 THEN GOSUB RESP2 ELSE GOSUB RESP4
1570 Y%=FIX(-200*LOG10(MAG)):PSET X%,Y%:Y%=FIX(200+PH*YK):PSET X%,Y%:NEXT X%:END
1580 ;
1590  "RESP1"
1600 ; RESP = 1/(1 + jw)
1610 MAG=1/SQR(1+F*F):PH=PK*ATN(-F):RETURN
1620 ;
1630  "RESP2"
1640 ; RESP = jw/(1 + jw)
1650 MAG=F/SQR(1+F*F):PH=90+PK*ATN(-F):RETURN
1660 ;
1670  "RESP3"
1680 ; RESP = 1/(1-w^2 + jaw)
1690 aa=1-F*F:bb=a*F:MAG=1/SQR(aa*aa+bb*bb)
1700 IF aa=0 THEN PH=-90 ELSE PH=PK*ATN(-bb/aa)
1710 IF PH>0 THEN PH=PH-180:RETURN ELSE RETURN
1720 ;
1730  "RESP4"
1740 ; RESP = -w^2/(1-w^2 + jaw)
1750 aa=1-F*F:bb=a*F:MAG=F*F/SQR(aa*aa+bb*bb)
1760 IF aa=0 THEN PH=-90 ELSE PH=PK*ATN(-bb/aa)
1770 IF PH<0 THEN PH=PH+180:RETURN ELSE RETURN
1780 ;
