110 REM D$=CHR$(4),NS=NUMERO DELLE SUBROUTINE, MD$=INDICAT0RE DI MODO, PR$=PROMPT
120 REM N1+NS=CONTATORI PER N. SUBROUTINE ELABORATE, N=CONTATORE PER N. STRINGHE NEL MENU
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
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
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
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
170 SD = 1: GOTO 480: REM LINEA DI CONTROLLO MENU PRINCIPALE
180 DATA GENERATORE AUTO MENU,SCRIVI I DATI DEL PROGRAMMA,PARAMETRI ASSEMBLAGGIO PROGRAMMA,ASSEMBLARE LINEE PROGRAMMA,VEDERE/MODIFICARE PROGRAMMA ASSEMBLATO,OPERAZIONI DISCHETTO,RICOMINCIARE,FINE
190 DATA MENU PRINCIPALE, CATALOG,CARICARE IL TESTO DEL MENU CREATO,SALVARE IN TESTO IL MENU CREATO,ESECUZIONE DEL MENU CREATO
200 DATA MENU PRINCIPALE, MODO STRINGA,INSERIRE GESTIONE ERRORE,UGUALI LUNGHEZZE STRINGHE MENU
210 RESTORE : IF ST >1 THEN FOR C = 1 TO ST: READ A$: NEXT : REM PREPARA LETTURA PER ARRIVARE AI DATI APPROPRIATI
220 READ T$
230 FOR C = 1 TO SN: READ MENU$(C):TB(C) = INT(20 - LEN(MENU$(C))/2): NEXT : RETURN
240 REM STAMPA INIZIALE DELLA ROUTINE MENU
250 HOME : HTAB INT(17 -( LEN(T$)/2)): PRINT "** ";: INVERSE : PRINT T$;: NORMAL : PRINT " **";
260 NORMAL : VTAB 24: HTAB 7: INVERSE : PRINT "->";: NORMAL : PRINT "SPOSTA";: INVERSE : PRINT "<-";: NORMAL : PRINT " ";: INVERSE : PRINT "<RETURN>";: NORMAL : PRINT " SELEZIONA";
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 RICEVE ED ELABORA PRESSIONE TASTO
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 FRECCIA SINISTRA O IN SU PER SELEZIONE MENU
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
320 IF A$ = CHR$(13) THEN X = PEEK(37) -VE +2: PRINT : RETURN : REM DETERMINA SCELTA CONTROLLANDO POSIZIONE TAB VERTICALE
330 GOTO 290
340 REM ROUTINE CONTROLLO TAB
350 IF X = VE THEN VTAB X: GOSUB 400:X = VE +SN -1: GOSUB 410: INVERSE : GOSUB 420: RETURN
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
930 GOSUB 3540: IF ER THEN ER = 0: GOTO 920
940 GOSUB 3590: GOSUB 3650: IF ER THEN ER = 0: GOTO 920
950 HTAB 1: VTAB 19: PRINT "N. LINEA A CUI SALTARE PER OPZIONE "N1 +1;: INPUT "->";LL$:LL = VAL(LL$)
960 GOSUB 3440: IF ER THEN ER = 0: GOTO 950: REM CONTROLLA ERRORE
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)
980 GOSUB 3440: IF ER THEN ER = 0: GOTO 970: REM CONTROLLO ERRORE
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)
1740 LN$(70 +C2 +1) = SB$(C,2,C1) +"RETURN: REM FINE DELLA **" +SB$(C,0,C1) +"** ROUTINE SOTTOMENU": PRINT LN$(70 +C2 +1)
1750 C2 = C2 +2: NEXT C1: NEXT C
1760 REM UNISCE LINEE DA LINEE DATI E GENERATE DAL PROGRAMMA
1770 PR$ = "...PASSAGGIO 2...": INVERSE : GOSUB 3220: NORMAL : HOME : HTAB 1: VTAB 4
1780 RESTORE : FOR C = 1 TO 17: READ A$: NEXT : REM PREPARA LETTURA
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)
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 METTE LINEE DATI ASSEMBLATE 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 LEGGE CORPO PRINCIPALE PROGRAMMA IN 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 METTE LINEE GOSUB ASSEMBLAGGIO E PUNTI INIZIALI E FINALIIN PG$(N)
1870 NEXT
1880 AS = 1:PR$ = "PROGR. ASSEMBLATO IN MEMORIA-PREMI<CR>:": GOSUB 3220: POKE -16368,0: GET A$:NL = C1 -1: POKE 35,24: RETURN
1890 DATA "100 REM ***************************","110 REM * CREATO USANDO GENERATORE DI MENU *","120 REM * DI KEN PENNER *","130 REM ***************************"
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"
1910 DATA "150 DIM TB(12),ME$(12):SD=1:D$=CHR$(4): GOTO 560: REM LINEA GOSUB MENU PRINC. E' SITUATA A 560"
1920 DATA "290 RESTORE : IF ST > 1 THEN FOR C = 1 TO ST: READ A$: NEXT : REM PREPARA LETTURA PER ARRIVARE AI DATI APPROPRIATI"
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 STAMPA INIZIALE ROUTINE MENU"
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[SPOSTA[;: INVERSE : PRINT[<-[;: NORMAL : PRINT[ [;: INVERSE : PRINT[<RETURN>[;: NORMAL : PRINT[ SELEZIONA[;"
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 RICEVE ED ELABORA PRESSIONE TASTO"
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: REMFRECCIA INDIETRO O IN SUSELEZIONA MENU A RITROSO"
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"
2030 DATA "400 IF A$ = CHR$ (13) THEN X = PEEK (37) - VE + 2: PRINT : RETURN : REM DETERMINA SCELTA CONTROLLANDO POSIZIONE TAB VERTICALE"
2040 DATA "410 GOTO 370"
2050 DATA "420 REM ROUTINE CONTROLLO TAB"
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 CHE STAMPA STRINGA MENU APPROPRIATA IN INVERSE SECONDO PRESSIONE TASTO"
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 PER PRODURRE SUONO"
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 LINEE CONTROLLO MENU PRINCIPALE E SOTTOMENU"
2190 DATA 62000 REM ROUTINE GESTIONE ERRORE"
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 [ERRORE NUMERO [PEEK (222)[ A LINEA [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 SALVATO SUL DISCO-PREMI <CR>: ": GOSUB 3220: POKE -16368,0: GET A$:SV = 1: RETURN
2850 REM ROUTINE CARICAMENTO PROGRAMMA MENU CREATO
2860 IF N >0 OR N1 >0 THEN PR$ = "DEVI PRIMA RICOMINCIARE: ": GOSUB 3220: POKE -16368,0: GET A$: POP : RETURN
2870 HOME :MD$ = "CARICA IL TESTO DEL MENU CREATO": GOSUB 3180
2880 HTAB 1: VTAB 4: PRINT "IMMETTI NOME FILE (F)INE";: 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 SALVA IL NOME DEL FILE SUL DISCO
2930 POKE 34,12
2940 CLEAR :D$ = CHR$(4)
2950 HTAB 1: VTAB 7: PRINT "ATTENDI: STO LEGGENDO IL FILE"
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
2965 PRINT D$"CHAIN LOADER": REM PER IL PRODOS
2970 REM NON OCCORRE RETURN PERCHE' CARICATORE RITORNA IL CONTROLLO ALLE PRIME LINEE
2980 REM ROUTINE ESECUZIONE PROVA MENU CREATO
2990 HOME : POKE 34,1:MD$ = "ESECUZIONE DI PROVA MENU CREATO ": GOSUB 3180
3000 HOME : HTAB 1: VTAB 4: PRINT "SCRIVI IL NOME DEL FILE (F)INE": INPUT "-->";B$: IF B$ = "F" 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 "STO LEGGENDO IL FILE"
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"
3100 VTAB 17: PRINT
3110 PRINT D$"EXEC IF"
3120 END
3130 REM ROUTINE FINE
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
3150 IF A$ = "S" THEN GOSUB 4100: TEXT : HOME : END
3250 REM CONTROLLO N. LINEA E ALTRI CONTROLLI PER MENU PRINCIPALE
3260 IF LL >60000 OR UL >60000 THEN ER$ = "SCEGLI N. LINEA < 60000": GOSUB 3410
3270 IF UL >0 AND UL -LL >10000 THEN ER$ = "SUBROUTINE TROPPO GRANDE": GOSUB 3410
3280 IF LL/100 < > INT(LL/100) THEN ER$ = "SCEGLI MULTIPLI DI 100": GOSUB 3410
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
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
3310 FOR C = LL TO UL STEP 100: IF LN$(C/100) = "" THEN ER$ = "NUMERI LINEA ASSEGNATI": GOSUB 3410
3320 FOR C = LL TO UL STEP 100: IF LN$(C/100) = "" THEN ER$ = "NUMERI LINEA ASSEGNATI": GOSUB 3410
3330 NEXT
3340 C = LL +100: IF LN$(C/100) = "" THEN ER$ = "NON C'E' SPAZIO PER LA SUBROUTINE": GOSUB 3410
3350 GOSUB 3200: RETURN
3360 IF LL >0 AND UL >0 AND UL -LL <299 OR NS >5 THEN ER = 1
3370 RETURN
3380 PR$ = "INTERROMPI IMMISSIONE DATI E RICOMINCI? (S/N): ": GOSUB 3220: POKE -16368,0: GET A$: IF A$ = "S" THEN GOTO 80
3390 RETURN
3400 REM ROUTINES VISUALIZZAZIONE ERRORE
3410 ER$ = CHR$(7) +"ERRORE! " +ER$ +" <CR>: "
3420 HT = 20 - INT( LEN(ER$)/2):ER = 1
3430 GOSUB 3200: HTAB HT: PRINT ER$;: POKE -16368,0: GET A$: GOSUB 3200: POP : RETURN
3440 REM CONTROLLO N. LINEA E ALTRI CONTROLLI PER I MENU DI SUBROUTINE
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
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
3470 FOR C = LL TO UL STEP 100: IF LN$(C/100) = "" THEN ER$ = "NUMERI LINEA ASSEGNATI": GOSUB 3410
3480 NEXT
3490 IF LL/100 < > INT(LL/100) THEN ER$ = "NON MULTIPLO DI 100": GOSUB 3410
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
3510 GOSUB 3200: RETURN
3520 FOR C = 1 TO N: IF B$ = MM$(C,0) THEN ER$ = "OPZIONE GIA' SCELTA": GOSUB 3410
3530 NEXT
3540 IF LEN(B$) >33 OR LEN(B$) <2 THEN ER$ = "IMMISSIONE LUNGHEZZA ERRATA: ": GOSUB 3410
3550 RETURN
3560 A = 15: IF RIGHT$(B$,5) = ".TEXT" THEN A = 10
3570 IF LEN(B$) >A OR LEN(B$) <1 THEN ER$ = "IMMISSIONE LUNGHEZZA ERRATA: ": GOSUB 3420
3580 RETURN
3590 FOR C = 1 TO N1: IF B$ = SB$(N,0,C) THEN ER$ = "OPZIONE GIA' SCELTA": GOSUB 3410
3600 NEXT : RETURN
3610 IF DA = 0 AND LD = 0 THEN ER$ = "NIENTE DATI DISPONIBILI": GOSUB 3410
3620 RETURN
3630 IF AS = 0 THEN ER$ = "PRIMA ASSEMBLA LE LINEE": GOSUB 3410
3640 RETURN
3650 FOR C = 1 TO LEN(B$):A = ASC( MID$ (B$,C,1)): IF A <32 OR A >96 THEN 3670
3660 NEXT : GOTO 3680
3670 ER$ = "SOLO MAIUSCOLE": GOSUB 3410
3680 RETURN
3690 REM ROUTINE INIZIALIZZAZIONE
3700 CLEAR : POKE 34,0: HOME
3710 PR$ = "STO INIZIALIZZANDO": INVERSE : GOSUB 3220: NORMAL
3720 DIM MM$(13,3),SB$(12,2,6),LN$(601),PG$(225),AP(4),TB(12),ME$(12)
3730 FOR C = 700 TO 60000 STEP 100:LN$(C/100) = STR$(C): NEXT