home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib31b.dsk / OUTLINER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  33KB  |  749 lines

  1. 10  REM  **********************
  2. 20  REM  *     OUTLINER       *
  3. 30  REM  *   BY ROYCE BACON   *
  4. 40  REM  * COPYRIGHT (C) 1987 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA  01742 *
  7. 70  REM  **********************
  8. 80  GOTO 1030
  9. 90  REM  --- GET A KEY PRESS ---
  10. 100 KEY =  PEEK(49152): IF KEY <128  THEN 100
  11. 110  POKE 49168,0:KEY$ =  CHR$(KEY -128)
  12. 120  RETURN 
  13. 130  REM  ----- GET FREE SPACE -----
  14. 140  IF  PEEK(48896) = 76  THEN  PRINT D$;"FRE":F = ( PEEK(111) +256 * PEEK(112)) -( PEEK(109) +256 * PEEK(110)): GOTO 160
  15. 150 F =  FRE(0)
  16. 160  VTAB 1: HTAB 36
  17. 170  PRINT  LEFT$( STR$(F) +BLNK$,5)
  18. 180  RETURN 
  19. 190  REM  ----- REDISPLAY THE SCREEN -----
  20. 200  NORMAL : HOME :RET = FALSE:QQ = NUM
  21. 210  FOR R = 0 TO 24:ROW(R) = 0: NEXT R:R = 0
  22. 220 NWK = NUM
  23. 230  IF LEV%(NWK) =  -1  THEN  RETURN 
  24. 240  GOSUB 280
  25. 250  IF RET  THEN  RETURN 
  26. 260 NWK = NWK +1: GOTO 230
  27. 270  REM  ----- DISPLAY ONE ITEM -----
  28. 280 OLINE$ = OLINE$(NWK):LEVEL = LEV%(NWK):T = LEVEL *2 +3
  29. 290  IF DIS%(NWK) = FALSE  THEN  RETURN 
  30. 300  IF ( LEN(OLINE$)/(WIDTH -T)) + PEEK(37) > PEEK(35) -2  THEN RET = TRUE: RETURN 
  31. 310 R = R +1:ROW(R) =  PEEK(37) +1
  32. 320  IF LEVEL >0  THEN  HTAB T -2
  33. 330  IF NWK = 0  THEN  PRINT "* ";: GOTO 360
  34. 340  IF LEV%(NWK +1) >LEVEL  THEN  PRINT "+ ";
  35. 350  IF LEV%(NWK +1) < = LEVEL  THEN  PRINT "- ";
  36. 360  IF  LEN(OLINE$) <WIDTH -T  THEN  PRINT OLINE$: GOTO 460
  37. 370 W2 = WIDTH -T:W1 = 1
  38. 380  IF W2 < = W1  THEN W2 = WIDTH -T +W1: GOTO 400
  39. 390  IF  MID$ (OLINE$,W2,1) < >" "  THEN W2 = W2 -1: GOTO 380
  40. 400  IF  PEEK(37) > PEEK(35) -2  THEN RET = TRUE: GOTO 460
  41. 410  PRINT  MID$ (OLINE$,W1,W2 -W1)
  42. 420 W1 = W2 +1:W2 = W2 +WIDTH -T
  43. 430  HTAB T
  44. 440  IF W2 > LEN(OLINE$)  THEN  PRINT  MID$ (OLINE$,W1): GOTO 460
  45. 450  GOTO 390
  46. 460  RETURN 
  47. 470  REM  ----- DISPLAY WAIT MSG -----
  48. 480  VTAB 23: HTAB 13: INVERSE 
  49. 490  PRINT BELL$" PLEASE WAIT "
  50. 500  NORMAL : RETURN 
  51. 510  REM  ----- GET THE LINE TO DO ACTION ON -----
  52. 520  IF  LEN(P$) <40  THEN P$ = " " +P$ +" ": GOTO 520
  53. 530  VTAB 22: PRINT : POKE 35,22: INVERSE : PRINT P$
  54. 540  VTAB 24: HTAB 2: PRINT "MOVE CURSOR TO LOCATION & PRESS RETURN";: NORMAL 
  55. 550  IF NUM <0  THEN NUM = 0: PRINT BELL$;
  56. 560  IF LEV%(NUM) =  -1  THEN NUM = NUM -1: PRINT BELL$;: GOTO 560
  57. 570  GOSUB 200:R = 1
  58. 580  VTAB 3: HTAB 1: POKE 49168,0
  59. 590  HTAB 2: INVERSE : PRINT ">";: NORMAL : GOSUB 100: HTAB 2: PRINT " ";
  60. 600  IF KEY$ =  CHR$(13)  THEN  POKE 35,24: RETURN 
  61. 610  IF KEY$ =  CHR$(27)  THEN  POKE 35,24: POP : RETURN 
  62. 620  IF KEY$ =  CHR$(8)  THEN  GOSUB 680: IF   NOT DIS  THEN 590
  63. 630  IF KEY$ =  CHR$(21)  THEN  GOSUB 730: IF   NOT DIS  THEN 590
  64. 640  IF KEY$ = "/"  OR KEY$ = "?"  OR KEY$ =  CHR$(10)  THEN  GOSUB 790: IF   NOT DIS  THEN 590
  65. 650  IF KEY$ = "-"  OR KEY$ = "="  OR KEY$ =  CHR$(11)  THEN  GOSUB 860: IF   NOT DIS  THEN 590
  66. 660  IF   NOT DIS  THEN  PRINT BELL$;: GOTO 590
  67. 670  GOTO 550
  68. 680 NUM = NUM -1: IF NUM <0  THEN NUM = 0: PRINT BELL$;: RETURN 
  69. 690  IF NUM >0  AND DIS%(NUM) = FALSE  THEN 680
  70. 700 R = R -1: IF R <1  THEN DIS = TRUE: RETURN 
  71. 710  IF ROW(R) < >0  THEN  VTAB (ROW(R)): HTAB 2:DIS = FALSE: RETURN 
  72. 720 DIS = TRUE: RETURN 
  73. 730 NUM = NUM +1: IF LEV%(NUM) =  -1  THEN NUM = NUM -1: PRINT BELL$;: RETURN 
  74. 740  IF DIS%(NUM) = FALSE  THEN 730
  75. 750 R = R +1
  76. 760 DIS = TRUE
  77. 770  IF R <25  AND ROW(R) < >0  THEN  VTAB (ROW(R)): HTAB 2:DIS = FALSE
  78. 780  RETURN 
  79. 790 X1 = NUM:DIS = FALSE
  80. 800 X1 = X1 +1: IF LEV%(X1) =  -1  THEN  PRINT BELL$;: RETURN 
  81. 810  IF DIS%(X1) = FALSE  THEN 800
  82. 820  IF R <24  THEN R = R +1: IF ROW(R) = 0  THEN DIS = TRUE
  83. 830  IF ROW(R) < >0  THEN  VTAB ROW(R): HTAB 1
  84. 840  IF LEV%(X1) = LEV%(NUM)  THEN NUM = X1: RETURN 
  85. 850  GOTO 800
  86. 860 X1 = NUM:DIS = FALSE
  87. 870 X1 = X1 -1: IF X1 <0  THEN  PRINT BELL$;: RETURN 
  88. 880  IF DIS%(X1) = FALSE  THEN 870
  89. 890 R = R -1: IF R <1  THEN DIS = TRUE
  90. 900  IF R >0  THEN  IF ROW(R) < >0  THEN  VTAB ROW(R): HTAB 1
  91. 910  IF LEV%(X1) = LEV%(NUM)  THEN NUM = X1: RETURN 
  92. 920  GOTO 870
  93. 930  REM  ----- GET A LINE -----
  94. 940  HTAB 2: & (OLINE$)
  95. 950 OLINE$ =  MID$ (OLINE$,1)
  96. 960  RETURN 
  97. 970  REM  ----- GET Y/N RESPONSE -----
  98. 980  INPUT "(Y/N) ";YN$
  99. 990 YN$ =  LEFT$(YN$,1): IF YN$ > CHR$(96)  THEN YN$ =  CHR$( ASC(YN$) -32)
  100. 1000  RETURN 
  101. 1010  REM 
  102. 1020  REM  ----- MAINLINE CONTROL ROUTINE -----
  103. 1030  GOSUB 6470: REM  INITIALIZATION
  104. 1040  HOME 
  105. 1050 C1 = 1
  106. 1060  POKE 49168,0: GOSUB 1120: REM  GET A COMMAND
  107. 1070  IF   NOT EXIT  THEN 1060
  108. 1080  TEXT : HOME : VTAB 12: HTAB 2
  109. 1090  PRINT "OUTLINER TERMINATED"
  110. 1100  POKE 216,0: END 
  111. 1110  REM  ----- GET A COMMAND -----
  112. 1120 T1 = (C1 -1) *10 +1
  113. 1130  IF T1 = 1  THEN T1 = 2
  114. 1140  VTAB 2: HTAB T1
  115. 1150  NORMAL : PRINT MENU$(C1,0);
  116. 1160  VTAB 2: HTAB T1
  117. 1170  GOSUB 100
  118. 1180  IF KEY$ =  CHR$(13)  THEN 1260
  119. 1190  IF KEY$ < > CHR$(8)  AND KEY$ < > CHR$(21)  AND KEY$ < > CHR$(10)  AND KEY$ < > CHR$(11)  THEN 1170
  120. 1200  VTAB 2: HTAB T1: INVERSE 
  121. 1210  PRINT MENU$(C1,0);
  122. 1220  IF KEY$ =  CHR$(8)  OR KEY$ =  CHR$(11)  THEN C1 = C1 -1: IF C1 <1  THEN C1 = N1
  123. 1230  IF KEY$ =  CHR$(21)  OR KEY$ =  CHR$(10)  THEN C1 = C1 +1: IF C1 >N1  THEN C1 = 1
  124. 1240  GOTO 1120
  125. 1250  REM  ----- DISPLAY MENU OPTIONS -----
  126. 1260  IF C1 >1  AND NAME$ = ""  THEN  PRINT BELL$;: GOTO 1120
  127. 1270  INVERSE 
  128. 1280  FOR C2 = 1 TO N2
  129. 1290  VTAB C2 +2: HTAB T1
  130. 1300  PRINT MENU$(C1,C2);
  131. 1310  NEXT C2
  132. 1320 C2 = 1
  133. 1330  VTAB C2 +2: HTAB T1: NORMAL 
  134. 1340  PRINT MENU$(C1,C2);: INVERSE 
  135. 1350  VTAB C2 +2: HTAB T1
  136. 1360  GOSUB 100
  137. 1370  IF KEY$ =  CHR$(13)  THEN 1460: REM  PROCESS THE COMMAND
  138. 1380  IF KEY$ =  CHR$(27)  OR KEY$ =  CHR$(9)  THEN  GOSUB 200: GOTO 1120
  139. 1390  VTAB C2 +2: HTAB T1: INVERSE : PRINT MENU$(C1,C2);
  140. 1400  IF KEY$ =  CHR$(21)  OR KEY$ =  CHR$(10)  THEN C2 = C2 +1: IF C2 >N2  THEN C2 = 1
  141. 1410  IF (KEY$ =  CHR$(21)  OR KEY$ =  CHR$(10))  AND MENU$(C1,C2) = ""  THEN C2 = 1
  142. 1420  IF KEY$ =  CHR$(8)  OR KEY$ =  CHR$(11)  THEN C2 = C2 -1: IF C2 <1  THEN C2 = N2
  143. 1430  IF MENU$(C1,C2) = ""  THEN C2 = C2 -1: GOTO 1430
  144. 1440  GOTO 1330
  145. 1450  REM  ----- PROCESS THE COMMAND -----
  146. 1460  NORMAL 
  147. 1470  ON C1 GOSUB 1530,1560,1600,1630
  148. 1480  GOSUB 140: REM  DISPLAY FREE SPACE
  149. 1490 NUM = QQ
  150. 1500  GOSUB 200: REM  REDISPLAY SCREEN
  151. 1510  RETURN 
  152. 1520  REM  ----- FILE MENU -----
  153. 1530  ON C2 GOSUB 1670,2000,2400,2690,3400,3650,3820
  154. 1540  RETURN 
  155. 1550  REM  ----- EDIT MENU -----
  156. 1560 CHG = TRUE
  157. 1570  ON C2 GOSUB 3890,4120,4270,4440,4490,4560
  158. 1580  RETURN 
  159. 1590  REM  ----- FORMAT MENU -----
  160. 1600  ON C2 GOSUB 4690,4750,4810,4880,4950,5030
  161. 1610  RETURN 
  162. 1620  REM  ----- SCROLL MENU -----
  163. 1630  ON C2 GOSUB 6260,6290,6350,6390,6430
  164. 1640 QQ = NUM
  165. 1650  RETURN 
  166. 1660  REM  ----- START A NEW OUTLINE -----
  167. 1670  IF   NOT CHG  THEN 1710
  168. 1680  VTAB 21: PRINT 
  169. 1690  PRINT BELL$;"DO YOU WANT TO ERASE OLD OUTLINE?": GOSUB 980
  170. 1700  IF YN$ < >"Y"  AND YN$ < > CHR$(121)  THEN  RETURN 
  171. 1710 EF = 1: ONERR  GOTO 1810
  172. 1720  HOME : VTAB 20: PRINT 
  173. 1730  PRINT "ENTER NAME OF OUTLINE:": INPUT JUNK$
  174. 1740  IF JUNK$ = ""  THEN  RETURN 
  175. 1750 NAME$ = JUNK$
  176. 1760  PRINT : PRINT D$;"VERIFY ";NAME$
  177. 1770  ONERR  GOTO 7320
  178. 1780  PRINT BELL$;"THAT OUTLINE EXISTS ALREADY, OK TO REUSE": GOSUB 980
  179. 1790  IF YN$ < >"Y"  AND YN$ < > CHR$(121)  THEN 1710
  180. 1800  GOTO 1860
  181. 1810  ONERR  GOTO 7320
  182. 1820 ER =  PEEK(222): CALL 768
  183. 1830  IF ER = 6  OR ER = 7  THEN 1860: REM  FILE NOT THERE
  184. 1840  IF ER < >11  AND ER < >16  THEN 7330
  185. 1850  PRINT BELL$;"INVALID FILE NAME": INPUT "PRESS RETURN TO CONTINUE ";JUNK$: GOTO 1710
  186. 1860  VTAB 1: HTAB 2
  187. 1870  FOR COL = 1 TO 28: PRINT " ";: NEXT COL
  188. 1880  VTAB 1: HTAB 2: PRINT NAME$;
  189. 1890  VTAB 22: PRINT : PRINT "ENTER TITLE FOR OUTLINE: ": INPUT OLINE$(0)
  190. 1900  HOME : GOSUB 480
  191. 1910  FOR Z = 1 TO 300
  192. 1920 OLINE$(Z) = "":LEV%(Z) =  -1:TXT$(Z) = "":DIS%(Z) = TRUE
  193. 1930  NEXT Z
  194. 1940 CHG = FALSE:NUM = 1:MAX = 1
  195. 1950 LEV%(0) = 0
  196. 1960 OLINE$(1) = "***** END OF " +NAME$ +" *****"
  197. 1970 LEV%(1) = 0:NUM = 0
  198. 1980  RETURN 
  199. 1990  REM  ----- EDIT AND OLD OUTLINE -----
  200. 2000  IF   NOT CHG  THEN 2040
  201. 2010  VTAB 21: CALL  -958: PRINT 
  202. 2020  PRINT BELL$;"DO YOU WANT TO ERASE OLD OUTLINE?": GOSUB 980
  203. 2030  IF YN$ < >"Y"  AND YN$ < > CHR$(121)  THEN  RETURN 
  204. 2040 EF = 2: ONERR  GOTO 7320
  205. 2050  HOME : PRINT : PRINT D$; LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76))
  206. 2060  PRINT : INPUT "ENTER NAME OF FILE: ";JUNK$
  207. 2070  IF JUNK$ = ""  THEN  RETURN 
  208. 2080 NAME$ = JUNK$
  209. 2090  ONERR  GOTO 2340
  210. 2100  PRINT : PRINT D$;"VERIFY ";NAME$
  211. 2110  ONERR  GOTO 7320
  212. 2120  PRINT D$;"OPEN ";NAME$
  213. 2130  HOME : VTAB 12: HTAB 5: PRINT "READING OUTLINE-PLEASE WAIT"
  214. 2140  PRINT D$;"READ ";NAME$:RW% = TRUE
  215. 2150  INPUT MAX
  216. 2160  FOR Z1 = 0 TO MAX
  217. 2170  INPUT LEV%(Z1): INPUT OLINE$(Z1): INPUT TXT$(Z1):DIS%(Z1) = TRUE
  218. 2180  NEXT Z1
  219. 2190  FOR Z1 = 0 TO 3
  220. 2200  INPUT P1%(Z1): INPUT P2%(Z1): INPUT P3%(Z1): INPUT P4$(Z1,0): INPUT P4$(Z1,1): INPUT P5$(Z1): INPUT P6$(Z1)
  221. 2210  NEXT Z1
  222. 2220  INPUT P7$: INPUT P8%: INPUT P9%(1): INPUT P9%(2): INPUT P9$
  223. 2230  PRINT D$;"CLOSE":RW% = FALSE
  224. 2240  HOME : GOSUB 480
  225. 2250 NUM = 0
  226. 2260  VTAB 1: HTAB 2
  227. 2270  FOR COL = 1 TO 28: PRINT " ";: NEXT COL
  228. 2280  VTAB 1: HTAB 2: PRINT NAME$;
  229. 2290  FOR Z = MAX +1 TO 300
  230. 2300 OLINE$(Z) = "":LEV%(Z) =  -1:TXT$(Z) = "":DIS%(Z) = TRUE
  231. 2310  NEXT Z
  232. 2320 CHG = FALSE
  233. 2330  RETURN 
  234. 2340  ONERR  GOTO 7320
  235. 2350  IF  PEEK(222) < >6  AND  PEEK(222) < >7  THEN 7320
  236. 2360  CALL 768
  237. 2370  PRINT BELL$;"THAT FILE DOES NOT EXIST"
  238. 2380  GOTO 2060
  239. 2390  REM  ----- SAVE AN OUTLINE -----
  240. 2400  IF NAME$ = ""  THEN  PRINT BELL$: RETURN 
  241. 2410  GOTO 2430
  242. 2420  PRINT BELL$;"CANCEL SAVE OPERATION ";: GOSUB 980: IF YN$ = "Y"  OR YN$ =  CHR$(121)  THEN  RETURN 
  243. 2430 EF = 3: ONERR  GOTO 2510
  244. 2440  HOME 
  245. 2450  PRINT : PRINT D$;"VERIFY ";NAME$
  246. 2460  ONERR  GOTO 7320
  247. 2470  PRINT BELL$;NAME$" ALREADY EXISTS": PRINT "OK TO DELETE IT ";: GOSUB 980
  248. 2480  IF YN$ < >"Y"  AND YN$ < > CHR$(121)  THEN  RETURN 
  249. 2490  PRINT D$;"DELETE ";NAME$
  250. 2500  GOTO 2540
  251. 2510  IF  PEEK(222) < >6  AND  PEEK(222) < >7  THEN 7320
  252. 2520  CALL 768
  253. 2530  ONERR  GOTO 7320
  254. 2540  PRINT D$;"OPEN ";NAME$
  255. 2550  HOME : VTAB 12: HTAB 5: PRINT "SAVING OUTLINE-PLEASE WAIT"
  256. 2560  PRINT D$;"WRITE ";NAME$:RW% = TRUE
  257. 2570  PRINT MAX
  258. 2580  FOR Z1 = 0 TO MAX
  259. 2590  PRINT LEV%(Z1): PRINT  CHR$(34) +OLINE$(Z1): PRINT  CHR$(34) +TXT$(Z1)
  260. 2600  NEXT Z1
  261. 2610  FOR Z1 = 0 TO 3
  262. 2620  PRINT P1%(Z1): PRINT P2%(Z1): PRINT P3%(Z1): PRINT P4$(Z1,0): PRINT P4$(Z1,1): PRINT P5$(Z1): PRINT P6$(Z1)
  263. 2630  NEXT Z1
  264. 2640  PRINT P7$: PRINT P8%: PRINT P9%(1): PRINT P9%(2): PRINT P9$
  265. 2650  PRINT D$;"CLOSE":RW% = FALSE
  266. 2660 CHG = FALSE
  267. 2670  RETURN 
  268. 2680  REM  ----- PRINT AN OUTLINE -----
  269. 2690  IF NAME$ = ""  THEN  PRINT BELL$: RETURN 
  270. 2700  HOME 
  271. 2710  PRINT "ALIGN PRINTER AT TOP OF FORM": INPUT "PRESS RETURN WHEN READY";JUNK$
  272. 2720  PRINT : PRINT "PRESS <ESC> TO STOP PRINTING"
  273. 2730 T1$ = "A":T2 = 1:T3$ =  CHR$(97):PC = 1:LAST% = FALSE
  274. 2740  PRINT : PRINT D$;"PR#";PP%
  275. 2750  PRINT  CHR$(9);"80N"
  276. 2760 PW = P3%(0) -2 *P2%(0):LM = P2%(0)
  277. 2770  PRINT P6$;P4$(0,0);
  278. 2780  FOR LC = 1 TO P9%(1): PRINT : NEXT LC
  279. 2790  IF  LEN(OLINE$(0)) >PW  THEN  PRINT  TAB( LM);OLINE$(0): GOTO 2810
  280. 2800  PRINT  TAB( LM + INT((PW - LEN(OLINE$(0)))/2));OLINE$(0)
  281. 2810  PRINT P6$;P4$(0,1);
  282. 2820 LC = P9%(1) +5
  283. 2830  FOR NWK = 1 TO MAX
  284. 2840  IF  PEEK( -16384) = 27 +128  THEN NWK = MAX: POKE 49168,0: GOTO 3100
  285. 2850 TX = FALSE
  286. 2860 L2 = LEV%(NWK) +1: IF L2 >3  THEN L2 = 3
  287. 2870 OLINE$ = OLINE$(NWK):LEVEL = LEV%(NWK):T = LEVEL *2 +3 +P2%(L2):PW = P3%(L2) -P2%(L2) -T
  288. 2880  IF P5$(L2) = "N"  THEN 3090
  289. 2890  IF OLINE$ = "/PAGE"  THEN  GOSUB 3160: GOTO 3100
  290. 2900  IF LC +P1%(L2) +( LEN(OLINE$)/PW) >P8% -P9%(1) -P9%(2)  THEN  GOSUB 3160: GOTO 2920
  291. 2910  IF P1%(L2) >1  THEN  FOR ZZ = 2 TO P1%(L2): PRINT :LC = LC +1: NEXT ZZ
  292. 2920  IF (P7$ = "Y"  OR P7$ =  CHR$(121))  AND LEVEL <3  THEN  GOSUB 3250: GOTO 2970
  293. 2930  IF P7$ = "Y"  OR P7$ =  CHR$(121)  THEN T = T +3
  294. 2940  PRINT  TAB( T -2);P6$;P4$(L2,0);
  295. 2950  IF LEV%(NWK +1) >LEVEL  THEN  PRINT "+ ";
  296. 2960  IF LEV%(NWK +1) < = LEVEL  THEN  PRINT "- ";
  297. 2970  IF  LEN(OLINE$) <PW  THEN  PRINT OLINE$:LC = LC +1: GOTO 3060
  298. 2980 W2 = PW:W1 = 1
  299. 2990  IF W2 < = W1  THEN W2 = PW +W1: GOTO 3010
  300. 3000  IF  MID$ (OLINE$,W2,1) < >" "  THEN W2 = W2 -1: GOTO 2990
  301. 3010  PRINT  MID$ (OLINE$,W1,W2 -W1):LC = LC +1
  302. 3020 W1 = W2 +1:W2 = W2 +PW
  303. 3030  PRINT P6$;P4$(L2,1); TAB( T);P4$(L2,0);
  304. 3040  IF W2 > LEN(OLINE$)  THEN  PRINT  MID$ (OLINE$,W1):LC = LC +1: GOTO 3060
  305. 3050  GOTO 3000
  306. 3060  IF P6$(L2) = "N"  OR TXT$(NWK) = ""  THEN 3090
  307. 3070  IF TX  THEN 3090
  308. 3080 TX = TRUE:OLINE$ = TXT$(NWK): PRINT  TAB( T);"* ";:T = T +2: GOTO 2970
  309. 3090  PRINT P6$;P4$(L2,1);
  310. 3100  NEXT NWK
  311. 3110 LAST% = TRUE: GOSUB 3160
  312. 3120  PRINT : PRINT D$;"PR#";P3%
  313. 3130  GOSUB 7090: VTAB 1: HTAB 2: PRINT NAME$;: VTAB 12
  314. 3140  RETURN 
  315. 3150  REM  ----- NEW PAGE ROUTINE -----
  316. 3160  IF P9$ = "N"  THEN 3190
  317. 3170  IF LC <P8% -3  THEN  FOR X2 = LC TO P8% -3: PRINT : NEXT X2
  318. 3180  PRINT P4$(0,0); TAB(  INT(P3%(0)/2));"-";PC;"-";P6$;P4$(0,1)
  319. 3190  PRINT  CHR$(12):PC = PC +1: IF LAST%  THEN 3230
  320. 3200  FOR LC = 1 TO P9%(1)
  321. 3210  PRINT 
  322. 3220  NEXT LC
  323. 3230  RETURN 
  324. 3240  REM  --- NUMBER TOPICS ---
  325. 3250 T = T +LEVEL +1
  326. 3260  PRINT  TAB( T -3);P4$(L2,0);
  327. 3270  IF LEVEL < >0 GOTO 3320
  328. 3280  IF TN  THEN  FOR I = 1 TO TN: PRINT T1$;: NEXT 
  329. 3290  PRINT T1$;". ";:T2 = 1
  330. 3300  IF T1$ < CHR$(90)  THEN T1$ =  CHR$( ASC(T1$) +1): RETURN 
  331. 3310 T1$ = "A":TN = TN +1: RETURN 
  332. 3320  IF LEVEL = 1  THEN  PRINT T2;". ";:TQ = 0:T2 = T2 +1:T3$ =  CHR$(97): RETURN 
  333. 3330  IF LEVEL < >2 GOTO 3380
  334. 3340  IF TQ  THEN  FOR I = 1 TO TQ: PRINT T3$;: NEXT 
  335. 3350  PRINT T3$;". ";
  336. 3360  IF T3$ < CHR$(122)  THEN T3$ =  CHR$( ASC(T3$) +1): RETURN 
  337. 3370 T3$ =  CHR$(97):TQ = TQ +1: RETURN 
  338. 3380  RETURN 
  339. 3390  REM  ----- MERGE ANOTHER OUTLINE -----
  340. 3400  IF NAME$ = ""  THEN  PRINT BELL$: RETURN 
  341. 3410 P$ = "INDICATE ITEM TO ADD AFTER": GOSUB 520
  342. 3420 EF = 4: ONERR  GOTO 7320
  343. 3430  HOME : PRINT : PRINT D$; LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76)): PRINT 
  344. 3440  INPUT "ENTER NAME OF FILE: ";N1$
  345. 3450  IF N1$ = ""  THEN  RETURN 
  346. 3460  ONERR  GOTO 3600
  347. 3470  PRINT D$;"OPEN ";N1$: PRINT D$;"READ ";N1$:RW% = TRUE
  348. 3480  HOME : VTAB 12: HTAB 5: PRINT "READING OUTLINE-PLEASE WAIT"
  349. 3490  ONERR  GOTO 7320
  350. 3500  INPUT M2
  351. 3510  IF M2 +MAX >298  THEN  GOSUB 4080:M2 = 0: GOTO 3580
  352. 3520  FOR Z1 = MAX TO NUM +1  STEP  -1
  353. 3530 OLINE$(Z1 +M2 -1) = OLINE$(Z1):LEV%(Z1 +M2 -1) = LEV%(Z1):TXT$(Z1 +M2 -1) = TXT$(Z1):DIS%(Z1 +M2 -1) = DIS%(Z1)
  354. 3540  NEXT Z1: INPUT JUNK$: INPUT JUNK$: INPUT JUNK$
  355. 3550  FOR Z1 = NUM +1 TO NUM +M2 -1
  356. 3560  INPUT LEV%(Z1): INPUT OLINE$(Z1): INPUT TXT$(Z1):DIS%(Z1) = TRUE
  357. 3570  NEXT Z1
  358. 3580  PRINT D$;"CLOSE":MAX = MAX +M2 -1:RW% = FALSE
  359. 3590 CHG = TRUE: RETURN 
  360. 3600  ONERR  GOTO 7320
  361. 3610  IF  PEEK(222) < >6  AND  PEEK(222) < >7  THEN 7320
  362. 3620  CALL 768
  363. 3630  PRINT BELL$"THAT FILE DOES NOT EXIST": GOTO 3420
  364. 3640  REM  ----- DISK COMMANDS -----
  365. 3650 EF = 5: ONERR  GOTO 3750
  366. 3660  POKE 35,24: HOME 
  367. 3670  VTAB 22: PRINT : INVERSE 
  368. 3680  PRINT "ENTER DISK COMMAND(S) - <RETURN> TO EXIT"
  369. 3690  NORMAL : POKE 35,22: HOME 
  370. 3700 OLINE$ = "": GOSUB 940:CMD$ = OLINE$
  371. 3710  IF CMD$ = ""  THEN 3790
  372. 3720  PRINT D$;CMD$
  373. 3730  ONERR  GOTO 7320
  374. 3740  GOTO 3700
  375. 3750  CALL 768
  376. 3760  POKE 35,24: HOME :ER =  PEEK(222): VTAB 23: PRINT : INVERSE : PRINT BELL$"DISK ERROR ";ER;" ENCOUNTERED-PRESS <RETURN> ";: NORMAL : GET JUNK$: PRINT 
  377. 3770  ONERR  GOTO 7320
  378. 3780  GOTO 3650
  379. 3790  POKE 35,24: HOME 
  380. 3800  RETURN 
  381. 3810  REM  ----- EXIT TO BASIC -----
  382. 3820 EXIT = TRUE
  383. 3830  IF   NOT CHG  THEN 3870
  384. 3840  VTAB 20: PRINT : CALL  -958: PRINT 
  385. 3850  PRINT BELL$;"DO YOU WANT TO EXIT WITHOUT SAVING THIS": PRINT "OUTLINE? ";: GOSUB 980
  386. 3860  IF YN$ < >"Y"  AND YN$ < > CHR$(121)  THEN EXIT = FALSE
  387. 3870  RETURN 
  388. 3880  REM  ----- ADD A TOPIC -----
  389. 3890 CHG = TRUE:N9 = NUM:OM = FALSE
  390. 3900 P$ = "INDICATE LINE TO ADD AFTER"
  391. 3910  GOSUB 520: REM  GET LINE TO ADD AFTER
  392. 3920 N9 = NUM:NWK = NUM: HOME : GOSUB 280
  393. 3930 OLINE$ = ""
  394. 3940  IF F <500  OR MAX >298  THEN  GOSUB 4080: GOTO 4070
  395. 3950  GOSUB 940: REM  GET A LINE
  396. 3960 LEV% = 0
  397. 3970  IF  LEFT$(OLINE$,1) = "."  THEN LEV% = LEV% +1:OLINE$ =  MID$ (OLINE$,2): GOTO 3970
  398. 3980  IF OLINE$ = ""  THEN 4070
  399. 3990  FOR Z1 = MAX TO NUM +1  STEP  -1
  400. 4000 OLINE$(Z1 +1) = OLINE$(Z1):LEV%(Z1 +1) = LEV%(Z1):DIS%(Z1 +1) = DIS%(Z1):TXT$(Z1 +1) = TXT$(Z1)
  401. 4010  NEXT Z1
  402. 4020 LEV%(NUM +1) = LEV%
  403. 4030 OLINE$(NUM +1) = OLINE$:DIS%(NUM +1) = TRUE:TXT$(NUM +1) = ""
  404. 4040 NUM = NUM +1:MAX = MAX +1
  405. 4050 LEV% = LEV%(NUM):OLINE$ = "": IF LEV% >0  THEN  FOR Z7 = 1 TO LEV%:OLINE$ = OLINE$ +".": NEXT Z7
  406. 4060  GOTO 3940
  407. 4070 NUM = N9: RETURN 
  408. 4080  VTAB 23: HTAB 1: INVERSE : PRINT BELL$"OUT OF MEMORY-PRESS <RETURN> TO CONTINUE";: NORMAL :OM = TRUE
  409. 4090  GET JUNK$: PRINT : IF JUNK$ < > CHR$(13)  THEN 4090
  410. 4100  RETURN 
  411. 4110  REM  ----- DELETE A TOPIC -----
  412. 4120 P$ = "INDICATE TOPIC TO DELETE"
  413. 4130 N9 = NUM: GOSUB 520: REM  GET LINE TO DELETE
  414. 4140  IF NUM = 0  THEN  PRINT BELL$;: GOTO 4250
  415. 4150 N8 = NUM +1
  416. 4160  IF LEV%(N8) >LEV%(NUM)  THEN N8 = N8 +1: GOTO 4160
  417. 4170 N8 = N8 -NUM
  418. 4180  FOR Z1 = NUM TO MAX -N8
  419. 4190 OLINE$(Z1) = OLINE$(Z1 +N8):LEV%(Z1) = LEV%(Z1 +N8):TXT$(Z1) = TXT$(Z1 +N8):DIS%(Z1) = DIS%(Z1 +N8)
  420. 4200  NEXT Z1
  421. 4210  FOR Z1 = MAX -N8 +1 TO MAX
  422. 4220 OLINE$(Z1) = "":LEV%(Z1) =  -1:DIS%(Z1) = TRUE:TXT$(Z1) = ""
  423. 4230  NEXT Z1
  424. 4240 MAX = MAX -N8:NUM = NUM -1:OM = FALSE
  425. 4250  RETURN 
  426. 4260  REM  ----- COPY A TOPIC -----
  427. 4270 P$ = "INDICATE TOPIC TO COPY"
  428. 4280 N9 = NUM: GOSUB 520: REM  GET TOPIC TO COPY
  429. 4290 N8 = 1:OM = FALSE
  430. 4300  IF LEV%(NUM +N8) >LEV%(NUM)  THEN N8 = N8 +1: GOTO 4300
  431. 4310  IF MAX +N8 >298  THEN  GOSUB 4080: RETURN 
  432. 4320 P$ = "INDICATE LINE TO COPY AFTER"
  433. 4330 NSV = NUM:N9 = NUM: GOSUB 520: REM  GET TOPIC TO COPY AFTER
  434. 4340  FOR Z1 = MAX TO NUM +1  STEP  -1
  435. 4350 OLINE$(Z1 +N8) = OLINE$(Z1):LEV%(Z1 +N8) = LEV%(Z1):DIS%(Z1 +N8) = DIS%(Z1):TXT$(Z1 +N8) = TXT$(Z1)
  436. 4360  NEXT Z1
  437. 4370  IF NUM <NSV  THEN NSV = NSV +N8
  438. 4380  FOR Z1 = 0 TO N8 -1
  439. 4390 OLINE$(NUM +Z1 +1) = OLINE$(NSV +Z1):LEV%(NUM +Z1 +1) = LEV%(NSV +Z1):DIS%(NUM +Z1 +1) = DIS%(NSV +Z1):TXT$(NUM +Z1 +1) = TXT$(NSV +Z1)
  440. 4400  NEXT Z1
  441. 4410 MAX = MAX +N8
  442. 4420  RETURN 
  443. 4430  REM  ----- MOVE A TOPIC -----
  444. 4440  GOSUB 4270: IF OM  THEN  RETURN : REM  DO A COPY
  445. 4450 NUM = NSV: REM  GET TOPIC TO DELETE
  446. 4460  GOSUB 4180: REM  DELETE IT
  447. 4470  RETURN 
  448. 4480  REM  ----- ADD TEXT TO A TOPIC -----
  449. 4490 P$ = "INDICATE TOPIC TO ADD TEXT TO"
  450. 4500 N9 = NUM: GOSUB 520: REM  GET TOPIC TO ADD TO
  451. 4510 NWK = NUM: HOME : GOSUB 280
  452. 4520 OLINE$ = TXT$(NUM): GOSUB 940: REM  GET THE TEXT
  453. 4530 TXT$(NUM) = OLINE$
  454. 4540  RETURN 
  455. 4550  REM  ----- EDIT A TOPIC -----
  456. 4560 N9 = NUM
  457. 4570 P$ = "INDICATE ITEM TO EDIT"
  458. 4580  GOSUB 520: REM  GET LINE TO CHANGE
  459. 4590 N9 = NUM:NWK = NUM: HOME : PRINT " ";
  460. 4600 OLINE$ = OLINE$(NUM)
  461. 4610  IF LEV%(NUM) >0  THEN  FOR T = 1 TO LEV%(NUM):OLINE$ = "." +OLINE$: NEXT T
  462. 4620  VTAB 3: HTAB 1
  463. 4630  GOSUB 940
  464. 4640 LEV%(NUM) = 0
  465. 4650  IF  LEFT$(OLINE$,1) = "."  THEN LEV%(NUM) = LEV%(NUM) +1:OLINE$ =  MID$ (OLINE$,2): GOTO 4650
  466. 4660 OLINE$(NUM) = OLINE$
  467. 4670  RETURN 
  468. 4680  REM  ----- EXPAND A TOPIC -----
  469. 4690 P$ = "INDICATE TOPIC TO EXPAND"
  470. 4700  GOSUB 520: REM  GET TOPIC
  471. 4710 Z1 = NUM +1
  472. 4720  IF LEV%(Z1) >LEV%(NUM)  THEN DIS%(Z1) = TRUE:Z1 = Z1 +1: GOTO 4720
  473. 4730  RETURN 
  474. 4740  REM  ----- COMPRESS A TOPIC -----
  475. 4750 P$ = "INDICATE TOPIC TO COMPRESS"
  476. 4760  GOSUB 520: REM  GET TOPIC
  477. 4770 Z1 = NUM +1
  478. 4780  IF LEV%(Z1) >LEV%(NUM)  THEN DIS%(Z1) = FALSE:Z1 = Z1 +1: GOTO 4780
  479. 4790  RETURN 
  480. 4800  REM  ----- EXPAND A LEVEL -----
  481. 4810  VTAB 21: PRINT : CALL  -958
  482. 4820  INPUT "ENTER LEVEL NUMBER TO EXPAND: ";JUNK$: ON JUNK$ = "" GOTO 4860:LEVEL =  VAL(JUNK$)
  483. 4830  FOR Z1 = 1 TO MAX
  484. 4840  IF LEV%(Z1) = LEVEL  THEN DIS%(Z1) = TRUE
  485. 4850  NEXT Z1
  486. 4860  RETURN 
  487. 4870  REM  ----- COMPRESS A LEVEL -----
  488. 4880  VTAB 21: PRINT : CALL  -958
  489. 4890  INPUT "ENTER LEVEL NUMBER TO COMPRESS: ";JUNK$: ON JUNK$ = "" GOTO 4930:LEVEL =  VAL(JUNK$)
  490. 4900  FOR Z1 = 1 TO MAX
  491. 4910  IF LEV%(Z1) =  >LEVEL  THEN DIS%(Z1) = FALSE
  492. 4920  NEXT Z1
  493. 4930  RETURN 
  494. 4940  REM  ----- DISPLAY TEXT FOR A TOPIC -----
  495. 4950 P$ = "INDICATE ITEM TO DISPLAY TEXT FOR"
  496. 4960  GOSUB 520
  497. 4970  HOME :NWK = NUM: GOSUB 280
  498. 4980 OLINE$ = TXT$(NUM):T = 1
  499. 4990  GOSUB 360
  500. 5000  VTAB 23: HTAB 2: INPUT "PRESS <RETURN> TO CONTINUE ";JUNK$
  501. 5010  RETURN 
  502. 5020  REM  ----- SET PRINT OPTIONS -----
  503. 5030 CHG = TRUE:EF = 7: ONERR  GOTO 7320
  504. 5040  HOME 
  505. 5050  PRINT "SLOT NUMBER FOR PRINTER:";
  506. 5060  VTAB 3: HTAB 30: PRINT PP%;" (0-7)";
  507. 5070  HTAB 30: INPUT "";JUNK$: IF JUNK$ = ""  THEN JUNK$ =  STR$(PP%)
  508. 5080  IF ( VAL(JUNK$) <0  OR  VAL(JUNK$) >7)  OR (JUNK$ <"0"  OR JUNK$ >"7")  THEN  PRINT BELL$;"SLOT MUST BE 0-7": GOTO 5060
  509. 5090 PP% =  VAL(JUNK$)
  510. 5100  FOR LL = 0 TO 3
  511. 5110 XF = 0: GOSUB 5490: IF XF  THEN LL = 3: NEXT LL: RETURN : REM  SET OPTIONS FOR LEVEL LL
  512. 5120  NEXT LL
  513. 5130  HOME : PRINT "NUMBER TOPICS?:";
  514. 5140  VTAB 3: HTAB 30: PRINT P7$;" (Y/N)";
  515. 5150  HTAB 30: INPUT "";JUNK$: IF JUNK$ = ""  THEN JUNK$ = P7$: VTAB 3: HTAB 30: PRINT JUNK$
  516. 5160  IF JUNK$ > CHR$(96)  THEN JUNK$ =  CHR$( ASC(JUNK$) -32)
  517. 5170  IF JUNK$ < >"Y"  AND JUNK$ < >"N"  AND JUNK$ < > CHR$(121)  AND JUNK$ < > CHR$(110)  THEN  PRINT BELL$;"PLEASE ENTER 'Y' OR 'N'";: GOTO 5140
  518. 5180 P7$ = JUNK$
  519. 5190  CALL  -958
  520. 5200  PRINT : PRINT "ENTER PAGE LENGTH (INCLUDING TOP AND": PRINT "BOTTOM MARGINS:";
  521. 5210  VTAB 6: HTAB 30: PRINT P8%;" (5-999)";
  522. 5220  VTAB 6: HTAB 30: INPUT "";JUNK$
  523. 5230  IF JUNK$ = ""  THEN JUNK$ =  STR$(P8%): VTAB 6: HTAB 30: PRINT JUNK$
  524. 5240  IF  VAL(JUNK$) <5  THEN  PRINT BELL$;"PAGE LENGTH MUST BE > 5";: GOTO 5210
  525. 5250 P8% =  VAL(JUNK$)
  526. 5260  CALL  -958
  527. 5270  PRINT : PRINT "ENTER NUMBER OF LINES IN TOP ": PRINT " MARGIN:";
  528. 5280  VTAB 9: HTAB 30: PRINT P9%(1);" (1-"; INT(P8%/2);")";
  529. 5290  VTAB 9: HTAB 30: INPUT "";JUNK$
  530. 5300  IF JUNK$ = ""  THEN JUNK$ =  STR$(P9%(1)): VTAB 9: HTAB 30: PRINT JUNK$
  531. 5310  IF  VAL(JUNK$) <1  OR  VAL(JUNK$) >P8%/2  THEN  PRINT BELL$;"MARGIN MUST BE > 0 AND < "; INT(P8%/2) +1;: GOTO 5280
  532. 5320 P9%(1) =  VAL(JUNK$)
  533. 5330  CALL  -958
  534. 5340  PRINT : PRINT "ENTER NUMBER OF LINES IN BOTTOM": PRINT " MARGIN:";
  535. 5350  VTAB 12: HTAB 30: PRINT P9%(2);" (1-"; INT(P8%/2);")";
  536. 5360  VTAB 12: HTAB 30: INPUT "";JUNK$
  537. 5370  IF JUNK$ = ""  THEN JUNK$ =  STR$(P9%(2)): VTAB 12: HTAB 30: PRINT JUNK$
  538. 5380  IF  VAL(JUNK$) <1  OR  VAL(JUNK$) >P8%/2  THEN  PRINT BELL$;"MARGIN MUST BE > 0 AND < "; INT(P8%/2) +1;: GOTO 5350
  539. 5390 P9%(2) =  VAL(JUNK$)
  540. 5400  CALL  -958: PRINT : PRINT "PRINT PAGE NUMBERS";: HTAB 30: PRINT P9$;" (Y/N)"
  541. 5410  VTAB 14: HTAB 30: INPUT "";JUNK$
  542. 5420  IF JUNK$ = ""  THEN JUNK$ = P9$: VTAB 14: HTAB 30: PRINT JUNK$;
  543. 5430  IF JUNK$ > CHR$(96)  THEN JUNK$ =  CHR$( ASC(JUNK$) -32)
  544. 5440  IF JUNK$ < >"Y"  AND JUNK$ < >"N"  AND JUNK$ < > CHR$(121)  AND JUNK$ < > CHR$(110)  THEN  PRINT BELL$;"PLEASE ENTER Y OR N": GOTO 5410
  545. 5450 P9$ = JUNK$: PRINT :Z8 =  PEEK(37): PRINT "ARE ABOVE OPTIONS CORRECT (Y/N)? ";: INVERSE : PRINT "N" CHR$(8);: NORMAL : POKE  -16368,0: WAIT  -16384,128:YN =  PEEK( -16384) -128: POKE  -16368,0: PRINT 
  546. 5460  ON YN = 110  OR YN = 78  OR YN = 13 GOTO 5130: IF YN < >121  AND YN < >89  THEN  VTAB Z8: PRINT  CHR$(7);: GOTO 5450
  547. 5470  GOSUB 480: RETURN 
  548. 5480  REM  ----- SET PRINT OPTIONS FOR A LEVEL -----
  549. 5490  HOME : PRINT "PRINT OPTIONS FOR ";
  550. 5500  IF LL = 0  THEN  PRINT "HEADINGS": GOTO 5520
  551. 5510  PRINT "LEVEL ";LL
  552. 5520  PRINT "SPACING:";
  553. 5530  VTAB 4: HTAB 30: PRINT P1%(LL);" (1-5)";
  554. 5540  VTAB 4: HTAB 30: INPUT "";JUNK$
  555. 5550  IF JUNK$ = ""  THEN JUNK$ =  STR$(P1%(LL)): VTAB 4: HTAB 30: PRINT JUNK$
  556. 5560  IF  VAL(JUNK$) <1  OR  VAL(JUNK$) >5  THEN  PRINT BELL$;"SPACING MUST BE 1-5";: GOTO 5530
  557. 5570 P1%(LL) =  VAL(JUNK$)
  558. 5580  PRINT "MARGINS:";: CALL  -958
  559. 5590  VTAB 5: HTAB 30: PRINT P2%(LL);" (0-40)";
  560. 5600  VTAB 5: HTAB 30: INPUT "";JUNK$
  561. 5610  IF JUNK$ = ""  THEN JUNK$ =  STR$(P2%(LL)): VTAB 5: HTAB 30: PRINT JUNK$
  562. 5620  IF  VAL(JUNK$) <0  OR  VAL(JUNK$) >40  OR JUNK$ >"9"  THEN  PRINT BELL$;"MARGINS MUST BE 1-40": GOTO 5590
  563. 5630 P2%(LL) =  VAL(JUNK$)
  564. 5640  CALL  -958
  565. 5650  PRINT "LINE LENGTH": PRINT "(INCLUDING BOTH MARGINS):";
  566. 5660  VTAB 7: HTAB 30: PRINT P3%(LL);" (";P2%(LL) +1;"-255)";
  567. 5670  VTAB 7: HTAB 30: INPUT "";JUNK$
  568. 5680  IF JUNK$ = ""  THEN JUNK$ =  STR$(P3%(LL)): VTAB 7: HTAB 30: PRINT JUNK$
  569. 5690  IF  VAL(JUNK$) < = P2%(LL)  OR  VAL(JUNK$) >255  THEN  PRINT BELL$;"LINE LENGTH MUST BE ";P2%(LL) +1;"-255";: GOTO 5660
  570. 5700 P3%(LL) =  VAL(JUNK$)
  571. 5710  FOR Z6 = 0 TO 1
  572. 5720  HTAB 1: VTAB 8 +3 *Z6: CALL  -958
  573. 5730  PRINT "CURRENT " MID$ ("STARTEND  ",1 +5 *Z6,5 -2 *Z6)" CONTROL STRING:"
  574. 5740  IF  LEN(P4$(LL,Z6)) = 0  THEN  PRINT "--NONE--": GOTO 5760
  575. 5750  FOR Z9 = 1 TO  LEN(P4$(LL,Z6)):X7 =  ASC( MID$ (P4$(LL,Z6),Z9,1)): GOSUB 6160: NEXT Z9
  576. 5760  PRINT :Z8 =  PEEK(37) +1: PRINT "IS THIS STRING OK?";
  577. 5770  VTAB Z8: HTAB 30: PRINT "Y (Y/N)"
  578. 5780  VTAB Z8: HTAB 30: INPUT "";JUNK$
  579. 5790  IF JUNK$ > CHR$(96)  THEN JUNK$ =  CHR$( ASC(JUNK$) -32)
  580. 5800  IF JUNK$ < >""  AND JUNK$ < >"Y"  AND JUNK$ < >"N"  AND JUNK$ < > CHR$(121)  AND JUNK$ < > CHR$(110)  THEN  PRINT BELL$;: GOTO 5770
  581. 5810  IF JUNK$ = ""  THEN  VTAB Z8: HTAB 30: PRINT "Y": GOTO 5930
  582. 5820  IF JUNK$ = "Y"  OR JUNK$ =  CHR$(121)  THEN 5930
  583. 5830  PRINT "ENTER PRINTER STRING - '^' TO QUIT"
  584. 5840 PX$ = "": ONERR  GOTO 6230
  585. 5850  POKE 49168,0: INVERSE : PRINT " ";: NORMAL : PRINT  CHR$(8);
  586. 5860 KEY =  PEEK(49152): IF KEY <128  THEN 5860
  587. 5870  POKE 49168,0:KEY = KEY -128: IF KEY = 94  THEN  PRINT : GOTO 5910
  588. 5880 PX$ = PX$ + CHR$(KEY)
  589. 5890 X7 = KEY: GOSUB 6160
  590. 5900  GOTO 5850
  591. 5910 P4$(LL,Z6) = PX$: ONERR  GOTO 7320
  592. 5920  GOTO 5720
  593. 5930  NEXT Z6
  594. 5940  CALL  -958:Z8 =  PEEK(37) +1
  595. 5950  VTAB Z8: PRINT "PRINT LEVEL ";LL;
  596. 5960  VTAB Z8: HTAB 30: PRINT P5$(LL);" (Y/N)"
  597. 5970  VTAB Z8: HTAB 30: INPUT "";JUNK$
  598. 5980  IF JUNK$ = ""  THEN JUNK$ = P5$(LL): VTAB Z8: HTAB 30: PRINT JUNK$
  599. 5990  IF JUNK$ > CHR$(96)  THEN JUNK$ =  CHR$( ASC(JUNK$) -32)
  600. 6000  IF JUNK$ < >"Y"  AND JUNK$ < >"N"  AND JUNK$ < > CHR$(121)  AND JUNK$ < > CHR$(110)  THEN  PRINT BELL$;"PLEASE ENTER 'Y' OR 'N'";: GOTO 5960
  601. 6010 P5$(LL) = JUNK$
  602. 6020  CALL  -958:Z8 =  PEEK(37) +1
  603. 6030  PRINT "PRINT TEXT FOR LEVEL ";LL;
  604. 6040  VTAB Z8: HTAB 30: PRINT P6$(LL);" (Y/N)";
  605. 6050  VTAB Z8: HTAB 30: INPUT "";JUNK$
  606. 6060  IF JUNK$ = ""  THEN JUNK$ = P6$(LL): VTAB Z8: HTAB 30: PRINT JUNK$
  607. 6070  IF JUNK$ > CHR$(96)  THEN JUNK$ =  CHR$( ASC(JUNK$) -32)
  608. 6080  IF JUNK$ < >"Y"  AND JUNK$ < >"N"  AND JUNK$ < > CHR$(121)  AND JUNK$ < > CHR$(110)  THEN  PRINT BELL$;"PLEASE ENTER 'Y' OR 'N'";: GOTO 6040
  609. 6090 P6$(LL) = JUNK$
  610. 6100 Z8 =  PEEK(37) +1: VTAB 23: INVERSE : PRINT " ESCAPE FOR MENU ": NORMAL : VTAB Z8: HTAB 1: PRINT "ARE ABOVE OPTIONS CORRECT (Y/N)? ";: INVERSE : PRINT "N" CHR$(8);: NORMAL 
  611. 6110  POKE  -16368,0: WAIT  -16384,128:YN =  PEEK( -16384) -128: POKE  -16368,0: PRINT 
  612. 6120  ON YN < >121  AND YN < >89  AND YN < >27 GOTO 5490: IF YN = 27  THEN XF = 1
  613. 6130  ONERR  GOTO 7320
  614. 6140  RETURN 
  615. 6150  REM  --PRINT PRINTER CONTROL CHARS--
  616. 6160  IF X7 = 13  THEN X7$ = " <RETURN>": GOTO 6210
  617. 6170  IF X7 = 27  THEN X7$ = " <ESC> ": GOTO 6210
  618. 6180  IF X7 = 32  THEN X7$ = " SPACE ": GOTO 6210
  619. 6190  IF X7 <32  THEN X7$ = " <CTRL>-" + CHR$(X7 +64) +" ": GOTO 6210
  620. 6200 X7$ =  CHR$(X7)
  621. 6210  IF  LEN(X7$) >40 - POS(0)  THEN  PRINT 
  622. 6220  PRINT X7$;: RETURN 
  623. 6230  CALL 768: IF  PEEK(222) < >255  THEN 7330
  624. 6240 KEY = 3: GOTO 5880
  625. 6250  REM  ----- SCROLL TO TOP OF OUTLINE -----
  626. 6260 NUM = 0
  627. 6270  RETURN 
  628. 6280  REM  ----- SCROLL TO BOTTOM OF OUTLINE -----
  629. 6290 NUM = MAX -1:Z9 = 0
  630. 6300 Z9 = Z9 + INT( LEN(OLINE$(NUM))/WIDTH) +1
  631. 6310  IF Z9 <18  THEN NUM = NUM -1: IF NUM >2  THEN 6300
  632. 6320  RETURN 
  633. 6330  VTAB 12: HTAB 10
  634. 6340  REM  ----- SCROLL DOWN ONE PAGE -----
  635. 6350 NUM = NWK -1
  636. 6360  IF NUM >MAX -1  THEN NUM = MAX -1
  637. 6370  RETURN 
  638. 6380  REM  ----- SCROLL UP ONE PAGE -----
  639. 6390 NUM = NUM -20
  640. 6400  IF NUM <0  THEN NUM = 0
  641. 6410  RETURN 
  642. 6420  REM  ----- SCROLL TO CURSOR LOCATION -----
  643. 6430 P$ = "INDICATE NEW TOP LINE OF SCREEN"
  644. 6440  GOSUB 520: REM  GET THE LINE
  645. 6450  RETURN 
  646. 6460  REM  ----- INITIALIZATION ROUTINE -----
  647. 6470  TEXT : HOME : GOSUB 480: REM  WAIT MSG
  648. 6480  FOR Z1 = 768 TO 777: READ P: POKE Z1,P: NEXT Z1
  649. 6490  DATA  104,168,104,166,223,154,72,152,72,96
  650. 6500 EF = 6: ONERR  GOTO 7320
  651. 6510  GOSUB 7240: REM  LOAD INPUT ROUTINE
  652. 6520 BELL$ =  CHR$(7):D$ =  CHR$(4)
  653. 6530  RESTORE : REM  RESTORE ERROR RTN OVERLAID
  654. 6540  FOR Z1 = 768 TO 777: READ P: POKE Z1,P: NEXT Z1
  655. 6550 TRUE = (1 = 1):FALSE = (1 = 0)
  656. 6560 EXIT = FALSE:CHG = FALSE:OM = FALSE:RW% = FALSE
  657. 6570 P3% = 0:WIDTH = 40
  658. 6580  POKE 49153,0: POKE 49237,0: POKE 1024,123:A =  PEEK(1024): POKE 49236,0: POKE 49152,0: IF A = 123  AND  PEEK(64435) = 6  THEN P3% = 3:WIDTH = 80: GOTO 6630
  659. 6590 JUNK =  PEEK(49048): FOR Z1 = 7 TO 2  STEP  -1
  660. 6600  IF JUNK > = 2 ^Z1  THEN JUNK = JUNK -2 ^Z1
  661. 6610  NEXT Z1
  662. 6620  REM  THIS LINE REMOVED
  663. 6630  PRINT D$;"PR#";P3%
  664. 6640  GOSUB 6840: REM  GET MENU ITEMS
  665. 6650  GOSUB 7090: REM  DISPLAY INTIAL SCREEN
  666. 6660  GOSUB 480: VTAB 10: HTAB 16: PRINT "OUTLINER": PRINT : HTAB 3: PRINT "COPYRIGHT 1987 BY MICROSPARC, INC."
  667. 6670  DIM OLINE$(300): REM  OUTLINE TOPICS
  668. 6680  DIM LEV%(300): REM  LEVEL OF TOPICS
  669. 6690  FOR Z = 1 TO 300:LEV%(Z) =  -1: NEXT Z
  670. 6700  DIM TXT$(300): REM  TXT FOR TOPICS
  671. 6710  DIM DIS%(300): REM  DISPLAY FLAG
  672. 6720  FOR Z = 0 TO 300:DIS%(Z) = TRUE: NEXT Z
  673. 6730  DIM P1%(3),P2%(3),P3%(3),P4$(3,1),P5$(3),P6$(3),P9%(2)
  674. 6740 PP% = 1: REM  PRINTER SLOT NUMBER
  675. 6750  FOR Z = 0 TO 3
  676. 6760 P1%(Z) = 1:P2%(Z) = 10:P3%(Z) = 80:P4$(Z,0) = "":P4$(Z,1) = "":P5$(Z) = "Y":P6$(Z) = "Y"
  677. 6770  NEXT Z
  678. 6780 P6$ = "": REM  P6$ = CHR$(27)+"!"+CHR$(0):REM PRINTER RESET STRING
  679. 6790 P7$ = "Y": REM  NUMBER TOPICS
  680. 6800 P8% = 66:P9%(1) = 6:P9%(2) = 6:P9$ = "Y": REM  PG LEN AND MARGINS
  681. 6810  DIM ROW(24): REM  ROW FOR EACH LINE OF TEXT DISPLAYED
  682. 6820  GOSUB 140: RETURN 
  683. 6830  REM  ----- GET MENU ITEMS -----
  684. 6840 N1 = 4:N2 = 7: REM  NUM OF MENUS/SUBMENUS
  685. 6850  DIM MENU$(N1,N2)
  686. 6860  FOR Z1 = 1 TO 20:BLNK$ = BLNK$ +" ": NEXT Z1
  687. 6870  FOR Z1 = 1 TO N1
  688. 6880  READ MENU$(Z1,0)
  689. 6890 L = 18: IF Z1 >3  THEN L = 8
  690. 6900  FOR Z2 = 1 TO N2
  691. 6910  READ MENU$
  692. 6920  IF MENU$ < >""  THEN MENU$(Z1,Z2) =  CHR$(91) + LEFT$(MENU$ +BLNK$,L) + CHR$(93)
  693. 6930  NEXT Z2
  694. 6940  NEXT Z1
  695. 6950  RETURN 
  696. 6960  DATA  "FILE"
  697. 6970  DATA  "START NEW OUTLINE", "EDIT OLD OUTLINE", "SAVE OUTLINE", "PRINT OUTLINE"
  698. 6980  DATA  "MERGE OUTLINE", "DISK COMMANDS", "EXIT TO BASIC"
  699. 6990  DATA  "EDIT"
  700. 7000  DATA  "ADD A TOPIC", "DELETE A TOPIC", "COPY A TOPIC", "MOVE A TOPIC"
  701. 7010  DATA  "ADD TEXT TO ITEM", "EDIT AN ITEM", ""
  702. 7020  DATA  "FORMAT"
  703. 7030  DATA  "EXPAND A TOPIC", "COMPRESS A TOPIC", "EXPAND A LEVEL", "COMPRESS A LEVEL"
  704. 7040  DATA  "DISPLAY TEXT", "PRINT OPTIONS", ""
  705. 7050  DATA  "SCROLL"
  706. 7060  DATA  "TOP", "BOTTOM", "PAGE DWN", "PAGE UP", "CURSOR"
  707. 7070  DATA  "", ""
  708. 7080  REM  ---DISPLAY INITIAL SCREEN---
  709. 7090  TEXT 
  710. 7100  HOME 
  711. 7110  PRINT  TAB( 30)"FREE:"
  712. 7120  GOSUB 140: REM  GET FREE SPACE
  713. 7130  VTAB 2: HTAB 1: INVERSE 
  714. 7140  FOR COL = 1 TO WIDTH: PRINT " ";: NEXT COL: PRINT 
  715. 7150  FOR M = 1 TO N1
  716. 7160  VTAB 2: HTAB (M -1) *10 +1
  717. 7170  IF M = 1  THEN  HTAB 2
  718. 7180  PRINT MENU$(M,0);
  719. 7190  NEXT M
  720. 7200  NORMAL 
  721. 7210  POKE 34,2
  722. 7220  RETURN 
  723. 7230  REM  ----- LOAD INPUT SUBROUTINE -----
  724. 7240  IF  PEEK(48896) < >76  THEN  PRINT  CHR$(4)"MAXFILES 1"
  725. 7250  HIMEM: 38400
  726. 7260  VTAB 11: PRINT : PRINT "LOADING BINARY FILES": IF  PEEK(48896) < >76  THEN  POKE 1014,0: POKE 1015,151
  727. 7270  IF  PEEK(48896) = 76  THEN  PRINT  CHR$(4);"BRUN OUTLINER.0"
  728. 7280  PRINT  CHR$(4);"BLOAD OUTLINER.1,A$9700"
  729. 7290 ML% = 255:SL% = 0:DC$ =  CHR$(95)
  730. 7300  RETURN 
  731. 7310  REM  ==ERROR HANDLING ROUTINE==
  732. 7320  CALL 768: POKE 216,0: PRINT  CHR$(4)"CLOSE"
  733. 7330  POKE 35,24: VTAB 21: PRINT : CALL  -958
  734. 7340 ER =  PEEK(222):LINE =  PEEK(218) + PEEK(219) *256
  735. 7350  IF ER = 3  THEN  INVERSE : PRINT BELL$"DRIVE IS NOT READY-READY IT": NORMAL : GOTO 7460
  736. 7360  IF ER = 4  THEN  INVERSE : PRINT BELL$"DISK IS WRITE PROTECTED-REMOVE TAB": NORMAL : GOTO 7460
  737. 7370  IF ER = 6  THEN  INVERSE : PRINT BELL$"FILE NOT FOUND-INSERT CORRECT DISK": NORMAL : GOTO 7460
  738. 7380  IF ER = 8  THEN  INVERSE : PRINT BELL$"I/O ERROR-INSERT DISK AGAIN": NORMAL : GOTO 7460
  739. 7390  IF ER = 9  THEN  INVERSE : PRINT BELL$"DISK IS FULL-DELETE SOME FILES OR USE": PRINT "DIFFERENT DISK": NORMAL : GOTO 7460
  740. 7400  IF ER = 77  THEN  INVERSE : PRINT BELL$"OUT OF MEMORY": NORMAL : GOTO 7460
  741. 7410  IF ER < >255 GOTO 7440
  742. 7420  ONERR  GOTO 7320
  743. 7430  RESUME 
  744. 7440  IF ER = 254  THEN  INVERSE : PRINT BELL$"INVALID DATA ENTERED": NORMAL : GOTO 7460
  745. 7450  PRINT "ERROR ";ER;" ENCOUNTERED IN LINE ";LINE
  746. 7460  INVERSE : PRINT ;" RETURN TO CONTINUE, ESCAPE TO QUIT ";: NORMAL : POKE  -16368,0: WAIT  -16384,128:J =  PEEK( -16384): POKE  -16368,0: PRINT 
  747. 7470  IF J = 155  THEN  STOP 
  748. 7480  ONERR  GOTO 7320
  749. 7490  ON EF GOTO 1710,2040,2420,3420,3650,6500,5030