home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib27a.dsk / FEBRUARY.1986 / AUTO.MENU.bas next >
BASIC Source File  |  2023-02-26  |  28KB  |  409 lines

  1. 1  REM  **********************
  2. 2  REM  *     <CTRL-A>AUTO.MENU      *
  3. 3  REM  * BY KENNETH PENNER  *
  4. 4  REM  * COPYRIGHT (C) 1986 *
  5. 5  REM  * BY MICROSPARC, INC *
  6. 6  REM  * CONCORD, MA  01742 *
  7. 7  REM  **********************
  8. 50  TEXT : HOME : VTAB 10: HTAB 11: PRINT "AUTO MENU GENERATOR": VTAB 12: HTAB 12: PRINT "BY KENNETH PENNER": VTAB 14: PRINT "** COPYRIGHT 1986 BY MICROSPARC, INC **": VTAB 22: HTAB 7: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT 
  9. 60  ONERR  GOTO 3770
  10. 70  IF C1 >1  THEN 480: REM  INITIALIZATION ALREADY TAKEN PLACE
  11. 80  HOME : GOTO 3700: REM  INITIALIZE
  12. 90  REM  THROW-AWAY STRING AND COUNTER VARIABLE -A$,B$,C$,F$,C,C1,C2
  13. 100  REM  FLAGS ER=ERROR OCCURED, DA=DATA ENTERED, AS=ASSEMBLY COMPLETED, SV=FILE SAVED, LD=FILE LOADED
  14. 110  REM  D$=CHR$(4),NS=NUMBER OF SUBROUTINES, MD$=MODE INDICATOR STRING, PR$=PROMPT MESSAGE STRING
  15. 120  REM  N1+NS=COUNTERS FOR # OF SUBROUTINES PROCESSED, N=COUNTER FOR NUMBER OF STRINGS IN MENU
  16. 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
  17. 140  REM  LN$(600) HOLDS ALL LEGAL LINE NUMBERS POSSIBLE FOR ERROR CHECKING PURPOSES AND ALSO ASSEMBLED DATA LINES FROM PASS 1
  18. 150  REM  LL$ AND LL HOLD LOWER LINE# LIMIT FOR GIVEN SUBROUTINE,UL$ AND UL HOLD UPPER LINE# LIMIT FOR GIVEN SUBROUTINES
  19. 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
  20. 170 SD = 1: GOTO 480: REM  MAIN MENU CONTROL LINE
  21. 180  DATA       AUTO MENU GENERATOR,ENTER PROGRAM DATA,CHANGE PROGRAM ASSEMBLY PARAMETERS,ASSEMBLE PROGRAM LINES, VIEW/EDIT ASSEMBLED PROGRAM LINES,DISK OPERATIONS,RESTART,QUIT
  22. 190  DATA       RETURN TO MAIN MENU, CATALOG,LOAD CREATED MENU TEXT FILE,SAVE CREATED MENU TO TEXT FILE, TEST RUN CREATED MENU
  23. 200  DATA    RETURN TO MAIN MENU, DISPLAY MODE STRING,INCLUDE ERROR HANDLING,EQUALIZE MENU STRING LENGTHS
  24. 210  RESTORE : IF ST >1  THEN  FOR C = 1 TO ST: READ A$: NEXT : REM  PRIMING READ TO GET TO PROPER DATA
  25. 220  READ T$
  26. 230  FOR C = 1 TO SN: READ MENU$(C):TB(C) =  INT(20 - LEN(MENU$(C))/2): NEXT : RETURN 
  27. 240  REM  INITIAL PRINTING OF MENU ROUTINE
  28. 250  HOME : HTAB  INT(17 -( LEN(T$)/2)): PRINT "** ";: INVERSE : PRINT T$;: NORMAL : PRINT " **";
  29. 260  NORMAL : VTAB 24: HTAB 7: INVERSE : PRINT "->";: NORMAL : PRINT "MOVE";: INVERSE : PRINT "<-";: NORMAL : PRINT "   ";: INVERSE : PRINT "<RETURN>";: NORMAL : PRINT " SELECTS";
  30. 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 
  31. 280  REM  GET AND PROCESS KEY PRESS
  32. 290  POKE  -16368,0: GET A$: GOSUB 440:X =  PEEK(37) +1
  33. 300  IF A$ =  CHR$(8)  OR A$ =  CHR$(11)  THEN  GOSUB 350: REM  BACKWARD OR UP ARROW REVERSES MENU SELECTION
  34. 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
  35. 320  IF A$ =  CHR$(13)  THEN X =  PEEK(37) -VE +2: PRINT : RETURN : REM  DETERMINE CHOICE BY CHECKING VERTICAL TAB POSITION
  36. 330  GOTO 290
  37. 340  REM  TAB CONTROL ROUTINE
  38. 350  IF X = VE  THEN  VTAB X: GOSUB 400:X = VE +SN -1: GOSUB 410: INVERSE : GOSUB 420: RETURN 
  39. 360  VTAB X: GOSUB 400:X = X -1: INVERSE : GOSUB 410: GOSUB 420: RETURN 
  40. 370  IF X = SN +VE -1  THEN  VTAB SN +VE -1: GOSUB 400:X = VE: GOSUB 410: INVERSE : GOSUB 420: RETURN 
  41. 380  VTAB X: GOSUB 400:X = X +1: INVERSE : GOSUB 410: GOSUB 420: RETURN 
  42. 390  REM  SUBROUTINE WHICH PRINTS PROPER MENU STRING IN INVERSE DEPENDING ON KEY PRESS
  43. 400  HTAB TB(X -VE +1): PRINT MENU$(X -VE +1);: RETURN 
  44. 410  VTAB X: HTAB TB(X -VE +1): RETURN 
  45. 420  PRINT MENU$(X -VE +1);: NORMAL : RETURN 
  46. 430  REM  ROUTINE TO PRODUCE SOUND
  47. 440  IF A$ =  CHR$(83)  THEN SD = (SD = 0)
  48. 450  IF SD  THEN S =  -16336:A =  PEEK(S) - PEEK(S) + PEEK(S) - PEEK(S) + PEEK(S)
  49. 460  RETURN 
  50. 470  REM  MAIN MENU
  51. 480  POKE 33,40:ST = 1:SN = 7:VE = 3: GOSUB 210: GOSUB 250: ON X GOSUB 540,500,1220,2270,490,4020,3140: POKE 34,0: HOME : GOTO 480
  52. 490 ST = 7:SN = 5:VE = 16: GOSUB 210: GOSUB 260: ON X GOSUB 520,2660,2860,2700,2990: POKE 34,0: HOME : GOTO 490
  53. 500 ST = 12:SN = 4:VE = 16: POKE 33,38: GOSUB 3990: GOSUB 210: GOSUB 260: ON X GOSUB 520,3980,3980,3980: POKE 34,0
  54. 510  GOSUB 290: GOSUB 3980: ON X GOTO 480,510,510,510
  55. 520  POP : POKE 33,40: RETURN 
  56. 530  REM  ENTER PROGRAM DATA ROUTINE
  57. 540  IF N >0  OR N1 >0  THEN PR$ = "MUST  RESTART FIRST: ": GOSUB 3220: POKE  -16368,0: GET A$: RETURN 
  58. 550 N = 1:N1 = 0
  59. 560  HOME :MD$ = "MAIN MENU DATA ENTRY": GOSUB 3180: POKE 34,16
  60. 570  HOME : VTAB 17: PRINT "MAIN MENU TITLE (2-32 CHARS) (Q)UITS": INPUT "-->";B$: IF B$ = "Q"  THEN  RETURN 
  61. 580  GOSUB 3540: ON  LEN(B$) >0 GOSUB 3650: IF ER  THEN ER = 0: GOTO 570
  62. 590  GOSUB 3210: IF A$ = "N"  THEN 570
  63. 600  IF A$ < >"Y"  THEN 590
  64. 610  INVERSE :MM$(N,0) = B$: GOSUB 3190: NORMAL 
  65. 620 UL = 0:LL = 0: HOME : VTAB 17: PRINT "MAIN MENU OPTION #"N" (2-32 CHARS):": INPUT "-->";B$
  66. 630  GOSUB 3520: GOSUB 3650: IF ER  THEN ER = 0: GOTO 620
  67. 640  HTAB 1: VTAB 19: PRINT "LINE# TO GOSUB TO FOR OPTION "N;: INPUT "-->";LL$:LL =  VAL(LL$)
  68. 650  GOSUB 3260: IF ER  THEN ER = 0: GOTO 640: REM  ERROR CHECKING
  69. 660  HTAB 1: VTAB 20: PRINT "LINE# END-POINT FOR OPTION "N;: INPUT "  -->";UL$:UL =  VAL(UL$): IF UL/100 =  INT(UL/100)  THEN UL = UL -1:UL$ =  STR$(UL)
  70. 670  GOSUB 3260: IF ER  THEN ER = 0: GOTO 660: REM  ERROR CHECK
  71. 680  GOSUB 3360: IF ER  THEN ER = 0:C$ = "N": GOTO 700
  72. 690  IF   NOT ER  THEN  HTAB 1: VTAB 21: PRINT "SUBMENU FOR OPTION "N;: INPUT "     (Y/N)-->";C$: IF C$ < >"Y"  AND C$ < >"N"  THEN 690
  73. 700  GOSUB 3210: IF A$ = "N"  THEN 620
  74. 710  IF A$ < >"Y"  THEN 700
  75. 720 N = N +1:MM$(N,0) = B$:MM$(N,1) = LL$:MM$(N,2) = UL$: IF C$ = "Y"  THEN MM$(N,3) = "SB":NS = NS +1
  76. 730 B$ = B$ +" (" +LL$ +"-" +UL$ +")" +C$: IF  LEN(B$) >36  THEN B$ = ".." + RIGHT$(B$,36)
  77. 740  GOSUB 3190
  78. 750  FOR C = LL TO UL  STEP 100:LN$(C/100) = "": NEXT : REM  CLEAR OUT LINE # POSSIBILITIES
  79. 760  HOME :PR$ = "<CR>CONTINUE,<SP>MENU COMPLETED,(Q)UIT": GOSUB 3220
  80. 770  POKE  -16368,0: GET A$:MM$(0,0) =  STR$(N)
  81. 780  IF A$ = "Q"  OR (A$ =  CHR$(32)  AND N = 2)  THEN  GOSUB 3380: GOTO 760
  82. 790  IF A$ =  CHR$(32)  THEN  GOTO 820
  83. 800  IF A$ =  CHR$(13)  AND N <13  THEN  GOTO 620
  84. 810  GOTO 760
  85. 820 PR$ = "MAIN MENU COMPLETED, PRESS A KEY:": GOSUB 3220: POKE  -16368,0: GET A$
  86. 830  IF NS = 0  THEN 1190
  87. 840 N = 1:SB = 1:N1 = 1: REM  N=SUBMENU#, N1=# OF STRINGS IN SUBMENU
  88. 850  POKE 34,0: HOME :MD$ = "SUBMENU DATA ENTRY": GOSUB 3180
  89. 860  POKE 34,1: HOME :SB = SB +1: FOR C = SB TO 13: IF MM$(C,3) = "SB"  THEN SB = C:C = 13
  90. 870  NEXT 
  91. 880 L1 =  VAL(MM$(SB,1)):L2 =  VAL(MM$(SB,2))
  92. 890  FOR C = L1 TO L2  STEP 100:LN$(C/100) =  STR$(C): NEXT 
  93. 900  HTAB 1: VTAB 3: PRINT "SUBMENU#   -->"N: PRINT "LINE# RANGE-->"MM$(SB,1)"-"MM$(SB,2): PRINT "MAIN MENU PROMPT FOR THIS SUBMENU BELOW": VTAB 7: INVERSE :B$ = MM$(SB,0): GOSUB 3230: NORMAL 
  94. 910  HTAB 1: VTAB 8:B$ = "RETURN TO MAIN MENU": GOSUB 3230
  95. 920  POKE 34,16:UL = 0:LL = 0: HOME : VTAB 17: PRINT "SUBMENU OPTION #"N1 +1" (2-32) CHARS (Q)UITS": INPUT "-->";B$: IF B$ = "Q"  THEN PR$ = "SUBMENU INCOMPLETE,QUIT ANYWAY? (Y/N)": GOSUB 3220: POKE  -16368,0: GET A$: IF A$ = "Y"  THEN NS = N -(N1 = 1): GOTO 1190
  96. 930  GOSUB 3540: IF ER  THEN ER = 0: GOTO 920
  97. 940  GOSUB 3590: GOSUB 3650: IF ER  THEN ER = 0: GOTO 920
  98. 950  HTAB 1: VTAB 19: PRINT "LINE# TO BRANCH TO FOR OPTION "N1 +1;: INPUT "->";LL$:LL =  VAL(LL$)
  99. 960  GOSUB 3440: IF ER  THEN ER = 0: GOTO 950: REM  ERROR CHECKING
  100. 970  HTAB 1: VTAB 20: PRINT "LINE # END-POINT FOR OPTION "N1 +1;: INPUT "  -->";UL$:UL =  VAL(UL$): IF UL/100 =  INT(UL/100)  THEN UL = UL -1:UL$ =  STR$(UL)
  101. 980  GOSUB 3440: IF ER  THEN ER = 0: GOTO 970: REM  ERROR CHECK
  102. 990  GOSUB 3210: IF A$ = "N"  THEN 920
  103. 1000  IF A$ < >"Y"  THEN 990
  104. 1010 SB$(N,0,N1) = B$:SB$(N,1,N1) = LL$:SB$(N,2,N1) = UL$:SB$(N,0,0) =  STR$(N1):N1 = N1 +1
  105. 1020 B$ = B$ +" (" +LL$ +"-" +UL$ +")": IF  LEN(B$) >36  THEN B$ = ".." + RIGHT$(B$,36)
  106. 1030  GOSUB 3240
  107. 1040  FOR C = LL TO UL  STEP 100:LN$(C/100) = "": NEXT : REM  CLEAR OUT LINE # POSSIBILITIES
  108. 1050 C1 = 0: FOR C = L1 TO L2  STEP 100: IF LN$(C/100) < >""  THEN C1 = C1 +1: REM  CHECK TO SEE IF ANY LINE NUMBERS LEFT
  109. 1060  NEXT : IF C1 = 0  THEN A$ =  CHR$(32): GOTO 1090
  110. 1070  HOME :PR$ = "<CR>CONTINUES,<SP>MENU COMPLETED,(Q)UIT": GOSUB 3220
  111. 1080  POKE  -16368,0: GET A$
  112. 1090  IF A$ =  CHR$(32)  AND N1 >1  THEN N = N +1:N1 = 1: GOTO 1140
  113. 1100  IF A$ = "Q"  THEN  GOSUB 3380: GOTO 1070
  114. 1110  IF A$ =  CHR$(13)  THEN 1140
  115. 1120  GOTO 1080
  116. 1130  REM  CHECK TO SEE IF ANY MORE SUBMENUS
  117. 1140  IF N =  >NS +1  OR (A$ =  CHR$(13)  AND N = NS  AND N1 >6)  THEN 1190
  118. 1150  IF N >13  THEN 1190
  119. 1160  IF N1 >6  THEN N = N +1:N1 = 1: GOTO 1180
  120. 1170  IF A$ =  CHR$(13)  THEN 920
  121. 1180 PR$ = "ADVANCING TO NEXT SUBMENU-PRESS <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$: GOTO 860
  122. 1190 PR$ = "SUBMENUS COMPLETE-PRESS <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$:DA = 1:SB$(0,0,0) =  STR$(NS): RETURN 
  123. 1200  REM  ASSEMBLE BASIC LINES ROUTINE
  124. 1210  REM  ASSEMBLE DATA LINES FOR MAIN MENU FIRST
  125. 1220  GOSUB 3610: IF ER  THEN ER = 0: RETURN 
  126. 1230  IF AS  OR LD  THEN PR$ = "ALREADY ASSEMBLED-PRESS <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$: RETURN 
  127. 1240  HOME :MD$ = "ASSEMBLING BASIC PROGRAM LINES": GOSUB 3180:PR$ = "...PASS 1...": INVERSE : GOSUB 3220: NORMAL : POKE 34,3: POKE 35,22:LN = 160: HTAB 1: VTAB 4
  128. 1250  IF AP(3)  THEN  GOSUB 3830
  129. 1260  FOR C = 1 TO 600:LN$(C) = "": NEXT 
  130. 1270  FOR C = 1 TO  VAL(MM$(0,0))
  131. 1280 F$ = F$ + CHR$(34) +MM$(C,0) + CHR$(34) +", "
  132. 1290  IF C/7 =  INT(C/7)  OR C =  VAL(MM$(0,0))  THEN LN$((LN -60)/10 -9) =  STR$(LN) +" DATA " + LEFT$(F$, LEN(F$) -2): PRINT LN$((LN -60)/10 -9):F$ = "":LN = LN +10
  133. 1300  NEXT 
  134. 1310  REM  ASSEMBLE DATA LINES FOR SUBROUTINES IF ANY
  135. 1320  IF NS = 0  THEN 1410: REM  SKIP TO MENU GOSUB LINE ASSEMBLY ROUTINE
  136. 1330  FOR C = 1 TO NS
  137. 1340  GOSUB 4040
  138. 1350  FOR C1 = 1 TO  VAL(SB$(C,0,0))
  139. 1360 F$ = F$ + CHR$(34) +SB$(C,0,C1) + CHR$(34) +", "
  140. 1370  NEXT C1
  141. 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
  142. 1390  NEXT C
  143. 1400  REM  MAIN MENU GOSUB LINE ASSEMBLY
  144. 1410 A$ = ":GOSUB290:GOSUB330:ON X GOSUB":SB = 1
  145. 1420 LN = 560:F$ =  STR$(LN) +" ST=1:SN=" + STR$( VAL(MM$(0,0)) -1) +":VE=3" +A$
  146. 1430  FOR C = 2 TO  VAL(MM$(0,0))
  147. 1440  IF MM$(C,3) = "SB"  THEN F$ = F$ + STR$(560 +10 *SB) +",":SB = SB +1: GOTO 1460
  148. 1450 F$ = F$ +MM$(C,1) +","
  149. 1460  NEXT 
  150. 1470 F$ =  LEFT$(F$, LEN(F$) -1) +"
  151. 1480 LN$(20) = F$ +":POKE34,0:HOME:GOTO560": PRINT LN$(20):LN = LN +10:F$ = ""
  152. 1490  IF NS = 0  THEN 1620: REM  START INTEGRATING PROGRAM LINES
  153. 1500  REM  SUB-MENU GOSUB LINE ASSEMBLY ROUTINE
  154. 1510 A$ = ":VE=16:GOSUB290:GOSUB340:ON X GOSUB 690,":ST$ =  STR$( VAL(MM$(0,0)) -1)
  155. 1520  FOR C = 1 TO NS: REM  # OF SUBROUTINES
  156. 1530 F$ = " ST=" +ST$ +":SN=" + STR$( VAL(SB$(C,0,0)) +1) +A$
  157. 1540  FOR C1 = 1 TO  VAL(SB$(C,0,0))
  158. 1550 F$ = F$ +SB$(C,1,C1) +","
  159. 1560  NEXT 
  160. 1570 F$ =  LEFT$(F$, LEN(F$) -1) +":POKE34,0:HOME:GOTO" + STR$(LN)
  161. 1580 LN$(20 +C) =  STR$(LN) +" " +F$: PRINT LN$(20 +C):LN = LN +10
  162. 1590 ST$ =  STR$( VAL(ST$) + VAL(SB$(C,0,0)) +1)
  163. 1600  NEXT C
  164. 1610 LN$(49) = "690 POP:RETURN": PRINT LN$(49)
  165. 1620  REM  ASSEMBLE MAIN MENU SUBROUTINE START AND END POINT LINES
  166. 1630 C1 = 0: FOR C = 2 TO  VAL(MM$(0,0))
  167. 1640  IF MM$(C,3) = "SB"  THEN 1690
  168. 1650 LN$(50 +C1) = MM$(C,1): IF AP(1)  THEN LN$(50 +C1) = LN$(50 +C1) +"POKE34,0:HOME:INVERSE:PRINT" + CHR$(34) +MM$(C,0) + CHR$(34) +":NORMAL:GETA$:"
  169. 1660 LN$(50 +C1) = LN$(50 +C1) +"REM **" +MM$(C,0) +"** MAIN MENU ROUTINE BEGINS HERE AND ENDS AT LINE " +MM$(C,2): PRINT LN$(50 +C1)
  170. 1670 LN$(50 +C1 +1) = MM$(C,2) +" RETURN:REM END OF **" +MM$(C,0) +"** MAIN MENU ROUTINE": PRINT LN$(50 +C1 +1)
  171. 1680 C1 = C1 +2
  172. 1690  NEXT C:C2 = 0: IF NS = 0  THEN 1770
  173. 1700  REM  ASSEMBLE SUBROUTINE START AND END POINT LINES
  174. 1710  FOR C = 1 TO NS: FOR C1 = 1 TO  VAL(SB$(C,0,0))
  175. 1720 LN$(70 +C2) = SB$(C,1,C1): IF AP(1)  THEN LN$(70 +C2) = LN$(70 +C2) +"POKE34,0:HOME:INVERSE:PRINT" + CHR$(34) +SB$(C,0,C1) + CHR$(34) +":NORMAL:POKE-16368,0:GET A$:"
  176. 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)
  177. 1740 LN$(70 +C2 +1) = SB$(C,2,C1) +"RETURN: REM END OF **" +SB$(C,0,C1) +"** SUBMENU ROUTINE": PRINT LN$(70 +C2 +1)
  178. 1750 C2 = C2 +2: NEXT C1: NEXT C
  179. 1760  REM  INTEGRATE LINES FROM DATA AND GENERATED PROGRAM LINES
  180. 1770 PR$ = "...PASS 2...": INVERSE : GOSUB 3220: NORMAL : HOME : HTAB 1: VTAB 4
  181. 1780  RESTORE : FOR C = 1 TO 17: READ A$: NEXT : REM  PRIMING READ
  182. 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)
  183. 1800  IF AP(2)  THEN PG$(1) = "100 ONERR GOTO62010:" + RIGHT$(PG$(1), LEN(PG$(1)) -3)
  184. 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)
  185. 1820  NEXT 
  186. 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$
  187. 1840  PRINT PG$(C1 -1): NEXT : REM  READ MAIN PROGRAM BODY INTO PG$(N)
  188. 1850  IF AP(2)  THEN  FOR C = 215 TO 221: READ LN$(C):A$ = LN$(C): GOSUB 4000:LN$(C) = A$: NEXT 
  189. 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)
  190. 1870  NEXT 
  191. 1880 AS = 1:PR$ = "PROGRAM ASSEMBLED IN MEMORY-PRESS<CR>:": GOSUB 3220: POKE  -16368,0: GET A$:NL = C1 -1: POKE 35,24: RETURN 
  192. 1890  DATA  "100 REM ***************************","110 REM * CREATED USING AUTO.MENU *","120 REM *      BY KEN PENNER      *","130 REM ***************************"
  193. 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"
  194. 1910  DATA  "150 DIM TB(12),ME$(12):SD=1:D$=CHR$(4): GOTO 560: REM MAIN MENU GOSUB LINE IS LOCATED AT 560"
  195. 1920  DATA  "290 RESTORE : IF ST > 1 THEN  FOR C = 1 TO ST: READ A$: NEXT : REM  PRIMING READ TO GET TO PROPER DATA"
  196. 1930  DATA  "300  READ T$"
  197. 1940  DATA  "310 FOR C = 1 TO SN: READ MENU$(C):TB(C) = INT (20 -  LEN (MENU$(C)) / 2): NEXT : RETURN "
  198. 1950  DATA  "320 REM   INITIAL PRINTING OF MENU ROUTINE"
  199. 1960  DATA  "330 HOME : HTAB  INT (17 - (LEN (T$) / 2)): PRINT [** [;: INVERSE : PRINT T$;: NORMAL : PRINT [ **[;"
  200. 1970  DATA  "340 NORMAL : VTAB 24: HTAB 7: INVERSE : PRINT [->[;: NORMAL : PRINT[MOVE[;: INVERSE : PRINT[<-[;: NORMAL : PRINT[    [;: INVERSE : PRINT[<RETURN>[;: NORMAL : PRINT[ SELECTS[;"
  201. 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 "
  202. 1990  DATA  "360 REM  GET AND PROCESS KEY PRESS"
  203. 2000  DATA  "370 GET A$: GOSUB 510:X =  PEEK (37) + 1"
  204. 2010  DATA  "380 IF A$ =  CHR$ (8)OR A$=CHR$(11) THEN  GOSUB 430: REM  BACKWARD OR UP ARROW REVERSES MENU SELECTION"
  205. 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"
  206. 2030  DATA  "400 IF A$ =  CHR$ (13) THEN X =  PEEK (37) - VE + 2: PRINT : RETURN : REM   DETERMINE CHOICE BY CHECKING VERTICAL TAB POSITION"
  207. 2040  DATA  "410 GOTO 370"
  208. 2050  DATA  "420 REM  TAB CONTROL ROUTINE"
  209. 2060  DATA  "430 IF X = VE THEN  VTAB X: GOSUB 480:X = VE + SN - 1: GOSUB 490: INVERSE : GOSUB 500: RETURN "
  210. 2070  DATA  "440 VTAB X: GOSUB 480:X = X - 1: INVERSE : GOSUB 490: GOSUB 500: RETURN "
  211. 2080  DATA  "450 IF X = SN + VE - 1 THEN  VTAB SN + VE - 1: GOSUB 480:X = VE: GOSUB 490: INVERSE : GOSUB 500: RETURN "
  212. 2090  DATA  "460 VTAB X: GOSUB 480:X = X + 1: INVERSE : GOSUB 490: GOSUB 500: RETURN "
  213. 2100  DATA  "470 REM   SUBROUTINE WHICH PRINTS PROPER MENU STRING IN INVERSE DEPENDING ON KEY PRESS"
  214. 2110  DATA  "480 HTAB TB(X - VE + 1): PRINT MENU$(X - VE + 1);: RETURN "
  215. 2120  DATA  "490 VTAB X: HTAB TB(X - VE + 1): RETURN "
  216. 2130  DATA  "500 PRINT MENU$(X - VE + 1);: NORMAL : RETURN "
  217. 2140  DATA  "510 REM      ROUTINE TO PRODUCE SOUND"
  218. 2150  DATA  "520 IF A$ =  CHR$(83) THEN SD = (SD = 0)"
  219. 2160  DATA  "530 IF SD THEN S =  - 16336:A =  PEEK (S) -  PEEK (S) +  PEEK (S) -  PEEK (S) +  PEEK (S)"
  220. 2170  DATA  "540 RETURN"
  221. 2180  DATA  "550 REM    MAIN AND SUBMENU CONTROL LINES"
  222. 2190  DATA  62000 REM ERROR HANDLING ROUTINE"
  223. 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
  224. 2210  DATA  "62020 IF X=6 OR X=5 THEN PRINT [FILE NOT FOUND[;:X=257"
  225. 2220  DATA  "62030  IF X = 8 OR X = 9 OR X = 4 THEN  PRINT [I/O ERROR[;:X = 257"
  226. 2230  DATA  "62040 IF X = 254 OR X = 255 OR X = 53 OR X = 176 THEN PRINT [BAD INPUT ERROR[;:X = 257
  227. 2240  DATA  "62050 IF X <  > 257 THEN  VTAB 23: PRINT [ERROR NUMBER [PEEK (222)[ IN LINE [PEEK (218) +  PEEK (219) * 256
  228. 2250  DATA  "62060 PRINT [-PRESS <CR>: [;: POKE-16368,0:GET A$: PRINT : RETURN
  229. 2260  REM  VIEW ASSEMBLED PROGRAMMED LINES ROUTINE
  230. 2270  GOSUB 3160: IF ER  THEN ER = 0: RETURN 
  231. 2280  GOSUB 3630: IF ER  THEN ER = 0: RETURN 
  232. 2290  HOME :MD$ = "VIEW/EDIT PROGRAM LINES": GOSUB 3180
  233. 2300  GOSUB 2390
  234. 2310  POKE 34,2: POKE 35,23: HTAB 1: VTAB 12: PRINT "-->"PG$(1);: HTAB 39: VTAB 24:C2 = 1
  235. 2320  POKE  -16368,0: GET A$
  236. 2330  IF A$ =  CHR$(32)  OR A$ =  CHR$(21)  THEN C2 = C2 +1: IF C2 >NL  THEN C2 = 1
  237. 2340  IF A$ =  CHR$(8)  THEN C2 = C2 -1: IF C2 = 0  THEN C2 = NL
  238. 2350  IF A$ = "Q"  THEN  POKE 35,24: RETURN 
  239. 2360  IF A$ =  CHR$(13)  THEN  GOSUB 2400: GOSUB 2390
  240. 2370  HTAB 1: VTAB 12: PRINT "-->"PG$(C2);: CALL  -958: HTAB 39: VTAB 24
  241. 2380  GOTO 2320
  242. 2390 PR$ = "<-ARROWS SCROLL-> (Q)UITS <CR>TO EDIT:": POKE 35,23: GOSUB 3220: RETURN 
  243. 2400 PR$ = "<RETURN> ACCEPTS,<CTRL>BDFINQZ TO EDIT:": GOSUB 3220: HTAB 1: VTAB 12:T = 12
  244. 2410 M$ = " " +PG$(C2): PRINT M$"  ";: GOSUB 2420:PG$(C2) = R$ +" ": RETURN 
  245. 2420 L = 2
  246. 2430 E = 1
  247. 2440  VTAB T: HTAB L: POKE  -16368,0: POKE  -16368,0: GET Z1$:X =  PEEK( -16384): VTAB T
  248. 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
  249. 2460  IF E = 1  THEN M$ =  LEFT$(M$,L -1) +Z1$ + MID$ (M$,L +1): HTAB L: PRINT Z1$;:L = L +1: GOTO 2440
  250. 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
  251. 2480 F = W:W = X: IF F < >X  AND F  THEN E = 1: GOTO 2460
  252. 2490  FOR J3 = L +1 TO  LEN(M$): IF Z1$ < > MID$ (M$,J3,1)  THEN  NEXT : GOTO 2440
  253. 2500  IF E  THEN L = J3: GOTO 2440
  254. 2510 M$ =  LEFT$(M$,L -1) + MID$ (M$,J3): HTAB L: CALL  -958: PRINT  MID$ (M$,L): GOTO 2440
  255. 2520 R$ =  MID$ (M$,2): IF  LEN(R$) = 1  THEN R$ = " " +R$
  256. 2530  RETURN 
  257. 2540  REM  EDIT ROUTINE
  258. 2550 M$ =  LEFT$(M$,L -1) + MID$ (M$,L +1): HTAB L: PRINT  MID$ (M$,L)" ";: GOTO 2430
  259. 2560  IF L = 2  THEN 2430
  260. 2570 L = L -1: GOTO 2430
  261. 2580  IF L <1 + LEN(M$)  THEN L = L +1
  262. 2590  GOTO 2430
  263. 2600 E = 2: GOTO 2440
  264. 2610 E = 3:W = 0: GOTO 2440
  265. 2620 E = 0:W = 0: GOTO 2440
  266. 2630 M$ =  LEFT$(M$,L -1): HTAB L: CALL  -958: GOTO 2430
  267. 2640 L =  LEN(M$) +1: GOTO 2430
  268. 2650  REM  CATALOG ROUTINE
  269. 2660  HOME :PR$ = "GETTING CATALOG...": GOSUB 3220: PRINT : PRINT D$"CATALOG"
  270. 2670  PRINT :PR$ = "PRESS <RETURN>": GOSUB 3220: POKE  -16368,0: GET A$: PRINT 
  271. 2680  RETURN 
  272. 2690  REM  SAVE MENU PROGRAM ROUTINE
  273. 2700  GOSUB 3610: IF ER  THEN ER = 0: RETURN 
  274. 2710  GOSUB 3630: IF ER  THEN ER = 0: RETURN 
  275. 2720  HOME : POKE 34,1:MD$ = "SAVE ASSEMBLED LINES TO DISK TEXT FILE": GOSUB 3180
  276. 2730  HOME : HTAB 1: VTAB 4: PRINT "ENTER FILE NAME (Q)UITS": INPUT "-->";B$: IF B$ = "Q"  THEN  RETURN 
  277. 2740  GOSUB 3560: IF ER  THEN ER = 0: GOTO 2730
  278. 2750  IF  RIGHT$(B$,5) < >".TEXT"  THEN B$ = B$ +".TEXT"
  279. 2760  PRINT D$"OPEN"B$: PRINT D$"CLOSE"B$: PRINT D$"DELETE"B$
  280. 2770  PRINT : PRINT "SAVING " LEFT$(B$, LEN(B$) -5)" TO DISK: "
  281. 2780  PRINT D$"OPEN"B$: PRINT D$"WRITE"B$
  282. 2790  PRINT NL: FOR C = 1 TO NL: IF PG$(C) < >""  THEN  PRINT PG$(C)
  283. 2800  NEXT 
  284. 2810  PRINT "POKE34,0": PRINT "HOME": PRINT "SAVE " LEFT$(B$, LEN(B$) -5): PRINT "DELETE IF"
  285. 2820  PRINT "RUN"
  286. 2830  PRINT D$"CLOSE"B$
  287. 2840 PR$ = "FILE SAVED TO DISK-PRESS <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$:SV = 1: RETURN 
  288. 2850  REM  LOAD CREATED MENU PROGRAM ROUTINE
  289. 2860  IF N >0  OR N1 >0  THEN PR$ = "MUST RESTART FIRST: ": GOSUB 3220: POKE  -16368,0: GET A$: POP : RETURN 
  290. 2870  HOME :MD$ = "LOAD CREATED MENU TEXT FILE": GOSUB 3180
  291. 2880  HTAB 1: VTAB 4: PRINT "ENTER FILE NAME (Q)UITS";: INPUT ": ";B$: IF B$ = "Q"  THEN  RETURN 
  292. 2890  GOSUB 3560: IF ER  THEN ER = 0: GOTO 2880
  293. 2900  IF  RIGHT$(B$,5) < >".TEXT"  THEN B$ = B$ +".TEXT"
  294. 2910  PRINT D$"VERIFY"B$
  295. 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
  296. 2930  POKE 34,12
  297. 2940  CLEAR :D$ =  CHR$(4)
  298. 2950  HTAB 1: VTAB 7: PRINT "WAIT WHILE PREPARING TO READ FILE"
  299. 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
  300. 2965  PRINT D$"CHAIN LOADER": REM  FOR PRODOS
  301. 2970  REM  NO RETURN NEEDED HERE BECAUSE LOADER RETURNS CONTROL TO FIRST LINES
  302. 2980  REM  TEST RUN CREATED MENU ROUTINE
  303. 2990  HOME : POKE 34,1:MD$ = "TEST RUN CREATED MENU ": GOSUB 3180
  304. 3000  HOME : HTAB 1: VTAB 4: PRINT "ENTER FILE NAME TO TEST (Q)UITS": INPUT "-->";B$: IF B$ = "Q"  THEN  RETURN 
  305. 3010  GOSUB 3560: IF ER  THEN ER = 0: GOTO 2990
  306. 3020  IF  RIGHT$(B$,5) < >".TEXT"  THEN B$ = B$ +".TEXT"
  307. 3030  PRINT D$"VERIFY"B$
  308. 3040  HOME : POKE 34,16: HTAB 1: VTAB 3: PRINT "PREPARING TO READ FILE":
  309. 3050  PRINT D$: PRINT D$"OPEN IF": PRINT D$"WRITE IF"
  310. 3060  PRINT "NEW": PRINT "EXEC "B$
  311. 3070  PRINT D$"CLOSE IF"
  312. 3080  HTAB 1: VTAB 3: PRINT "READING IN "B$" FILE.."
  313. 3090  PRINT : PRINT "REMEMBER...": PRINT : PRINT "1. "B$" IS A TEXT FILE": PRINT : PRINT "2. " LEFT$(B$, LEN(B$) -5)" IS AN APPLESOFT FILE"
  314. 3100  VTAB 17: PRINT 
  315. 3110  PRINT D$"EXEC IF"
  316. 3120  END 
  317. 3130  REM  QUIT ROUTINE
  318. 3140  IF   NOT SV  THEN PR$ = "PROGRAM NOT SAVED! QUIT? (Y/N): ": FLASH : GOSUB 3220: NORMAL : POKE  -16368,0: GET A$: IF A$ < >"Y"  AND A$ < >"N"  THEN 3140
  319. 3150  IF A$ = "Y"  THEN  TEXT : HOME : END 
  320. 3160  RETURN 
  321. 3170  REM  UTILITY ROUTINES
  322. 3180  HTAB 1: VTAB 1: INVERSE : PRINT MD$: NORMAL : RETURN 
  323. 3190  VTAB (N +2): HTAB (20 - INT( LEN(B$)/2)): PRINT B$:B$ = "": RETURN 
  324. 3200  HTAB 1: VTAB 24: FOR C = 1 TO 39: PRINT " ";: NEXT : RETURN 
  325. 3210 PR$ = "CORRECT? (Y/N): ": GOSUB 3220: POKE  -16368,0: GET A$: GOSUB 3200: RETURN 
  326. 3220  GOSUB 3200: VTAB 24: HTAB 20 - INT( LEN(PR$)/2): PRINT PR$;: RETURN 
  327. 3230  HTAB (20 - INT( LEN(B$)/2)): PRINT B$:B$ = "": RETURN 
  328. 3240  VTAB (N1 +7): HTAB (20 - INT( LEN(B$)/2)): PRINT B$:B$ = "": RETURN 
  329. 3250  REM  LINE# AND OTHER CHECKS FOR MAIN MENU
  330. 3260  IF LL >60000  OR UL >60000  THEN ER$ = "CHOOSE LINE# < 60000": GOSUB 3410
  331. 3270  IF UL >0  AND UL -LL >10000  THEN ER$ = "SUBROUTINE TOO LARGE": GOSUB 3410
  332. 3280  IF LL/100 < > INT(LL/100)  THEN ER$ = "CHOOSE MULTIPLES OF 100": GOSUB 3410
  333. 3290 A = (LL <700) *699 +(UL >0  AND UL <LL) *(LL +99) +(UL =  <0) *(LL <700) *(LL >700) *(LL +99): IF LL <700  OR (UL >0  AND UL <LL +99)  OR (UL <0)  THEN ER$ = "CHOOSE LINE# >" + STR$(A):A = 0: GOSUB 3410
  334. 3300 A = (LL <700) *699 +(UL >0  AND UL <LL) *(LL +99) +(UL =  <0) *(LL <700) *(LL >700) *(LL +99): IF LL <700  OR (UL >0  AND UL <LL +99)  OR (UL <0)  THEN ER$ = "CHOOSE LINE# >" + STR$(A):A = 0: GOSUB 3410
  335. 3310  FOR C = LL TO UL  STEP 100: IF LN$(C/100) = ""  THEN ER$ = "LINE NUMBERS ASSIGNED": GOSUB 3410
  336. 3320  FOR C = LL TO UL  STEP 100: IF LN$(C/100) = ""  THEN ER$ = "LINE NUMBERS ASSIGNED": GOSUB 3410
  337. 3330  NEXT 
  338. 3340 C = LL +100: IF LN$(C/100) = ""  THEN ER$ = "NO ROOM FOR SUBROUTINE": GOSUB 3410
  339. 3350  GOSUB 3200: RETURN 
  340. 3360  IF LL >0  AND UL >0  AND UL -LL <299  OR NS >5  THEN ER = 1
  341. 3370  RETURN 
  342. 3380 PR$ = "ABORT DATA ENTRY AND RESTART? (Y/N): ": GOSUB 3220: POKE  -16368,0: GET A$: IF A$ = "Y"  THEN  GOTO 80
  343. 3390  RETURN 
  344. 3400  REM  ERROR DISPLAY ROUTINES
  345. 3410 ER$ =  CHR$(7) +"ERROR! " +ER$ +" <CR>: "
  346. 3420 HT = 20 - INT( LEN(ER$)/2):ER = 1
  347. 3430  GOSUB 3200: HTAB HT: PRINT ER$;: POKE  -16368,0: GET A$: GOSUB 3200: POP : RETURN 
  348. 3440  REM  LINE # AND OTHER CHECKS FOR SUBROUTINE MENUS
  349. 3450 A = (LL <L1) *(L1 -1) +(UL >0  AND UL <LL +99) *(LL +99) +(UL =  <0) *(L1 <LL) *(LL >0) *(LL): IF LL <L1  OR (UL >0  AND UL <LL +99)  OR (UL <0)  THEN ER$ = "CHOOSE LINE# >" + STR$(A):A = 0: GOSUB 3410
  350. 3460 A = (UL >L2) *L2 +((LL >L2 -99) *L2 -98): IF UL >L2  OR LL >L2 -99  THEN ER$ = "CHOOSE LINE# <" + STR$(A):A = 0: GOSUB 3410
  351. 3470  FOR C = LL TO UL  STEP 100: IF LN$(C/100) = ""  THEN ER$ = "LINE NUMBERS ASSIGNED": GOSUB 3410
  352. 3480  NEXT 
  353. 3490  IF LL/100 < > INT(LL/100)  THEN ER$ = "NOT MULTIPLE OF 100": GOSUB 3410
  354. 3500  IF N1 = 1  AND UL >0  AND LL >0  AND UL -LL >L2 -L1 -99  THEN ER$ = "NO ROOM FOR 2 ROUTINES": GOSUB 3410
  355. 3510  GOSUB 3200: RETURN 
  356. 3520  FOR C = 1 TO N: IF B$ = MM$(C,0)  THEN ER$ = "OPTION NOT DISTINCT": GOSUB 3410
  357. 3530  NEXT 
  358. 3540  IF  LEN(B$) >33  OR  LEN(B$) <2  THEN ER$ = "IMPROPER ENTRY LENGTH: ": GOSUB 3410
  359. 3550  RETURN 
  360. 3560 A = 15: IF  RIGHT$(B$,5) = ".TEXT"  THEN A = 10
  361. 3570  IF  LEN(B$) >A  OR  LEN(B$) <1  THEN ER$ = "IMPROPER ENTRY LENGTH": GOSUB 3420
  362. 3580  RETURN 
  363. 3590  FOR C = 1 TO N1: IF B$ = SB$(N,0,C)  THEN ER$ = "OPTION NOT DISTINCT": GOSUB 3410
  364. 3600  NEXT : RETURN 
  365. 3610  IF DA = 0  AND LD = 0  THEN ER$ = "NO DATA AVAILABLE": GOSUB 3410
  366. 3620  RETURN 
  367. 3630  IF AS = 0  THEN ER$ = "ASSEMBLE LINES FIRST": GOSUB 3410
  368. 3640  RETURN 
  369. 3650  FOR C = 1 TO  LEN(B$):A =  ASC( MID$ (B$,C,1)): IF A <32  OR A >96  THEN 3670
  370. 3660  NEXT : GOTO 3680
  371. 3670 ER$ = "UPPER CASE ONLY": GOSUB 3410
  372. 3680  RETURN 
  373. 3690  REM  INITIALIZATION ROUTINE
  374. 3700  CLEAR : POKE 34,0: HOME 
  375. 3710 PR$ = "INITIALIZING": INVERSE : GOSUB 3220: NORMAL 
  376. 3720  DIM MM$(13,3),SB$(12,2,6),LN$(601),PG$(225),AP(4),TB(12),ME$(12)
  377. 3730  FOR C = 700 TO 60000  STEP 100:LN$(C/100) =  STR$(C): NEXT 
  378. 3740 D$ =  CHR$(4): ONERR  GOTO 3770
  379. 3750  GOTO 170
  380. 3760  REM  ERROR HANDLER ROUTINE
  381. 3770  CALL  -3288: PRINT D$: PRINT D$"CLOSE": PRINT D$"PR#0": PRINT  CHR$(7):X =  PEEK(222): HTAB 1: VTAB 23: POKE 35,24: CALL  -958: HTAB 1: VTAB 23
  382. 3780  IF X = 6  OR X = 5  THEN  PRINT "FILE NOT FOUND";:X = 257
  383. 3790  IF X = 8  OR X = 9  OR X = 4  THEN  PRINT "I/O ERROR";:X = 257
  384. 3800  IF X = 254  OR X = 255  OR X = 53  OR X = 176  THEN  PRINT "BAD INPUT ERROR";:X = 257
  385. 3810  IF X < >257  THEN  PRINT "ERROR NUMBER " PEEK(222)" IN LINE " PEEK(218) + PEEK(219) *256
  386. 3820  PRINT "-PRESS <CR>: ";: GET A$: PRINT : RETURN 
  387. 3830 A$ = " ":L = 0: FOR C = 2 TO  VAL(MM$(0,0)): REM  DETERMINE LONGEST STRING
  388. 3840  IF  LEN(MM$(C,0)) >L  THEN L =  LEN(MM$(C,0))
  389. 3850  NEXT : IF L/2 =  INT(L/2)  THEN L = L +1: REM  MAKE SURE L IS ODD FOR CENTERING PURPOSES
  390. 3860  FOR C = 1 TO  VAL(MM$(0,0)): REM  PAD WITH SPACES
  391. 3870  IF  LEN(MM$(C,0)) <L  THEN MM$(C,0) = MM$(C,0) +A$:MM$(C,0) =  MID$ (A$,1,( LEN(MM$(C,0)) <L)) +MM$(C,0): GOTO 3870
  392. 3880  NEXT : IF  VAL(SB$(0,0,0)) = 0  THEN 3970
  393. 3890  FOR C = 1 TO  VAL(SB$(0,0,0)):L = 19: REM  LENGTH OF RETURN TO MAIN MENU
  394. 3900  FOR C1 = 1 TO  VAL(SB$(C,0,0)): REM  FIND LONGEST SUBMENU STRING
  395. 3910  IF  LEN(SB$(C,0,C1)) >L  THEN L =  LEN(SB$(C,0,C1))
  396. 3920  NEXT 
  397. 3930  FOR C1 = 1 TO  VAL(SB$(C,0,0))
  398. 3940  IF  LEN(SB$(C,0,C1)) <L  THEN SB$(C,0,C1) = SB$(C,0,C1) +A$:SB$(C,0,C1) =  MID$ (A$,1, LEN(SB$(C,0,C1)) <L) +SB$(C,0,C1): GOTO 3940
  399. 3950  NEXT 
  400. 3960  NEXT 
  401. 3970  RETURN 
  402. 3980 A = X -1:AP(A) = (AP(A) = 0)
  403. 3990 A$ = "YN": FOR C = 1 TO 3: HTAB 35: VTAB 16 +C: PRINT  MID$ (A$,(AP(C) = 0) +1,1);: NEXT : VTAB (X) +VE -1: RETURN 
  404. 4000  FOR C2 = 1 TO  LEN(A$): IF  MID$ (A$,C2,1) = "["  THEN A$ =  LEFT$(A$,C2 -1) + CHR$(34) + MID$ (A$,C2 +1)
  405. 4010  NEXT : RETURN 
  406. 4020  HOME : VTAB 12: PRINT "RESTART AND CLEAR MEMORY (Y/N): ";: GET A$: IF A$ = "Y"  THEN  RUN 50
  407. 4030  RETURN 
  408. 4040 F$ = "RETURN TO MAIN MENU, ":L = AP(3) *( LEN(SB$(C,0,1)) -19): IF L >1  THEN F$ =  LEFT$(F$,19): FOR C1 = 1 TO L/2:F$ = " " +F$ +" ": NEXT :F$ =  CHR$(34) +F$ + CHR$(34) +", "
  409. 4050  RETURN