home *** CD-ROM | disk | FTP | other *** search
/ AppleDisk 1 / AppleDisk_001.dsk / AUTO.MENU.bas < prev    next >
Encoding:
BASIC Source File  |  1986-01-01  |  28.7 KB  |  415 lines

  1. 1  REM  **********************
  2. 2  REM  * GENERATORE DI MENU *
  3. 3  REM  * DI KENNETH PENNER  *
  4. 4  REM  * (C)1986 EDITRONICA *
  5. 6  REM  *    E MICROSPARC    *
  6. 7  REM  **********************
  7. 50  TEXT : HOME : VTAB 10: HTAB 11: PRINT "GENERATORE DI MENU": VTAB 12: HTAB 12: PRINT "DI KENNETH PENNER": VTAB 2: PRINT "* (C) 1986 EDITRONICA E MICROSPARC *": VTAB 22: HTAB 7: PRINT "PREMI <RETURN> PER CONTINUARE";: GET Z$: PRINT 
  8. 60  REM  ONERR  GOTO 3770 
  9. 70  IF C1 >1  THEN 480: REM   INIZIALIZZAZIONE GIA' AVVENUTA
  10. 80  HOME : GOTO 3700: REM    INIZIALIZZA
  11. 90  REM   STRINGA THROW-AWAY E VARIABILE CONTATORE - A$,B$,C$,F$,C,C1,C2
  12. 100  REM    FLAGS ER=ERRORE AVVENUTO, DA=DATI IMMESSI, AS=ASSEMBLAGGIO COMPLETATO, SV=FILE SALVATO, LD=FILE CARICATO
  13. 110  REM    D$=CHR$(4),NS=NUMERO DELLE SUBROUTINE, MD$=INDICAT0RE DI MODO, PR$=PROMPT 
  14. 120  REM    N1+NS=CONTATORI PER N. SUBROUTINE ELABORATE, N=CONTATORE PER N. STRINGHE NEL MENU
  15. 130  REM      SB$(12,2,7)-CONSERVA DATI SUBROUTINE, MM$(12,3)-CONSERVA DATI MENU PRINCIPALE, PG$(150)-CONSERVA LINEE DI PROGRAMMA FINALI DAL PASSAGGIO 2
  16. 140  REM    LN$(600) CONSERVA TUTTI I NUMERI DI LINEA VALIDI POSSIBILI PER IL CONTROLLO DELL'ERRORE E ANCHE LE LINEE DI DATI ASSEMBLATE DEL PASSAGGIO 2
  17. 150  REM    LL$ E LL CONSERVANO IL N. DI LINEA INFERIORE PER UNA DATA SUBROUTINE, UL$ E UL CONSERVANO IL N. DI LINEA SUPERIORE PER LE SUBROUTINE
  18. 160  REM   VARIABILI MENU- T$=TITOLO:SD=FLAG SUONO:MENU$(N)=STRINGHE MENU: TB(N)=TABS: ST=POSIZIONE INIZIALE STRINGHE MENU NELLA LISTA DATI:VE=POSIZIONE VERTICALE:SN=N. DELLE SCELTE DI MENU:X=POSIZIONE VERTICALE CURSORE
  19. 170 SD = 1: GOTO 480: REM    LINEA DI CONTROLLO MENU PRINCIPALE
  20. 180  DATA       GENERATORE AUTO MENU,SCRIVI I DATI DEL PROGRAMMA,PARAMETRI ASSEMBLAGGIO PROGRAMMA,ASSEMBLARE LINEE PROGRAMMA,VEDERE/MODIFICARE PROGRAMMA ASSEMBLATO,OPERAZIONI DISCHETTO,RICOMINCIARE,FINE
  21. 190  DATA    MENU PRINCIPALE, CATALOG,CARICARE IL TESTO DEL MENU CREATO,SALVARE IN TESTO IL MENU CREATO,ESECUZIONE DEL MENU CREATO
  22. 200  DATA   MENU PRINCIPALE, MODO STRINGA,INSERIRE GESTIONE ERRORE,UGUALI LUNGHEZZE STRINGHE MENU
  23. 210  RESTORE : IF ST >1  THEN  FOR C = 1 TO ST: READ A$: NEXT : REM    PREPARA LETTURA PER ARRIVARE AI DATI APPROPRIATI
  24. 220  READ T$
  25. 230  FOR C = 1 TO SN: READ MENU$(C):TB(C) =  INT(20 - LEN(MENU$(C))/2): NEXT : RETURN 
  26. 240  REM    STAMPA INIZIALE DELLA ROUTINE MENU
  27. 250  HOME : HTAB  INT(17 -( LEN(T$)/2)): PRINT "** ";: INVERSE : PRINT T$;: NORMAL : PRINT " **";
  28. 260  NORMAL : VTAB 24: HTAB 7: INVERSE : PRINT "->";: NORMAL : PRINT "SPOSTA";: INVERSE : PRINT "<-";: NORMAL : PRINT "   ";: INVERSE : PRINT "<RETURN>";: NORMAL : PRINT " SELEZIONA";
  29. 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 
  30. 280  REM   RICEVE ED ELABORA PRESSIONE TASTO
  31. 290  POKE  -16368,0: GET A$: GOSUB 440:X =  PEEK(37) +1
  32. 300  IF A$ =  CHR$(8)  OR A$ =  CHR$(11)  THEN  GOSUB 350: REM FRECCIA SINISTRA O IN SU PER SELEZIONE MENU
  33. 310  IF A$ =  CHR$(21)  OR A$ =  CHR$(32)  OR A$ =  CHR$(10)  THEN  GOSUB 370: REM FRECCIA DESTRA O IN GIU'  O SPAZIO PER SELEZIONE MENU
  34. 320  IF A$ =  CHR$(13)  THEN X =  PEEK(37) -VE +2: PRINT : RETURN : REM    DETERMINA SCELTA CONTROLLANDO POSIZIONE TAB VERTICALE
  35. 330  GOTO 290
  36. 340  REM   ROUTINE CONTROLLO TAB
  37. 350  IF X = VE  THEN  VTAB X: GOSUB 400:X = VE +SN -1: GOSUB 410: INVERSE : GOSUB 420: RETURN 
  38. 360  VTAB X: GOSUB 400:X = X -1: INVERSE : GOSUB 410: GOSUB 420: RETURN 
  39. 370  IF X = SN +VE -1  THEN  VTAB SN +VE -1: GOSUB 400:X = VE: GOSUB 410: INVERSE : GOSUB 420: RETURN 
  40. 380  VTAB X: GOSUB 400:X = X +1: INVERSE : GOSUB 410: GOSUB 420: RETURN 
  41. 390  REM     SUBROUTINE CHE STAMPA LA STRINGA DI MENU APPROPRIATA IN INVERSE SECONDO LA PRESSIONE DEL TASTO
  42. 400  HTAB TB(X -VE +1): PRINT MENU$(X -VE +1);: RETURN 
  43. 410  VTAB X: HTAB TB(X -VE +1): RETURN 
  44. 420  PRINT MENU$(X -VE +1);: NORMAL : RETURN 
  45. 430  REM       ROUTINE PER PRODURRE IL SUONO
  46. 440  IF A$ =  CHR$(83)  THEN SD = (SD = 0)
  47. 450  IF SD  THEN S =  -16336:A =  PEEK(S) - PEEK(S) + PEEK(S) - PEEK(S) + PEEK(S)
  48. 460  RETURN 
  49. 470  REM     MENU PRINCIPALE
  50. 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
  51. 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
  52. 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
  53. 510  GOSUB 290: GOSUB 3980: ON X GOTO 480,510,510,510
  54. 520  POP : POKE 33,40: RETURN 
  55. 530  REM    ROUTINE IMMISSIONE DATI PROGRAMMA
  56. 540  IF N >0  OR N1 >0  THEN PR$ = "DEVI  PRIMA RICOMINCIARE: ": GOSUB 3220: POKE  -16368,0: GET A$: RETURN 
  57. 550 N = 1:N1 = 0
  58. 560  HOME :MD$ = "IMMISSIONE DATI MENU PRINCIPALE": GOSUB 3180: POKE 34,16
  59. 570  HOME : VTAB 17: PRINT "TITOLO MENU PRINC. (2-32 CAR) (F)INE:": INPUT "-->";B$: IF B$ = "F"  THEN  RETURN 
  60. 580  GOSUB 3540: ON  LEN(B$) >0 GOSUB 3650: IF ER  THEN ER = 0: GOTO 570
  61. 590  GOSUB 3210: IF A$ = "N"  THEN 570
  62. 600  IF A$ < >"S"  THEN 590
  63. 610  INVERSE :MM$(N,0) = B$: GOSUB 3190: NORMAL 
  64. 620 UL = 0:LL = 0: HOME : VTAB 17: PRINT "OPZIONE MENU PRINCIPALE N."N"(2-32 CHARS):": INPUT "--->";B$
  65. 630  GOSUB 3520: GOSUB 3650: IF ER  THEN ER = 0: GOTO 620
  66. 640  HTAB 1: VTAB 19: PRINT "LINEA INIZIO OPZIONE N."N;: INPUT "  -->";LL$:LL =  VAL(LL$)
  67. 650  GOSUB 3260: IF ER  THEN ER = 0: GOTO 640: REM CONTROLLO ERRORE 
  68. 660  HTAB 1: VTAB 20: PRINT "LINEA FINE OPZIONE N."N;: INPUT "  -->";UL$:UL =  VAL(UL$): IF UL/100 =  INT(UL/100)  THEN UL = UL -1:UL$ =  STR$(UL)
  69. 670  GOSUB 3260: IF ER  THEN ER = 0: GOTO 660: REM   CONTROLLO ERRORE
  70. 680  GOSUB 3360: IF ER  THEN ER = 0:C$ = "N": GOTO 700
  71. 690  IF   NOT ER  THEN  HTAB 1: VTAB 21: PRINT "SOTTOMENU PER OPZIONE "N;: INPUT "     (S/N)-->";C$: IF C$ < >"S"  AND C$ < >"N"  THEN 690
  72. 700  GOSUB 3210: IF A$ = "N"  THEN 620
  73. 710  IF A$ < >"S"  THEN 700
  74. 720 N = N +1:MM$(N,0) = B$:MM$(N,1) = LL$:MM$(N,2) = UL$: IF C$ = "S"  THEN MM$(N,3) = "SB":NS = NS +1
  75. 730 B$ = B$ +" (" +LL$ +"-" +UL$ +")" +C$: IF  LEN(B$) >36  THEN B$ = ".." + RIGHT$(B$,36)
  76. 740  GOSUB 3190
  77. 750  FOR C = LL TO UL  STEP 100:LN$(C/100) = "": NEXT : REM        AZZERA LE POSSIBILITA' DI N. LINEA
  78. 760  HOME :PR$ = "<CR>CONTINUI,<SP>MENU COMPLETO,(F)INE": GOSUB 3220
  79. 770  POKE  -16368,0: GET A$:MM$(0,0) =  STR$(N)
  80. 780  IF A$ = "Q"  OR (A$ =  CHR$(32)  AND N = 2)  THEN  GOSUB 3380: GOTO 760
  81. 790  IF A$ =  CHR$(32)  THEN  GOTO 820
  82. 800  IF A$ =  CHR$(13)  AND N <13  THEN  GOTO 620
  83. 810  GOTO 760
  84. 820 PR$ = "MENU PRINC.COMPLETATO,PREMI UN TASTO: ": GOSUB 3220: POKE  -16368,0: GET A$
  85. 830  IF NS = 0  THEN 1190
  86. 840 N = 1:SB = 1:N1 = 1: REM       N=N. SOTTOMENU N1=N. DI STRINGHE NEL SOTTOMENU
  87. 850  POKE 34,0: HOME :MD$ = "IMMISSIONE DATI SOTTOMENU": GOSUB 3180
  88. 860  POKE 34,1: HOME :SB = SB +1: FOR C = SB TO 13: IF MM$(C,3) = "SB"  THEN SB = C:C = 13
  89. 870  NEXT 
  90. 880 L1 =  VAL(MM$(SB,1)):L2 =  VAL(MM$(SB,2))
  91. 890  FOR C = L1 TO L2  STEP 100:LN$(C/100) =  STR$(C): NEXT 
  92. 900  HTAB 1: VTAB 3: PRINT "SOTTOMENU N.   -->"N: PRINT "LINEE       IL SOTTOMENU": VTAB 7: INVERSE :B$ = MM$(SB,0): GOSUB 3230: NORMAL 
  93. 910  HTAB 1: VTAB 8:B$ = "MENU PRINCIPALE": GOSUB 3230
  94. 920  POKE 34,16:UL = 0:LL = 0: HOME : VTAB 17: PRINT "OPZIONE SOTTOMENU N."N1 +1" (2-32) CAR (F)INE": INPUT "-->";B$
  95. 925  IF B$ = "F"  THEN PR$ = "SOTTOMENU INCOMPLETO,ESCI COMUNQUE? (S/N)": GOSUB 3220: POKE  -16368,0: GET A$: IF A$ = "S"  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 "N. LINEA A CUI SALTARE PER OPZIONE "N1 +1;: INPUT "->";LL$:LL =  VAL(LL$)
  99. 960  GOSUB 3440: IF ER  THEN ER = 0: GOTO 950: REM       CONTROLLA ERRORE
  100. 970  HTAB 1: VTAB 20: PRINT "N. LINEA FINALE PER OPZIONE "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     CONTROLLO ERRORE
  102. 990  GOSUB 3210: IF A$ = "N"  THEN 920
  103. 1000  IF A$ < >"S"  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 
  108. 1050 C1 = 0: FOR C = L1 TO L2  STEP 100: IF LN$(C/100) < >""  THEN C1 = C1 +1: REM   CONTROLLA SE RESTINO NUMERI DI LINEA
  109. 1060  NEXT : IF C1 = 0  THEN A$ =  CHR$(32): GOTO 1090
  110. 1070  HOME :PR$ = "<CR>CONTINUA,<SP>MENU COMPLETO,(F)INE": 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$ = "F"  THEN  GOSUB 3380: GOTO 1070
  114. 1110  IF A$ =  CHR$(13)  THEN 1140
  115. 1120  GOTO 1080
  116. 1130  REM   CONTROLLA SE CI SONO ALTRI SOTTOMENU
  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$ = "PER IL SOTTOMENU SEGUENTE-PREMI <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$: GOTO 860
  122. 1190 PR$ = "SOTTOMENU COMPLETI-PREMI <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$:DA = 1:SB$(0,0,0) =  STR$(NS): RETURN 
  123. 1200  REM     ROUTINE ASSEMBLAGGIO LINEE BASIC
  124. 1210  REM     ASSEMBLA PRIMA LINEE DATI PER MENU PRINCIPALE
  125. 1220  GOSUB 3610: IF ER  THEN ER = 0: RETURN 
  126. 1230  IF AS  OR LD  THEN PR$ = "GIA' ASSEMBLATE-PREMI <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$: RETURN 
  127. 1240  HOME :MD$ = "ASSEMBLO LINEE PROGRAMMA BASIC": GOSUB 3180:PR$ = "...PASSAGGIO 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   ASSEMBLA LINEE DATI PER LE SUBROUTINE SE CI SONO
  135. 1320  IF NS = 0  THEN 1410: REM    SALTA A ROUTINE ASSEMBLAGGIO LINEE GOSUB MENU PRINCIPALE
  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 LINEA DATI MENU PER SUBROUTINE N." + STR$(C): PRINT LN$((LN -60)/10 -9):F$ = "MENU PRINCIPALE, ":LN = LN +10
  142. 1390  NEXT C
  143. 1400  REM   ASSEMBLAGGIO LINEE GOSUB MENU PRINCIPALE
  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      COMINCIA A UNIRE LINEE PROGRAMMA
  153. 1500  REM   ROUTINE ASSEMBLAGGIO LINEE GOSUB SOTTOMENU
  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   N. DELLE SUBROUTINE
  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   ASSEMBLA LINEE INIZIALE E TERMINALE SUBROUTINE MENU PRINCIPALE
  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) +"** ROUTINE MENU PRINCIPALE COMINCIA QUI E FINISCE A LINEA " +MM$(C,2): PRINT LN$(50 +C1)
  170. 1670 LN$(50 +C1 +1) = MM$(C,2) +" RETURN:REM FINE DELLA **" +MM$(C,0) +"** ROUTINE MENU PRINCIPALE": PRINT LN$(50 +C1 +1)
  171. 1680 C1 = C1 +2
  172. 1690  NEXT C:C2 = 0: IF NS = 0  THEN 1770
  173. 1700  REM   ASSEMBLA LINEE INIZIALE E TERMINALE SUBROUTINE
  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) +"** ROUTINE S.MENU COMINCIA QUI E       FINISCE A LINEA " +SB$(C,2,C1): PRINT LN$(70 +C2)
  177. 1740 LN$(70 +C2 +1) = SB$(C,2,C1) +"RETURN: REM FINE DELLA **" +SB$(C,0,C1) +"** ROUTINE SOTTOMENU": PRINT LN$(70 +C2 +1)
  178. 1750 C2 = C2 +2: NEXT C1: NEXT C
  179. 1760  REM     UNISCE LINEE DA LINEE DATI E GENERATE DAL PROGRAMMA
  180. 1770 PR$ = "...PASSAGGIO 2...": INVERSE : GOSUB 3220: NORMAL : HOME : HTAB 1: VTAB 4
  181. 1780  RESTORE : FOR C = 1 TO 17: READ A$: NEXT : REM                  PREPARA LETTURA
  182. 1790  FOR C1 = 1 TO 6: READ PG$(C1): PRINT PG$(C1): NEXT :C1 = 7: REM    LEGGE LINEE 100-150 DEL GENERATORE AUTO MENU E METTE 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          METTE LINEE DATI ASSEMBLATE 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       LEGGE CORPO PRINCIPALE PROGRAMMA IN 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                METTE  LINEE  GOSUB ASSEMBLAGGIO E PUNTI INIZIALI E FINALIIN PG$(N)
  190. 1870  NEXT 
  191. 1880 AS = 1:PR$ = "PROGR. ASSEMBLATO IN MEMORIA-PREMI<CR>:": GOSUB 3220: POKE  -16368,0: GET A$:NL = C1 -1: POKE 35,24: RETURN 
  192. 1890  DATA        "100 REM ***************************","110 REM * CREATO USANDO GENERATORE DI MENU *","120 REM *      DI KEN PENNER      *","130 REM ***************************"
  193. 1900  DATA   "140 REM T$=TITOLO:SD=FLAG SUONO:MENU$(N)=STRINGHE MENU:TB(N)=TABS:ST=POSIZIONE INIZIALE STRINGHE MENU IN LISTA DATI:VE=POSIZIONE TAB VERTICALE:SN=N. SCELTE MENU:X=POSIZIONE VERTICALE CURSORE"
  194. 1910  DATA       "150 DIM TB(12),ME$(12):SD=1:D$=CHR$(4): GOTO 560: REM LINEA GOSUB MENU PRINC. E' SITUATA A 560"
  195. 1920  DATA   "290 RESTORE : IF ST > 1 THEN  FOR C = 1 TO ST: READ A$: NEXT : REM  PREPARA LETTURA PER ARRIVARE AI DATI APPROPRIATI"
  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   STAMPA INIZIALE ROUTINE MENU"
  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[SPOSTA[;: INVERSE : PRINT[<-[;: NORMAL : PRINT[    [;: INVERSE : PRINT[<RETURN>[;: NORMAL : PRINT[ SELEZIONA[;"
  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  RICEVE ED ELABORA PRESSIONE TASTO"
  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: REMFRECCIA INDIETRO O IN SUSELEZIONA MENU A RITROSO"  
  205. 2020  DATA     "390 IF A$ =  CHR$ (21) OR A$ =  CHR$ (32) OR A$=CHR$(10)THEN  GOSUB 450: REM  FRECCIA AVANTI O IN GIU' SELEZIONA MENU IN AVANTI"
  206. 2030  DATA  "400 IF A$ =  CHR$ (13) THEN X =  PEEK (37) - VE + 2: PRINT : RETURN : REM   DETERMINA SCELTA CONTROLLANDO POSIZIONE TAB VERTICALE"
  207. 2040  DATA    "410 GOTO 370"
  208. 2050  DATA   "420 REM  ROUTINE CONTROLLO TAB"
  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 CHE STAMPA STRINGA MENU APPROPRIATA IN INVERSE SECONDO PRESSIONE TASTO"
  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 PER PRODURRE SUONO"
  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    LINEE CONTROLLO MENU PRINCIPALE E SOTTOMENU"
  222. 2190  DATA      62000 REM ROUTINE GESTIONE ERRORE"
  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 [ERRORE NUMERO [PEEK (222)[ A LINEA [PEEK (218) +  PEEK (219) * 256
  228. 2250  DATA           "62060 PRINT [-PREMI <CR>: [;: POKE-16368,0:GET A$: PRINT : RETURN 
  229. 2260  REM     ROUTINE ESAME LINEE PROGRAMMATE ASSEMBLATE
  230. 2270  GOSUB 3610: IF ER  THEN ER = 0: RETURN 
  231. 2280  GOSUB 3630: IF ER  THEN ER = 0: RETURN 
  232. 2290  HOME :MD$ = "VEDI/EDITI LINEE PROGRAMMA": 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$ = "F"  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$ = "<-SCORR. FRECCE->   (F)INE   <CR>EDIT:": POKE 35,23: GOSUB 3220: RETURN 
  243. 2400 PR$ = "<RETURN> ACCETTA,<CTRL>BDFINQZ -> 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     ROUTINE EDITING
  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    ROUTINE CATALOG
  269. 2660  HOME :PR$ = "STO RICEVENDO IL CATALOG...": GOSUB 3220: PRINT : PRINT D$"CATALOG"
  270. 2670  PRINT :PR$ = "PREMI <RETURN>": GOSUB 3220: POKE  -16368,0: GET A$: PRINT 
  271. 2680  RETURN 
  272. 2690  REM    ROUTINE SALVATAGGIO PROGRAMMA MENU
  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$ = "SALVA IN TESTO LE LINEE ASSEMBLATE ": GOSUB 3180
  276. 2730  HOME : HTAB 1: VTAB 4: PRINT "SCRIVI IL NOME DEL FILE (F)INE": INPUT "-->";B$: IF B$ = "F"  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 "STO SALVANDO " LEFT$(B$, LEN(B$) -5)" SUL DISCO: "
  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 SALVATO SUL DISCO-PREMI <CR>: ": GOSUB 3220: POKE  -16368,0: GET A$:SV = 1: RETURN 
  288. 2850  REM      ROUTINE CARICAMENTO PROGRAMMA MENU CREATO
  289. 2860  IF N >0  OR N1 >0  THEN PR$ = "DEVI PRIMA RICOMINCIARE: ": GOSUB 3220: POKE  -16368,0: GET A$: POP : RETURN 
  290. 2870  HOME :MD$ = "CARICA IL TESTO DEL MENU CREATO": GOSUB 3180
  291. 2880  HTAB 1: VTAB 4: PRINT "IMMETTI NOME FILE (F)INE";: 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  SALVA IL NOME DEL FILE SUL DISCO
  296. 2930  POKE 34,12
  297. 2940  CLEAR :D$ =  CHR$(4)
  298. 2950  HTAB 1: VTAB 7: PRINT "ATTENDI: STO LEGGENDO IL FILE"
  299. 2960  IF  PEEK(48896) < >76  THEN  PRINT D$"BLOAD CHAIN,A520": CALL 520"LOADER": REM    ESEGUE PROGRAMMA CARICATORE PER LEGGERE IL FILE CON PROGRAMMA DI CONCATENAMENTO DOS 3.3 DEL SYSTEM MASTER DISK
  300. 2965  PRINT D$"CHAIN LOADER": REM  PER IL PRODOS
  301. 2970  REM   NON OCCORRE RETURN PERCHE' CARICATORE RITORNA IL CONTROLLO ALLE PRIME LINEE
  302. 2980  REM     ROUTINE ESECUZIONE PROVA MENU CREATO
  303. 2990  HOME : POKE 34,1:MD$ = "ESECUZIONE DI PROVA MENU CREATO ": GOSUB 3180
  304. 3000  HOME : HTAB 1: VTAB 4: PRINT "SCRIVI IL NOME DEL FILE  (F)INE": INPUT "-->";B$: IF B$ = "F"  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 "STO LEGGENDO IL 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 "STO LEGGENDO IL FILE "B$"..."
  313. 3090  PRINT : PRINT "RICORDA...": PRINT : PRINT "1. "B$" E' UN FILE DI TESTO": PRINT : PRINT "2. " LEFT$(B$, LEN(B$) -5)" E' UN FILE IN APPLESOFT"
  314. 3100  VTAB 17: PRINT 
  315. 3110  PRINT D$"EXEC IF"
  316. 3120  END 
  317. 3130  REM    ROUTINE FINE
  318. 3140  IF   NOT SV  THEN PR$ = "PROGRAMMA NON SALVATO! SMETTI? (S/N): ": FLASH : GOSUB 3220: NORMAL : POKE  -16368,0: GET A$: IF A$ < >"S"  AND A$ < >"N"  THEN 3140
  319. 3150  IF A$ = "S"  THEN  GOSUB 4100: TEXT : HOME : END 
  320. 3160  RETURN 
  321. 3170  REM    ROUTINES DI UTILITA'
  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$ = "ESATTO? (S/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   CONTROLLO N. LINEA E ALTRI CONTROLLI PER MENU PRINCIPALE
  330. 3260  IF LL >60000  OR UL >60000  THEN ER$ = "SCEGLI N. LINEA < 60000": GOSUB 3410
  331. 3270  IF UL >0  AND UL -LL >10000  THEN ER$ = "SUBROUTINE TROPPO GRANDE": GOSUB 3410
  332. 3280  IF LL/100 < > INT(LL/100)  THEN ER$ = "SCEGLI MULTIPLI DI 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$ = "SCEGLI N. LINEA >" + 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$ = "SCEGLI N.LINEA>" + STR$(A):A = 0: GOSUB 3410
  335. 3310  FOR C = LL TO UL  STEP 100: IF LN$(C/100) = ""  THEN ER$ = "NUMERI LINEA ASSEGNATI": GOSUB 3410
  336. 3320  FOR C = LL TO UL  STEP 100: IF LN$(C/100) = ""  THEN ER$ = "NUMERI LINEA ASSEGNATI": GOSUB 3410
  337. 3330  NEXT 
  338. 3340 C = LL +100: IF LN$(C/100) = ""  THEN ER$ = "NON C'E' SPAZIO PER LA 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$ = "INTERROMPI IMMISSIONE DATI E RICOMINCI? (S/N): ": GOSUB 3220: POKE  -16368,0: GET A$: IF A$ = "S"  THEN  GOTO 80
  343. 3390  RETURN 
  344. 3400  REM   ROUTINES VISUALIZZAZIONE ERRORE
  345. 3410 ER$ =  CHR$(7) +"ERRORE! " +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     CONTROLLO N. LINEA E ALTRI CONTROLLI PER I MENU DI SUBROUTINE
  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$ = "SCEGLI N. LINEA >" + 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$ = "SCEGLI N. LINEA <" + STR$(A):A = 0: GOSUB 3410
  351. 3470  FOR C = LL TO UL  STEP 100: IF LN$(C/100) = ""  THEN ER$ = "NUMERI LINEA ASSEGNATI": GOSUB 3410
  352. 3480  NEXT 
  353. 3490  IF LL/100 < > INT(LL/100)  THEN ER$ = "NON MULTIPLO DI 100": GOSUB 3410
  354. 3500  IF N1 = 1  AND UL >0  AND LL >0  AND UL -LL >L2 -L1 -99  THEN ER$ = "NON C'E' POSTO PER 2 ROUTINE": GOSUB 3410
  355. 3510  GOSUB 3200: RETURN 
  356. 3520  FOR C = 1 TO N: IF B$ = MM$(C,0)  THEN ER$ = "OPZIONE GIA' SCELTA": GOSUB 3410
  357. 3530  NEXT 
  358. 3540  IF  LEN(B$) >33  OR  LEN(B$) <2  THEN ER$ = "IMMISSIONE LUNGHEZZA ERRATA: ": 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$ = "IMMISSIONE LUNGHEZZA ERRATA: ": GOSUB 3420
  362. 3580  RETURN 
  363. 3590  FOR C = 1 TO N1: IF B$ = SB$(N,0,C)  THEN ER$ = "OPZIONE GIA' SCELTA": GOSUB 3410
  364. 3600  NEXT : RETURN 
  365. 3610  IF DA = 0  AND LD = 0  THEN ER$ = "NIENTE DATI DISPONIBILI": GOSUB 3410
  366. 3620  RETURN 
  367. 3630  IF AS = 0  THEN ER$ = "PRIMA ASSEMBLA LE LINEE": 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$ = "SOLO MAIUSCOLE": GOSUB 3410
  372. 3680  RETURN 
  373. 3690  REM   ROUTINE INIZIALIZZAZIONE
  374. 3700  CLEAR : POKE 34,0: HOME 
  375. 3710 PR$ = "STO INIZIALIZZANDO": 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   ROUTINE GESTIONE ERRORE
  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 "ERRORE NUMERO " PEEK(222)" A LINEA " PEEK(218) + PEEK(219) *256
  386. 3820  PRINT "-PREMI <CR>: ";: GET A$: PRINT : RETURN 
  387. 3830 A$ = " ":L = 0: FOR C = 2 TO  VAL(MM$(0,0)): REM   DETERMINA STRINGA PIU' LUNGA
  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   BADA CHE L SIA DISPARI A SCOPO DI CENTRATURA
  390. 3860  FOR C = 1 TO  VAL(MM$(0,0)): REM   COMPLETA CON SPAZI
  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   LUNGHEZZA DEL RITORNO AL MENU PRINCIPALE
  394. 3900  FOR C1 = 1 TO  VAL(SB$(C,0,0)): REM   TROVA STRINGA PIU' LUNGA SOTTOMENU
  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$ = "SN": 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 "RICOMINCI E PULISCI MEMORIA (S/N): ";: GET A$: IF A$ = "S"  THEN  RUN 50
  407. 4030  RETURN 
  408. 4040 F$ = "TORNI AL MENU PRINCIPALE, ":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 
  410. 4100  CALL  -936: VTAB 10: HTAB 11: INVERSE : PRINT "1";: NORMAL : PRINT " - MENU APPLEDISK"
  411. 4110  PRINT : HTAB 11: INVERSE : PRINT "2";: NORMAL : PRINT " - FINE"
  412. 4120  VTAB 15: HTAB 18: PRINT "< >";
  413. 4130  VTAB 15: HTAB 19: GET A$: PRINT A$: IF A$ < >"1"  AND A$ < >"2"  THEN 1530
  414. 4140  IF A$ = "1"  THEN  PRINT  CHR$(4)"RUN HELLO2": END 
  415. 4150  RETURN