110 REM D$=CHR$(4),NS=NUMBER OF SUBROUTINES, MD$=MODE INDICATOR STRING, PR$=PROMPT MESSAGE STRING
120 REM N1+NS=COUNTERS FOR # OF SUBROUTINES PROCESSED, N=COUNTER FOR NUMBER OF STRINGS IN MENU
130 REM SB$(12,2,7)-HOLDS SUBROUTINE DATA, MM$(12,3)-HOLDS MAIN MENU DATA, PG$(150)-HOLDS FINAL PROGRAM LINES FROM PASS 2
140 REM LN$(600) HOLDS ALL LEGAL LINE NUMBERS POSSIBLE FOR ERROR CHECKING PURPOSES AND ALSO ASSEMBLED DATA LINES FROM PASS 1
150 REM LL$ AND LL HOLD LOWER LINE# LIMIT FOR GIVEN SUBROUTINE,UL$ AND UL HOLD UPPER LINE# LIMIT FOR GIVEN SUBROUTINES
160 REM MENU VARIABLES- T$=TITLE:SD=SOUNDFLAG:MENU$(N)=MENUSTRINGS:TB(N)=TABS:ST=START POSITION OF MENUSTRINGS IN DATA LIST:VE=VERTICALTABPOSITION:SN=# OF MENU CHOICES:X=VERTICAL CURSOR POSITION
170 SD = 1: GOTO 480: REM MAIN MENU CONTROL LINE
180 DATA AUTO MENU GENERATOR,ENTER PROGRAM DATA,CHANGE PROGRAM ASSEMBLY PARAMETERS,ASSEMBLE PROGRAM LINES, VIEW/EDIT ASSEMBLED PROGRAM LINES,DISK OPERATIONS,RESTART,QUIT
190 DATA RETURN TO MAIN MENU, CATALOG,LOAD CREATED MENU TEXT FILE,SAVE CREATED MENU TO TEXT FILE, TEST RUN CREATED MENU
200 DATA RETURN TO MAIN MENU, DISPLAY MODE STRING,INCLUDE ERROR HANDLING,EQUALIZE MENU STRING LENGTHS
210 RESTORE : IF ST >1 THEN FOR C = 1 TO ST: READ A$: NEXT : REM PRIMING READ TO GET TO PROPER DATA
220 READ T$
230 FOR C = 1 TO SN: READ MENU$(C):TB(C) = INT(20 - LEN(MENU$(C))/2): NEXT : RETURN
240 REM INITIAL PRINTING OF MENU ROUTINE
250 HOME : HTAB INT(17 -( LEN(T$)/2)): PRINT "** ";: INVERSE : PRINT T$;: NORMAL : PRINT " **";
260 NORMAL : VTAB 24: HTAB 7: INVERSE : PRINT "->";: NORMAL : PRINT "MOVE";: INVERSE : PRINT "<-";: NORMAL : PRINT " ";: INVERSE : PRINT "<RETURN>";: NORMAL : PRINT " SELECTS";
270 HTAB TB(1): VTAB VE: FOR C = 1 TO SN: HTAB TB(C): PRINT MENU$(C): NEXT : VTAB VE: HTAB TB(1): INVERSE : PRINT MENU$(1);: NORMAL
280 REM GET AND PROCESS KEY PRESS
290 POKE -16368,0: GET A$: GOSUB 440:X = PEEK(37) +1
300 IF A$ = CHR$(8) OR A$ = CHR$(11) THEN GOSUB 350: REM BACKWARD OR UP ARROW REVERSES MENU SELECTION
310 IF A$ = CHR$(21) OR A$ = CHR$(32) OR A$ = CHR$(10) THEN GOSUB 370: REM FORWARD OR DOWN ARROW OR SPACE BAR ADVANCES MENU SELECTION
320 IF A$ = CHR$(13) THEN X = PEEK(37) -VE +2: PRINT : RETURN : REM DETERMINE CHOICE BY CHECKING VERTICAL TAB POSITION
330 GOTO 290
340 REM TAB CONTROL ROUTINE
350 IF X = VE THEN VTAB X: GOSUB 400:X = VE +SN -1: GOSUB 410: INVERSE : GOSUB 420: RETURN
1380 LN$((LN -60)/10 -9) = STR$(LN) +" DATA " + LEFT$(F$, LEN(F$) -2) +": REM MENU DATA LINE FOR SUBROUTINE #" + STR$(C): PRINT LN$((LN -60)/10 -9):F$ = "RETURN TO MAIN MENU, ":LN = LN +10
1730 LN$(70 +C2) = LN$(70 +C2) +"REM **" +SB$(C,0,C1) +"** SUBMENU ROUTINE BEGINS HERE AND ENDS AT LINE " +SB$(C,2,C1): PRINT LN$(70 +C2)
1740 LN$(70 +C2 +1) = SB$(C,2,C1) +"RETURN: REM END OF **" +SB$(C,0,C1) +"** SUBMENU ROUTINE": PRINT LN$(70 +C2 +1)
1750 C2 = C2 +2: NEXT C1: NEXT C
1760 REM INTEGRATE LINES FROM DATA AND GENERATED PROGRAM LINES
1770 PR$ = "...PASS 2...": INVERSE : GOSUB 3220: NORMAL : HOME : HTAB 1: VTAB 4
1780 RESTORE : FOR C = 1 TO 17: READ A$: NEXT : REM PRIMING READ
1790 FOR C1 = 1 TO 6: READ PG$(C1): PRINT PG$(C1): NEXT :C1 = 7: REM READ LINES 100-150 OF AUTO MENU GENERATOR AND PLACE IN PG$(1-6)
1800 IF AP(2) THEN PG$(1) = "100 ONERR GOTO62010:" + RIGHT$(PG$(1), LEN(PG$(1)) -3)
1810 FOR C = 1 TO 19: IF LEN(LN$(C)) >1 THEN PG$(C1) = LN$(C):LN$(C) = "": PRINT PG$(C1):C1 = C1 +1: REM PLACE ASSEMBLED DATA LINE) IN PG$(7-N)
1820 NEXT
1830 FOR C = 1 TO 27: READ PG$(C1):C1 = C1 +1: IF C = 6 OR C = 5 THEN A$ = PG$(C1 -1): GOSUB 4000:PG$(C1 -1) = A$
1840 PRINT PG$(C1 -1): NEXT : REM READ MAIN PROGRAM BODY INTO PG$(N)
1850 IF AP(2) THEN FOR C = 215 TO 221: READ LN$(C):A$ = LN$(C): GOSUB 4000:LN$(C) = A$: NEXT
1860 FOR C = 20 TO 225: IF LEN(LN$(C)) >1 THEN PG$(C1) = LN$(C):LN$(C) = "": PRINT PG$(C1):C1 = C1 +1: REM PLACE ASSEMBLE GOSUB LINES AND BEGIN END POINTS INTO PG$(N)
1870 NEXT
1880 AS = 1:PR$ = "PROGRAM ASSEMBLED IN MEMORY-PRESS<CR>:": GOSUB 3220: POKE -16368,0: GET A$:NL = C1 -1: POKE 35,24: RETURN
1890 DATA "100 REM ***************************","110 REM * CREATED USING AUTO.MENU *","120 REM * BY KEN PENNER *","130 REM ***************************"
1900 DATA "140 REM T$=TITLE:SD=SOUNDFLAG:MENU$(N)=MENUSTRINGS:TB(N)=TABS:ST=START POSITION OF MENUSTRINGS IN DATA LIST:VE=VERTICALTABPOSITION:SN=# OF MENU CHOICES:X=VERTICAL CURSOR POSITION"
1910 DATA "150 DIM TB(12),ME$(12):SD=1:D$=CHR$(4): GOTO 560: REM MAIN MENU GOSUB LINE IS LOCATED AT 560"
1920 DATA "290 RESTORE : IF ST > 1 THEN FOR C = 1 TO ST: READ A$: NEXT : REM PRIMING READ TO GET TO PROPER DATA"
1930 DATA "300 READ T$"
1940 DATA "310 FOR C = 1 TO SN: READ MENU$(C):TB(C) = INT (20 - LEN (MENU$(C)) / 2): NEXT : RETURN "
1950 DATA "320 REM INITIAL PRINTING OF MENU ROUTINE"
1960 DATA "330 HOME : HTAB INT (17 - (LEN (T$) / 2)): PRINT [** [;: INVERSE : PRINT T$;: NORMAL : PRINT [ **[;"
1970 DATA "340 NORMAL : VTAB 24: HTAB 7: INVERSE : PRINT [->[;: NORMAL : PRINT[MOVE[;: INVERSE : PRINT[<-[;: NORMAL : PRINT[ [;: INVERSE : PRINT[<RETURN>[;: NORMAL : PRINT[ SELECTS[;"
1980 DATA "350 HTAB TB(1): VTAB VE: FOR C = 1 TO SN: HTAB TB(C): PRINT MENU$(C): NEXT : VTAB VE: HTAB TB(1): INVERSE : PRINT MENU$(1);: NORMAL "
1990 DATA "360 REM GET AND PROCESS KEY PRESS"
2000 DATA "370 GET A$: GOSUB 510:X = PEEK (37) + 1"
2010 DATA "380 IF A$ = CHR$ (8)OR A$=CHR$(11) THEN GOSUB 430: REM BACKWARD OR UP ARROW REVERSES MENU SELECTION"
2020 DATA "390 IF A$ = CHR$(21) OR A$ = CHR$ (32) OR A$=CHR$(10)THEN GOSUB 450: REM FORWARD OR DOWN ARROW OR SPACE BAR ADVANCES MENU SELECTION"
2030 DATA "400 IF A$ = CHR$ (13) THEN X = PEEK (37) - VE + 2: PRINT : RETURN : REM DETERMINE CHOICE BY CHECKING VERTICAL TAB POSITION"
2040 DATA "410 GOTO 370"
2050 DATA "420 REM TAB CONTROL ROUTINE"
2060 DATA "430 IF X = VE THEN VTAB X: GOSUB 480:X = VE + SN - 1: GOSUB 490: INVERSE : GOSUB 500: RETURN "
2070 DATA "440 VTAB X: GOSUB 480:X = X - 1: INVERSE : GOSUB 490: GOSUB 500: RETURN "
2080 DATA "450 IF X = SN + VE - 1 THEN VTAB SN + VE - 1: GOSUB 480:X = VE: GOSUB 490: INVERSE : GOSUB 500: RETURN "
2090 DATA "460 VTAB X: GOSUB 480:X = X + 1: INVERSE : GOSUB 490: GOSUB 500: RETURN "
2100 DATA "470 REM SUBROUTINE WHICH PRINTS PROPER MENU STRING IN INVERSE DEPENDING ON KEY PRESS"
2110 DATA "480 HTAB TB(X - VE + 1): PRINT MENU$(X - VE + 1);: RETURN "
2120 DATA "490 VTAB X: HTAB TB(X - VE + 1): RETURN "
2130 DATA "500 PRINT MENU$(X - VE + 1);: NORMAL : RETURN "
2140 DATA "510 REM ROUTINE TO PRODUCE SOUND"
2150 DATA "520 IF A$ = CHR$(83) THEN SD = (SD = 0)"
2160 DATA "530 IF SD THEN S = - 16336:A = PEEK (S) - PEEK (S) + PEEK (S) - PEEK (S) + PEEK (S)"
2170 DATA "540 RETURN"
2180 DATA "550 REM MAIN AND SUBMENU CONTROL LINES"
2190 DATA 62000 REM ERROR HANDLING ROUTINE"
2200 DATA "62010 CALL -3288:PRINTD$:PRINTD$[CLOSE[:PRINT D$[PR#0[:PRINT CHR$(7):X=PEEK(222):HTAB1:VTAB23:POKE35,24:CALL-958:HTAB1:VTAB23
2210 DATA "62020 IF X=6 OR X=5 THEN PRINT [FILE NOT FOUND[;:X=257"
2220 DATA "62030 IF X = 8 OR X = 9 OR X = 4 THEN PRINT [I/O ERROR[;:X = 257"
2230 DATA "62040 IF X = 254 OR X = 255 OR X = 53 OR X = 176 THEN PRINT [BAD INPUT ERROR[;:X = 257
2240 DATA "62050 IF X < > 257 THEN VTAB 23: PRINT [ERROR NUMBER [PEEK (222)[ IN LINE [PEEK (218) + PEEK (219) * 256
2440 VTAB T: HTAB L: POKE -16368,0: POKE -16368,0: GET Z1$:X = PEEK( -16384): VTAB T
2450 IF X <32 THEN ON X GOTO 2440,2420,2440,2550,2440,2610,2440,2560,2600,2440,2440,2440,2520,2640,2440,2440,2630,2440,2440,2440,2580,2440,2440,2440,2440,2620,2440,2440,2440,2440,2440: GOTO 2440
2460 IF E = 1 THEN M$ = LEFT$(M$,L -1) +Z1$ + MID$ (M$,L +1): HTAB L: PRINT Z1$;:L = L +1: GOTO 2440
2470 IF E = 2 THEN M$ = LEFT$(M$,L -1) +Z1$ + MID$ (M$,L): HTAB L: PRINT MID$ (M$,L);:L = L +1: GOTO 2440
2480 F = W:W = X: IF F < >X AND F THEN E = 1: GOTO 2460
2490 FOR J3 = L +1 TO LEN(M$): IF Z1$ < > MID$ (M$,J3,1) THEN NEXT : GOTO 2440
2840 PR$ = "FILE SAVED TO DISK-PRESS <CR>: ": GOSUB 3220: POKE -16368,0: GET A$:SV = 1: RETURN
2850 REM LOAD CREATED MENU PROGRAM ROUTINE
2860 IF N >0 OR N1 >0 THEN PR$ = "MUST RESTART FIRST: ": GOSUB 3220: POKE -16368,0: GET A$: POP : RETURN
2870 HOME :MD$ = "LOAD CREATED MENU TEXT FILE": GOSUB 3180
2880 HTAB 1: VTAB 4: PRINT "ENTER FILE NAME (Q)UITS";: INPUT ": ";B$: IF B$ = "Q" THEN RETURN
2890 GOSUB 3560: IF ER THEN ER = 0: GOTO 2880
2900 IF RIGHT$(B$,5) < >".TEXT" THEN B$ = B$ +".TEXT"
2910 PRINT D$"VERIFY"B$
2920 PRINT D$"OPEN FN": PRINT D$"WRITE FN": PRINT B$: PRINT D$"CLOSE FN": REM SAVE FILE NAME TO DISK SO CLEAR IS POSSIBLE
2930 POKE 34,12
2940 CLEAR :D$ = CHR$(4)
2950 HTAB 1: VTAB 7: PRINT "WAIT WHILE PREPARING TO READ FILE"
2960 IF PEEK(48896) < >76 THEN PRINT D$"BLOAD CHAIN,A520": CALL 520"LOADER": REM RUN LOADER PROGRAM TO READ THE FILE WITH DOS 3.3 CHAIN PROGRAM FROM SYSTEM MASTER DISK
2965 PRINT D$"CHAIN LOADER": REM FOR PRODOS
2970 REM NO RETURN NEEDED HERE BECAUSE LOADER RETURNS CONTROL TO FIRST LINES
2980 REM TEST RUN CREATED MENU ROUTINE
2990 HOME : POKE 34,1:MD$ = "TEST RUN CREATED MENU ": GOSUB 3180
3000 HOME : HTAB 1: VTAB 4: PRINT "ENTER FILE NAME TO TEST (Q)UITS": INPUT "-->";B$: IF B$ = "Q" THEN RETURN
3010 GOSUB 3560: IF ER THEN ER = 0: GOTO 2990
3020 IF RIGHT$(B$,5) < >".TEXT" THEN B$ = B$ +".TEXT"
3030 PRINT D$"VERIFY"B$
3040 HOME : POKE 34,16: HTAB 1: VTAB 3: PRINT "PREPARING TO READ FILE":