1000 DIM PT$(1),PTLAST$(1),ANS(2,2)›1010 GOTO 2710›1020 REM ›1030 REM | PLOTING CODE DRAW2D |›1040 REM | RELEASE 1.3 |›1050 REM ›1060 CLIP$="Y"›1070 ALAST=-777777:BLAST=ALAST›1080 PTLAST$="I"›1090 K=0›1100 FOR KK=1 TO PTCNT›1110 X=XY(KK,1):Y=XY(KK,2)›1120 REM ›1130 REM | TEST FOR DATA COMMAND |›1140 REM ›1150 IF X<>-777777 THEN 1180›1160 REM COMMAND=1 IS PEN UP›1170 IF Y=1 THEN CLIP$="Y":GOTO 2180›1180 REM ›1190 REM | CONVERT X,Y TO TUBE A,B |›1200 REM ›1210 K=K+1›1220 DIFX=0.86*(X-XCENTER)›1230 X=XCENTER+DIFX›1240 A=(X-XMIN)*REL1+AMIN›1250 B=(Y-YMIN)*REL2+BMAX›1260 REM ›1270 REM | CLIP LOGIC |›1280 REM ›1290 PT$="I"›1300 IF AAMAX THEN PT$="O"›1310 IF BBMAX THEN PT$="O"›1320 IF PT$="I" AND PTLAST$="I" THEN GOTO 2080›1330 IF PT$="O" AND PTLAST$="O" THEN GOTO 1580›1340 IF PT$="I" AND PTLAST$="O" THEN GOTO 1860›1350 REM ›1360 REM | PT IS OUT, LAST PT IN |›1370 REM ›1380 IF K=1 THEN 2160›1390 X=A:Y=B›1400 IF A=ALAST THEN 1490›1410 IF B=BLAST THEN 1540›1420 REM ›1430 REM NOT 90 DEGREES TO EDGE›1440 GOSUB 2200›1450 IF CNT<1 THEN 2160›1460 X=ANS(1,1):Y=ANS(1,2)›1470 GOTO 1570›1480 REM ›1490 REM VERT LINE›1500 IF B>BMAX THEN Y=BMAX›1510 IF BAMAX THEN X=AMAX›1560 IF AAMAX AND ALAST>AMAX THEN 2160›1630 IF BBMAX AND BLAST>BMAX THEN 2160›1650 IF K=1 THEN 2160›1660 X=A:Y=B›1670 IF A=ALAST THEN 1760›1680 IF B=BLAST THEN 1800›1690 REM ›1700 REM LN HITS TUBE AT ANGLE›1710 GOSUB 2200›1720 IF CNT<>2 THEN 2160›1730 X=ANS(1,1):Y=ANS(1,2)›1740 ALAST=ANS(2,1):BLAST=ANS(2,2)›1750 GOTO 1830›1760 REM VERT LINE ACROSS TUBE›1770 IF BBMAX THEN Y=BMAX:BLAST=BMIN›1790 GOTO 1830›1800 REM HORZ LINE ACROSS TUBE›1810 IF AAMAX THEN X=AMAX:ALAST=AMIN›1830 PLOT ALAST,BLAST›1840 DRAWTO X,Y›1850 GOTO 2160›1860 REM ›1870 REM | PT IS IN, LAST PT OUT |›1880 REM ›1890 IF A=ALAST THEN 1990›1900 IF B=BLAST THEN 2040›1910 REM ›1920 REM NOT 90 DEGREES TO EDGE›1930 IF K=1 THEN 2160›1940 GOSUB 2200›1950 IF CNT<1 THEN 2160›1960 ALAST=ANS(1,1):BLAST=ANS(1,2)›1970 GOTO 2070›1980 REM ›1990 REM VERT LINE›2000 IF BLAST>BMAX THEN BLAST=BMAX›2010 IF BLASTAMAX THEN ALAST=AMAX›2060 IF ALASTBMAX OR YAMAX OR XA AND X>ALAST THEN 2480›2400 IF XB AND Y>BLAST THEN 2480›2420 IF YANG2 THEN ANG2=ANG2+360:GOTO 2570›2580 IF ANG<5 THEN ANG=5›2590 REM CHECK FOR CIRCLE OFF TUBE›2600 IF XC-R>XMAX THEN RETURN ›2610 IF XC+RYMAX THEN RETURN ›2630 IF YC+R255 THEN POP :GOTO 3740›3720 NEXT I›3730 GOTO 3630›3740 OPEN #4,4,0,"K:":GET #4,X›3750 CLOSE #4:GOTO 4720›3760 REM ›3770 REM | START LOOP FOR PLOTING |›3780 REM ›3790 ECNT=0›3800 ADR1=ADR(PRINT$):ADR2=ADR(TEXT$)›3810 REM GET NEXT COMMAND TYPE›3820 TRAP 3590›3830 READ TYPE:TYPE=INT(TYPE)›3840 ECNT=ECNT+1›3850 TEXT$(1)=STR$(ECNT)›3860 X=LEN(TEXT$)›3870 TEXT$(X+1)=" OF "›3880 X=LEN(TEXT$)›3890 TEXT$(X+1)=STR$(ECNT1)›3900 X=LEN(TEXT$)›3910 IF ECNT=ECNT1 THEN TEXT$=" ":X=8›3920 IF ECNT=1 AND TYPE<>1 THEN TEXT$(X+1)=" ATARI LAYOUT BY JACK GILCHRIST":X=LEN(TEXT$)›3930 IF TYPE=1 THEN TEXT$(X+1)=" ":X=LEN(TEXT$)›3940 C=USR(ADR1,0,23,ADR2,X)›3950 REM ›3960 REM TYPES 1,2,3,4,5 FORMAT›3970 REM DATA TYPE,X,Y,TEXT›3980 REM ›3990 REM 1=TITLE TEXT AT BOTTOM›4000 REM 2=HORZ TEXT STARTING AT X,Y›4010 REM 3=VERT TEXT STARTING AT X,Y›4020 REM 4=HORZ TEXT CENTERED ON X,Y›4030 REM 5=VERT TEXT CENTERED ON X,Y›4040 REM TYPE 1 IS ALWAYS DISPLAYED›4050 REM X,Y REQUIRED BUT NOT USED›4060 REM ›4070 REM 6=UNASSIGNED›4080 REM 7=CCW ARC FORMAT›4090 REM DATA 7,ANG,XC,YC,R,ANG1,ANG2›4100 REM ›4110 REM 8=FULL CIRCLE›4120 REM FORMAT DATA 8,ANGLE,XC,YC,R›4130 REM ANGLE=DEGREES BETWEEN POINTS›4140 REM TO BE SAMPLED›4150 REM ›4160 REM 9=PT ARRAY›4170 REM FORMAT›4180 REM DATA 9,PTCNT,X1,Y1,...XN,YN›4190 REM ›4200 REM 10=BOX›4210 REM DATA 10,XMIN,YMIN,XLENGTH,YLENGTH›4220 REM ›4230 REM 11=SOLID BOX›4240 REM FORMAT SAME AS TYPE 10›4250 REM ›4260 REM 12 BOX AT ANGLE›4270 REM ›4280 IF TYPE<1 OR TYPE>12 THEN GOTO 4710›4290 ON TYPE GOSUB 6700,6700,6700,6700,6700,2710,2500,2500,4300,4390,4390,4390:GOTO 3810›4300 REM ›4310 REM | SUB FOR PT ARRAY |›4320 REM ›4330 READ PTCNT›4340 FOR I=1 TO PTCNT›4350 READ X,Y›4360 XY(I,1)=X:XY(I,2)=Y›4370 NEXT I›4380 GOTO 1020›4390 REM ›4400 REM | SUB FOR BOX |›4410 REM ›4420 REM GET BOX CORNERS›4430 GOSUB 7010›4440 IF TYPE=11 THEN 4460›4450 GOTO 1020›4460 REM ›4470 REM | FILL IN BOX |›4480 REM ›4490 GOSUB 1020›4500 DIFX=0.86*(XY(4,1)-XCENTER)›4510 X=XCENTER+DIFX:Y=XY(4,2)›4520 A1=(X-XMIN)*REL1+AMIN›4530 B1=(Y-YMIN)*REL2+BMAX›4540 DIFX=0.86*(XY(2,1)-XCENTER)›4550 X=XCENTER+DIFX:Y=XY(2,2)›4560 A2=(X-XMIN)*REL1+AMIN›4570 B2=(Y-YMIN)*REL2+BMAX›4580 IF A1>AMAX THEN RETURN ›4590 IF A2BMAX THEN RETURN ›4610 IF B2AMAX THEN A2=AMAX›4640 IF B1BMAX THEN B2=BMAX›4660 FOR I=B1 TO B2›4670 PLOT A1,I›4680 DRAWTO A2,I›4690 NEXT I›4700 RETURN ›4710 ? "BAD COMMAND";TYPE:GOTO 3590›4720 REM ›4730 REM | MAIN MENU |›4740 REM ›4750 GRAPHICS 1:POKE 751,1›4760 SETCOLOR 4,9,3:SETCOLOR 2,9,3›4770 SETCOLOR 0,9,12:SETCOLOR 1,9,10›4780 POSITION 1,0›4790 ? #6;"DISPLAY OPTIONS"›4800 POSITION 1,3›4810 ? #6;"(A) SET WINDOW"›4820 POSITION 1,5›4830 ? #6;"(B) DISPLAY"›4840 POSITION 1,7›4850 ? #6;"(C) NEW DRAWING"›4860 POSITION 1,9›4870 ? #6;"(D) RETURN"›4880 POSITION 1,11›4890 ? #6;"(E) STOP"›4900 OPEN #4,4,0,"K:":GET #4,X›4910 CLOSE #4›4920 IF X<65 OR X>69 THEN GOTO 4720›4930 IF X=69 THEN GRAPHICS 0:END ›4940 IF X=68 THEN RUN "D1:DRAW"›4950 IF X=67 THEN RUN "D1:DRAW2D.MSH"›4960 IF X=65 THEN GOSUB 4990:GOTO 4720›4970 RESTORE ›4980 GOTO 3260›4990 REM ›5000 REM | SUB TO SET WINDOW |›5010 REM ›5020 GRAPHICS 0›5030 ? "INPUT DATA MAX-MIN'S"›5040 ? " XMAX=";XB,›5050 ? " XMIN=";XS›5060 ? " YMAX=";YB,›5070 ? " YMIN=";YS:? ›5080 ? "CURRENT WINDOW RANGE"›5090 ? " XMAX=";XMAX,›5100 ? " XMIN=";XMIN›5110 ? " YMAX=";YMAX,›5120 ? " YMIN=";YMIN:? ›5130 ? "YOUR OPTIONS ARE!"›5140 ? " (A) SHIFT X"›5150 ? " (B) SHIFT Y"›5160 ? " (C) SET CENTER XC,YC"›5170 ? " (D) SCALE BY #"›5180 ? " (E) SET SCALE"›5190 ? " (F) SET WINDOW"›5200 ? " (G) WINDOW=DATA MAX-MIN'S"›5210 ? " (H) RETURN"›5220 OPEN #4,4,0,"K:":GET #4,X›5230 CLOSE #4›5240 IF X<65 OR X>72 THEN GOTO 4990›5250 IF X=72 THEN RETURN ›5260 IF X=71 THEN XMAX=XB:XMIN=XS:YMAX=YB:YMIN=YS:GOTO 4990›5270 IF X=65 THEN GOTO 5330›5280 IF X=66 THEN GOTO 5380›5290 IF X=67 THEN GOTO 5430›5300 IF X=68 THEN GOTO 5550›5310 IF X=69 THEN GOTO 5670›5320 IF X=70 THEN GOTO 5790›5330 REM SHIFT X›5340 ? :? "INPUT DESIRED SHIFT IN X ";›5350 INPUT X›5360 XMAX=XMAX+X:XMIN=XMIN+X›5370 GOTO 4990›5380 REM SHIFT Y›5390 ? :? "INPUT DESIRED SHIFT IN Y ";›5400 INPUT X›5410 YMAX=YMAX+X:YMIN=YMIN+X›5420 GOTO 4990›5430 REM SET X,Y CENTER›5440 ? :? "INPUT X AND Y DESIRED AT CENTER!"›5450 ? "CURRENT CENTER IS";›5460 A=(XMAX+XMIN)/2›5470 B=(YMAX+YMIN)/2›5480 ? " XC=";A;›5490 ? " YC=";B:? ›5500 ? "DESIRED CENTER IS ";›5510 INPUT X,Y›5520 I=X-A:XMAX=XMAX+I:XMIN=XMIN+I›5530 I=Y-B:YMAX=YMAX+I:YMIN=YMIN+I›5540 GOTO 4990›5550 REM SCALE BY #›5560 CSCALE=ABS((XB-XS)/(XMAX-XMIN))›5570 ? :? "CURRENT SCALE=";CSCALE›5580 ? "CHANGE SCALE BY=";:INPUT SCALE›5590 XC=(XMAX+XMIN)/2›5600 YC=(YMAX+YMIN)/2›5610 X=(XMAX-XMIN)/2:Y=(YMAX-YMIN)/2›5620 XMAX=XC+X/SCALE›5630 XMIN=XC-X/SCALE›5640 YMAX=YC+Y/SCALE›5650 YMIN=YC-Y/SCALE›5660 GOTO 4990›5670 REM SET SCALE TO #›5680 CSCALE=ABS((XB-XS)/(XMAX-XMIN))›5690 ? :? "CURRENT SCALE=";CSCALE›5700 ? "CHANGE SCALE TO=";:INPUT SCALE›5710 XC=(XMAX+XMIN)/2›5720 YC=(YMAX+YMIN)/2›5730 X=(XB-XS)/2:Y=(YB-YS)/2›5740 XMAX=XC+X/SCALE›5750 XMIN=XC-X/SCALE›5760 YMAX=YC+Y/SCALE›5770 YMIN=YC-Y/SCALE›5780 GOTO 4990›5790 ? :REM SET WINDOW VALUES›5800 ? "YOUR VALUES";›5810 ? " WILL BE ADJUSTED TO"›5820 ? "PROPORTIONAL RATIO OF THE TV TUBE"›5830 ? ›5840 ? "INPUT YOUR VIEWPORT AS FOLLOWS"›5850 ? "XMAX,XMIN,YMAX,YMIN"›5860 ? "YOUR VALUES ARE ";›5870 INPUT XMAX,XMIN,YMAX,YMIN›5880 GOTO 4990›5890 REM ›5900 REM | CALC DISPLAY XY MAXMIN'S |›5910 REM ›5920 XB=-777777:XS=777777›5930 YB=-777777:YS=777777›5940 GRAPHICS 2:POKE 751,1›5950 SETCOLOR 4,9,3:SETCOLOR 2,9,3›5960 SETCOLOR 0,9,12:SETCOLOR 1,9,10›5970 POSITION 4,1›5980 ? #6;"PLEASE WAIT!"›5990 POSITION 4,3›6000 ? #6;"I'M SCANNING"›6010 POSITION 4,5›6020 ? #6;"YOUR DRAWING"›6030 POSITION 4,7›6040 ? #6;"FOR IT'S X,Y"›6050 POSITION 4,9›6060 ? #6;" MAX-MIN'S!"›6070 TRAP 6650›6080 ECNT1=0›6090 REM ›6100 REM LOOP FOR EACH ENTITY›6110 READ TYPE›6120 ECNT1=ECNT1+1›6130 IF TYPE=8 OR TYPE=7 THEN 6200›6140 IF TYPE>9 AND TYPE<13 THEN 6300›6150 IF TYPE=9 THEN 6430›6160 IF TYPE>0 AND TYPE<6 THEN 6550›6170 ? "I ENCOUNTER A TYPE OF DATA I"›6180 ? "DON'T RECOGNIZE. TYPE=";TYPE›6190 ? "ENTITY NUMBER IS ";ECNT1›6200 REM ›6210 REM | CALC MAXMIN OF CIRCLE |›6220 REM ›6230 READ ANG,XC,YC,R›6240 IF TYPE=7 THEN READ ANG1,ANG2›6250 IF XC+R>XB THEN XB=XC+R›6260 IF XC-RYB THEN YB=YC+R›6280 IF YC-RXB THEN XB=X›6380 IF XYB THEN YB=Y›6400 IF YXB THEN XB=X›6500 IF XYB THEN YB=Y›6520 IF YXB THEN XB=X›6610 IF XYB THEN YB=Y›6630 IF Y39 THEN GOTO 6970›6900 IF B>22 AND TYPE>1 THEN GOTO 6970›6910 IF B<0 OR B>23 THEN GOTO 6970›6920 CS1$=TEXT$(I,I)›6930 REM ALLOW FOR VERT SHIFT TO›6940 REM FRACTIONS OF A LINE›6950 J=A+(40*(INT((B-INT(B))*8)))›6960 C=USR(ADR(PRINT$),J,B,X,1)›6970 IF TYPE<3 OR TYPE=4 THEN A=A+1›6980 IF TYPE=3 OR TYPE=5 THEN B=B+1›6990 NEXT I›7000 RETURN ›7010 REM ›7020 REM | SUB FOR BOX |›7030 REM | CALC ALL CORNERS |›7040 REM ›7050 READ X,Y,A,B›7060 IF A<0 THEN X=X+A:A=-A›7070 IF B<0 THEN Y=Y+B:B=-B›7080 IF TYPE=12 THEN READ ANG›7090 PTCNT=5›7100 XY(1,1)=X:XY(1,2)=Y›7110 XY(2,1)=X+A:XY(2,2)=Y›7120 XY(3,1)=XY(2,1):XY(3,2)=Y+B›7130 XY(4,1)=X:XY(4,2)=XY(3,2)›7140 XY(5,1)=X:XY(5,2)=Y›7150 IF TYPE<12 THEN RETURN ›7160 REM ›7170 REM | ROTATE BOX TYPE=12 |›7180 REM ›7190 XC=XY(1,1):YC=XY(1,2)›7200 FOR I=2 TO 4›7210 IF I=2 THEN ANG1=0:R=A›7220 IF I=4 THEN ANG1=90:R=B›7230 IF I<>3 THEN 7270›7240 DIFX=XY(I,1)-XC:DIFY=XY(I,2)-YC›7250 R=SQR((DIFX*DIFX)+(DIFY*DIFY))›7260 ANG1=ATN(DIFY/DIFX)›7270 ANG2=ANG+ANG1›7280 XY(I,1)=(R*COS(ANG2))+XC›7290 XY(I,2)=(R*SIN(ANG2))+YC›7300 NEXT I›7310 RETURN ›