home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib31b.dsk
/
OUTLINER.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
33KB
|
749 lines
10 REM **********************
20 REM * OUTLINER *
30 REM * BY ROYCE BACON *
40 REM * COPYRIGHT (C) 1987 *
50 REM * BY MICROSPARC, INC *
60 REM * CONCORD, MA 01742 *
70 REM **********************
80 GOTO 1030
90 REM --- GET A KEY PRESS ---
100 KEY = PEEK(49152): IF KEY <128 THEN 100
110 POKE 49168,0:KEY$ = CHR$(KEY -128)
120 RETURN
130 REM ----- GET FREE SPACE -----
140 IF PEEK(48896) = 76 THEN PRINT D$;"FRE":F = ( PEEK(111) +256 * PEEK(112)) -( PEEK(109) +256 * PEEK(110)): GOTO 160
150 F = FRE(0)
160 VTAB 1: HTAB 36
170 PRINT LEFT$( STR$(F) +BLNK$,5)
180 RETURN
190 REM ----- REDISPLAY THE SCREEN -----
200 NORMAL : HOME :RET = FALSE:QQ = NUM
210 FOR R = 0 TO 24:ROW(R) = 0: NEXT R:R = 0
220 NWK = NUM
230 IF LEV%(NWK) = -1 THEN RETURN
240 GOSUB 280
250 IF RET THEN RETURN
260 NWK = NWK +1: GOTO 230
270 REM ----- DISPLAY ONE ITEM -----
280 OLINE$ = OLINE$(NWK):LEVEL = LEV%(NWK):T = LEVEL *2 +3
290 IF DIS%(NWK) = FALSE THEN RETURN
300 IF ( LEN(OLINE$)/(WIDTH -T)) + PEEK(37) > PEEK(35) -2 THEN RET = TRUE: RETURN
310 R = R +1:ROW(R) = PEEK(37) +1
320 IF LEVEL >0 THEN HTAB T -2
330 IF NWK = 0 THEN PRINT "* ";: GOTO 360
340 IF LEV%(NWK +1) >LEVEL THEN PRINT "+ ";
350 IF LEV%(NWK +1) < = LEVEL THEN PRINT "- ";
360 IF LEN(OLINE$) <WIDTH -T THEN PRINT OLINE$: GOTO 460
370 W2 = WIDTH -T:W1 = 1
380 IF W2 < = W1 THEN W2 = WIDTH -T +W1: GOTO 400
390 IF MID$ (OLINE$,W2,1) < >" " THEN W2 = W2 -1: GOTO 380
400 IF PEEK(37) > PEEK(35) -2 THEN RET = TRUE: GOTO 460
410 PRINT MID$ (OLINE$,W1,W2 -W1)
420 W1 = W2 +1:W2 = W2 +WIDTH -T
430 HTAB T
440 IF W2 > LEN(OLINE$) THEN PRINT MID$ (OLINE$,W1): GOTO 460
450 GOTO 390
460 RETURN
470 REM ----- DISPLAY WAIT MSG -----
480 VTAB 23: HTAB 13: INVERSE
490 PRINT BELL$" PLEASE WAIT "
500 NORMAL : RETURN
510 REM ----- GET THE LINE TO DO ACTION ON -----
520 IF LEN(P$) <40 THEN P$ = " " +P$ +" ": GOTO 520
530 VTAB 22: PRINT : POKE 35,22: INVERSE : PRINT P$
540 VTAB 24: HTAB 2: PRINT "MOVE CURSOR TO LOCATION & PRESS RETURN";: NORMAL
550 IF NUM <0 THEN NUM = 0: PRINT BELL$;
560 IF LEV%(NUM) = -1 THEN NUM = NUM -1: PRINT BELL$;: GOTO 560
570 GOSUB 200:R = 1
580 VTAB 3: HTAB 1: POKE 49168,0
590 HTAB 2: INVERSE : PRINT ">";: NORMAL : GOSUB 100: HTAB 2: PRINT " ";
600 IF KEY$ = CHR$(13) THEN POKE 35,24: RETURN
610 IF KEY$ = CHR$(27) THEN POKE 35,24: POP : RETURN
620 IF KEY$ = CHR$(8) THEN GOSUB 680: IF NOT DIS THEN 590
630 IF KEY$ = CHR$(21) THEN GOSUB 730: IF NOT DIS THEN 590
640 IF KEY$ = "/" OR KEY$ = "?" OR KEY$ = CHR$(10) THEN GOSUB 790: IF NOT DIS THEN 590
650 IF KEY$ = "-" OR KEY$ = "=" OR KEY$ = CHR$(11) THEN GOSUB 860: IF NOT DIS THEN 590
660 IF NOT DIS THEN PRINT BELL$;: GOTO 590
670 GOTO 550
680 NUM = NUM -1: IF NUM <0 THEN NUM = 0: PRINT BELL$;: RETURN
690 IF NUM >0 AND DIS%(NUM) = FALSE THEN 680
700 R = R -1: IF R <1 THEN DIS = TRUE: RETURN
710 IF ROW(R) < >0 THEN VTAB (ROW(R)): HTAB 2:DIS = FALSE: RETURN
720 DIS = TRUE: RETURN
730 NUM = NUM +1: IF LEV%(NUM) = -1 THEN NUM = NUM -1: PRINT BELL$;: RETURN
740 IF DIS%(NUM) = FALSE THEN 730
750 R = R +1
760 DIS = TRUE
770 IF R <25 AND ROW(R) < >0 THEN VTAB (ROW(R)): HTAB 2:DIS = FALSE
780 RETURN
790 X1 = NUM:DIS = FALSE
800 X1 = X1 +1: IF LEV%(X1) = -1 THEN PRINT BELL$;: RETURN
810 IF DIS%(X1) = FALSE THEN 800
820 IF R <24 THEN R = R +1: IF ROW(R) = 0 THEN DIS = TRUE
830 IF ROW(R) < >0 THEN VTAB ROW(R): HTAB 1
840 IF LEV%(X1) = LEV%(NUM) THEN NUM = X1: RETURN
850 GOTO 800
860 X1 = NUM:DIS = FALSE
870 X1 = X1 -1: IF X1 <0 THEN PRINT BELL$;: RETURN
880 IF DIS%(X1) = FALSE THEN 870
890 R = R -1: IF R <1 THEN DIS = TRUE
900 IF R >0 THEN IF ROW(R) < >0 THEN VTAB ROW(R): HTAB 1
910 IF LEV%(X1) = LEV%(NUM) THEN NUM = X1: RETURN
920 GOTO 870
930 REM ----- GET A LINE -----
940 HTAB 2: & (OLINE$)
950 OLINE$ = MID$ (OLINE$,1)
960 RETURN
970 REM ----- GET Y/N RESPONSE -----
980 INPUT "(Y/N) ";YN$
990 YN$ = LEFT$(YN$,1): IF YN$ > CHR$(96) THEN YN$ = CHR$( ASC(YN$) -32)
1000 RETURN
1010 REM
1020 REM ----- MAINLINE CONTROL ROUTINE -----
1030 GOSUB 6470: REM INITIALIZATION
1040 HOME
1050 C1 = 1
1060 POKE 49168,0: GOSUB 1120: REM GET A COMMAND
1070 IF NOT EXIT THEN 1060
1080 TEXT : HOME : VTAB 12: HTAB 2
1090 PRINT "OUTLINER TERMINATED"
1100 POKE 216,0: END
1110 REM ----- GET A COMMAND -----
1120 T1 = (C1 -1) *10 +1
1130 IF T1 = 1 THEN T1 = 2
1140 VTAB 2: HTAB T1
1150 NORMAL : PRINT MENU$(C1,0);
1160 VTAB 2: HTAB T1
1170 GOSUB 100
1180 IF KEY$ = CHR$(13) THEN 1260
1190 IF KEY$ < > CHR$(8) AND KEY$ < > CHR$(21) AND KEY$ < > CHR$(10) AND KEY$ < > CHR$(11) THEN 1170
1200 VTAB 2: HTAB T1: INVERSE
1210 PRINT MENU$(C1,0);
1220 IF KEY$ = CHR$(8) OR KEY$ = CHR$(11) THEN C1 = C1 -1: IF C1 <1 THEN C1 = N1
1230 IF KEY$ = CHR$(21) OR KEY$ = CHR$(10) THEN C1 = C1 +1: IF C1 >N1 THEN C1 = 1
1240 GOTO 1120
1250 REM ----- DISPLAY MENU OPTIONS -----
1260 IF C1 >1 AND NAME$ = "" THEN PRINT BELL$;: GOTO 1120
1270 INVERSE
1280 FOR C2 = 1 TO N2
1290 VTAB C2 +2: HTAB T1
1300 PRINT MENU$(C1,C2);
1310 NEXT C2
1320 C2 = 1
1330 VTAB C2 +2: HTAB T1: NORMAL
1340 PRINT MENU$(C1,C2);: INVERSE
1350 VTAB C2 +2: HTAB T1
1360 GOSUB 100
1370 IF KEY$ = CHR$(13) THEN 1460: REM PROCESS THE COMMAND
1380 IF KEY$ = CHR$(27) OR KEY$ = CHR$(9) THEN GOSUB 200: GOTO 1120
1390 VTAB C2 +2: HTAB T1: INVERSE : PRINT MENU$(C1,C2);
1400 IF KEY$ = CHR$(21) OR KEY$ = CHR$(10) THEN C2 = C2 +1: IF C2 >N2 THEN C2 = 1
1410 IF (KEY$ = CHR$(21) OR KEY$ = CHR$(10)) AND MENU$(C1,C2) = "" THEN C2 = 1
1420 IF KEY$ = CHR$(8) OR KEY$ = CHR$(11) THEN C2 = C2 -1: IF C2 <1 THEN C2 = N2
1430 IF MENU$(C1,C2) = "" THEN C2 = C2 -1: GOTO 1430
1440 GOTO 1330
1450 REM ----- PROCESS THE COMMAND -----
1460 NORMAL
1470 ON C1 GOSUB 1530,1560,1600,1630
1480 GOSUB 140: REM DISPLAY FREE SPACE
1490 NUM = QQ
1500 GOSUB 200: REM REDISPLAY SCREEN
1510 RETURN
1520 REM ----- FILE MENU -----
1530 ON C2 GOSUB 1670,2000,2400,2690,3400,3650,3820
1540 RETURN
1550 REM ----- EDIT MENU -----
1560 CHG = TRUE
1570 ON C2 GOSUB 3890,4120,4270,4440,4490,4560
1580 RETURN
1590 REM ----- FORMAT MENU -----
1600 ON C2 GOSUB 4690,4750,4810,4880,4950,5030
1610 RETURN
1620 REM ----- SCROLL MENU -----
1630 ON C2 GOSUB 6260,6290,6350,6390,6430
1640 QQ = NUM
1650 RETURN
1660 REM ----- START A NEW OUTLINE -----
1670 IF NOT CHG THEN 1710
1680 VTAB 21: PRINT
1690 PRINT BELL$;"DO YOU WANT TO ERASE OLD OUTLINE?": GOSUB 980
1700 IF YN$ < >"Y" AND YN$ < > CHR$(121) THEN RETURN
1710 EF = 1: ONERR GOTO 1810
1720 HOME : VTAB 20: PRINT
1730 PRINT "ENTER NAME OF OUTLINE:": INPUT JUNK$
1740 IF JUNK$ = "" THEN RETURN
1750 NAME$ = JUNK$
1760 PRINT : PRINT D$;"VERIFY ";NAME$
1770 ONERR GOTO 7320
1780 PRINT BELL$;"THAT OUTLINE EXISTS ALREADY, OK TO REUSE": GOSUB 980
1790 IF YN$ < >"Y" AND YN$ < > CHR$(121) THEN 1710
1800 GOTO 1860
1810 ONERR GOTO 7320
1820 ER = PEEK(222): CALL 768
1830 IF ER = 6 OR ER = 7 THEN 1860: REM FILE NOT THERE
1840 IF ER < >11 AND ER < >16 THEN 7330
1850 PRINT BELL$;"INVALID FILE NAME": INPUT "PRESS RETURN TO CONTINUE ";JUNK$: GOTO 1710
1860 VTAB 1: HTAB 2
1870 FOR COL = 1 TO 28: PRINT " ";: NEXT COL
1880 VTAB 1: HTAB 2: PRINT NAME$;
1890 VTAB 22: PRINT : PRINT "ENTER TITLE FOR OUTLINE: ": INPUT OLINE$(0)
1900 HOME : GOSUB 480
1910 FOR Z = 1 TO 300
1920 OLINE$(Z) = "":LEV%(Z) = -1:TXT$(Z) = "":DIS%(Z) = TRUE
1930 NEXT Z
1940 CHG = FALSE:NUM = 1:MAX = 1
1950 LEV%(0) = 0
1960 OLINE$(1) = "***** END OF " +NAME$ +" *****"
1970 LEV%(1) = 0:NUM = 0
1980 RETURN
1990 REM ----- EDIT AND OLD OUTLINE -----
2000 IF NOT CHG THEN 2040
2010 VTAB 21: CALL -958: PRINT
2020 PRINT BELL$;"DO YOU WANT TO ERASE OLD OUTLINE?": GOSUB 980
2030 IF YN$ < >"Y" AND YN$ < > CHR$(121) THEN RETURN
2040 EF = 2: ONERR GOTO 7320
2050 HOME : PRINT : PRINT D$; LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76))
2060 PRINT : INPUT "ENTER NAME OF FILE: ";JUNK$
2070 IF JUNK$ = "" THEN RETURN
2080 NAME$ = JUNK$
2090 ONERR GOTO 2340
2100 PRINT : PRINT D$;"VERIFY ";NAME$
2110 ONERR GOTO 7320
2120 PRINT D$;"OPEN ";NAME$
2130 HOME : VTAB 12: HTAB 5: PRINT "READING OUTLINE-PLEASE WAIT"
2140 PRINT D$;"READ ";NAME$:RW% = TRUE
2150 INPUT MAX
2160 FOR Z1 = 0 TO MAX
2170 INPUT LEV%(Z1): INPUT OLINE$(Z1): INPUT TXT$(Z1):DIS%(Z1) = TRUE
2180 NEXT Z1
2190 FOR Z1 = 0 TO 3
2200 INPUT P1%(Z1): INPUT P2%(Z1): INPUT P3%(Z1): INPUT P4$(Z1,0): INPUT P4$(Z1,1): INPUT P5$(Z1): INPUT P6$(Z1)
2210 NEXT Z1
2220 INPUT P7$: INPUT P8%: INPUT P9%(1): INPUT P9%(2): INPUT P9$
2230 PRINT D$;"CLOSE":RW% = FALSE
2240 HOME : GOSUB 480
2250 NUM = 0
2260 VTAB 1: HTAB 2
2270 FOR COL = 1 TO 28: PRINT " ";: NEXT COL
2280 VTAB 1: HTAB 2: PRINT NAME$;
2290 FOR Z = MAX +1 TO 300
2300 OLINE$(Z) = "":LEV%(Z) = -1:TXT$(Z) = "":DIS%(Z) = TRUE
2310 NEXT Z
2320 CHG = FALSE
2330 RETURN
2340 ONERR GOTO 7320
2350 IF PEEK(222) < >6 AND PEEK(222) < >7 THEN 7320
2360 CALL 768
2370 PRINT BELL$;"THAT FILE DOES NOT EXIST"
2380 GOTO 2060
2390 REM ----- SAVE AN OUTLINE -----
2400 IF NAME$ = "" THEN PRINT BELL$: RETURN
2410 GOTO 2430
2420 PRINT BELL$;"CANCEL SAVE OPERATION ";: GOSUB 980: IF YN$ = "Y" OR YN$ = CHR$(121) THEN RETURN
2430 EF = 3: ONERR GOTO 2510
2440 HOME
2450 PRINT : PRINT D$;"VERIFY ";NAME$
2460 ONERR GOTO 7320
2470 PRINT BELL$;NAME$" ALREADY EXISTS": PRINT "OK TO DELETE IT ";: GOSUB 980
2480 IF YN$ < >"Y" AND YN$ < > CHR$(121) THEN RETURN
2490 PRINT D$;"DELETE ";NAME$
2500 GOTO 2540
2510 IF PEEK(222) < >6 AND PEEK(222) < >7 THEN 7320
2520 CALL 768
2530 ONERR GOTO 7320
2540 PRINT D$;"OPEN ";NAME$
2550 HOME : VTAB 12: HTAB 5: PRINT "SAVING OUTLINE-PLEASE WAIT"
2560 PRINT D$;"WRITE ";NAME$:RW% = TRUE
2570 PRINT MAX
2580 FOR Z1 = 0 TO MAX
2590 PRINT LEV%(Z1): PRINT CHR$(34) +OLINE$(Z1): PRINT CHR$(34) +TXT$(Z1)
2600 NEXT Z1
2610 FOR Z1 = 0 TO 3
2620 PRINT P1%(Z1): PRINT P2%(Z1): PRINT P3%(Z1): PRINT P4$(Z1,0): PRINT P4$(Z1,1): PRINT P5$(Z1): PRINT P6$(Z1)
2630 NEXT Z1
2640 PRINT P7$: PRINT P8%: PRINT P9%(1): PRINT P9%(2): PRINT P9$
2650 PRINT D$;"CLOSE":RW% = FALSE
2660 CHG = FALSE
2670 RETURN
2680 REM ----- PRINT AN OUTLINE -----
2690 IF NAME$ = "" THEN PRINT BELL$: RETURN
2700 HOME
2710 PRINT "ALIGN PRINTER AT TOP OF FORM": INPUT "PRESS RETURN WHEN READY";JUNK$
2720 PRINT : PRINT "PRESS <ESC> TO STOP PRINTING"
2730 T1$ = "A":T2 = 1:T3$ = CHR$(97):PC = 1:LAST% = FALSE
2740 PRINT : PRINT D$;"PR#";PP%
2750 PRINT CHR$(9);"80N"
2760 PW = P3%(0) -2 *P2%(0):LM = P2%(0)
2770 PRINT P6$;P4$(0,0);
2780 FOR LC = 1 TO P9%(1): PRINT : NEXT LC
2790 IF LEN(OLINE$(0)) >PW THEN PRINT TAB( LM);OLINE$(0): GOTO 2810
2800 PRINT TAB( LM + INT((PW - LEN(OLINE$(0)))/2));OLINE$(0)
2810 PRINT P6$;P4$(0,1);
2820 LC = P9%(1) +5
2830 FOR NWK = 1 TO MAX
2840 IF PEEK( -16384) = 27 +128 THEN NWK = MAX: POKE 49168,0: GOTO 3100
2850 TX = FALSE
2860 L2 = LEV%(NWK) +1: IF L2 >3 THEN L2 = 3
2870 OLINE$ = OLINE$(NWK):LEVEL = LEV%(NWK):T = LEVEL *2 +3 +P2%(L2):PW = P3%(L2) -P2%(L2) -T
2880 IF P5$(L2) = "N" THEN 3090
2890 IF OLINE$ = "/PAGE" THEN GOSUB 3160: GOTO 3100
2900 IF LC +P1%(L2) +( LEN(OLINE$)/PW) >P8% -P9%(1) -P9%(2) THEN GOSUB 3160: GOTO 2920
2910 IF P1%(L2) >1 THEN FOR ZZ = 2 TO P1%(L2): PRINT :LC = LC +1: NEXT ZZ
2920 IF (P7$ = "Y" OR P7$ = CHR$(121)) AND LEVEL <3 THEN GOSUB 3250: GOTO 2970
2930 IF P7$ = "Y" OR P7$ = CHR$(121) THEN T = T +3
2940 PRINT TAB( T -2);P6$;P4$(L2,0);
2950 IF LEV%(NWK +1) >LEVEL THEN PRINT "+ ";
2960 IF LEV%(NWK +1) < = LEVEL THEN PRINT "- ";
2970 IF LEN(OLINE$) <PW THEN PRINT OLINE$:LC = LC +1: GOTO 3060
2980 W2 = PW:W1 = 1
2990 IF W2 < = W1 THEN W2 = PW +W1: GOTO 3010
3000 IF MID$ (OLINE$,W2,1) < >" " THEN W2 = W2 -1: GOTO 2990
3010 PRINT MID$ (OLINE$,W1,W2 -W1):LC = LC +1
3020 W1 = W2 +1:W2 = W2 +PW
3030 PRINT P6$;P4$(L2,1); TAB( T);P4$(L2,0);
3040 IF W2 > LEN(OLINE$) THEN PRINT MID$ (OLINE$,W1):LC = LC +1: GOTO 3060
3050 GOTO 3000
3060 IF P6$(L2) = "N" OR TXT$(NWK) = "" THEN 3090
3070 IF TX THEN 3090
3080 TX = TRUE:OLINE$ = TXT$(NWK): PRINT TAB( T);"* ";:T = T +2: GOTO 2970
3090 PRINT P6$;P4$(L2,1);
3100 NEXT NWK
3110 LAST% = TRUE: GOSUB 3160
3120 PRINT : PRINT D$;"PR#";P3%
3130 GOSUB 7090: VTAB 1: HTAB 2: PRINT NAME$;: VTAB 12
3140 RETURN
3150 REM ----- NEW PAGE ROUTINE -----
3160 IF P9$ = "N" THEN 3190
3170 IF LC <P8% -3 THEN FOR X2 = LC TO P8% -3: PRINT : NEXT X2
3180 PRINT P4$(0,0); TAB( INT(P3%(0)/2));"-";PC;"-";P6$;P4$(0,1)
3190 PRINT CHR$(12):PC = PC +1: IF LAST% THEN 3230
3200 FOR LC = 1 TO P9%(1)
3210 PRINT
3220 NEXT LC
3230 RETURN
3240 REM --- NUMBER TOPICS ---
3250 T = T +LEVEL +1
3260 PRINT TAB( T -3);P4$(L2,0);
3270 IF LEVEL < >0 GOTO 3320
3280 IF TN THEN FOR I = 1 TO TN: PRINT T1$;: NEXT
3290 PRINT T1$;". ";:T2 = 1
3300 IF T1$ < CHR$(90) THEN T1$ = CHR$( ASC(T1$) +1): RETURN
3310 T1$ = "A":TN = TN +1: RETURN
3320 IF LEVEL = 1 THEN PRINT T2;". ";:TQ = 0:T2 = T2 +1:T3$ = CHR$(97): RETURN
3330 IF LEVEL < >2 GOTO 3380
3340 IF TQ THEN FOR I = 1 TO TQ: PRINT T3$;: NEXT
3350 PRINT T3$;". ";
3360 IF T3$ < CHR$(122) THEN T3$ = CHR$( ASC(T3$) +1): RETURN
3370 T3$ = CHR$(97):TQ = TQ +1: RETURN
3380 RETURN
3390 REM ----- MERGE ANOTHER OUTLINE -----
3400 IF NAME$ = "" THEN PRINT BELL$: RETURN
3410 P$ = "INDICATE ITEM TO ADD AFTER": GOSUB 520
3420 EF = 4: ONERR GOTO 7320
3430 HOME : PRINT : PRINT D$; LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76)): PRINT
3440 INPUT "ENTER NAME OF FILE: ";N1$
3450 IF N1$ = "" THEN RETURN
3460 ONERR GOTO 3600
3470 PRINT D$;"OPEN ";N1$: PRINT D$;"READ ";N1$:RW% = TRUE
3480 HOME : VTAB 12: HTAB 5: PRINT "READING OUTLINE-PLEASE WAIT"
3490 ONERR GOTO 7320
3500 INPUT M2
3510 IF M2 +MAX >298 THEN GOSUB 4080:M2 = 0: GOTO 3580
3520 FOR Z1 = MAX TO NUM +1 STEP -1
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)
3540 NEXT Z1: INPUT JUNK$: INPUT JUNK$: INPUT JUNK$
3550 FOR Z1 = NUM +1 TO NUM +M2 -1
3560 INPUT LEV%(Z1): INPUT OLINE$(Z1): INPUT TXT$(Z1):DIS%(Z1) = TRUE
3570 NEXT Z1
3580 PRINT D$;"CLOSE":MAX = MAX +M2 -1:RW% = FALSE
3590 CHG = TRUE: RETURN
3600 ONERR GOTO 7320
3610 IF PEEK(222) < >6 AND PEEK(222) < >7 THEN 7320
3620 CALL 768
3630 PRINT BELL$"THAT FILE DOES NOT EXIST": GOTO 3420
3640 REM ----- DISK COMMANDS -----
3650 EF = 5: ONERR GOTO 3750
3660 POKE 35,24: HOME
3670 VTAB 22: PRINT : INVERSE
3680 PRINT "ENTER DISK COMMAND(S) - <RETURN> TO EXIT"
3690 NORMAL : POKE 35,22: HOME
3700 OLINE$ = "": GOSUB 940:CMD$ = OLINE$
3710 IF CMD$ = "" THEN 3790
3720 PRINT D$;CMD$
3730 ONERR GOTO 7320
3740 GOTO 3700
3750 CALL 768
3760 POKE 35,24: HOME :ER = PEEK(222): VTAB 23: PRINT : INVERSE : PRINT BELL$"DISK ERROR ";ER;" ENCOUNTERED-PRESS <RETURN> ";: NORMAL : GET JUNK$: PRINT
3770 ONERR GOTO 7320
3780 GOTO 3650
3790 POKE 35,24: HOME
3800 RETURN
3810 REM ----- EXIT TO BASIC -----
3820 EXIT = TRUE
3830 IF NOT CHG THEN 3870
3840 VTAB 20: PRINT : CALL -958: PRINT
3850 PRINT BELL$;"DO YOU WANT TO EXIT WITHOUT SAVING THIS": PRINT "OUTLINE? ";: GOSUB 980
3860 IF YN$ < >"Y" AND YN$ < > CHR$(121) THEN EXIT = FALSE
3870 RETURN
3880 REM ----- ADD A TOPIC -----
3890 CHG = TRUE:N9 = NUM:OM = FALSE
3900 P$ = "INDICATE LINE TO ADD AFTER"
3910 GOSUB 520: REM GET LINE TO ADD AFTER
3920 N9 = NUM:NWK = NUM: HOME : GOSUB 280
3930 OLINE$ = ""
3940 IF F <500 OR MAX >298 THEN GOSUB 4080: GOTO 4070
3950 GOSUB 940: REM GET A LINE
3960 LEV% = 0
3970 IF LEFT$(OLINE$,1) = "." THEN LEV% = LEV% +1:OLINE$ = MID$ (OLINE$,2): GOTO 3970
3980 IF OLINE$ = "" THEN 4070
3990 FOR Z1 = MAX TO NUM +1 STEP -1
4000 OLINE$(Z1 +1) = OLINE$(Z1):LEV%(Z1 +1) = LEV%(Z1):DIS%(Z1 +1) = DIS%(Z1):TXT$(Z1 +1) = TXT$(Z1)
4010 NEXT Z1
4020 LEV%(NUM +1) = LEV%
4030 OLINE$(NUM +1) = OLINE$:DIS%(NUM +1) = TRUE:TXT$(NUM +1) = ""
4040 NUM = NUM +1:MAX = MAX +1
4050 LEV% = LEV%(NUM):OLINE$ = "": IF LEV% >0 THEN FOR Z7 = 1 TO LEV%:OLINE$ = OLINE$ +".": NEXT Z7
4060 GOTO 3940
4070 NUM = N9: RETURN
4080 VTAB 23: HTAB 1: INVERSE : PRINT BELL$"OUT OF MEMORY-PRESS <RETURN> TO CONTINUE";: NORMAL :OM = TRUE
4090 GET JUNK$: PRINT : IF JUNK$ < > CHR$(13) THEN 4090
4100 RETURN
4110 REM ----- DELETE A TOPIC -----
4120 P$ = "INDICATE TOPIC TO DELETE"
4130 N9 = NUM: GOSUB 520: REM GET LINE TO DELETE
4140 IF NUM = 0 THEN PRINT BELL$;: GOTO 4250
4150 N8 = NUM +1
4160 IF LEV%(N8) >LEV%(NUM) THEN N8 = N8 +1: GOTO 4160
4170 N8 = N8 -NUM
4180 FOR Z1 = NUM TO MAX -N8
4190 OLINE$(Z1) = OLINE$(Z1 +N8):LEV%(Z1) = LEV%(Z1 +N8):TXT$(Z1) = TXT$(Z1 +N8):DIS%(Z1) = DIS%(Z1 +N8)
4200 NEXT Z1
4210 FOR Z1 = MAX -N8 +1 TO MAX
4220 OLINE$(Z1) = "":LEV%(Z1) = -1:DIS%(Z1) = TRUE:TXT$(Z1) = ""
4230 NEXT Z1
4240 MAX = MAX -N8:NUM = NUM -1:OM = FALSE
4250 RETURN
4260 REM ----- COPY A TOPIC -----
4270 P$ = "INDICATE TOPIC TO COPY"
4280 N9 = NUM: GOSUB 520: REM GET TOPIC TO COPY
4290 N8 = 1:OM = FALSE
4300 IF LEV%(NUM +N8) >LEV%(NUM) THEN N8 = N8 +1: GOTO 4300
4310 IF MAX +N8 >298 THEN GOSUB 4080: RETURN
4320 P$ = "INDICATE LINE TO COPY AFTER"
4330 NSV = NUM:N9 = NUM: GOSUB 520: REM GET TOPIC TO COPY AFTER
4340 FOR Z1 = MAX TO NUM +1 STEP -1
4350 OLINE$(Z1 +N8) = OLINE$(Z1):LEV%(Z1 +N8) = LEV%(Z1):DIS%(Z1 +N8) = DIS%(Z1):TXT$(Z1 +N8) = TXT$(Z1)
4360 NEXT Z1
4370 IF NUM <NSV THEN NSV = NSV +N8
4380 FOR Z1 = 0 TO N8 -1
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)
4400 NEXT Z1
4410 MAX = MAX +N8
4420 RETURN
4430 REM ----- MOVE A TOPIC -----
4440 GOSUB 4270: IF OM THEN RETURN : REM DO A COPY
4450 NUM = NSV: REM GET TOPIC TO DELETE
4460 GOSUB 4180: REM DELETE IT
4470 RETURN
4480 REM ----- ADD TEXT TO A TOPIC -----
4490 P$ = "INDICATE TOPIC TO ADD TEXT TO"
4500 N9 = NUM: GOSUB 520: REM GET TOPIC TO ADD TO
4510 NWK = NUM: HOME : GOSUB 280
4520 OLINE$ = TXT$(NUM): GOSUB 940: REM GET THE TEXT
4530 TXT$(NUM) = OLINE$
4540 RETURN
4550 REM ----- EDIT A TOPIC -----
4560 N9 = NUM
4570 P$ = "INDICATE ITEM TO EDIT"
4580 GOSUB 520: REM GET LINE TO CHANGE
4590 N9 = NUM:NWK = NUM: HOME : PRINT " ";
4600 OLINE$ = OLINE$(NUM)
4610 IF LEV%(NUM) >0 THEN FOR T = 1 TO LEV%(NUM):OLINE$ = "." +OLINE$: NEXT T
4620 VTAB 3: HTAB 1
4630 GOSUB 940
4640 LEV%(NUM) = 0
4650 IF LEFT$(OLINE$,1) = "." THEN LEV%(NUM) = LEV%(NUM) +1:OLINE$ = MID$ (OLINE$,2): GOTO 4650
4660 OLINE$(NUM) = OLINE$
4670 RETURN
4680 REM ----- EXPAND A TOPIC -----
4690 P$ = "INDICATE TOPIC TO EXPAND"
4700 GOSUB 520: REM GET TOPIC
4710 Z1 = NUM +1
4720 IF LEV%(Z1) >LEV%(NUM) THEN DIS%(Z1) = TRUE:Z1 = Z1 +1: GOTO 4720
4730 RETURN
4740 REM ----- COMPRESS A TOPIC -----
4750 P$ = "INDICATE TOPIC TO COMPRESS"
4760 GOSUB 520: REM GET TOPIC
4770 Z1 = NUM +1
4780 IF LEV%(Z1) >LEV%(NUM) THEN DIS%(Z1) = FALSE:Z1 = Z1 +1: GOTO 4780
4790 RETURN
4800 REM ----- EXPAND A LEVEL -----
4810 VTAB 21: PRINT : CALL -958
4820 INPUT "ENTER LEVEL NUMBER TO EXPAND: ";JUNK$: ON JUNK$ = "" GOTO 4860:LEVEL = VAL(JUNK$)
4830 FOR Z1 = 1 TO MAX
4840 IF LEV%(Z1) = LEVEL THEN DIS%(Z1) = TRUE
4850 NEXT Z1
4860 RETURN
4870 REM ----- COMPRESS A LEVEL -----
4880 VTAB 21: PRINT : CALL -958
4890 INPUT "ENTER LEVEL NUMBER TO COMPRESS: ";JUNK$: ON JUNK$ = "" GOTO 4930:LEVEL = VAL(JUNK$)
4900 FOR Z1 = 1 TO MAX
4910 IF LEV%(Z1) = >LEVEL THEN DIS%(Z1) = FALSE
4920 NEXT Z1
4930 RETURN
4940 REM ----- DISPLAY TEXT FOR A TOPIC -----
4950 P$ = "INDICATE ITEM TO DISPLAY TEXT FOR"
4960 GOSUB 520
4970 HOME :NWK = NUM: GOSUB 280
4980 OLINE$ = TXT$(NUM):T = 1
4990 GOSUB 360
5000 VTAB 23: HTAB 2: INPUT "PRESS <RETURN> TO CONTINUE ";JUNK$
5010 RETURN
5020 REM ----- SET PRINT OPTIONS -----
5030 CHG = TRUE:EF = 7: ONERR GOTO 7320
5040 HOME
5050 PRINT "SLOT NUMBER FOR PRINTER:";
5060 VTAB 3: HTAB 30: PRINT PP%;" (0-7)";
5070 HTAB 30: INPUT "";JUNK$: IF JUNK$ = "" THEN JUNK$ = STR$(PP%)
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
5090 PP% = VAL(JUNK$)
5100 FOR LL = 0 TO 3
5110 XF = 0: GOSUB 5490: IF XF THEN LL = 3: NEXT LL: RETURN : REM SET OPTIONS FOR LEVEL LL
5120 NEXT LL
5130 HOME : PRINT "NUMBER TOPICS?:";
5140 VTAB 3: HTAB 30: PRINT P7$;" (Y/N)";
5150 HTAB 30: INPUT "";JUNK$: IF JUNK$ = "" THEN JUNK$ = P7$: VTAB 3: HTAB 30: PRINT JUNK$
5160 IF JUNK$ > CHR$(96) THEN JUNK$ = CHR$( ASC(JUNK$) -32)
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
5180 P7$ = JUNK$
5190 CALL -958
5200 PRINT : PRINT "ENTER PAGE LENGTH (INCLUDING TOP AND": PRINT "BOTTOM MARGINS:";
5210 VTAB 6: HTAB 30: PRINT P8%;" (5-999)";
5220 VTAB 6: HTAB 30: INPUT "";JUNK$
5230 IF JUNK$ = "" THEN JUNK$ = STR$(P8%): VTAB 6: HTAB 30: PRINT JUNK$
5240 IF VAL(JUNK$) <5 THEN PRINT BELL$;"PAGE LENGTH MUST BE > 5";: GOTO 5210
5250 P8% = VAL(JUNK$)
5260 CALL -958
5270 PRINT : PRINT "ENTER NUMBER OF LINES IN TOP ": PRINT " MARGIN:";
5280 VTAB 9: HTAB 30: PRINT P9%(1);" (1-"; INT(P8%/2);")";
5290 VTAB 9: HTAB 30: INPUT "";JUNK$
5300 IF JUNK$ = "" THEN JUNK$ = STR$(P9%(1)): VTAB 9: HTAB 30: PRINT JUNK$
5310 IF VAL(JUNK$) <1 OR VAL(JUNK$) >P8%/2 THEN PRINT BELL$;"MARGIN MUST BE > 0 AND < "; INT(P8%/2) +1;: GOTO 5280
5320 P9%(1) = VAL(JUNK$)
5330 CALL -958
5340 PRINT : PRINT "ENTER NUMBER OF LINES IN BOTTOM": PRINT " MARGIN:";
5350 VTAB 12: HTAB 30: PRINT P9%(2);" (1-"; INT(P8%/2);")";
5360 VTAB 12: HTAB 30: INPUT "";JUNK$
5370 IF JUNK$ = "" THEN JUNK$ = STR$(P9%(2)): VTAB 12: HTAB 30: PRINT JUNK$
5380 IF VAL(JUNK$) <1 OR VAL(JUNK$) >P8%/2 THEN PRINT BELL$;"MARGIN MUST BE > 0 AND < "; INT(P8%/2) +1;: GOTO 5350
5390 P9%(2) = VAL(JUNK$)
5400 CALL -958: PRINT : PRINT "PRINT PAGE NUMBERS";: HTAB 30: PRINT P9$;" (Y/N)"
5410 VTAB 14: HTAB 30: INPUT "";JUNK$
5420 IF JUNK$ = "" THEN JUNK$ = P9$: VTAB 14: HTAB 30: PRINT JUNK$;
5430 IF JUNK$ > CHR$(96) THEN JUNK$ = CHR$( ASC(JUNK$) -32)
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
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
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
5470 GOSUB 480: RETURN
5480 REM ----- SET PRINT OPTIONS FOR A LEVEL -----
5490 HOME : PRINT "PRINT OPTIONS FOR ";
5500 IF LL = 0 THEN PRINT "HEADINGS": GOTO 5520
5510 PRINT "LEVEL ";LL
5520 PRINT "SPACING:";
5530 VTAB 4: HTAB 30: PRINT P1%(LL);" (1-5)";
5540 VTAB 4: HTAB 30: INPUT "";JUNK$
5550 IF JUNK$ = "" THEN JUNK$ = STR$(P1%(LL)): VTAB 4: HTAB 30: PRINT JUNK$
5560 IF VAL(JUNK$) <1 OR VAL(JUNK$) >5 THEN PRINT BELL$;"SPACING MUST BE 1-5";: GOTO 5530
5570 P1%(LL) = VAL(JUNK$)
5580 PRINT "MARGINS:";: CALL -958
5590 VTAB 5: HTAB 30: PRINT P2%(LL);" (0-40)";
5600 VTAB 5: HTAB 30: INPUT "";JUNK$
5610 IF JUNK$ = "" THEN JUNK$ = STR$(P2%(LL)): VTAB 5: HTAB 30: PRINT JUNK$
5620 IF VAL(JUNK$) <0 OR VAL(JUNK$) >40 OR JUNK$ >"9" THEN PRINT BELL$;"MARGINS MUST BE 1-40": GOTO 5590
5630 P2%(LL) = VAL(JUNK$)
5640 CALL -958
5650 PRINT "LINE LENGTH": PRINT "(INCLUDING BOTH MARGINS):";
5660 VTAB 7: HTAB 30: PRINT P3%(LL);" (";P2%(LL) +1;"-255)";
5670 VTAB 7: HTAB 30: INPUT "";JUNK$
5680 IF JUNK$ = "" THEN JUNK$ = STR$(P3%(LL)): VTAB 7: HTAB 30: PRINT JUNK$
5690 IF VAL(JUNK$) < = P2%(LL) OR VAL(JUNK$) >255 THEN PRINT BELL$;"LINE LENGTH MUST BE ";P2%(LL) +1;"-255";: GOTO 5660
5700 P3%(LL) = VAL(JUNK$)
5710 FOR Z6 = 0 TO 1
5720 HTAB 1: VTAB 8 +3 *Z6: CALL -958
5730 PRINT "CURRENT " MID$ ("STARTEND ",1 +5 *Z6,5 -2 *Z6)" CONTROL STRING:"
5740 IF LEN(P4$(LL,Z6)) = 0 THEN PRINT "--NONE--": GOTO 5760
5750 FOR Z9 = 1 TO LEN(P4$(LL,Z6)):X7 = ASC( MID$ (P4$(LL,Z6),Z9,1)): GOSUB 6160: NEXT Z9
5760 PRINT :Z8 = PEEK(37) +1: PRINT "IS THIS STRING OK?";
5770 VTAB Z8: HTAB 30: PRINT "Y (Y/N)"
5780 VTAB Z8: HTAB 30: INPUT "";JUNK$
5790 IF JUNK$ > CHR$(96) THEN JUNK$ = CHR$( ASC(JUNK$) -32)
5800 IF JUNK$ < >"" AND JUNK$ < >"Y" AND JUNK$ < >"N" AND JUNK$ < > CHR$(121) AND JUNK$ < > CHR$(110) THEN PRINT BELL$;: GOTO 5770
5810 IF JUNK$ = "" THEN VTAB Z8: HTAB 30: PRINT "Y": GOTO 5930
5820 IF JUNK$ = "Y" OR JUNK$ = CHR$(121) THEN 5930
5830 PRINT "ENTER PRINTER STRING - '^' TO QUIT"
5840 PX$ = "": ONERR GOTO 6230
5850 POKE 49168,0: INVERSE : PRINT " ";: NORMAL : PRINT CHR$(8);
5860 KEY = PEEK(49152): IF KEY <128 THEN 5860
5870 POKE 49168,0:KEY = KEY -128: IF KEY = 94 THEN PRINT : GOTO 5910
5880 PX$ = PX$ + CHR$(KEY)
5890 X7 = KEY: GOSUB 6160
5900 GOTO 5850
5910 P4$(LL,Z6) = PX$: ONERR GOTO 7320
5920 GOTO 5720
5930 NEXT Z6
5940 CALL -958:Z8 = PEEK(37) +1
5950 VTAB Z8: PRINT "PRINT LEVEL ";LL;
5960 VTAB Z8: HTAB 30: PRINT P5$(LL);" (Y/N)"
5970 VTAB Z8: HTAB 30: INPUT "";JUNK$
5980 IF JUNK$ = "" THEN JUNK$ = P5$(LL): VTAB Z8: HTAB 30: PRINT JUNK$
5990 IF JUNK$ > CHR$(96) THEN JUNK$ = CHR$( ASC(JUNK$) -32)
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
6010 P5$(LL) = JUNK$
6020 CALL -958:Z8 = PEEK(37) +1
6030 PRINT "PRINT TEXT FOR LEVEL ";LL;
6040 VTAB Z8: HTAB 30: PRINT P6$(LL);" (Y/N)";
6050 VTAB Z8: HTAB 30: INPUT "";JUNK$
6060 IF JUNK$ = "" THEN JUNK$ = P6$(LL): VTAB Z8: HTAB 30: PRINT JUNK$
6070 IF JUNK$ > CHR$(96) THEN JUNK$ = CHR$( ASC(JUNK$) -32)
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
6090 P6$(LL) = JUNK$
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
6110 POKE -16368,0: WAIT -16384,128:YN = PEEK( -16384) -128: POKE -16368,0: PRINT
6120 ON YN < >121 AND YN < >89 AND YN < >27 GOTO 5490: IF YN = 27 THEN XF = 1
6130 ONERR GOTO 7320
6140 RETURN
6150 REM --PRINT PRINTER CONTROL CHARS--
6160 IF X7 = 13 THEN X7$ = " <RETURN>": GOTO 6210
6170 IF X7 = 27 THEN X7$ = " <ESC> ": GOTO 6210
6180 IF X7 = 32 THEN X7$ = " SPACE ": GOTO 6210
6190 IF X7 <32 THEN X7$ = " <CTRL>-" + CHR$(X7 +64) +" ": GOTO 6210
6200 X7$ = CHR$(X7)
6210 IF LEN(X7$) >40 - POS(0) THEN PRINT
6220 PRINT X7$;: RETURN
6230 CALL 768: IF PEEK(222) < >255 THEN 7330
6240 KEY = 3: GOTO 5880
6250 REM ----- SCROLL TO TOP OF OUTLINE -----
6260 NUM = 0
6270 RETURN
6280 REM ----- SCROLL TO BOTTOM OF OUTLINE -----
6290 NUM = MAX -1:Z9 = 0
6300 Z9 = Z9 + INT( LEN(OLINE$(NUM))/WIDTH) +1
6310 IF Z9 <18 THEN NUM = NUM -1: IF NUM >2 THEN 6300
6320 RETURN
6330 VTAB 12: HTAB 10
6340 REM ----- SCROLL DOWN ONE PAGE -----
6350 NUM = NWK -1
6360 IF NUM >MAX -1 THEN NUM = MAX -1
6370 RETURN
6380 REM ----- SCROLL UP ONE PAGE -----
6390 NUM = NUM -20
6400 IF NUM <0 THEN NUM = 0
6410 RETURN
6420 REM ----- SCROLL TO CURSOR LOCATION -----
6430 P$ = "INDICATE NEW TOP LINE OF SCREEN"
6440 GOSUB 520: REM GET THE LINE
6450 RETURN
6460 REM ----- INITIALIZATION ROUTINE -----
6470 TEXT : HOME : GOSUB 480: REM WAIT MSG
6480 FOR Z1 = 768 TO 777: READ P: POKE Z1,P: NEXT Z1
6490 DATA 104,168,104,166,223,154,72,152,72,96
6500 EF = 6: ONERR GOTO 7320
6510 GOSUB 7240: REM LOAD INPUT ROUTINE
6520 BELL$ = CHR$(7):D$ = CHR$(4)
6530 RESTORE : REM RESTORE ERROR RTN OVERLAID
6540 FOR Z1 = 768 TO 777: READ P: POKE Z1,P: NEXT Z1
6550 TRUE = (1 = 1):FALSE = (1 = 0)
6560 EXIT = FALSE:CHG = FALSE:OM = FALSE:RW% = FALSE
6570 P3% = 0:WIDTH = 40
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
6590 JUNK = PEEK(49048): FOR Z1 = 7 TO 2 STEP -1
6600 IF JUNK > = 2 ^Z1 THEN JUNK = JUNK -2 ^Z1
6610 NEXT Z1
6620 REM THIS LINE REMOVED
6630 PRINT D$;"PR#";P3%
6640 GOSUB 6840: REM GET MENU ITEMS
6650 GOSUB 7090: REM DISPLAY INTIAL SCREEN
6660 GOSUB 480: VTAB 10: HTAB 16: PRINT "OUTLINER": PRINT : HTAB 3: PRINT "COPYRIGHT 1987 BY MICROSPARC, INC."
6670 DIM OLINE$(300): REM OUTLINE TOPICS
6680 DIM LEV%(300): REM LEVEL OF TOPICS
6690 FOR Z = 1 TO 300:LEV%(Z) = -1: NEXT Z
6700 DIM TXT$(300): REM TXT FOR TOPICS
6710 DIM DIS%(300): REM DISPLAY FLAG
6720 FOR Z = 0 TO 300:DIS%(Z) = TRUE: NEXT Z
6730 DIM P1%(3),P2%(3),P3%(3),P4$(3,1),P5$(3),P6$(3),P9%(2)
6740 PP% = 1: REM PRINTER SLOT NUMBER
6750 FOR Z = 0 TO 3
6760 P1%(Z) = 1:P2%(Z) = 10:P3%(Z) = 80:P4$(Z,0) = "":P4$(Z,1) = "":P5$(Z) = "Y":P6$(Z) = "Y"
6770 NEXT Z
6780 P6$ = "": REM P6$ = CHR$(27)+"!"+CHR$(0):REM PRINTER RESET STRING
6790 P7$ = "Y": REM NUMBER TOPICS
6800 P8% = 66:P9%(1) = 6:P9%(2) = 6:P9$ = "Y": REM PG LEN AND MARGINS
6810 DIM ROW(24): REM ROW FOR EACH LINE OF TEXT DISPLAYED
6820 GOSUB 140: RETURN
6830 REM ----- GET MENU ITEMS -----
6840 N1 = 4:N2 = 7: REM NUM OF MENUS/SUBMENUS
6850 DIM MENU$(N1,N2)
6860 FOR Z1 = 1 TO 20:BLNK$ = BLNK$ +" ": NEXT Z1
6870 FOR Z1 = 1 TO N1
6880 READ MENU$(Z1,0)
6890 L = 18: IF Z1 >3 THEN L = 8
6900 FOR Z2 = 1 TO N2
6910 READ MENU$
6920 IF MENU$ < >"" THEN MENU$(Z1,Z2) = CHR$(91) + LEFT$(MENU$ +BLNK$,L) + CHR$(93)
6930 NEXT Z2
6940 NEXT Z1
6950 RETURN
6960 DATA "FILE"
6970 DATA "START NEW OUTLINE", "EDIT OLD OUTLINE", "SAVE OUTLINE", "PRINT OUTLINE"
6980 DATA "MERGE OUTLINE", "DISK COMMANDS", "EXIT TO BASIC"
6990 DATA "EDIT"
7000 DATA "ADD A TOPIC", "DELETE A TOPIC", "COPY A TOPIC", "MOVE A TOPIC"
7010 DATA "ADD TEXT TO ITEM", "EDIT AN ITEM", ""
7020 DATA "FORMAT"
7030 DATA "EXPAND A TOPIC", "COMPRESS A TOPIC", "EXPAND A LEVEL", "COMPRESS A LEVEL"
7040 DATA "DISPLAY TEXT", "PRINT OPTIONS", ""
7050 DATA "SCROLL"
7060 DATA "TOP", "BOTTOM", "PAGE DWN", "PAGE UP", "CURSOR"
7070 DATA "", ""
7080 REM ---DISPLAY INITIAL SCREEN---
7090 TEXT
7100 HOME
7110 PRINT TAB( 30)"FREE:"
7120 GOSUB 140: REM GET FREE SPACE
7130 VTAB 2: HTAB 1: INVERSE
7140 FOR COL = 1 TO WIDTH: PRINT " ";: NEXT COL: PRINT
7150 FOR M = 1 TO N1
7160 VTAB 2: HTAB (M -1) *10 +1
7170 IF M = 1 THEN HTAB 2
7180 PRINT MENU$(M,0);
7190 NEXT M
7200 NORMAL
7210 POKE 34,2
7220 RETURN
7230 REM ----- LOAD INPUT SUBROUTINE -----
7240 IF PEEK(48896) < >76 THEN PRINT CHR$(4)"MAXFILES 1"
7250 HIMEM: 38400
7260 VTAB 11: PRINT : PRINT "LOADING BINARY FILES": IF PEEK(48896) < >76 THEN POKE 1014,0: POKE 1015,151
7270 IF PEEK(48896) = 76 THEN PRINT CHR$(4);"BRUN OUTLINER.0"
7280 PRINT CHR$(4);"BLOAD OUTLINER.1,A$9700"
7290 ML% = 255:SL% = 0:DC$ = CHR$(95)
7300 RETURN
7310 REM ==ERROR HANDLING ROUTINE==
7320 CALL 768: POKE 216,0: PRINT CHR$(4)"CLOSE"
7330 POKE 35,24: VTAB 21: PRINT : CALL -958
7340 ER = PEEK(222):LINE = PEEK(218) + PEEK(219) *256
7350 IF ER = 3 THEN INVERSE : PRINT BELL$"DRIVE IS NOT READY-READY IT": NORMAL : GOTO 7460
7360 IF ER = 4 THEN INVERSE : PRINT BELL$"DISK IS WRITE PROTECTED-REMOVE TAB": NORMAL : GOTO 7460
7370 IF ER = 6 THEN INVERSE : PRINT BELL$"FILE NOT FOUND-INSERT CORRECT DISK": NORMAL : GOTO 7460
7380 IF ER = 8 THEN INVERSE : PRINT BELL$"I/O ERROR-INSERT DISK AGAIN": NORMAL : GOTO 7460
7390 IF ER = 9 THEN INVERSE : PRINT BELL$"DISK IS FULL-DELETE SOME FILES OR USE": PRINT "DIFFERENT DISK": NORMAL : GOTO 7460
7400 IF ER = 77 THEN INVERSE : PRINT BELL$"OUT OF MEMORY": NORMAL : GOTO 7460
7410 IF ER < >255 GOTO 7440
7420 ONERR GOTO 7320
7430 RESUME
7440 IF ER = 254 THEN INVERSE : PRINT BELL$"INVALID DATA ENTERED": NORMAL : GOTO 7460
7450 PRINT "ERROR ";ER;" ENCOUNTERED IN LINE ";LINE
7460 INVERSE : PRINT ;" RETURN TO CONTINUE, ESCAPE TO QUIT ";: NORMAL : POKE -16368,0: WAIT -16384,128:J = PEEK( -16384): POKE -16368,0: PRINT
7470 IF J = 155 THEN STOP
7480 ONERR GOTO 7320
7490 ON EF GOTO 1710,2040,2420,3420,3650,6500,5030