home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib27a.dsk / MARCH.1986 / NIBBLE.PLOTTER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  40KB  |  570 lines

  1. 10  REM  **********************
  2. 20  REM  *   NIBBLE.PLOTTER   *
  3. 30  REM  *  BY PAUL SANDORFF  *
  4. 40  REM  * COPYRIGHT (C) 1986 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA  01742 *
  7. 70  REM  **********************
  8. 80  HOME : VTAB 10: HTAB 14: PRINT "NIBBLE PLOTTER": PRINT : HTAB 13: PRINT "BY PAUL SANDORFF": PRINT : PRINT "** COPYRIGHT 1986 BY MICROSPARC, INC **": GOSUB 1420
  9. 90  DIM PC$(3,1):PC$(0,0) = "18 LINES/INCH":PC$(1,0) = "6 LINES/INCH":PC$(2,0) = "17 CHARS/INCH":PC$(3,0) = "10 CHARS/INCH":EX$ =  CHR$(27)
  10. 100  FOR I = 1 TO 8: READ M1$(I): NEXT : FOR I = 1 TO 5: READ M2$(I): NEXT : FOR I = 768 TO 863: READ J: POKE I,J: NEXT : FOR I = 864 TO 911: READ J: POKE I,J: NEXT 
  11. 110 SL = 1:C1 = 10:C2 = 2:DD = .001:DI = .5:CL =  LOG(10):D$ =  CHR$(4):AA$ = "":LS$ = "          ":LL$ = "--------------------": REM  CONSTANTS (10 SPACES/20 DASHES)
  12. 120 CU = 0:TB = 17:SX = 10:SY = 10:LG$ = "Y":GL$ = "Y":TL$ = "B": REM  DEFAULTS
  13. 130 EF = 1: ONERR  GOTO 1460
  14. 140  HOME : VTAB 12: PRINT "READING PRINTER CODES": PRINT D$"VERIFY PCODES"
  15. 150 EF = 2: ONERR  GOTO 1460
  16. 160  PRINT D$"OPEN PCODES": PRINT D$"READ PCODES": FOR I = 0 TO 3: GOSUB 5330:PC$(I,1) = PX$: NEXT : PRINT : PRINT D$"CLOSE"
  17. 170  HOME : VTAB 12: PRINT "DO YOU WANT TO CHANGE PRINTER CODES? N";: POKE  -16368,0: GET Z$: PRINT : ON Z$ < >"Y"  AND Z$ < > CHR$(121)  AND Z$ < >EX$ GOTO 5200: IF Z$ = EX$  THEN  PRINT  CHR$(7);: GOTO 170
  18. 180  FOR I = 0 TO 3:PP$ = PC$(I,0):PX$ = PC$(I,1): GOSUB 5420:PC$(I,1) = PX$: NEXT 
  19. 190 EF = 3: ONERR  GOTO 1460
  20. 200  HOME : VTAB 12: PRINT "SAVING NEW PRINTER CODES"
  21. 210  PRINT D$"OPEN PCODES": PRINT D$"CLOSE PCODES": PRINT D$"DELETE PCODES": PRINT D$"OPEN PCODES": PRINT D$"WRITE PCODES": FOR I = 0 TO 3:PX$ = PC$(I,1): GOSUB 5360: NEXT : PRINT : PRINT D$"CLOSE PCODES"
  22. 220  GOTO 170
  23. 230  REM 
  24. 240  REM  SUBROUTINES
  25. 250  REM 
  26. 260  REM  INPUT AND <ESC> SYSTEM
  27. 270  REM 
  28. 280 KB =  PEEK( -16384): POKE  -16368,0: IF KB < >155  THEN  RETURN 
  29. 290  GOTO 370
  30. 300 XF = 0: POKE  -16368,0: CALL 864,AA$:IN$ = AA$ +"": IF  PEEK(238) = 155 GOTO 370
  31. 310  IF  PEEK(253) < >0  THEN Z = 2: RETURN 
  32. 320  IF XF  THEN XF = 0:Z = 1: RETURN 
  33. 330  IF  PEEK(253) = 0  THEN Z = 3: RETURN 
  34. 340  POKE  -16368,0: FOR CH = 1 TO  LEN(IN$):AS =  ASC( MID$ (IN$,CH,1)): IF (AS <43)  OR (AS >57)  OR (AS = 47)  OR (AS = 44)  THEN Z = 1
  35. 350  NEXT CH: RETURN 
  36. 360 XF = 0: POKE  -16368,0: GET A$: PRINT A$: IF A$ < >EX$  THEN  RETURN 
  37. 370 XF = 1: POKE 253,0: RETURN 
  38. 380 XF = 0: ON EF GOTO 5200,150,190,1610,1700,1930,2030,2230,3790,3910,4210,4370,4970: GOTO 5200
  39. 390  GOTO 5200
  40. 400  REM 
  41. 410  REM  QUICKSORT ROUTINE
  42. 420  REM 
  43. 430 PT = 1:TP(PT) = N +1:BT = 1: REM  INITIALIZE PTR,TOP,AND BTTM OF ARRAY SEGMENT
  44. 440 J = TP(PT):I = BT -1: IF J -BT <3 GOTO 550
  45. 450 MD =  INT((I +J)/C2)
  46. 460 I = I +1: IF I = J GOTO 510
  47. 470  IF Y(KS(I),JS(I)) > = Y(KS(MD),JS(MD)) GOTO 460
  48. 480 J = J -1: IF I = J GOTO 510
  49. 490  IF Y(KS(J),JS(J)) < = Y(KS(MD),JS(MD)) GOTO 480
  50. 500 ST = KS(I):KS(I) = KS(J):KS(J) = ST:ST = JS(I):JS(I) = JS(J):JS(J) = ST:SW = SW +1: VTAB 8: HTAB 13: PRINT SW: GOTO 460
  51. 510  IF I > = MD  THEN I = I -1
  52. 520  IF J = MD GOTO 540
  53. 530 ST = KS(I):KS(I) = KS(MD):KS(MD) = ST:ST = JS(I):JS(I) = JS(MD):JS(MD) = ST:SW = SW +1: VTAB 8: HTAB 13: PRINT SW
  54. 540 PT = PT +1:TP(PT) = I: GOTO 440
  55. 550  IF J -BT <2 GOTO 580: REM  ONE AND TWO ELEMENT CASES
  56. 560  IF Y(KS(BT),JS(BT)) >Y(KS(BT +1),JS(BT +1)) GOTO 580
  57. 570 ST = KS(BT):KS(BT) = KS(BT +1):KS(BT +1) = ST:ST = JS(BT):JS(BT) = JS(BT +1):JS(BT +1) = ST:SW = SW +1: VTAB 8: HTAB 13: PRINT SW
  58. 580 BT = TP(PT) +1:PT = PT -1: IF PT >0 GOTO 440
  59. 590  RETURN 
  60. 600  REM 
  61. 610  REM  ASSEMBLE LINES & PRINT
  62. 620  REM 
  63. 630  FOR LN = 0 TO C1 *SY:YY = Y2 -LN *DY: GOSUB 280: ON   NOT XF GOTO 640:LN = C1 *SY: GOSUB 1160: GOSUB 1170: GOTO 910
  64. 640  IF  ABS(LN/C2 - INT(LN/C2)) >DD  THEN L$ = "          ! ": FOR I = 1 TO SX:L$ = L$ +LS$: NEXT I: GOTO 760: REM  ODD NUMBERED LINE (10 SPACES)
  65. 650 HT = (5 *SY - LEN(YC$)): IF (LN >HT)  AND (LN < = HT +C2 * LEN(YC$))  THEN L$ =  MID$ (YC$, INT((LN -HT +1)/C2),1) +"         !": GOTO 670: REM  -FRONT END WITH Y AXIS CAPTION (9 SPACES)
  66. 660 L$ = "          !": REM  -SAME,NO CHAR (10 SPACES)
  67. 670  IF LN/C1 - INT(LN/C1) >DD GOTO 710: REM  -BRANCH IF NOT 10TH LINE
  68. 680 SC$ = "      " + STR$( INT(100 *YY +DI)/100) +" !":L$ =  LEFT$(L$,3) + RIGHT$(SC$,8): REM  -INSERT Y SCALE (6 SPACES)
  69. 690  IF GL$ = "N"  OR GL$ =  CHR$(110) GOTO 730
  70. 700  FOR I = 1 TO SX:L$ = L$ +"--------- ": NEXT I:L$ = L$ +" ": GOTO 760: REM  9 DASHES
  71. 710  IF GL$ = "N"  OR GL$ =  CHR$(110) GOTO 750
  72. 720  FOR I = 1 TO SX:L$ = L$ +"         !": NEXT I:L$ = L$ +" ": GOTO 760: REM  -OTHER LINES BLANK (9 SPACES)
  73. 730  IF LN = 0  OR LN = C1 *SY  THEN  FOR I = 1 TO SX:L$ = L$ +"---------!": NEXT I:L$ = L$ +" ": GOTO 760: REM  9 DASHES
  74. 740 L$ = L$ +"-         ": FOR I = 1 TO SX -C2:L$ = L$ +LS$: NEXT :L$ = L$ +"        -! ": GOTO 760: REM  9/8 SPACES
  75. 750  FOR I = 1 TO SX -1:L$ = L$ +LS$: NEXT I:L$ = L$ +"         ! ": REM  9 SPACES
  76. 760  IF C$ = "N"  OR C$ =  CHR$(110) GOTO 820
  77. 770  IF CU = 1  THEN XV = (YY -AA)/BB:OS = DY/(C2 *BB): GOTO 810
  78. 780  IF CU = 2  THEN XV =  EXP((YY -AA) *CL/BB):OS = DY *XV *CL/(C2 *BB): GOTO 810
  79. 790  IF CU = 3  AND YY >0  THEN XV =  LOG(YY/AA)/BB:OS = DY/(C2 *BB *YY): GOTO 810
  80. 800  IF CU = 4  AND YY >0  THEN XV = (YY/AA) ^(1/BB):OS = DY *XV/(C2 *BB *YY)
  81. 810  IF (XV >X1  AND XV <X2)  OR (XV <X1  AND XV >X2)  THEN XP =  INT(DI +(XV -X1)/DX -OS/DX):L$ =  LEFT$(L$,XP +C1) + CHR$(46) + RIGHT$(L$,C1 *SX +1 -XP)
  82. 820  IF LG$ = "N"  OR LG$ =  CHR$(110) GOTO 860
  83. 830  IF LN = LY%  THEN L$ =  LEFT$(L$,LX% +C1) +L1$ + RIGHT$(L$,C1 *SX +C2 -LX% - LEN(L1$))
  84. 840  IF LN = LY% +3  THEN L$ =  LEFT$(L$,LX% +C1) +L2$ + RIGHT$(L$,C1 *SX +C2 -LX% - LEN(L2$))
  85. 850  IF LN = LY% +6  THEN L$ =  LEFT$(L$,LX% +C1) +L3$ + RIGHT$(L$,C1 *SX +C2 -LX% - LEN(L3$))
  86. 860 YL = YY -DI *DY: REM  LINE LOWER BOUNDARY
  87. 870  IF UU >TN  OR UU <1 GOTO 900: REM  LINES WITHOUT POINTS
  88. 880  IF  SGN(YL -Y(KS(UU),JS(UU))) =  SGN(DY) GOTO 900: REM  IF PT BELOW YL LINE IS DONE
  89. 890 XP =  INT(DI +(X(KS(UU),JS(UU)) -X1)/DX):L$ =  LEFT$(L$,XP +C1) +SY$(KS(UU)) + RIGHT$(L$,C1 *SX +1 -XP):UU = UU + SGN(DY): GOTO 870: REM  INSERT POINT & INC INDEX
  90. 900  PRINT  SPC( TB);L$;: REM  PRINT ASSEMBLED LINE NO LF
  91. 910  PRINT : NEXT LN: RETURN 
  92. 920  REM 
  93. 930  REM  AUTO SCALE ROUTINE
  94. 940  REM 
  95. 950 EX =  -3:COL = 1
  96. 960  IF COL *C1 ^EX > = MD GOTO 1000
  97. 970  IF COL = 1  THEN COL = 2: GOTO 960
  98. 980  IF COL = 2  THEN COL = 5: GOTO 960
  99. 990  IF COL = 5  THEN EX = EX +1:COL = 1: GOTO 960
  100. 1000 MD = COL *C1 ^EX: RETURN 
  101. 1010  IF Z2 < > INT(Z2/MD) *MD  THEN Z2 = ( INT(Z2/MD) +1) *MD
  102. 1020  RETURN 
  103. 1030  REM 
  104. 1040  REM  DUMMY LINE FOR MATH EVAL (135 COLONS AFTER EV=0 IN LINE 1060)
  105. 1050  REM 
  106. 1060 EV = 0:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  107. 1070 LOC =  PEEK(25) +256 * PEEK(26) +7: POKE LOC,48: FOR I = 1 TO  LEN(EQ$) -1: POKE LOC +I,58: NEXT : RETURN 
  108. 1080  REM 
  109. 1090  REM  PRINTER CONTROLS
  110. 1100  REM 
  111. 1110  PRINT : PRINT "ADJUST PAPER AND TURN ON PRINTER"
  112. 1120  PRINT : PRINT : PRINT "PRESS <RETURN> WHEN READY TO GO": PRINT : PRINT "OR <ESC> TO ESCAPE": GOSUB 360: IF XF  THEN  ON EF = 7 GOTO 2030: GOTO 5200
  113. 1130  PRINT D$"PR#"SL: RETURN : REM  TURN PRINTER ON, SCREEN OFF
  114. 1140  PRINT PC$(2,1): RETURN : REM   CODE FOR 17 CPI
  115. 1150  PRINT PC$(0,1): RETURN : REM  CODE FOR 18 LPI
  116. 1160  PRINT PC$(1,1): PRINT PC$(3,1): RETURN : REM  CODES FOR 10 CPI AND 6 LPI
  117. 1170  PRINT D$"PR#0": RETURN : REM  TURN PRINTER OFF, SCREEN ON
  118. 1180  REM 
  119. 1190  REM  FILES CONTROLS
  120. 1200  REM 
  121. 1210  PRINT D$;"OPEN";FI$: PRINT D$;"CLOSE";FI$
  122. 1220  PRINT D$;"DELETE";FI$
  123. 1230  PRINT D$;"OPEN ";FI$
  124. 1240  PRINT D$;"WRITE ";FI$: RETURN 
  125. 1250  PRINT D$;"VERIFY";FI$
  126. 1260  PRINT D$;"OPEN";FI$
  127. 1270  PRINT D$;"READ";FI$: RETURN 
  128. 1280  PRINT D$;"CLOSE";FI$: RETURN 
  129. 1290  REM 
  130. 1300  REM  DATA STATEMENTS
  131. 1310  REM 
  132. 1320  DATA  "TYPE IN X-Y DATA","ENTER MATHEMATICAL RELATION","READ X-Y DATA FROM DISK FILE","EDIT X-Y DATA, SAVE, PRINT LIST","FIT TWO-PARAMETER CURVE","ADD TO EXISTING LIST","PRINT GRAPH","CLEAR AND RERUN"
  133. 1330  DATA  "LINEAR REGRESSION   Y = A + B*X","LOG BASE 10 FIT     Y = A + B*LOG(X)","EXPONENTIAL FIT     Y = A + EXP(B*X)","POWER CURVE         Y = A + X^B","RETURN TO MAIN MENU": REM  5/5/9 SPACES
  134. 1340  DATA  32,190,222,32,227,223,165,184,133,29,165,185,133,30,160,2,177,131,133,28,136,177,131,133,27,136,177,131,168,169,0,153,0,2,136,177,27,153,0,2,192,0,208,246
  135. 1350  DATA  160,4,132,19,162,255,32,108,213,169,36,133,80,169,4,133,81,32,26,214,165,155,133,25,165,156,133,26,160,6,200,185,249,1,240,4,145,155,208,246,165,29,133,184,165,30,133,185,96,0,0,0
  136. 1360  DATA  32,190,222,32,227,223,162,0,134,238,32,12,253,133,238,201,155,240,25,162,0,32,120,253,134,253,32,57,213,165,253,136,145,131,169,0,200,145,131,169,2,200,145,131,96,0,0,0
  137. 1370  REM 
  138. 1380  REM  MENU OPERATIONS
  139. 1390  REM 
  140. 1400  PRINT : PRINT : PRINT : PRINT "PRESS <RETURN> FOR MAIN MENU: ";: GOSUB 360: GOTO 5200
  141. 1410  VTAB (C2 *MN +3): INVERSE : PRINT MN;: NORMAL : PRINT "  ";: RETURN 
  142. 1420  VTAB 23: HTAB 6: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT Z$: RETURN 
  143. 1430  REM 
  144. 1440  REM  ONERR MESSAGE
  145. 1450  REM 
  146. 1460  CALL  -3288:ER =  PEEK(222):EL =  PEEK(218) +256 * PEEK(219): GOSUB 1160: GOSUB 1170
  147. 1470  IF EF = 1  AND ER = 6 GOTO 180: REM  PRINTER FILE NOT FOUND
  148. 1480  IF ER = 4  THEN EM$ = "WRITE PROTECTED": GOTO 1550
  149. 1490  IF ER = 6  THEN EM$ = "FILE NOT FOUND": GOTO 1550
  150. 1500  IF ER = 9  THEN EM$ = "DISK FULL": GOTO 1550
  151. 1510  IF ER = 8  THEN EM$ = "I/O ERROR--CHECK DRIVE DOOR": GOTO 1550
  152. 1520  IF ER = 10  THEN EM$ = "FILE LOCKED": GOTO 1550
  153. 1530  IF EF = 10  THEN  HOME : VTAB 12: PRINT "ERROR IN FORMULA OR CHOSEN RANGE.": PRINT "PRESS <RETURN> TO RESTART PROGRAM";: GET Z$: PRINT : RUN 90
  154. 1540 EM$ = "ERROR " + STR$(ER) +" IN LINE " + STR$(EL)
  155. 1550  IF EF = 11  OR EF = 13  THEN  HOME : VTAB 12: PRINT EM$: VTAB 18: PRINT "PRESS <RETURN> TO CLEAR VARIABLES": PRINT " AND RESTART NIBBLE PLOTTER";: GET Z$: PRINT : RUN 90
  156. 1560  HOME : VTAB 12: PRINT EM$: VTAB 18: PRINT "PRESS <RETURN> TO TRY AGAIN": PRINT " OR <ESC> FOR MAIN MENU";: GET Z$: PRINT : IF Z$ = EX$ GOTO 5200
  157. 1570  ON EF GOTO 130,150,190,1610,1700,1930,2030,2230,3670,3910,4210,4370,4990: GOTO 5200
  158. 1580  REM 
  159. 1590  REM  REVIEW X-Y DATA,SAVE
  160. 1600  REM 
  161. 1610 EF = 4: ONERR  GOTO 1460
  162. 1620  HOME : IF NS = 0  THEN  PRINT "NO DATA IN MEMORY": GOSUB 1420: GOTO 5200
  163. 1630 M3$(1) = "EDIT X-Y DATA":M3$(2) = "SAVE TO DISK":M3$(3) = "PRINT OUT X-Y LISTS":M3$(4) = "RETURN TO MAIN MENU"
  164. 1640  HOME : PRINT "THESE OPERATIONS CAN BE PERFORMED:": FOR MN = 1 TO 4: GOSUB 1410: PRINT M3$(MN): NEXT MN
  165. 1650  VTAB 18: PRINT "NUMBER OF YOUR SELECTION ? ";: GET M$: PRINT M$: IF M$ = EX$ GOTO 5200
  166. 1660 MS =  VAL(M$): ON MS GOTO 1700,1930,2030,5200: GOTO 1610
  167. 1670  REM 
  168. 1680  REM  EDIT
  169. 1690  REM 
  170. 1700 K = 0:EF = 5
  171. 1710 K = K +1:I = 0
  172. 1720 I = 0: HOME : PRINT "THESE ARE ENTRIES FOR SET ";K
  173. 1730 I = I +1:N2 = I *20:N1 = N2 -19: IF NP(K) <N2  THEN N2 = NP(K)
  174. 1740 J = N1 -1: VTAB 4
  175. 1750 J = J +1: PRINT J; TAB( 05)X(K,J); TAB( 20)Y(K,J): IF J <N2 GOTO 1750
  176. 1760  VTAB 2: CALL  -868: PRINT "VERIFY - ARE THEY OK?   Y/N ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N"  AND A$ < > CHR$(110) GOTO 1850
  177. 1770 ZF = 1: GOSUB 5380:SV = 1: VTAB 2: CALL  -868: PRINT "ACCEPT OR REVISE AS REQUIRED:":J = N1 -1
  178. 1780 J = J +1
  179. 1790  VTAB (J +23 -20 *I): PRINT J; TAB( 5)X(K,J); TAB( 20)Y(K,J);: HTAB (5): GOSUB 300: ON XF GOTO 1720: GOSUB 320: ON Z GOTO 1790,1800,1810
  180. 1800 X(K,J) =  VAL(IN$)
  181. 1810  VTAB (J +23 -20 *I): HTAB 5: PRINT X(K,J); TAB( 20)Y(K,J);: HTAB (20): GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 1810,1820,1830
  182. 1820 Y(K,J) =  VAL(IN$)
  183. 1830  VTAB (J +23 -20 *I): HTAB 20: PRINT Y(K,J)
  184. 1840  IF J <N2 GOTO 1780
  185. 1850  VTAB 2: CALL  -958: IF I < INT(NP(K)/20 +.999) GOTO 1730
  186. 1860  IF K <NS GOTO 1710
  187. 1870  HOME : PRINT "WANT TO REVIEW AGAIN ? Y/N ";: GOSUB 360: ON XF GOTO 380: IF A$ < >"N"  AND A$ < > CHR$(110) GOTO 1700
  188. 1880  IF NA < >0 GOTO 5200: REM  NA FLAGS FILE INPUT
  189. 1890  GOTO 1630
  190. 1900  REM 
  191. 1910  REM  SAVE TO DISK
  192. 1920  REM 
  193. 1930 EF = 6:FI$ = "": HOME : PRINT "UNDER WHAT FILE NAME IS THE DATA TO BE"; SPC( 42);"SAVED ?     WARNING - EXISTING FILE OF"; SPC( 14);"SAME NAME WILL BE ERASED": VTAB 7: PRINT  TAB( 3)"? ";FI$;: HTAB 5: GOSUB 300: ON XF GOTO 1610: IF Z = 3  AND  LEN(FI$) >0 GOTO 1950
  194. 1940 FI$ = IN$: IF FI$ = "" GOTO 1930
  195. 1950  VTAB 7: PRINT  TAB( 5)FI$: GOSUB 1210
  196. 1960  PRINT NS: FOR K = 1 TO NS: PRINT NP(K): NEXT 
  197. 1970  FOR K = 1 TO NS: FOR J = 1 TO NP(K): PRINT X(K,J): PRINT Y(K,J): NEXT J: NEXT K
  198. 1980  GOSUB 1280:SV = 0
  199. 1990  GOTO 1640
  200. 2000  REM 
  201. 2010  REM  PRINT OUT X-Y LISTING
  202. 2020  REM 
  203. 2030 EF = 7: HOME : PRINT "TITLE FOR THE TABLES WILL BE - ?": VTAB 5: HTAB 5: PRINT FI$: VTAB 5: HTAB 5: GOSUB 300: ON XF GOTO 1610: IF Z = 3 GOTO 2050
  204. 2040 FI$ = IN$
  205. 2050  VTAB 5: HTAB 5: PRINT FI$: GOSUB 1110
  206. 2060  GOSUB 1140: REM  SET 17 CPI
  207. 2070  PRINT  TAB( 30)FI$: PRINT 
  208. 2080  FOR K = 1 TO NS:J1 = 0:J2 = 0
  209. 2090  PRINT  TAB( 20)" " SPC( 9)"SET NO.";K;
  210. 2100  IF NS >K  THEN  PRINT  SPC( 50)"SET NO.";K +1;
  211. 2110  PRINT : PRINT : PRINT  TAB( 10);"NO." SPC( 12)"X" SPC( 19)"Y";
  212. 2120  IF NS >K  THEN  PRINT  SPC( 14)"NO." SPC( 12)"X" SPC( 19)"Y";
  213. 2130  PRINT 
  214. 2140 Z = 0: IF NS >K  THEN Z = NP(K +1)
  215. 2150  PRINT : IF J1 = NP(K)  AND NS >K  AND J2 <Z  THEN J2 = J2 +1: PRINT  SPC( 50)J2; SPC( 10 - LEN( STR$(J2)));X(K +1,J2) SPC( 20 - LEN( STR$(X(K +1,J2))));Y(K +1,J2);
  216. 2160  IF J1 <NP(K)  THEN J1 = J1 +1: PRINT  SPC( 10);J1; SPC( 10 - LEN( STR$(J1)));X(K,J1) SPC( 20 - LEN( STR$(X(K,J1))));Y(K,J1);: IF NS >K  AND J2 <Z  THEN J2 = J2 +1: PRINT  SPC( 20 - LEN( STR$(Y(K,J1))));J2; SPC( 10 - LEN( STR$(J2)));X(K +1,J2); SPC( 20 - LEN( STR$(X(K +1,J2))));Y(K +1,J2);
  217. 2170  GOSUB 280: ON XF GOTO 2190: IF J1 <NP(K)  OR J2 <Z GOTO 2140
  218. 2180  IF K <NS  THEN K = K +1
  219. 2190  PRINT : PRINT :K = NS *XF +K *(XF = 0): NEXT K
  220. 2200  GOSUB 1160: GOSUB 1170: GOTO 5200
  221. 2210  REM 
  222. 2220  REM  INITIALIZE PLOTTER
  223. 2230 EF = 8: ONERR  GOTO 1460
  224. 2240  IF TN  AND ZF  AND (NS >1)  THEN  HOME : VTAB 12: PRINT "IF YOU WANT TO CHANGE DATA SET": PRINT "SELECTION, YOU MUST CLEAR AND RERUN.": VTAB 22: PRINT "PRESS <RETURN> TO CONTINUE": PRINT " OR <ESC> FOR MAIN MENU": GET Z$: PRINT : ON Z$ = EX$ GOTO 5200: GOTO 2410
  225. 2250  HOME : IF NS = 0  THEN  PRINT "NO DATA IN MEMORY": GOSUB 1420: GOTO 5200
  226. 2260 D3 = D3 +1: IF D3 = 1  THEN  DIM KK(NS),SY$(NS)
  227. 2270  IF CU < >0  THEN  PRINT "SHOW THE CURVE FIT ON THE PLOT ? Y/N ";: GET C$: PRINT C$: IF C$ =  CHR$(27) GOTO 5200: REM  CU AND C$ FLAG CURVE FIT ANALYSIS
  228. 2280  IF C$ = "Y"  OR C$ =  CHR$(121)  THEN NK = 1:KK(1) = SN: GOTO 2410
  229. 2290  IF NS = 1  THEN NK = 1:KK(1) = 1: GOTO 2410
  230. 2300 D5 = D5 +1: PRINT "THERE ARE ";NS;" SETS OF X-Y POINTS IN       MEMORY. WANT ALL ON THIS GRAPH ? (Y/N):";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N"  AND A$ < > CHR$(110)  THEN NK = NS: FOR I = 1 TO NK:KK(I) = I: NEXT : GOTO 2410: REM  7 SPACES
  231. 2310  PRINT : PRINT "IDENTIFY (BY NUMBER) THE DATA SET(S) TO BE PLOTTED.": PRINT : PRINT :CV =  PEEK(37) +1
  232. 2320 NK = 0: FOR I = 1 TO NS:KK(I) = 0: NEXT :I = 1: REM  RESET IN CASE <ESC> AND REPEAT
  233. 2330  VTAB CV: PRINT "SELECTION NO.";I;" IS SET NO. "; TAB( 34)KK(I);: HTAB 34: GOSUB 300: ON XF GOTO 2250: GOSUB 320: ON Z GOTO 2330,2340,2350
  234. 2340 KK(I) =  VAL(IN$): VTAB CV +C2: CALL  -868
  235. 2350  IF KK(I) <1  OR KK(I) >NS  THEN  VTAB CV +C2: PRINT "NO.";KK(I);" NOT IN MEMORY.   ": GOTO 2390
  236. 2360  FOR J = 0 TO I -1: IF KK(I) = KK(J)  THEN  VTAB CV +C2: PRINT "NO.";KK(I);" ALREADY ENTERED. ":J = I -1: GOTO 2390
  237. 2370  NEXT J:NK = I:I = I +1:CV = CV +1: IF CV = 20  THEN  VTAB 24: PRINT :CV = CV -1
  238. 2380  IF I >NS  THEN  VTAB CV +C2: PRINT "THAT'S ALL THERE ARE IN MEMORY": GOSUB 1420: GOTO 2410
  239. 2390  VTAB CV +3: HTAB 5: PRINT "ANY OTHER ? Y/N (N IF NONE): ";: GOSUB 360: ON XF GOTO 2250: IF A$ < >"N"  AND A$ > < CHR$(110)  THEN  VTAB CV +3: CALL  -868: GOTO 2330
  240. 2400  VTAB CV +5: PRINT "CONFIRM - OK? Y/N (N TO REPEAT) ";: GOSUB 360: ON XF GOTO 2250: IF A$ = "N"  THEN  VTAB CV +5: CALL  -868: HOME : GOTO 2300
  241. 2410  TEXT : HOME :I = 0
  242. 2420 I = I +1:CV = I: IF CV >22  THEN CV = 22
  243. 2430  VTAB CV: PRINT "WHAT SYMBOL FOR SET NO.";KK(I);" ? "; TAB( 31)SY$(KK(I)): VTAB CV: HTAB 31: GOSUB 300: ON XF GOTO 5200: IF Z = 3 GOTO 2450
  244. 2440 SY$(KK(I)) = IN$
  245. 2450  VTAB CV: HTAB 31: PRINT SY$(KK(I)): IF  LEN(SY$(KK(I))) >1  THEN  VTAB CV +1: PRINT "MUST BE ONE CHAR": GOTO 2430
  246. 2460  IF I <NK GOTO 2420
  247. 2470  PRINT : PRINT : PRINT "SYMBOL SELECTION OK ? CONFIRM (Y/N) ";: GOSUB 360: ON XF GOTO 2410: IF A$ = "N"  OR A$ =  CHR$(110) GOTO 2410
  248. 2480  HOME : PRINT "THESE DEFAULT CONDITIONS ARE IN EFFECT:": VTAB 4: PRINT  TAB( 3)"PROVIDE FOR INSIDE LEGEND           ";LG$: REM  11 SPACES
  249. 2490  VTAB 7: PRINT  TAB( 3)"INCLUDE GRID LINES                  ";GL$: VTAB 10: PRINT  TAB( 3)"NUMBER OF MAJOR DIVISIONS  HORIZ:"; TAB( 38);SX: PRINT  TAB( 30)" VERT:"; TAB( 38);SY: REM  18/4 SPACES
  250. 2500  VTAB 14: PRINT  TAB( 3)"LEFT HAND MARGIN "; INT(DI +TB/1.71)/C1;" INCH (CHARS)"; TAB( 38);TB
  251. 2510  VTAB 20: CALL  -868: PRINT "ACCEPT DEFAULTS ? (Y/N) ";: GOSUB 360: ON XF GOTO 2480: IF A$ < >"N"  AND A$ < > CHR$(110) GOTO 2670
  252. 2520  VTAB 20: PRINT "REVISE VALUES (OR PRESS RETN TO KEEP)": VTAB 4: HTAB 39: GOSUB 300: ON XF GOTO 2480: IF Z = 3 GOTO 2540
  253. 2530 LG$ = IN$: IF (LG$ < >"Y"  AND LG$ < >"N"  AND LG$ < > CHR$(121)  AND LG$ < > CHR$(110)) GOTO 2520
  254. 2540  VTAB 4: HTAB 39: PRINT LG$: VTAB 7: HTAB 39: GOSUB 300: ON XF GOTO 2480: IF Z = 3 GOTO 2560
  255. 2550 GL$ = IN$: IF (GL$ < >"Y"  AND GL$ < >"N"  AND GL$ < > CHR$(110)  AND GL$ < > CHR$(121)) GOTO 2540
  256. 2560  VTAB 7: HTAB 39: PRINT GL$: VTAB 10: HTAB 38: PRINT SX;: HTAB 38: GOSUB 300: ON XF GOTO 2480: GOSUB 320: ON Z GOTO 2560,2570,2580
  257. 2570 SX =  VAL(IN$)
  258. 2580  VTAB 10: HTAB 38: PRINT SX: VTAB 11: HTAB 38: PRINT SY;: HTAB 38: GOSUB 300: ON XF GOTO 2480: GOSUB 320: ON Z GOTO 2580,2590,2600
  259. 2590 SY =  VAL(IN$)
  260. 2600  VTAB 11: HTAB 38: PRINT SY: VTAB 14: HTAB 38: PRINT TB;: HTAB 38: GOSUB 300: ON XF GOTO 2480: GOSUB 320: ON Z GOTO 2600,2610,2620
  261. 2610 TB =  VAL(IN$)
  262. 2620  VTAB 14: HTAB 38: PRINT TB:W% = (TB +15 +C1 *SX)/1.71: IF W% >85  THEN  VTAB 20: CALL  -868: PRINT "WIDTH EXCEEDS NORMAL-OK ? Y/N:";: GOSUB 360: ON XF GOTO 2480: IF A$ = "N"  OR A$ =  CHR$(110)  THEN  VTAB 20: CALL  -868: PRINT "REVISE HORIZ DIVISIONS OR LEFT MARGIN": GOTO 2560
  263. 2630  GOTO 2480
  264. 2640  REM 
  265. 2650  REM  RANGES AND SCALES
  266. 2660  REM 
  267. 2670  IF TN  AND   NOT ZF GOTO 2770
  268. 2680  PRINT : PRINT "DETERMINING RANGES -":XA = X(KK(1),1):XB = XA:YA = Y(KK(1),1):YB = YA: FOR I = 1 TO NK: FOR J = 1 TO NP(KK(I)): IF XA >X(KK(I),J)  THEN XA = X(KK(I),J)
  269. 2690  IF XB <X(KK(I),J)  THEN XB = X(KK(I),J)
  270. 2700  IF YA >Y(KK(I),J)  THEN YA = Y(KK(I),J)
  271. 2710  IF YB <Y(KK(I),J)  THEN YB = Y(KK(I),J)
  272. 2720  NEXT J: NEXT I
  273. 2730  PRINT "SELECTING SCALES -":MD = (XB -XA)/SX: GOSUB 950:Z2 = XB: GOSUB 1010:X2 = Z2: IF X2 -XA <(SX -1) *MD  THEN X2 = X2 +MD
  274. 2740 X1 = X2 -SX *MD
  275. 2750 MD = (YB -YA)/SY: GOSUB 950:Z2 = YB: GOSUB 1010:Y2 = Z2: IF Y2 -YA <(SY -1) *MD  THEN Y2 = Y2 +MD
  276. 2760 Y1 = Y2 -SY *MD
  277. 2770  HOME : VTAB 2: PRINT "  Y2=";Y2: FOR J = 3 TO 9: VTAB J: HTAB 12: PRINT "!": NEXT : VTAB 9: PRINT "  Y1=";Y1; TAB( 12)LL$: VTAB 10: HTAB 12: PRINT "X1"; TAB( 31)"X2": VTAB 11: HTAB 12: PRINT X1; TAB( 31)X2
  278. 2780  VTAB 17: PRINT "ARE THESE RANGES OK? Y/N (N TO REVISE):";: GOSUB 360: ON XF GOTO 2770: IF A$ < >"N"  AND A$ < > CHR$(110) GOTO 2900
  279. 2790  VTAB 18: PRINT "REVISE AS REQD (OR HIT RETN TO ACCEPT)  ": VTAB 11: HTAB 12: PRINT X1;: HTAB 12: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2790,2800,2810
  280. 2800 X1 =  VAL(IN$)
  281. 2810  VTAB 11: HTAB 12: PRINT X1; TAB( 31)X2;: HTAB 31: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2810,2820,2830
  282. 2820 X2 =  VAL(IN$)
  283. 2830  VTAB 11: HTAB 31: PRINT X2: IF X1 <X2  AND (X2 <XB  OR X1 >XA)  OR X1 >X2  AND (X1 <XB  OR X2 >XA)  THEN  VTAB 18: CALL  -868: VTAB 17: PRINT "RANGE OF X DOES NOT INCLUDE ALL POINTS. IS THAT OK ? Y/N: ";: GOSUB 360: ON XF GOTO 2770: IF A$ = "N" GOTO 2790
  284. 2840  VTAB 17: CALL  -868: VTAB 18: PRINT "REVISE Y1,Y2 (OR HIT RETN TO ACCEPT)    ": VTAB 9: HTAB 6: PRINT Y1; TAB( 12)LL$;: HTAB 6: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2840,2850,2860
  285. 2850 Y1 =  VAL(IN$)
  286. 2860  VTAB 9: HTAB 6: PRINT Y1; TAB( 12)LL$: VTAB 2: HTAB 6: PRINT Y2;: HTAB 6: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2860,2870,2880
  287. 2870 Y2 =  VAL(IN$)
  288. 2880  VTAB 2: HTAB 6: PRINT Y2: IF Y1 <Y2  AND (Y2 <YB  OR Y1 >YA)  OR Y1 >Y2  AND (Y1 <YB  OR Y2 >YA)  THEN  VTAB 18: CALL  -868: VTAB 17: PRINT "RANGE OF Y DOES NOT INCLUDE ALL POINTS. IS THAT OK ? Y/N: ";: GOSUB 360: ON XF GOTO 2770: IF A$ = "N" GOTO 2840
  289. 2890  VTAB 17: CALL  -868: PRINT : PRINT "VERIFY - OK ?    Y/N  (N TO REVISE):  ";: GOSUB 360: ON XF GOTO 2770: IF A$ = "N"  THEN  VTAB 18: CALL  -868: GOTO 2790
  290. 2900 DX = (X2 -X1)/(C1 *SX):DY = (Y2 -Y1)/(C1 *SY)
  291. 2910  REM 
  292. 2920  REM  TITLES AND LABELS
  293. 2930  REM 
  294. 2940  HOME : PRINT "WANT TITLE OF PLOT   ABOVE PLOT ? (A)"; SPC( 24);"BELOW ?      (B)"; SPC( 24);"NOT AT ALL ? (N) ";TL$: VTAB 3: HTAB 39: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 2960: REM  3/6 SPACES
  295. 2950 TL$ = IN$: IF (TL$ < >"A"  AND TL$ < >"B"  AND TL$ < >"N") GOTO 2940
  296. 2960  VTAB 3: HTAB 39: PRINT TL$: IF TL$ = "N" GOTO 3050
  297. 2970  HOME :TL% = (C1 *SX)/1.71: PRINT "ENTER PLOT TITLE  (OR <RTN> FOR BLANK)": PRINT "TWO LINES - MAX ";TL%;" CHARS/LINE"
  298. 2980  VTAB 4: PRINT "LINE 1: ";T1$: VTAB 4: HTAB 9: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 3000
  299. 2990 T1$ = IN$
  300. 3000  VTAB 4: HTAB 9: PRINT T1$: IF  LEN(T1$) >TL%  THEN  PRINT  CHR$(7): GOTO 2980
  301. 3010  VTAB 7: CALL  -868: PRINT "LINE 2: ";T2$: VTAB 7: HTAB 9: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 3030
  302. 3020 T2$ = IN$
  303. 3030  VTAB 7: HTAB 9: PRINT T2$: IF  LEN(T2$) >TL%  THEN  PRINT  CHR$(7): GOTO 3010
  304. 3040  VTAB 10: CALL  -868: PRINT "CONFIRM: TITLE OK ?  Y/N: ";: GOSUB 360: ON XF GOTO 2940: IF A$ = "N" GOTO 2980
  305. 3050  VTAB 10: CALL  -958: VTAB 10: PRINT "ENTER X-AXIS LABEL (";C1 *SX;" CHARS MAX):": VTAB 12: HTAB 3: PRINT XC$: VTAB 12: HTAB 3: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 3070
  306. 3060 XC$ = IN$
  307. 3070  VTAB 12: HTAB 3: PRINT XC$: IF  LEN(XC$) >C1 *SX  THEN  PRINT  CHR$(7): GOTO 3050
  308. 3080  VTAB 15: PRINT "LABEL OK ?   Y/N (N TO REVISE): ";: GOSUB 360: ON XF GOTO 2940: IF A$ = "N" GOTO 3050
  309. 3090  VTAB 15: PRINT "ENTER Y-AXIS LABEL (";5 *SY;" CHARS MAX):": VTAB 18: HTAB 3: PRINT YC$: VTAB 18: HTAB 3: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 3110
  310. 3100 YC$ = IN$
  311. 3110  VTAB 18: HTAB 3: PRINT YC$: IF  LEN(YC$) >5 *SY  THEN  PRINT  CHR$(7): GOTO 3090
  312. 3120  VTAB 21: PRINT "CONFIRM: LABEL OK ?  Y/N: ";: GOSUB 360: ON XF GOTO 2940: IF A$ = "N" GOTO 3090
  313. 3130  REM 
  314. 3140  REM  LEGEND INSIDE GRID
  315. 3150  REM 
  316. 3160  IF LG$ = "N" GOTO 3380
  317. 3170 LG$ = "Y": HOME : PRINT "THE THREE LINES OF LEGEND TO GO INSIDE  GRID BOUNDARY ARE:": VTAB 5: HTAB 3: PRINT "LINE 1 = ";L1$: VTAB 8: HTAB 3: PRINT "LINE 2 = ";L2$: VTAB 11: HTAB 3: PRINT "LINE 3 = ";L3$: IF CU < >0 GOTO 3250
  318. 3180  VTAB 15: PRINT "ENTER DESIRED LEGEND (RETN FOR BLANK)": VTAB 5: HTAB 12: GOSUB 300: ON XF GOTO 3160: IF Z = 3 GOTO 3200
  319. 3190 L1$ = IN$
  320. 3200  VTAB 5: HTAB 12: PRINT L1$: VTAB 8: HTAB 12: GOSUB 300: ON XF GOTO 3160: IF Z = 3 GOTO 3220
  321. 3210 L2$ = IN$
  322. 3220  VTAB 8: HTAB 12: PRINT L2$: VTAB 11: HTAB 12: GOSUB 300: ON XF GOTO 3160: IF Z = 3 GOTO 3240
  323. 3230 L3$ = IN$
  324. 3240  VTAB 11: HTAB 12: PRINT L3$: IF L1$ = ""  AND L2$ = ""  AND L3$ = "" GOTO 3380
  325. 3250  VTAB 15: CALL  -868: PRINT "PLACE LEGEND AT WHAT X,Y VALUE ? ": VTAB 17: PRINT "  FIRST CHAR AT X = ";LX;: HTAB 21: GOSUB 300: ON XF GOTO 3160: GOSUB 320: ON Z GOTO 3250,3260,3270
  326. 3260 LX =  VAL(IN$)
  327. 3270  VTAB 17: HTAB 21: PRINT LX:LX% = DI +(LX -X1)/DX
  328. 3280  IF LX% <0  OR LX% + LEN(L1$) >C1 *SX  OR LX% + LEN(L2$) >C1 *SX  OR LX% + LEN(L3$) >C1 *SX  THEN  VTAB 21: PRINT "LEGEND MUST BE PLACED BETWEEN X= ";X1: PRINT "AND X= ";X2;". REVISE LEGEND - OR LOCATION": GOTO 3180
  329. 3290  VTAB 21: CALL  -958
  330. 3300  VTAB 19: PRINT "  FIRST LINE AT Y = ";LY;: HTAB 21: GOSUB 300: ON XF GOTO 3160: GOSUB 320: ON Z GOTO 3300,3310,3320
  331. 3310 LY =  VAL(IN$)
  332. 3320  VTAB 19: HTAB 21: PRINT LY:LY% = DI +(Y2 -LY)/DY
  333. 3330  IF LY% <0  OR LY% +6 >C1 *SY  THEN  VTAB 21: PRINT "LEGEND MUST BE PLACED BETWEEN Y = ";Y1 +6 *DY: PRINT "AND Y = ";Y2;". REVISE LOCATION": GOTO 3300
  334. 3340  VTAB 21: CALL  -958: PRINT "CONFIRM - LEGEND OK ? Y/N: ";: GOSUB 360: ON XF GOTO 3160: IF A$ = "N"  OR A$ =  CHR$(110) GOTO 3180
  335. 3350  REM 
  336. 3360  REM  SORT OF A QUICKSORT
  337. 3370  REM 
  338. 3380  HOME : IF TN = 0  THEN  FOR I = 1 TO NK:TN = TN +NP(KK(I)): NEXT : DIM KS(TN +1),JS(TN +1),TP(TN +1):ZF = 1
  339. 3390  ON   NOT ZF GOTO 3450:SW = 0: VTAB 6: PRINT "SORTING POINTS": VTAB 8: PRINT "NUM SWAPS = ";SW
  340. 3400 N = 0: FOR I = 1 TO NK: FOR J = 1 TO NP(KK(I)):N = N +1:KS(N) = KK(I):JS(N) = J: NEXT : NEXT : REM  FORM 1-D ARRAY OF SUBSCRIPTS
  341. 3410  GOSUB 430:ZF = 0
  342. 3420  REM 
  343. 3430  REM  START PLOT
  344. 3440  REM 
  345. 3450 UU = 1: IF DY <0  THEN UU = TN: REM  START HI OR LO
  346. 3460  IF  SGN(Y(KS(UU),JS(UU)) -Y2 -DI *DY) =  SGN(DY)  THEN UU = UU + SGN(DY): GOTO 3460: REM  DROP POINTS THAT EXCEED Y2
  347. 3470  HOME : PRINT "READY TO PLOT ?": GOSUB 1110
  348. 3480  IF TL$ = "A"  THEN  PRINT  SPC( TB/1.7 +6 +TL%/C2 - LEN(T1$)/C2);T1$: PRINT  SPC( TB/1.7 +6 +TL%/C2 - LEN(T2$)/C2);T2$
  349. 3490  GOSUB 1140: REM  SET 17 CPI
  350. 3500  GOSUB 1150: REM  SET 18 LPI
  351. 3510  GOSUB 630: REM  PLOTTING S/R
  352. 3520  REM 
  353. 3530  REM  X SCALE AND LABEL
  354. 3540  REM 
  355. 3550  PRINT : PRINT :L$ = LS$: FOR I = 0 TO SX
  356. 3560 XS =  INT(100 *(X1 +DD +I *(X2 -X1)/SX))/100
  357. 3570 XS$ =  STR$(XS)
  358. 3580 L$ =  LEFT$(L$,11 +C1 *I - LEN(XS$)/C2) +XS$ +"         ": REM  9 SPACES
  359. 3590  NEXT I: PRINT  SPC( TB);L$
  360. 3600  PRINT : PRINT : PRINT : PRINT 
  361. 3610  PRINT  SPC( TB +11 +5 *SX - LEN(XC$)/C2);XC$: GOSUB 1160: REM  PRINTER TO NORMAL MODE
  362. 3620  IF TL$ = "B"  THEN  PRINT  SPC( TB/1.7 +4 +TL%/C2 - LEN(T1$)/C2);T1$: PRINT  SPC( TB/1.7 +4 +TL%/C2 - LEN(T2$)/C2);T2$
  363. 3630  GOSUB 1170: GOTO 5200: REM  TURN OFF PRINTER AND RETURN TO MAIN MENU
  364. 3640  REM 
  365. 3650  REM  MANUAL DATA INPUT
  366. 3660  REM 
  367. 3670 EF = 9: ONERR  GOTO 1460
  368. 3680  HOME : IF NS < >0  THEN  PRINT "FINISHED WITH THE DATA NOW IN MEMORY ?": PRINT : PRINT "IF SO, RERUN PROGRAM TO CLEAR VARIABLES": GOTO 1400
  369. 3690 SV = 1:K = 0:NS = 1: VTAB 5: HTAB 1: PRINT "ENTER NUM DIFFERENT SETS OF X-Y DATA:";NS;: HTAB 38: GOSUB 300: GOSUB 320: ON Z +1 GOTO 3690,3690,3700,3710
  370. 3700 NS =  VAL(IN$): IF NS <1  THEN  PRINT  CHR$(7);: GOTO 3690
  371. 3710 D1 = D1 +1: IF D1 = 1  THEN  DIM NP(NS):PP = 1
  372. 3720  VTAB 5: HTAB 38: PRINT NS:K = K +1:CV = 7 +K:NP(K) = NP(K) +(NP(K) = 0): IF CV >23  THEN  PRINT :CV = 23
  373. 3730  VTAB CV: HTAB 1: PRINT "ENTER NUM OF X-Y POINTS IN SET NO.";K; TAB( 38)NP(K);: HTAB 38: GOSUB 300: GOSUB 320: ON Z GOTO 3730,3740,3740
  374. 3740 NP(K) =  VAL(IN$): IF NP(K) >PP  THEN PP = NP(K)
  375. 3750  VTAB CV: HTAB 38: PRINT NP(K): IF K <NS GOTO 3720
  376. 3760 D2 = D2 +1: IF D2 = 1  THEN  DIM X(NS,PP),Y(NS,PP)
  377. 3770 K = 0
  378. 3780 K = K +1: HOME : PRINT "ENTER X,Y PAIRS OF SET NO. ";K: PRINT : PRINT "PLOTTER WILL ACCEPT ANY SEQUENCE. PLOT- TING PRECISION IS 2 DIGITS. DON'T STOP  FOR ERRORS - USE EDIT TO CORRECT LATER": POKE 34,6
  379. 3790  VTAB 6: HTAB 1: CALL  -958:J = 0: GOSUB 5380
  380. 3800 J = J +1:X(K,J) = X(1,J):CV = 6 +J: IF CV >23  THEN  PRINT :CV = 23
  381. 3810  VTAB CV: HTAB 1: PRINT "X";J;"="; TAB( 04)X(K,J);: HTAB 4 +(J >9) +(J >99): GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 3810,3820,3830
  382. 3820 X(K,J) =  VAL(IN$)
  383. 3830  VTAB CV: HTAB 4 +(J >9) +(J >99): PRINT X(K,J); TAB( 20)"Y";J;"="; TAB( 23)Y(K,J);: HTAB 23 +(J >9) +(J >99): GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 3830,3840,3850
  384. 3840 Y(K,J) =  VAL(IN$)
  385. 3850  VTAB CV: HTAB 23 +(J >9) +(J >99): PRINT Y(K,J): IF J <NP(K) GOTO 3800
  386. 3860  TEXT : IF K <NS GOTO 3780
  387. 3870  GOTO 1610
  388. 3880  REM 
  389. 3890  REM  MATH FORMULA INPUT
  390. 3900  REM 
  391. 3910 EF = 10: ONERR  GOTO 1460
  392. 3920  HOME : IF NP(1) < >0  THEN  PRINT "PREVIOUS DATA IS STILL IN MEMORY -": PRINT : PRINT "IF THIS DATA IS TO BE REPLACED,": PRINT : PRINT "RERUN PROGRAM TO CLEAR VARIABLES": GOTO 1400
  393. 3930  IF SV  THEN  HOME : VTAB 12: PRINT "YOUR CURRENT X-Y DATA": PRINT " HAS NOT BEEN SAVED.": PRINT : PRINT "PRESS <ESC> FOR MAIN MENU": PRINT " OR <RETURN> TO CONTINUE": GET Z$: PRINT : ON Z$ = EX$ GOTO 5200
  394. 3940  HOME : PRINT "ENTER MATHEMATICAL EXPRESSION IN X": PRINT : PRINT "LEGITIMATE APPLESOFT, 128 CHARS OR LESS"
  395. 3950  VTAB 6: HTAB 5: PRINT "Y = ";: INPUT "";EQ$: IF  LEN(EQ$) >128  THEN EQ$ =  LEFT$(EQ$,128): VTAB 10: PRINT "EXPRESSION CUT OFF AT 128 CHARS": VTAB 6: HTAB 9: PRINT EQ$
  396. 3960  VTAB 12: PRINT "IS THAT OK ?  N TO REPLACE: ";: GOSUB 360: ON XF GOTO 380: VTAB 10: CALL  -868
  397. 3970  IF A$ = "N"  OR A$ =  CHR$(110)  THEN  VTAB 12: PRINT "RETYPE ENTIRE EXPRESSION     ": GOTO 3950
  398. 3980  VTAB 10: PRINT "PLOT OVER WHAT RANGE OF X ?": VTAB 12: CALL  -868: PRINT  TAB( 25)"X MIN = ";XA;: HTAB 33: GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 3980,3990,4000
  399. 3990 XA =  VAL(IN$)
  400. 4000  VTAB 12: HTAB 33: PRINT XA: VTAB 13: PRINT  TAB( 25)"X MAX = ";XB;: HTAB 33: GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 4000,4010,4020
  401. 4010 XB =  VAL(IN$)
  402. 4020  VTAB 13: HTAB 33: PRINT XB: VTAB 15: PRINT "HOW MANY POINTS ?"; SPC( 23);"(NO.POINTS = 1 + NO.INTERVALS)  ";NP(1);: HTAB 33: GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 4020,4030,4040
  403. 4030 NP(1) =  VAL(IN$)
  404. 4040  VTAB 16: HTAB 33: PRINT NP(1): VTAB 18: PRINT "CONFIRM-IS IT OK?  Y/N (N TO REVISE): ";: GET A$: PRINT A$: IF A$ = "N"  OR A$ =  CHR$(110) GOTO 3890
  405. 4050  REM 
  406. 4060  REM  CALCULATE POINTS
  407. 4070  REM 
  408. 4080 L1$ = "Y = " +EQ$:EQ$ = EQ$ +":RETURN:REM:"
  409. 4090  REM 
  410. 4100  CALL 768,EQ$
  411. 4110  VTAB 18: CALL  -868: PRINT "CALCULATING POINTS -": DIM X(1,NP(1)),Y(1,NP(1))
  412. 4120 DX = (XB -XA)/(NP(1) -1): FOR J = 1 TO NP(1):X(1,J) = XA +(J -1) *DX:X = X(1,J): VTAB 20: PRINT X;LS$
  413. 4130  GOSUB 1060:Y(1,J) = EV: NEXT 
  414. 4140  GOSUB 1070
  415. 4150  VTAB 22: CALL  -868: PRINT "X-Y POINTS ARE IN MEMORY": GOSUB 1420
  416. 4160 NS = 1:SN = 1: GOTO 5200
  417. 4170  REM 
  418. 4180  REM 
  419. 4190  REM  DATA INPUT FROM FILE
  420. 4200  REM 
  421. 4210 EF = 11: ONERR  GOTO 1460
  422. 4220  HOME : IF NS < >0  THEN  PRINT "FINISHED WITH THE DATA NOW IN MEMORY ?": PRINT : PRINT "IF SO, RERUN PROGRAM TO CLEAR VARIABLES": GOTO 1400
  423. 4230  PRINT "WANT TO SEE THE CATALOG ? Y/N ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N"  AND A$ < > CHR$(110)  THEN  HOME : PRINT D$;"CATALOG"
  424. 4240 CV =  PEEK(37) +1: VTAB CV: PRINT "ENTER NAME OF TEXT FILE TO BE LOADED:         ";FI$;: HTAB 7: GOSUB 300: ON XF GOTO 380: IF Z = 3  AND  LEN(FI$) >0 GOTO 4260: REM  9 SPACES
  425. 4250 FI$ = IN$: IF FI$ = "" GOTO 4220
  426. 4260 CV = CV +1: IF CV >23  THEN CV = 23
  427. 4270  VTAB CV: HTAB 7: PRINT FI$: GOSUB 1250
  428. 4280  INPUT NS: DIM NP(NS):PP = 0: FOR K = 1 TO NS: INPUT NP(K): IF NP(K) >PP  THEN PP = NP(K)
  429. 4290  NEXT K: DIM X(NS,PP),Y(NS,PP)
  430. 4300  FOR K = 1 TO NS: FOR J = 1 TO NP(K): INPUT X(K,J): INPUT Y(K,J): NEXT J: NEXT K
  431. 4310  GOSUB 1280: IF IN$ = "" GOTO 4280
  432. 4320  HOME : PRINT "WANT TO REVIEW THIS DATA? (Y/N) ";: GOSUB 360: ON XF GOTO 4320: IF A$ = "Y"  OR A$ =  CHR$(121) GOTO 1700
  433. 4330  GOTO 5200
  434. 4340  REM 
  435. 4350  REM  CURVE FIT
  436. 4360  REM 
  437. 4370 EF = 12: ONERR  GOTO 1460
  438. 4380  HOME : IF NS <1  THEN  PRINT "X-Y DATA NOT IN MEMORY": GOSUB 1420: GOTO 5200
  439. 4390  IF NS >1  THEN  PRINT "THERE IS MORE THAN ONE SET OF POINTS    IN MEMORY. WHICH SET DO YOU WISH TO     ANALYZE ? (PRESS <RETURN> TO REVIEW) ";: GOSUB 300: ON XF GOTO 5200:SN =  VAL(IN$): ON SN = 0 GOTO 1590: IF SN <0  OR SN >NS  THEN  HOME : GOTO 4390
  440. 4400  IF NS = 1  THEN SN = 1
  441. 4410  HOME : PRINT "THE FOLLOWING ANALYSES ARE AVAILABLE:"
  442. 4420  FOR MN = 1 TO 5: GOSUB 1410: PRINT M2$(MN): NEXT MN
  443. 4430  VTAB 17: HTAB 5: PRINT "YOUR SELECTION (NUMBER) IS - ?  ";: HTAB 36: GET M$: ON M$ = EX$ GOTO 5200: PRINT M$:CU =  VAL(M$): IF CU <1  OR CU >5  THEN  PRINT  CHR$(7);: GOTO 4430
  444. 4440  VTAB 20: PRINT "COMPUTER WORKING -": IF CU = 5 GOTO 5200
  445. 4450  REM 
  446. 4460  REM  GET LOWER BOUNDS
  447. 4470  REM 
  448. 4480 S1 = 0:S2 = 0:S3 = 0:S4 = 0:S5 = 0
  449. 4490 XA = X(SN,1):YA = Y(SN,1)
  450. 4500  FOR J = 1 TO NP(SN)
  451. 4510  IF (X(SN,J) <XA)  THEN XA = X(SN,J)
  452. 4520  IF (Y(SN,J) <YA)  THEN YA = Y(SN,J)
  453. 4530  NEXT J
  454. 4540  REM 
  455. 4550  REM  SUM TERMS
  456. 4560  REM 
  457. 4570  ON CU GOTO 4640,4620,4600,4580,5200
  458. 4580  IF XA < = 0  OR YA < = 0  THEN  VTAB 21: PRINT "POWER FIT CANNOT HANDLE 0 OR NEG VALUES": GOSUB 1420: GOTO 4410
  459. 4590  FOR J = 1 TO NP(SN):S1 = S1 + LOG(X(SN,J)):S2 = S2 + LOG(Y(SN,J)):S3 = S3 + LOG(X(SN,J)) * LOG(Y(SN,J)):S4 = S4 +( LOG(X(SN,J))) ^2:S5 = S5 +( LOG(Y(SN,J))) ^2: NEXT J: GOTO 4680
  460. 4600  IF YA < = 0  THEN  VTAB 21: PRINT "EXP FIT CANNON HANDLE Y < = 0": GOSUB 1420: GOTO 4370
  461. 4610  FOR J = 1 TO NP(SN):S1 = S1 +X(SN,J):S2 = S2 + LOG(Y(SN,J)):S3 = S3 +X(SN,J) * LOG(Y(SN,J)):S4 = S4 +(X(SN,J)) *(X(SN,J)):S5 = S5 +( LOG(Y(SN,J))) ^2: NEXT J: GOTO 4680
  462. 4620  IF XA < = 0  THEN  VTAB 21: PRINT "LOG FIT CANNOT HANDLE X < = 0": GOSUB 1420: GOTO 4370
  463. 4630  FOR J = 1 TO NP(SN):S1 = S1 + LOG(X(SN,J))/CL:S2 = S2 +Y(SN,J):S3 = S3 + LOG(X(SN,J)) *Y(SN,J)/CL:S4 = S4 +( LOG(X(SN,J))/CL) ^2:S5 = S5 +Y(SN,J) *Y(SN,J): NEXT J: GOTO 4680
  464. 4640  FOR J = 1 TO NP(SN):S1 = S1 +X(SN,J):S2 = S2 +Y(SN,J):S3 = S3 +X(SN,J) *Y(SN,J):S4 = S4 +X(SN,J) *X(SN,J):S5 = S5 +Y(SN,J) *Y(SN,J): NEXT J
  465. 4650  REM 
  466. 4660  REM  SOLVE FOR PARAMETERS
  467. 4670  REM 
  468. 4680 BB = (NP(SN) *S3 -S2 *S1)/(NP(SN) *S4 -S1 ^2):BB =  INT(BB *100)/100
  469. 4690 AA = (S2 -BB *S1)/NP(SN):AA =  INT(AA *100)/100
  470. 4700 S6 = BB *(S3 -S1 *S2/NP(SN))
  471. 4710 S5 = S5 -S2 *S2/NP(SN)
  472. 4720 R2 = S6/S5:R1 =  INT(1000 * SQR(R2))/1000
  473. 4730 SS =  INT(1000 * SQR( ABS((S5 -S6)/(NP(SN) -C2))))/1000
  474. 4740  REM 
  475. 4750  REM  ASSEMBLE EQUATION
  476. 4760  REM 
  477. 4770  ON CU GOTO 4840,4820,4800,4780,5200
  478. 4780 AA =  EXP(AA)
  479. 4790 L1$ = "Y  =  " + STR$(AA) +"  *  X ^ " + STR$(BB): GOTO 4880
  480. 4800 AA =  EXP(AA)
  481. 4810 L1$ = "Y  =  " + STR$(AA) +"  *  EXP(" + STR$(BB) +" X)": GOTO 4880
  482. 4820 L1$ = "Y  =  " + STR$(AA) +"  +  " + STR$(BB) +" (LOG10 X)"
  483. 4830  GOTO 4880
  484. 4840 L1$ = "Y  =  " + STR$(AA) +"  +  " + STR$(BB) +" X"
  485. 4850  REM 
  486. 4860  REM  SHOW RESULTS
  487. 4870  REM 
  488. 4880 L2$ = "R  =  " + STR$(R1)
  489. 4890 L3$ = "S  =  " + STR$(SS)
  490. 4900  HOME : VTAB 3: PRINT "THE BEST FIT RELATION IS:": PRINT : PRINT  TAB( 3)L1$
  491. 4910  VTAB 12: PRINT "COEFFICIENT OF CORRELATION ";L2$
  492. 4920  PRINT : PRINT "STANDARD ERROR OF ESTIMATE ";L3$
  493. 4930 LG$ = "Y": GOTO 1400
  494. 4940  REM 
  495. 4950  REM  CHANGE ARRAY SIZE
  496. 4960  REM 
  497. 4970 EF = 13: ONERR  GOTO 1460
  498. 4980  HOME : IF NS < >0  THEN  PRINT "SPACE ALLOCATION CANNOT BE REVISED WHEN": PRINT : PRINT "THERE IS X-Y DATA IN MEMORY": PRINT : PRINT "SAVE THE DATA ON DISK FIRST, RERUN THE": PRINT : PRINT "PROGRAM, THEN SELECT OPTION 6": GOTO 1400
  499. 4990  HOME : PRINT "CONFIRM - IS THE DATA TO BE REVISED": PRINT : PRINT "NOW STORED ON DISK? Y/N: ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"Y"  AND A$ < > CHR$(121)  THEN  VTAB 20: PRINT "USE ENTER DATA OPTION (1) OF MAIN MENU": GOSUB 1420: GOTO 5200
  500. 5000  HOME : PRINT "WANT TO SEE THE CATALOG ? Y/N ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N"  AND A$ < > CHR$(110)  THEN  HOME : PRINT D$;"CATALOG"
  501. 5010 CV =  PEEK(37) +1: VTAB CV: PRINT "ENTER NAME OF TEXT FILE HOLDING X-Y DATA      ";FI$;: HTAB 7: GOSUB 300: ON XF GOTO 4990: IF Z = 3 GOTO 5030: REM  6 SPACES
  502. 5020 FI$ = IN$
  503. 5030 CV = CV +1: IF CV >23  THEN CV = 23
  504. 5040  VTAB CV: HTAB 7: PRINT FI$: GOSUB 1250
  505. 5050  INPUT NA: DIM NB(NA):PP = 0: FOR K = 1 TO NA: INPUT NB(K): IF NB(K) >PP  THEN PP = NB(K)
  506. 5060  NEXT K: GOSUB 1280
  507. 5070  HOME : PRINT "REVISE (OR ACCEPT) FILE PARAMETERS:":NS = NA: VTAB 5: PRINT "NUMBER DIFFERENT SETS OF X-Y DATA: ";NS;: HTAB 36: GOSUB 300: ON XF GOTO 4990: GOSUB 320: ON Z GOTO 5070,5080,5090
  508. 5080 NS =  VAL(IN$): ON NS <NA GOTO 5070: DIM NP(NS)
  509. 5090  VTAB 5: HTAB 36: PRINT NS: FOR K = 1 TO NA:NP(K) = NB(K): NEXT :K = 0
  510. 5100 K = K +1:CV = 7 +K: IF CV >23  THEN CV = 23
  511. 5110  VTAB CV: PRINT "NUMBER OF POINTS IN SET NO. ";K; TAB( 36)NP(K);: HTAB 36: GOSUB 300: ON XF GOTO 5070: GOSUB 320: ON Z GOTO 5110,5120,5130
  512. 5120 NP =  VAL(IN$): ON NP <NP(K) GOTO 5110:NP(K) = NP: IF NP(K) >PP  THEN PP = NP(K)
  513. 5130  VTAB CV: HTAB 36: PRINT NP(K): IF K <NS GOTO 5100
  514. 5140  DIM X(NS,PP),Y(NS,PP)
  515. 5150  GOSUB 1250: INPUT NA: FOR K = 1 TO NA: INPUT NB(K): NEXT K: FOR K = 1 TO NA: FOR J = 1 TO NB(K): INPUT X(K,J): INPUT Y(K,J): NEXT J: NEXT K: GOSUB 1280
  516. 5160  HOME : PRINT "THE X-Y DATA WILL NOW BE DISPLAYED WITH "; SPC( 40);"VALUES OF THE ADDED POINTS SHOWN AS 0,0."; SPC( 40);"CORRECT THEM TO SHOW THE NEW X-Y VALUES": GOSUB 1420:M$ = "1": GOTO 1700
  517. 5170  REM 
  518. 5180  REM  MAIN MENU
  519. 5190  REM 
  520. 5200  TEXT : HOME : FOR I = 1 TO 15: PRINT "*";: HTAB 39: PRINT "*": PRINT : NEXT I
  521. 5210  HTAB 2: VTAB 1: FOR I = 0 TO 18: PRINT "* ";: NEXT : HTAB 2: VTAB 23: FOR I = 0 TO 18: PRINT "* ";: NEXT 
  522. 5220  VTAB 3: HTAB 11: INVERSE : PRINT "NIBBLE PLOTTER MENU": NORMAL 
  523. 5230  RESTORE : FOR MN = 1 TO 8: HTAB 4: GOSUB 1410: READ M1$(MN): PRINT M1$(MN): NEXT 
  524. 5240  VTAB 19: HTAB 30: INVERSE : PRINT "9";: NORMAL : PRINT "  EXIT"
  525. 5250  VTAB 21: HTAB 5: PRINT "YOUR SELECTION (NUMBER) IS - ?  ";: HTAB 36: POKE  -16368,0: GET M$: PRINT M$:MS =  VAL(M$)
  526. 5260  ON MS GOTO 3670,3910,4210,1610,4370,4970,2230,5300,5310: PRINT  CHR$(7);: GOTO 5250
  527. 5270  REM 
  528. 5280  REM  MISCELLANEOUS ROUTINES
  529. 5290  REM 
  530. 5300  HOME : VTAB 10: PRINT "ARE YOU SURE YOU WANT TO CLEAR MEMORY?": INPUT "(Y/N):";YN$: ON YN$ < >"Y"  AND YN$ < > CHR$(121) GOTO 5200: GOSUB 1170: CLEAR :AA$ = "": GOTO 90
  531. 5310  HOME : TEXT : VTAB 12: INPUT "ARE YOU SURE YOU WANT TO QUIT? ";YN$: IF YN$ < >"Y"  AND YN$ < > CHR$(121) GOTO 5200
  532. 5320  GOSUB 1170: TEXT : CLEAR : HOME : END 
  533. 5330 PX$ = ""
  534. 5340  GET XX$:XX =  ASC(XX$) -48: IF XX = 0  THEN  RETURN 
  535. 5350  FOR II = 1 TO XX: GET XX$:PX$ = PX$ +XX$: NEXT : RETURN 
  536. 5360  PRINT  CHR$(48 + LEN(PX$));: IF  LEN(PX$) = 0  THEN  RETURN 
  537. 5370  PRINT PX$;: RETURN 
  538. 5380 HP =  PEEK(36):VP =  PEEK(37): VTAB 24: HTAB 1: CALL  -958: PRINT "PRESS <ESC> TO START OVER";: VTAB VP +1: HTAB HP +1: RETURN 
  539. 5390 HP =  PEEK(36):VP =  PEEK(37): VTAB 22: HTAB 1: CALL  -958: VTAB VP +1: HTAB HP +1: RETURN 
  540. 5400  REM  ROUTINE TO INPUT PRINTER CODES
  541. 5410  REM  PX$ IS PRINTER CONTROL STRING;I7,X7,X7$ AND Y7 AND USED ONLY LOCALLY
  542. 5420  HOME : HTAB 8: PRINT "VIEW/CHANGE PRINTER CODES": VTAB 14: HTAB 1: PRINT "CODE FOR "PP$: VTAB 15: HTAB 1: GOSUB 5680: VTAB 16: HTAB 1: CALL  -958: GOTO 5580
  543. 5430 PX$ = "": VTAB 13: HTAB 1: PRINT "TYPE CODES EXACTLY AS REQUIRED": PRINT " BY PRINTER FOR "PP$".": VTAB 16: HTAB 1: CALL  -958: VTAB 23: HTAB 1: GOSUB 5680: VTAB 24: HTAB 1: PRINT "TYPE '^' TO QUIT.";: VTAB 16: HTAB 1: ONERR  GOTO 5690
  544. 5440  POKE  -16368,0
  545. 5450 X7 =  PEEK( -16384): IF X7 <128 GOTO 5450
  546. 5460 X7 = X7 -128
  547. 5470  IF X7 = 94  THEN  RETURN 
  548. 5480  IF  LEN(PX$) >19  THEN  PRINT  CHR$(7);: GOTO 5440
  549. 5490 PX$ = PX$ + CHR$(X7)
  550. 5500  IF X7 = 13  THEN X7$ = " <RETURN> ": GOTO 5550
  551. 5510  IF X7 = 27  THEN X7$ = " <ESC> ": GOTO 5550
  552. 5520  IF X7 = 32  THEN X7$ = " SPACE ": GOTO 5550
  553. 5530  IF X7 <32  THEN X7$ = " <CTRL>-" + CHR$(X7 +64) +" ": GOTO 5550
  554. 5540 X7$ =  CHR$(X7): GOTO 5550
  555. 5550  GOSUB 5560: ON   NOT Y7 GOTO 5440: RETURN 
  556. 5560  IF  LEN(X7$) >40 - POS(0)  THEN  PRINT 
  557. 5570  PRINT X7$;: RETURN 
  558. 5580  IF PX$ = "" GOTO 5600
  559. 5590 Y7 = 1: FOR I7 = 1 TO  LEN(PX$):X7 =  ASC( MID$ (PX$,I7,1)): GOSUB 5500: NEXT I7
  560. 5600  VTAB 23: HTAB 1: GOSUB 5680: VTAB 24: HTAB 1: PRINT "IS THIS OK? ";:Y7 = 0: GOTO 5660
  561. 5610  POKE  -16368,0
  562. 5620 X7 =  PEEK( -16384): IF X7 <128 GOTO 5620
  563. 5630 X7 = X7 -128: IF X7 = 13  THEN  ON   NOT (Y7) GOTO 5430: RETURN 
  564. 5640  IF   NOT (X7 = 8  OR X7 = 10  OR X7 = 11  OR X7 = 21)  THEN  PRINT  CHR$(7);: GOTO 5610
  565. 5650 Y7 = 1 -Y7
  566. 5660  IF Y7  THEN  VTAB 24: HTAB 13: NORMAL : PRINT "NO ";: INVERSE : PRINT "YES";: NORMAL : GOTO 5610
  567. 5670  VTAB 24: HTAB 13: INVERSE : PRINT "NO";: NORMAL : PRINT " YES";: GOTO 5610
  568. 5680  FOR I7 = 1 TO 40: PRINT  CHR$(95);: NEXT : RETURN 
  569. 5690  CALL  -3288: IF  PEEK(222) = 255  THEN X7 = 3: GOTO 5470
  570. 5700  POKE 216,0: RETURN