Compucolor.org – Virtual Media

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