Listing of file='PLOTTR.BAS;0F' on disk='vmedia/chip_25-sector.ccvf'
100 REM PROGRAM NAME: PLOTTR V12.80 110 REM PART OF 3D PLOTTING PACKAGE BY JAMES C. MINOR 111 REM 39 BRYN MAWR ROAD 112 REM ROCHESTER, NEW YORK 14624 113 REM TEL: (716-) 247-7069 120 REM COPYRIGHT 1980 BY JAMES C. MINOR 125 130 REM PURPOSE: TO SET UP THE PARAMETERS AND CALL THE PROPER 140 REM ROUTINES TO WORK THE 3-D PLOT PACKAGE 150 REM 160 ZL= 0:ZU= 0:REM RESERVE SPACE 170 GOSUB 1000:IF I= 128 GOTO 380 :REM RECOVER DATA, QUIT IF BAD 190 GOSUB 400 :REM SETUP PLOTTING FUNCTIONS AND PARAMETERS 200 GOSUB 500 :REM SETUP FOR FUNCTION BEING PLOTTED 220 IF VW(0)> 0 THEN GOSUB 2000 :REM PREPARE DISPLAY DISK 230 FOR I= 1 TO ABS (VW(0)) :REM I=PLOT NUMBER 240 GOSUB 3000 :REM COMPUTE ROTATION CONSTANTS 250 GOSUB 3300 :REM DETERMINE OFFSET AND SCALING PARAMETERS 258 GOSUB 4000 :REM SETUP FOR HIDDEN LINES 260 PR= 0:GOSUB 5000 :REM COMPUTE/TRANSFORM/SCALE/ AND PLOT 270 GOSUB 9000 :REM STORE TIME, Z-EXTREMES, AND AXES 275 GOSUB 9800 :REM PRINT TITLE 280 IF VW(0)> 0 THEN GOSUB 9900 :REM SAVE DISPLAY ON DISK 290 NEXT I 300 IF VW(0)> 1 THEN GOSUB 9950 :REM PUT SCREEN IN STANDBY MODE 310 IF VW(0)= - 1 THEN I= 1:GOSUB 25000 :REM PRESENT VIEW OPTIONS 380 END 390 400 REM PLOTTING FUNCTIONS AND PARAMETERS 410 DIM H(128,2) 420 D0= 5:REM MAX UNINTERRUPTED LENGTH OF LINE (SCREEN UNITS) 430 CS= 3:CN= 2:REM "SOUTH" AND "NORTH" COLOR CODES 439 REM TO BE VISIBLE A POINT MUST LIE BETWEEN BOUNDARIES 440 BW= - 1:BE= 126:BS= 8:BN= 128:REM WST,EAST,STH,NRTH SCRN BOUNDS 450 DEF FN RD(X)= 10^ (INT (LOG (ABS (X+ 1E- 35))/ LOG (10))- DP+ 1):REM DP-PLACE TERM 460 DEF FN RO(X)= INT (.5+ (X+ 1E- 35)/ FN RD(X))* FN RD(X)- 1E- 35:REM ROUNDOFF 480 RETURN 490 500 REM USE THIS SPACE FOR ANY ONE-SHOT OPERATIONS FOR YOUR 510 REM FUNCTION. FOR INSTANCE "DEF FN" STATEMENTS OR GIVING 520 REM FUNCTIONAL SPECIFICS OR PARAMETER ARRAYS. 530 REM YOU MAY WISH TO USE SOMETHING LIKE "DIM PP(2,12)" 540 REM AND THEN SPECIFY THE VARIOUS ELEMENTS. THEN WHEN YOU 550 REM USE YOUR FUNCTION, HAVE PP(1,UP) AND PP(2,UP) SO 560 REM YOUR USER PARAMETER (UP) CAN VARY TWO (OR MORE) 570 REM FUNCTION PARAMETERS. 580 RETURN 590 600 REM YOUR FUNCTION: Z(X,Y) 610 REM YOUR USER PARAMETER HAS THE NAME "UP". THE INPUT 615 REM POSITION PARAMETERS ARE "X" AND "Y" AND THE OUTPUT 617 REM IS "Z". YOU MAY USE ANY NAME BEGINNING WITH "U" 619 REM FOR INTERMEDIATE PARAMETERS. 620 U= SQR (X* X+ Y* Y) 630 Z= 3* SIN (U+ .001)/ (U+ .001) 680 RETURN 690 1000 REM SUBROUTINE TO RECOVER DATA 1005 IF PEEK (32767)< > 128 THEN I= 128 :RETURN 1010 S= 28928:M= 0:M1= 0:M2= 0:REM STABILIZE VARIABLE SPACE 1030 REM RECOVER STRING ARRAYS IN HIGH MEMORY: 1040 POKE 32960,PEEK (S):POKE 32961,PEEK (S+ 1):REM STRING POINTER(S=28928) 1050 S= S+ 2:POKE 32978,PEEK (S):POKE 32979,PEEK (S+ 1):REM BAS STK PNT(S=28930) 1060 REM STRING POINTERS RECOVERED. 1080 REM RECOVER NUMERICAL ARRAYS: 1090 S= S+ 2:M1= 256* PEEK (32987)+ PEEK (32986):REM NEW ARRAYS AT END OLD ARR 1100 S= S+ 2:M2= M1+ (256* PEEK (S+ 1)+ PEEK (S))- (256* PEEK (S- 1)+ PEEK (S- 2)):REM NEW ARRAY END (S=28934) 1110 S= S+ 2:FOR M= M1 TO M2:POKE M,PEEK (S+ M- M1):NEXT :REM RECOVER ARRAYS 1120 M= INT (M2/ 256):POKE 32987,M:POKE 32986,M2- 256* M:REM NEW END ARRAY 1130 REM ARRAYS RECOVERED. 1150 OUT 8,255:PLOT 12:REM UNLOCK KEYBOARD 1160 RETURN 1990 2000 REM ROUTINE TO PREPARE DISPLAY DISK 2010 GOSUB 2100 :REM PRINT INSTRUCTIONS 2020 GOSUB 2200 :REM CHECK SIZE AVAILABLE 2030 IF 32* VW(0)> SI THEN GOSUB 2500 :GOTO 2010 :REM IF DISK TOO SMALL, GIVE OPTIONS 2035 PLOT 30,16,29,18,15,12 2040 RETURN 2050 2100 REM DISK DISPLAY INSTRUCTIONS 2110 PLOT 30,20,29,23,15,14,12,3,16,5 2120 PRINT "NOW REMOVE THE PROGRAM DISK AND" 2130 PRINT TAB( 15);"INSERT YOUR DISPLAY STORAGE DISK." 2140 INPUT " PRESS RETURN WHEN READY. ";DU 2150 RETURN 2190 2200 REM CHECK DISK SIZE 2210 BL= 0 2220 ND= 2:PLOT 27,4:PRINT "READ "+ STR$ (BL)+ " 811D 80":PLOT 27,27 2230 IF BL= 0 THEN GOSUB 2300 :REM CHECK FIRST BLOCK 2240 IF PEEK (33053+ ND)< > 3 THEN SI= 400- SI :RETURN 2250 SI= SI+ 256* PEEK (33067+ ND)+ PEEK (33066+ ND):REM ACCUMULATE SIZES 2260 ND= ND+ 21 :REM LOOK AT NEXT FILE 2270 IF ND< 120 THEN GOTO 2240 2280 BL= BL+ 1 :GOTO 2220 2300 REM FISST BLOCK HANDLER 2310 SI= 1+ PEEK (33054):ND= 23 2320 IF PEEK (33055)= 65 THEN RETURN :REM DIRECTORY NOT EMPTY 2330 PLOT 30,16,29,17,12,3,18,5:PRINT "YOUR DISK IS NOT INITIALIZED" 2340 PRINT TAB( 21);"PRESS I TO INITIALIZE" 2350 PLOT 3,9,9:PRINT "OTHERWISE INSERT ANOTHER DISK AND PRESS RETURN" 2360 GOSUB 2400:IF VAL (M$)< > 13 AND VAL (M$)< > 73 GOTO 2350 2370 IF VAL (M$)= 73:PLOT 27,4:PRINT "INI CD0:"+ NA$(0):PLOT 27,27 2380 RETURN 2390 2400 REM AUTO INPUT ROUTINE (W/O CARRIAGE RETURN) 2410 POKE 33278,0 :REM CLEAR KEYBOARD CHARACTER BYTE 2420 IF PEEK (33278)= 0 GOTO 2420 :REM KEEP LOOKING FOR INPUT 2430 M$= CHR$ (PEEK (33278)):REM READ IT 2440 PRINT :RETURN 2490 2500 REM GIVE OPTIONS IF DISK SPACE IS TOO SMALL 2510 SI= INT (SI/ 32):PLOT 30,16,29,17,12,15 2515 PLOT 27,4:PRINT "DIR":PLOT 27,27 2520 PRINT TAB( 11);"THE DISK IS TOO SMALL TO HOLD";VW(0);" DISPLAYS." 2530 PRINT TAB( 16);"IT WILL ONLY HOLD";SI;" DISPLAYS." 2540 PRINT :PRINT TAB( 7);"EITHER PRESS RETURN AND TRY A DIFFERENT DISK" 2550 PRINT TAB( 9);"OR ENTER A NUMBER LESS THAN OR EQUAL TO";SI 2560 PRINT " AND I SHALL STORE THE FIRST SET(S) UP THROUGH THAT NUMBER. "; 2570 INPUT SI:IF 0< SI AND SI< VW(0) THEN VW(0)= SI 2580 RETURN 2590 2990 3000 REM COMPUTE ROTATION CONSTANTS 3005 T1= 3600* PEEK (33211)+ 60* PEEK (33210)+ PEEK (33209):REM START CLOCK1 3010 W= 3.14159/ 180:PH= W* PH(I):TH= W* TH(I):DI= DI(I):UP= UP(I) 3020 C1= - SIN (TH):C2= COS (TH) 3030 C3= - COS (TH)* COS (PH):C4= - SIN (TH)* COS (PH):C5= SIN (PH) 3040 C6= - COS (TH)* SIN (PH):C7= - SIN (TH)* SIN (PH):C8= - COS (PH) 3050 RETURN 3070 3300 REM DETERMINE OFFSET AND SCALING PARAMETERS 3310 XN= XN(I):XX= XX(I):YN= YN(I):YX= YX(I):ZN= ZN(I):ZX= ZX(I) 3315 IF (ZN= 1 AND ZX= 1) AND I> 1 THEN RETURN :REM USE PREVIOUS VALUES 3320 SX= 1:SY= 1:OX= 0:OY= 0 3330 WEST= 1E30:EAST= - 1E30:SO= 1E30:NO= - 1E30 3335 PR= 0:IF ZN= ZX THEN PR= - 1:GOSUB 4000:GOSUB 5000:GOTO 3425:REM PRESCALE 3340 REM WORST-CASE EXTREMES FOR LEFT/RIGHT/BOTTOM/TOP: 3350 X= XN:Y= YN:Z= ZN:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3360 X= XN:Y= YN:Z= ZX:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3370 X= XN:Y= YX:Z= ZN:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3380 X= XN:Y= YX:Z= ZX:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3390 X= XX:Y= YN:Z= ZN:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3400 X= XX:Y= YN:Z= ZX:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3410 X= XX:Y= YX:Z= ZN:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3420 X= XX:Y= YX:Z= ZX:GOSUB 6000:GOSUB 3500:REM PICK MIN & MAX 3425 REM DETERMINE SCALES AND OFFSETS: 3430 SX= (BE- BW- 2.002)/ (EAST- WEST):SY= (BN- BS- 2.002)/ (NO- SO) 3440 OX= BW+ 1.001- SX* WEST:OY= BS+ 1.001- SY* SO 3450 RETURN 3490 3500 REM DETERMINE MIN & MAX SCREEN EXCURSIONS 3510 IF XS < WEST THEN WEST= XS 3520 IF EAST < XS THEN EAST= XS 3530 IF YS< SO THEN SO= YS 3540 IF NO< YS THEN NO= YS 3550 RETURN 3590 4000 REM SETUP FOR HIDDEN LINES 4010 REM DETERMINE FOREGROUND/BACKGROUND PARAMETERS 4020 XF= XX:XB= XN:YF= YX:YB= YN 4030 IF 90< TH(I) AND TH(I)< = 180 THEN XF= XN:XB= XX 4040 IF 180< TH(I) AND TH(I)< = 270 THEN XF= XN:XB= XX:YF= YN:YB= YX 4050 IF 270< TH(I) AND TH(I)< 360 THEN YF= YN:YB= YX 4060 RETURN 4090 5000 REM THE POINT PLOTTING LOOP 5001 ZL= 1E19:ZU= - 1E19:REM INITIALIZE Z EXTREMES 5002 CY$= CY$(I) 5003 T2= 3600* PEEK (33211)+ 60* PEEK (33210)+ PEEK (33209):REM START CLOCK2 5005 PLOT 30,16,29,18,15,12,3,64,0 5006 REM INIT. HIGH HORIZON (H(XS,1)) AND LOW HORIZON (H(XS,2)) 5007 FOR II= 0 TO 128:H(II,1)= BS- 1:H(II,2)= BN+ 1:NEXT 5008 F0= 0:REM FLAG FOR FIRST ENTRY INTO ROUTINE 5009 IF PR THEN PRINT "":PRINT "PRESCALING" 5010 LN= YF:LX= YB:PN= XF:PX= XB:CY= 1:REM CONST.Y LINES UNLESS CY$=X 5020 IF CY$= "X" THEN LN= XF:LX= XB:PN= YF:PX= YB:CY= 0 5030 SL= .999999* (LX- LN)/ (NL(CY,I)- 1):SP= .999999* (PX- PN)/ (NP(CY,I)- 1) 5040 FOR L= LN TO LX STEP SL 5050 FOR P= PN TO PX STEP SP 5060 X= P:Y= L:IF CY$= "X" THEN X= L:Y= P 5080 GOSUB 600:REM CUMPUTE Z(X,Y) 5090 GOSUB 6000:REM CONVERT 3-D TO 2-D,SCALE AND OFFSET 5100 IF PR AND ABS (Z)< 1E20 THEN GOSUB 3500:REM PRESCALE (DON'T PLOT) 5105 IF NOT PR AND ABS (Z)< 1E20 THEN GOSUB 6200:REM SET Z EXTREMES 5110 IF NOT PR THEN GOSUB 10000:REM PLOT ON SCREEN 5120 NEXT P 5130 NEXT L 5135 IF CY$(I)= "B"AND CY$< > "X" THEN CY$= "X":GOTO 5006 5138 IF PR GOTO 5170 5140 T1= 3600* PEEK (33211)+ 60* PEEK (33210)+ PEEK (33209)- T1:IF T1< 0 THEN T1= T1+ 86400 5150 T2= 3600* PEEK (33211)+ 60* PEEK (33210)+ PEEK (33209)- T2:IF T2< 0 THEN T2= T2+ 86400 5160 T1= T1- T2:REM T1=SCALE TIME 5170 RETURN 5190 6000 REM 3-D TO 2-D,PERSPECTIVE,OFFSET, AND SCALE 6010 REM 3-D TO 2-D: 6020 XS= C1* X+ C2* Y 6030 YS= C3* X+ C4* Y+ C5* Z 6040 REM PERSPECTIVE: 6050 PE= DI/ (DI+ C6* X+ C7* Y+ C8* Z) 6060 XS= PE* XS 6070 YS= PE* YS 6080 REM SCALE AND OFFSET: 6090 XS= SX* XS+ OX 6100 YS= SY* YS+ OY 6110 RETURN 6190 6200 REM SET Z EXTREMES 6210 IF Z> ZU THEN ZU= Z 6220 IF Z< ZL THEN ZL= Z 6230 RETURN 6240 9000 REM HIDE TIME AND SCALE INFO ON SCREEN 9010 FOR IA= 28799 TO 32767 STEP 128 9020 POKE IA,0:REM BLANK OUT SCREEN RHS 9030 NEXT IA 9040 POKE 28798,INT (.5+ 22.4* LOG (T1+ 1)):REM 2.5% DISCRET. ERROR 9050 POKE 28926,INT (.5+ 22.4* LOG (T2+ 1)) 9055 DP= 3:ZL= FN RO(ZL):ZU= FN RO(ZU) 9060 SZ= 256* PEEK (32983)+ PEEK (32982) 9070 FOR J= 2 TO 5:POKE 28798+ J* 128,PEEK (SZ+ J):NEXT :REM ZL 9080 FOR J= 8 TO 11:POKE 28798+ (J- 2)* 128,PEEK (SZ+ J):NEXT :REM ZU 9090 RETURN 9100 9800 REM PRINT TITLE ON GRAPH 9810 PLOT 30,16,29,23,15,14,3,32- INT (LEN (TI$(I))/ 2),31 9820 PRINT TI$(I);:PLOT 8:PRINT CHR$ (15) 9830 RETURN 9890 9900 REM SAVE ON DISK 9910 PLOT 27,4:PRINT "SAVE "+ NA$(0)+ ".DSP 7000 1000":PLOT 27,27 9920 RETURN 9940 9950 REM SCREEN STANDBY MODE 9960 PLOT 30,16,29,17,14,31,12 9970 PRINT CHR$ (31);"FINISHED-PLEASE REMOVE DISK BEFORE TURNING POWER OFF.";CHR$ (19) 9980 RETURN 9990 10000 REM SUBROUTINE: HIDDEN LINE 10020 REM TO COMPACT ABOUT 60 REM STATEMENTS REMOVED FROM HERE 11010 IF NOT F0 THEN F0= - 1:F1= 0:F2= 0:REM FIRST ENTRY/PLOT 11020 IF P= PN THEN F4= 0:V1= 0:S1= 0:REM FIRST ENTRY/LINE 11030 S0= - 1 :IF ABS (Z)> 1E20 THEN S0= 0:REM SUPPORT STATE 11040 IF NOT S0 THEN S1= 0:GOTO 11160:REM FINISH LINE IF NEEDED 11050 REM STATE IS (S0): 11060 XI= XS:YI= YS:GOSUB 12600:REM VIS/HID STATE OF (XI,YI) 11070 IF S1 GOTO 11110 11080 REM STATE IS (NOT S1,S0): 11090 IF V0 THEN XI= XS:YI= YS:GOSUB 12100:RETURN 11100 XP= XS:YP= YS:V1= 0:S1= - 1:RETURN :REM (NOT S1,S0,NOT V0) 11110 REM STATE IS (S1,S0): 11120 GOSUB 12700:REM COMPUTE LINE SEGMENT PARAMETERS 11130 FOR DD= 1 TO DS:REM BRK LN INTO DS SEGS OF LNG<D0 11140 GOSUB 11300:REM LINE SEGMENT 11150 NEXT DD 11160 IF F1 AND ABS ((PX- P)/ (PX- PN))< .001 THEN GOSUB 11500:REM "LAST" 11170 RETURN 11180 11200 REM SUBROUTINE: "FIRST" VISIBLE POINT/LINE (XI,YI) 11210 IF F1 THEN XP= XC:YP= YC:XH= XI:YH= YI:GOSUB 11900:REM LINE HORIZON OF "COMMENCE" EDGE 11220 F1= - 1:F4= - 1:V1= - 1:S1= - 1:XC= XI:YC= YI:XP= XI:YP= YI 11230 RETURN 11240 11300 REM SUBROUTINE: LINE SEGMENT 11310 XD= XS- (DS- DD)* DX 11320 YD= YS- (DS- DD)* DY 11330 IF DS> 1 THEN XI= XD:YI= YD:GOSUB 12600:REM VIS/HID OF(XI,YI) 11340 IF V1 AND V0 THEN GOSUB 11600:GOTO 11380:REM VIS->VIS 11350 IF NOT V1 AND V0 THEN GOSUB 11700:GOTO 11380:REM HID->VIS 11360 IF V1 AND NOT V0 THEN GOSUB 11800:GOTO 11380:REM VIS->HID 11370 IF F3 THEN XH= XD:YH= YD:GOSUB 11900:REM LINE HORIZON 11380 XP= XD:YP= YD:V1= V0:S1= S0:REM PREPARE FOR NEXT SEGMENT/ENTRY 11390 RETURN 11400 11500 REM SUBROUTINE: "LAST" POINT/LINE 11510 IF F2 THEN XP= XE:YP= YE:XH= XV:YH= YV:GOSUB 11900:REM LINE HORIZON OF "END" EDGE 11520 F2= - 1:XE= XV:YE= YV:HX= XE:HY= YE:GOSUB 12000:REM POINT HRZN 11530 RETURN 11540 11600 REM SUBROUTINE: VIS->VIS: (XP,YP)->(XD,YD) 11610 PLOT 2,242,INT (XD),INT (YD),255 11620 XH= XD:YH= YD:GOSUB 11900:REM LINE HORIZON 11630 XV= XD:YV= YD:REM MOST RCENT VISIBLE POINT 11640 RETURN 11650 11700 REM SUBROUTINE: HID->VIS: (XP,YP)->(XD,YD) 11710 GOSUB 12400:REM FIND INTERSECT 11720 GOSUB 12100:REM COMMENCE EDGE? 11730 XP= XI:YP= YI:GOSUB 11600:REM VIS->VIS :(XP,YP)->(XD,YD) 11740 RETURN 11750 11800 REM SUBROUTINE: VIS->HID: (XP,YP)->(XD,YD) 11810 GOSUB 12400:REM FIND INTERSECT 11820 XT= XD:YT= YD:REM TEMP STORAGE FOR (XD,YD) 11830 XD= XI:YD= YI:GOSUB 11600:REM VIS->VIS :(XP,YP)->(XD,YD) 11840 XD= XT:YD= YT:REM RECOVER LAST POINT 11850 RETURN 11860 11900 REM LINE HORIZON (XP,YP) THROUGH (XH,YH) 11910 IH= SGN (XH- XP):IF IH= 0 THEN RETURN 11920 SH= (YP- YH)/ (XP- XH) 11930 FOR HX= XP TO XH STEP IH 11935 IF INT (HX)= INT (XH) GOTO 11960 11940 HY= INT (YP+ SH* (HX- XP)) 11950 GOSUB 12000:REM POINT HORIZON 11960 NEXT HX 11970 RETURN 11980 12000 REM SUBROUTINE: POINT HORIZON (HX,HY) 12010 IF INT (HX)< = BW OR BE< = HX THEN RETURN 12020 IF HY< BS THEN HY= BS 12030 IF HY> BN THEN HY= BN 12040 IF HY< H(HX,2) THEN H(HX,2)= HY 12050 IF HY> H(HX,1) THEN H(HX,1)= HY 12060 RETURN 12070 12100 REM SUBROUTINE: COMMENCE EDGE? (XI,YI) 12110 PLOT 2,INT (XI),INT (YI),255 12120 IF F4 THEN HX= XV:HY= YV:GOSUB 12000:REM POINT HORIZON 12130 IF NOT F4 THEN GOSUB 11200 :REM "FIRST" 12140 RETURN 12150 12400 REM SUBROUTINE: FIND INTERSECT 12410 REM INPUT SEGMENT (XP,YP) TO (XD,YD) 12420 REM OUTPUT POINT (XI,YI) - A VISIBLE POINT 12430 IF XP< > XD GOTO 12460 12435 XI= XP 12440 IF YP= > BN OR YD= > BN THEN YI= BN- 1:RETURN 12450 IF INT (YP)< = BS OR INT (YD)< = BS THEN YI= BS+ 1:RETURN 12452 IF INT (YP)> H(XI,1)OR INT (YD)> H(XI,1)THEN YI= H(XI,1):RETURN 12454 YI= H(XI,2):RETURN 12460 SD= (YD- YP)/ (XD- XP):REM SLOPE OF LINE 12470 IF INT (XP)< = BW OR INT (XD)< = BW THEN XI= BW+ 1:YI= YP+ SD* (XI- XP):GOSUB 12560:RETURN 12480 IF XP= > BE OR XD= > BE THEN XI= BE- 1:YI= YP+ SD* (XI- XP):GOSUB 12560:RETURN 12482 IF INT (YP)< = BS OR INT (YD)< = BS THEN YI= BS+ 1:XI= XP+ (YI- YP)/ SD:RETURN 12484 IF YP= > BN OR YD= > BN THEN YI= BN- 1:XI= XP+ (YI- YP)/ SD:RETURN 12490 IS= SGN (XD- XP) 12500 FOR XT= XP TO XD+ IS STEP IS 12510 XI= XT:YI= YP+ SD* (XI- XP):GOSUB 12600:IF NOT (V1= V0) THEN XT= XD+ IS 12520 NEXT XT 12525 IF XI* IS> XD* IS THEN XI= XD 12530 IF F5 THEN YI= H(XI,1):RETURN 12540 YI= H(XI,2) 12550 RETURN 12555 12560 REM YI LIMIT 12570 IF INT (YI)< = BS THEN YI= BS+ 1:XI= XP+ (YI- YP)/ SD:RETURN 12580 IF YI= > BN THEN YI= BN- 1:XI= XP+ (YI- YP)/ SD:RETURN 12590 RETURN 12595 12600 REM SUBROUTINE: VIS/HID STATE OF (XI,YI) 12605 F3= 0 12610 IF INT (XI)< = BW OR BE< = XI THEN V0= 0:RETURN 12620 IF INT (YI)< = BS OR BN< = YI THEN V0= 0:F3= - 1:RETURN 12630 IF H(XI,1)< INT (YI) THEN PLOT 6,CN:V0= - 1:F5= - 1:RETURN 12640 IF YI< H(XI,2) THEN PLOT 6,CS:V0= - 1:F5= 0:RETURN 12650 V0= 0:REM HIDDEN BEHIND PLOT 12660 RETURN 12670 12700 REM SUBROUTINE: COMPUTE SEGMENT PARAMETERS 12710 D1= SQR ((XS- XP)* (XS- XP)+ (YS- YP)* (YS- YP)):IF D1< 1 THEN D1= 1 12720 DS= INT (1+ D1/ D0):IF DS> 128 THEN DS= 1 12730 DX= (XS- XP)/ DS 12740 DY= (YS- YP)/ DS 12750 RETURN 12760 25000 REM VIEWING OPTIONS 25010 M$= "I":GOTO 25030 25020 PLOT 3,0,29:PRINT :GOSUB 2400:REM AUTO INPUT 25030 M= ASC (M$):PLOT 30,16,29,22,15,3,0,31,11,3,0,30,11 25040 IF M= 73OR M= 81OR M= 82OR M= 83OR M= 84OR M= 90 GOTO 25060 25050 PRINT CHR$ (26)+ CHR$ (32)+ CHR$ (26):GOTO 25000 25060 IF M= 73 THEN GOSUB 25200:GOTO 25020:REM INSTRUCTIONS 25070 IF M= 81 THEN PLOT 12:END :REM QUIT 25080 IF M= 82 THEN GOSUB 9800:GOTO 25020:REM RESTORE TITLE 25090 IF M= 83 THEN GOSUB 25600:GOTO 25000:REM SAVE 25100 IF M= 84 THEN GOSUB 26000:GOTO 25020:REM TIMES 25110 IF M= 90 THEN GOSUB 26200:GOTO 25020:REM ZMIN/ZMAX 25120 RETURN 25130 25200 REM INSTRUCTIONS 25210 PRINT " I=THESE INSTRUCTIONS; Q=QUIT; R=RESTORE TITLE " 25220 PRINT " S=SAVE ON DISK; T=PLOTTING TIMES; Z=Z-EXTREMES "; 25230 RETURN 25240 25600 REM SAVE 25610 INPUT "INSERT YOUR STORAGE DISK. PRESS RETURN WHEN READY ";DUMMY 25620 PLOT 3,0,30,11:INPUT "ENTER .DSP FILE NAME YOU WANT THIS SAVED UNDER: ";M$ 25630 M$= LEFT$ (M$,6) 25640 PLOT 3,0,30,11:GOSUB 9800:REM RESTORE TITLE 25650 PLOT 27,4:PRINT "SAVE "+ M$+ ".DSP 7000 1000":PLOT 27,27 25660 RETURN 25670 26000 REM TIMES 26005 DP= 2:REM 2 DEC. PLAC. 26010 PRINT TAB( 16);" SCALING TIME=";FN RO(T1/ 60);" MINUTES" 26020 PRINT TAB( 16);" PLOTTING TIME=";FN RO(T2/ 60);" MINUTES"; 26030 RETURN 26040 26200 REM ZMIN/ZMAX 26210 PRINT TAB( 16);" MAXIMUM COMPUTED Z-VALUE=";ZU 26220 PRINT TAB( 16);" MINIMUM COMPUTED Z-VALUE=";ZL;""; 26230 RETURN 26240