home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib09.dsk / SCRATCH-PAD.bas < prev    next >
BASIC Source File  |  2023-02-26  |  16KB  |  287 lines

  1. 10  REM  SCRATCH-PAD     BY STEPHEN BOHN
  2. 20  POKE 3,0: POKE 4,0: HIMEM: 32510
  3. 30  ONERR  GOTO 130
  4. 40  TEXT : HOME 
  5. 50  DIM F(21,21),D(21,21),CL$(21),RO$(21),A$(30)
  6. 60  GOSUB 10000
  7. 70  PRINT  CHR$(4);"BLOAD F.";NM$
  8. 80 BL$(1) = "00":BL$(2) = BL$(1):BL$(3) = BL$(1):BL$(4) = "000"
  9. 90 BL$(5) = "  00":BL$(6) = "   00":BL$(7) = "    00":BL$(8) = "     00":BL$(9) = "      00"
  10. 100  TEXT 
  11. 110  PRINT  CHR$(4);"BLOAD DISPLAYER"
  12. 120  GOTO 2580
  13. 130  REM  --- HANDLE ERRORS ---
  14. 140 QX =  PEEK(222)
  15. 150  IF QX = 42  THEN  RESTORE : GOTO 2580
  16. 160  IF QX = 6  THEN  GOSUB 1370: HOME : FLASH : PRINT "FILE NOT FOUND": NORMAL : GOTO 1220
  17. 170  IF QX = 9  THEN  HOME : INVERSE : VTAB 10: PRINT "DISK FULL - PLEASE USE ANOTHER": NORMAL : PRINT  CHR$(7);: FOR I = 1 TO 1000: NEXT I: GOTO 2580
  18. 180  IF QX = 133  THEN  TEXT : HOME : PRINT "DIVISION BY ZERO ": PRINT "PROBLEM WITH FORMULA ": FOR I = 1 TO 8000: NEXT I: CLEAR : RESTORE : GOTO 30
  19. 190  IF QX = 254  THEN  GOTO 1350
  20. 200  IF QX = 5  THEN 1350
  21. 210  TEXT : HOME : PRINT "PROBLEM IN LINE #";: PRINT  PEEK(218) + PEEK(219) *256
  22. 220  END 
  23. 230  REM  --- GET DATA VIA CUSTOM ---
  24. 240 IC = IC +1:B$ = "": READ R: READ C
  25. 250  HOME : PRINT "ENTER DATA FOR ROW ";R;" ,COLUMN ";C
  26. 260  GOSUB 2010: INVERSE : HTAB 1: VTAB 4 +R: PRINT RO$(R);: NORMAL 
  27. 270  GOSUB 1920: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  28. 280  GOSUB 660
  29. 290  IF A$ = "Q"  THEN  RESTORE :IC = 0: RETURN 
  30. 300  IF IC > = ND  THEN  RESTORE :IC = 0: RETURN 
  31. 310  GOTO 240
  32. 320  REM  --- GET DATA VIA ROW ---
  33. 330  FOR R = 1 TO NR: FOR C = 1 TO NC
  34. 340  HOME : PRINT "ENTER DATA FOR ROW ";R;" ,COLUMN ";C:B$ = ""
  35. 350  GOSUB 1990: IF  PEEK(32768 +(R *256) +LL) < >164  THEN 400
  36. 360  GOSUB 2010: INVERSE : HTAB 1: VTAB 4 +R: PRINT RO$(R);: NORMAL 
  37. 370  GOSUB 1920: INVERSE : VTAB 4: HTAB 12: PRINT CL$(C);: NORMAL 
  38. 380  GOSUB 660
  39. 390  IF A$ = "Q"  THEN  RETURN 
  40. 400  NEXT C: NEXT R: RETURN 
  41. 410  REM  --- GET DATA VIA COLUMN ---
  42. 420  FOR C = 1 TO NC: FOR R = 1 TO NR
  43. 430  HOME : PRINT "ENTER DATA FOR ROW ";R;" ,COLUMN ";C:B$ = ""
  44. 440  GOSUB 1990: IF  PEEK(32768 +(R *256) +LL) < >164  THEN 490
  45. 450  GOSUB 2010: INVERSE : HTAB 1: VTAB 4 +R: PRINT RO$(R);: NORMAL 
  46. 460  GOSUB 1920: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  47. 470  GOSUB 660
  48. 480  IF A$ = "Q"  THEN  RETURN 
  49. 490  NEXT R: NEXT C: RETURN 
  50. 500  REM  --- ADD/CHANGE DATA ---
  51. 510  HOME : VTAB 1: HTAB 11: INVERSE : PRINT "ADD OR CHANGE DATA ": HTAB 11: PRINT "(PRESS 'Q' TO QUIT)": NORMAL 
  52. 520  VTAB 3: HTAB 1: CALL  -958: PRINT "ENTER ROW NUMBER ->";: GET A$: PRINT A$;: IF A$ = "Q"  THEN  RETURN 
  53. 530  IF A$ =  CHR$(13)  THEN 520
  54. 540  INPUT "";B$:A$ = A$ +B$
  55. 550 R =  VAL(A$): IF R <1  OR R >20  THEN 520
  56. 560  VTAB 3: HTAB 1: CALL  -958: PRINT "ENTER COLUMN NUMBER ->";: GET A$: PRINT A$;: IF A$ = "Q"  THEN  RETURN 
  57. 570  IF A$ =  CHR$(13)  THEN 560
  58. 580  INPUT "";B$:A$ = A$ +B$
  59. 590 C =  VAL(A$): IF C <1  OR C >20  THEN 560
  60. 600  GOSUB 2010: INVERSE : HTAB 1: VTAB 4 +R: PRINT RO$(R);: NORMAL 
  61. 610  GOSUB 1920: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  62. 620 B$ = BL$( LEN(CL$(C))): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  63. 630  VTAB 1: HTAB 1: PRINT "ENTER DATA FOR ROW ";R;" , COLUMN ";C:B$ = "": PRINT "           (PRESS 'Q' TO QUIT)"
  64. 640  VTAB 3: HTAB 1: PRINT "           ";: GOSUB 660: IF A$ = "Q"  THEN  RETURN 
  65. 650  GOTO 510
  66. 660  REM  --- GET DATA ---
  67. 670 B$ = "": VTAB 2: HTAB 11: PRINT "(PRESS 'Q' TO QUIT)"
  68. 680  VTAB 4 +R: HTAB 11 + LEN(CL$(C)): GET A$
  69. 690  IF A$ =  CHR$(13)  THEN D(R,C) =  VAL(B$)/100: RETURN 
  70. 700  IF A$ =  CHR$(83)  THEN  RETURN 
  71. 710  IF A$ =  CHR$(67)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  72. 720  IF A$ =  CHR$(8)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  73. 730  IF A$ = "Q"  THEN  RETURN 
  74. 740  IF A$ =  CHR$(46)  THEN 840
  75. 750  IF A$ =  CHR$(45)  THEN 770
  76. 760  IF  ASC(A$) <48  OR  ASC(A$) >57  THEN  PRINT  CHR$(7);: GOTO 680
  77. 770 B$ = B$ +A$: GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  78. 780  IF  LEN(B$) < LEN(CL$(C)) -1  THEN 680
  79. 790  VTAB 4 +R: HTAB 11 + LEN(CL$(C)): GET A$
  80. 800  IF A$ =  CHR$(67)  OR A$ =  CHR$(8)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  81. 810  IF A$ < > CHR$(13)  THEN  PRINT  CHR$(7);: GOTO 790
  82. 820 D(R,C) =  VAL(B$)/100: RETURN 
  83. 830  GOTO 680
  84. 840  VTAB 4 +R: HTAB 11 + LEN(CL$(C)): GET A$
  85. 850  IF A$ =  CHR$(13)  THEN D(R,C) =  VAL(B$):B$ = B$ +"00": GOSUB 2040: RETURN 
  86. 860  IF A$ =  CHR$(83)  THEN  RETURN 
  87. 870  IF A$ =  CHR$(67)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  88. 880  IF A$ =  CHR$(8)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  89. 890  IF A$ =  CHR$(81)  THEN  RETURN 
  90. 900 B$ = B$ +A$: GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  91. 920  IF  LEN(B$) =  LEN(CL$(C)) -1  THEN  PRINT  CHR$(7);: GOTO 670
  92. 930  VTAB 4 +R: HTAB 11 + LEN(CL$(C)): GET A$
  93. 940  IF A$ =  CHR$(13)  THEN D(R,C) =  VAL(B$)/10:B$ = B$ +"0": GOSUB 2040: RETURN 
  94. 950  IF A$ =  CHR$(83)  THEN  RETURN 
  95. 960  IF A$ =  CHR$(67)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  96. 970  IF A$ =  CHR$(8)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  97. 980  IF A$ =  CHR$(81)  THEN  RETURN 
  98. 990  IF  ASC(A$) <48  OR  ASC(A$) >57  THEN  PRINT  CHR$(7);: GOTO 930
  99. 1000 B$ = B$ +A$: GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL 
  100. 1010 D(R,C) =  VAL(B$)/100
  101. 1020  VTAB 4 +R: HTAB 11 + LEN(CL$(C)): GET A$
  102. 1030  IF A$ =  CHR$(67)  OR A$ =  CHR$(8)  THEN B$ = "$" +BL$( LEN(CL$(C)) -1): GOSUB 2040: INVERSE : VTAB 3: HTAB 12: PRINT CL$(C);: NORMAL : GOTO 670
  103. 1040  IF A$ < > CHR$(13)  THEN  PRINT  CHR$(7);: GOTO 1020
  104. 1050  RETURN 
  105. 1060  REM  --- SAVE FILE ---
  106. 1070  TEXT : HOME :MD$ = ""
  107. 1080  PRINT "INSERT DISK TO SAVE DATA TO ": PRINT : PRINT "DO YOU WISH TO USE A SPECIAL": PRINT "NAME MODIFER Y/N ? ";: GET A$: IF A$ = "N"  THEN 1120
  108. 1090  IF A$ < >"Y"  THEN 1070
  109. 1100  PRINT : INPUT "ENTER NAME MODIFER ->";MD$
  110. 1110  IF  LEN(MD$) >10  THEN  PRINT : INVERSE : PRINT "PLEASE USE A MODIFER OF 10 CHARACTERS": PRINT "OR LESS                              ": VTAB 5: HTAB 1: CALL  -868: GOTO 1100
  111. 1120  PRINT : PRINT  CHR$(4);"BSAVE E.";NM$;MD$; CHR$(44);"A32768"; CHR$(44);"L5376"
  112. 1130  FOR R = 1 TO NR: FOR C = 1 TO NC
  113. 1140  IF D(R,C) < >0  THEN II = II +1
  114. 1150  NEXT C: NEXT R
  115. 1160  PRINT  CHR$(4);"OPEN D.";NM$ +MD$: PRINT  CHR$(4);"WRITE D.";NM$ +MD$: PRINT II
  116. 1170  FOR R = 1 TO NR: FOR C = 1 TO NC
  117. 1180  IF D(R,C) < >0  THEN  PRINT R: PRINT C: PRINT D(R,C)
  118. 1190  NEXT C: NEXT R: PRINT  CHR$(4);"CLOSE D.";NM$ +MD$: RETURN 
  119. 1200  REM  --- LOAD FILE ---
  120. 1210 NF = 0: TEXT : HOME :MD$ = ""
  121. 1220  VTAB 10: PRINT "IF YOU WOULD LIKE A LISTING OF FILES": PRINT "AVAILABLE, PRESS THE 'L' KEY ";: GET A$: PRINT A$: IF A$ < >"L"  THEN 1260
  122. 1230  HOME : VTAB 3: PRINT "INSERT DISK FIRH FILE(S) TO BE LOADED": INPUT "PRESS RETURN WHEN READY";A$: GOSUB 1370
  123. 1240  REM  NF = NO FILES
  124. 1250  IF NF = 1  THEN 2580
  125. 1260  VTAB 24: HTAB 11: PRINT "(PRESS 'Q' TO QUIT)";: HTAB 1: VTAB 19: PRINT "INSERT DISK WITH FILE TO BE LOADED ": PRINT : PRINT "IS THERE A SPECIAL NAME MODIFER Y/N ?";: GET A$: IF A$ = "N"  THEN 1320
  126. 1270  IF A$ = "Q"  THEN 2580
  127. 1280  IF A$ < >"Y"  THEN 1260
  128. 1290  PRINT : INPUT "ENTER SPECIAL MODIFER ->";MD$
  129. 1300  IF  LEN(MD$) >10  THEN MD$ =  LEFT$(MD$,10)
  130. 1310  IF NF = 1  THEN 2580
  131. 1320  PRINT : PRINT  CHR$(4);"BLOAD E.";NM$ +MD$
  132. 1330  PRINT  CHR$(4);"OPEN D.";NM$ +MD$: PRINT  CHR$(4);"READ D.";NM$ +MD$: INPUT II
  133. 1340  FOR I = 1 TO II: INPUT R: INPUT C: INPUT D(R,C): NEXT I
  134. 1350  PRINT  CHR$(4);"CLOSE D.";NM$ +MD$: GOTO 2140
  135. 1360  REM  --- FILE ERROR ---
  136. 1370 NF = 0: FOR ZZ = 0 TO 10:A$(ZZ) = "": NEXT ZZ
  137. 1380  TEXT : HOME : PRINT : PRINT  CHR$(4);"CATALOG"::: INVERSE : PRINT "DO NOT ENTER ANY COMMANDS YET": NORMAL 
  138. 1390  IF  PEEK(1031) = 197  THEN I = 1031:A = 1: GOTO 1640
  139. 1400  IF  PEEK(1159) = 197  THEN I = 1159:A = 2: GOTO 1640
  140. 1410  IF  PEEK(1287) = 197  THEN I = 1287:A = 3: GOTO 1640
  141. 1420  IF  PEEK(1415) = 197  THEN I = 1415:A = 4: GOTO 1640
  142. 1430  IF  PEEK(1543) = 197  THEN I = 1543:A = 5: GOTO 1640
  143. 1440  IF  PEEK(1671) = 197  THEN I = 1671:A = 6: GOTO 1640
  144. 1450  IF  PEEK(1799) = 197  THEN I = 1799:A = 7: GOTO 1640
  145. 1460  IF  PEEK(1927) = 197  THEN I = 1927:A = 8: GOTO 1640
  146. 1470  IF  PEEK(1071) = 197  THEN I = 1071:A = 9: GOTO 1640
  147. 1480  IF  PEEK(1199) = 197  THEN I = 1199:A = 10: GOTO 1640
  148. 1490  IF  PEEK(1327) = 197  THEN I = 1327:A = 11: GOTO 1640
  149. 1500  IF  PEEK(1455) = 197  THEN I = 1455:A = 12: GOTO 1640
  150. 1510  IF  PEEK(1583) = 197  THEN I = 1583:A = 13: GOTO 1640
  151. 1520  IF  PEEK(1711) = 197  THEN I = 1711:A = 14: GOTO 1640
  152. 1530  IF  PEEK(1839) = 197  THEN I = 1839:A = 15: GOTO 1640
  153. 1540  IF  PEEK(1967) = 197  THEN I = 1967:A = 16: GOTO 1640
  154. 1550  IF  PEEK(1111) = 197  THEN I = 1111:A = 17: GOTO 1640
  155. 1560  IF  PEEK(1239) = 197  THEN I = 1239:A = 18: GOTO 1640
  156. 1570  IF  PEEK(1367) = 197  THEN I = 1367:A = 19: GOTO 1640
  157. 1580  IF  PEEK(1495) = 197  THEN I = 1495:A = 20: GOTO 1640
  158. 1590  IF  PEEK(1623) = 197  THEN I = 1623:A = 21: GOTO 1640
  159. 1600  IF  PEEK(1751) = 197  THEN I = 1751:A = 22: GOTO 1640
  160. 1610  IF  PEEK(1879) = 197  THEN I = 1879:A = 23: GOTO 1640
  161. 1620  IF  PEEK(2007) = 197  THEN I = 2007:A = 24: GOTO 1640
  162. 1630 A = 24
  163. 1640  FOR J = 1 TO  LEN(NM$)
  164. 1650  IF  PEEK(I +J +1) < >( ASC( MID$ (NM$,J,1)) +128  THEN 1710
  165. 1660  NEXT J
  166. 1670  FOR J = 1 TO 10
  167. 1680 A$(N) = A$(N) + CHR$(( PEEK(I +J + LEN(NM$) +1)) -128)
  168. 1690  NEXT J
  169. 1700 N = N +1
  170. 1710  FOR J = 1 TO 2: NEXT J
  171. 1720  IF A = 24A  AND N = 0  THEN 1880
  172. 1730  IF A = 24  THEN 1790
  173. 1740  IF A >12  THEN 1770
  174. 1750  ON A GOTO 1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,1500,1510
  175. 1760  PRINT "A = ";A;" IN LINE 1540 ?": END 
  176. 1770 A = A -12: ON A GOTO 1520,1530,1540,1550,1560,1570,1580,1590,1600,1610,1620
  177. 1780  GOTO 1880
  178. 1790  HOME : PRINT "FILES AVAILABLE FOR ";NM$;" ARE:"
  179. 1800  PRINT : INVERSE 
  180. 1810  FOR J = 0 TO N -2
  181. 1820  PRINT 
  182. 1830  HTAB 10: PRINT A$(J);
  183. 1840  IF A$(J) = "          "  THEN  NORMAL : PRINT "-NO MODIFER";: INVERSE 
  184. 1850  NEXT J
  185. 1860  PRINT 
  186. 1870  NORMAL :NF = 0: RETURN 
  187. 1880  HOME : INVERSE : VTAB 12: PRINT "NO FILES AVAILABLE": NORMAL 
  188. 1890 NF = 1
  189. 1900  FOR J = 1 TO 4: PRINT  CHR$(7): NEXT J: FOR J = 1 TO 2000: NEXT J
  190. 1910  RETURN 
  191. 1920  REM  --- DISPLAY FILE ROUTINE ---
  192. 1930 LL = 1
  193. 1940  IF C = 1  THEN LL = 2: GOTO 1980
  194. 1950  FOR II = 0 TO C -1
  195. 1960 LL = LL + LEN(CL$(II) +1
  196. 1970  NEXT II
  197. 1980  POKE 3,LL: CALL 32512: RETURN 
  198. 1990 LL = 1: IF C = 1  THEN LL = 2: RETURN 
  199. 2000  FOR II = 0 TO C -1:LL = LL + LEN(CL$(II)) +1: NEXT II: RETURN 
  200. 2010  REM  --- PRINT ROW ROUTINE ---
  201. 2020  FOR I = 1 TO NR: HTAB 1: VTAB 4 +I: PRINT RO$(I);:
  202. 2030  NEXT I: RETURN 
  203. 2040  REM  --- DISPLAY DATA VALUES ---
  204. 2050  IF B$ = ""  THEN  RETURN 
  205. 2060 B =  LEN(B$)
  206. 2070  FOR J = 1 TO B:PP = 32768 +(R *256) +LL * LEN(CL$(C)) -J
  207. 2080  IF B = 1  THEN  POKE PP,176: POKE PP -1,176: POKE PP -2,174
  208. 2090  IF J = 1  THEN  POKE PP, ASC( RIGHT$(B$,1)) +128: GOTO 2130
  209. 2100  IF J = 2  THEN  POKE PP, ASC( MID$ (B$,1 +B -J,1)) +128: GOTO 2130
  210. 2110  IF J = 3  THEN  POKE PP,174
  211. 2120  POKE PP -1, ASC( MID$ (B$,I +B -J,1)) +128
  212. 2130  CALL 32512: NEXT J: RETURN 
  213. 2140  REM  --- FETCH FORMULA ---
  214. 2150  HOME : VTAB 12: HTAB 8: INVERSE : PRINT "  CALCULATING FORMULAS  ": VTAB 13: HTAB 8: PRINT "MAY TAKE SEVERAL MINUTES": NORMAL 
  215. 2160  FOR K = 1 TO NR: FOR M = 1 TO NC
  216. 2170  ON M GOSUB 11100,11200,11300,11400,11500,11600,11700,11800,11900,12000,12100,12200,12300,12400,12500,12600,12700,12800,12900,13000,13100
  217. 2180  FOR N = 1 TO NR: IF F(N,M) < >0  THEN B = F(N,M):B =  INT((B +.005000005) *100):B$ =  STR$(B):D(N,M) = B/100
  218. 2190  NEXT N: NEXT M: NEXT K
  219. 2200  HOME : GOSUB 2010
  220. 2210  FOR M = 1 TO NC
  221. 2220  ON M GOSUB 11100,11200,11300,11400,11500,11600,11700,11800,11900,12000,12100,12200,12300,12400,12500,12600,12700,12800,12900,13000,13100
  222. 2230 C = M
  223. 2240  FOR R = 1 TO NR: IF F(R,C) = 0  THEN 2310
  224. 2250 B = F(R,C):B =  INT((B +.005000005) *100):B$ =  STR$(B):F(R,C) = B/100
  225. 2260  IF B >1 *10 ^( LEN(CL$(C)) -1) -1  THEN B$ =  LEFT$("ERROR     ", LEN(CL$(C)) -1)
  226. 2270  GOSUB 1930
  227. 2280 C$ = B$:B$ =  LEFT$("           ", LEN(CL$(C)) -1): GOSUB 2040:B$ = C$
  228. 2290  GOSUB 2050
  229. 2300 D(R,C) = F(R,C)
  230. 2310  NEXT R
  231. 2320  NEXT M
  232. 2330  REM  --- DISPLAY DATA ---
  233. 2340  TEXT : HOME : VTAB 1: HTAB 14: INVERSE : PRINT "DISPLAY FILE": FOR I = 1 TO NR: HTAB 1: VTAB 4 +I: PRINT RO$(I);: NEXT I
  234. 2350  VTAB 2: HTAB 2: PRINT "(P)RINT (C)HANGE (S)AVE (E)NTER (Q)UIT"
  235. 2360  NORMAL : POKE 4,0
  236. 2370 Y = 1: POKE 3,Y: CALL 32512
  237. 2380  VTAB 1: HTAB 41: GET A$
  238. 2390  VTAB 4: HTAB 1: CALL  -868
  239. 2400  IF A$ =  CHR$(81)  THEN  HOME : END : REM  "Q"
  240. 2410  IF A$ =  CHR$(67)THHEN GOSUB 510: GOSUB 2150: GOTO 2330: REM  "C"
  241. 2420  IF A$ =  CHR$(83)  THEN  GOSUB 1070: GOTO 2330: REM  "S"
  242. 2430  IF A$ =  CHR$(69)  THEN  POKE 4,0: GOTO 2580: REM  "E"
  243. 2440  IF A$ =  CHR$(80)  THEN 2670: REM  "P"
  244. 2450  IF A$ =  CHR$(8)  THEN Y = Y +10: IF Y >255  THEN Y = Y -255
  245. 2460  IF A$ =  CHR$(21)  THEN Y = Y -10: IF Y <0  THEN Y = 255 +Y
  246. 2470  IF A$ =  CHR$(60)  THEN Y = Y +1: IF Y >255  THEN Y = Y -255
  247. 2480  IF A$ =  CHR$(44)  THEN Y = Y +1: IF Y >255  THEN Y = Y -255
  248. 2490  IF A$ =  CHR$(46)  THEN Y = Y -1: IF Y <0  THEN Y = 255 +Y
  249. 2500  IF A$ =  CHR$(62)  THEN Y = Y -1: IF Y <0  THEN Y = 255 +Y
  250. 2510  IF A$ =  CHR$(45)  THEN STAR = STAR -1: IF STAR <0  THEN STAR = 0
  251. 2520  IF A$ =  CHR$(43)  THEN STAR = STAR +1: IF STAR >27  THEN STAR = 27
  252. 2530  IF A$ =  CHR$(59)  THEN STAR = STAR +1: IF STAR >27  THEN STAR = 27
  253. 2540  IF STAR >0  THEN  VTAB 4: HTAB 11 +STAR: INVERSE : PRINT  CHR$(42);: NORMAL 
  254. 2550  IF Y +STAR >255  THEN  POKE 3,Y +STAR -255: POKE 4,STAR: CALL 32512: GOTO 2380
  255. 2560  POKE 3,Y +STAR: POKE 4,STAR: CALL 32512
  256. 2570  GOTO 2380
  257. 2580  HOME : VTAB 4: HTAB 15: PRINT "ENTER DATA": VTAB 6: HTAB 15: PRINT "1) CUSTOM": VTAB 7: HTAB 15: PRINT "2) BY ROW": VTAB 8: HTAB 15: PRINT "3) BY COLUMN": VTAB 9: HTAB 15: PRINT "4) RANDOM"
  258. 2590  VTAB 10: HTAB 15: PRINT "5) LOAD FILE": VTAB 11: HTAB 15: PRINT "Q) TO QUIT"
  259. 2600  VTAB 13: HTAB 8: PRINT "          ": VTAB 13: HTAB 8: INVERSE : PRINT "WHICH ?";: NORMAL : GET A$
  260. 2610  IF A$ = "Q"  THEN 2140
  261. 2620 A =  VAL(A$): IF A <1  OR A >5  THEN 2600
  262. 2630  IF A = 5  THEN 1210
  263. 2640  ON A GOSUB 230,320,410,500
  264. 2650  GOTO 2140
  265. 2660  REM  --- PRINT OUT ---
  266. 2670  TEXT : HOME : VTAB 5: INPUT "ENTER STARTING COLUMN NUMBER ->";A$:S =  VAL(A$): IF S <1  OR S >NC  THEN 2670
  267. 2680  VTAB 6: CALL  -958: VTAB 7: HTAB 1: INPUT "ENTER ENDING COLUMN NUMBER ->";A$:E =  VAL(A$): IF E <S  OR E >NC  THEN 2680
  268. 2690  VTAB 8: CALL  -958: VTAB 9: HTAB 1: PRINT "ENTER STARTING ";: INVERSE : PRINT "ROW";: NORMAL : INPUT " NUMBER ->";A$:SY =  VAL(A$): IF SY <1  OR SY >NR  THEN 2690
  269. 2700  VTAB 10: CALL  -958: VTAB 11: HTAB 1: PRINT "ENTER ENDING ";: INVERSE : PRINT "ROW";: NORMAL : INPUT " NUMBER ->";A$:EY =  VAL(A$): IF EY <SY  OR EY >NR  THEN 2700
  270. 2710 SX = S:EX = E: HOME : VTAB 5: PRINT "STARTING COLUMN NUMBER = ";SX: PRINT : PRINT "ENDING COLUMN NUMBER = ";EX: PRINT : PRINT : PRINT "STARTING ";: INVERSE : PRINT "ROW";: NORMAL : PRINT " NUMBER = ";SY
  271. 2720  PRINT : PRINT "ENDING ";: INVERSE : PRINT "ROW";::: NORMAL : PRINT " NUMBER = ";EY
  272. 2730  VTAB 14: CALL  -958: VTAB 14: HTAB 1: PRINT "IS THIS CORRECT ?";: GET A$: PRINT A$: IF A$ < >"Y"  THEN 2330
  273. 2740  PRINT : PRINT  CHR$(4);"PR#1"
  274. 2750 TS = SX
  275. 2760 TE = TS -1:LL = 0: FOR I = TS TO EX
  276. 2770  IF TE < >I -1  THEN 2790
  277. 2780  IF LL + LEN(CL$(I)) <60  THEN LL = LL +1 + LEN(CL$(I)):TE = I
  278. 2800  PRINT "          ";:TC = 0: GOSUB 2850: PRINT 
  279. 2810  PRINT "          ";: FOR I = 1 TO LL +1: PRINT  CHR$(61);: NEXT I: PRINT 
  280. 2820  FOR TC = SY TO EY: PRINT RO$(TC);: GOSUB 2850: PRINT : NEXT TC
  281. 2830  IF TE > = EX  THEN  PRINT : PRINT  CHR$(4);"PR#0": HOME : GOTO 2330
  282. 2840 TS = TE +1: PRINT : GOTO 2760
  283. 2850 TL =  -1: FOR K = 1 TO TS -1:TL = TL +1 + LEN(CL$(K)): NEXT K
  284. 2860 TT = 32769 +(TC *256) +TL
  285. 2870  FOR J = TT TO TT +LL
  286. 2880  IF  PEEK(J) = 186  THEN  PRINT  CHR$(124);: NEXT J: RETURN 
  287. 2890  PRINT  CHR$( PEEK(J) -128);: NEXT J: RETURN