MSX BASIC – lezione 11

da | Nov 20, 2023 | MSX BASIC | 0 commenti

RUBRICA “MSX BASIC” a cura di Orazio Cacciola (parte 11)

GOSUB/RETURN/ON GOSUB/ON GOTO/INKEY$

In questa puntata parlerò dei comandi per richiamare delle subroutine da qualsiasi punto del nostro programma, come usarli quando le scelte sono molteplici e come inserire un carattere da tastiera.

GOSUB
Manda il programma ad una subroutine, al termine di essa ritornerà alla istruzione successiva. È un comando simile al GOTO, in entrambi i casi manda l’esecuzione alla linea che segue subito dopo il comando. C’è però una differenza tra i due, mentre il primo dopo aver fatto il “salto” prosegue normalmente, il secondo memorizza la posizione dove è avvenuto il salto. Questo vuol dire che il BASIC tiene in memoria, ogni GOSUB che incontra, infatti possiamo usare tutti i GOSUB che vogliamo, ricordiamoci che la memoria del BASIC non è tanta, più ne useremo e più questa diminuirà.
SINTASSI: GOSUB Numero di Linea

RETURN
Comando che serve a chiudere la routine chiamata con GOSUB. Ogni GOSUB deve avere un RETURN. Infatti il RETURN oltre rimandare l’esecuzione del programma
all’istruzione successiva al GOSUB, libera la memoria. Possiamo anche decidere di non fare ritornare il programma alla linea successiva al GOSUB, aggiungendo un numero di linea.
SINTASSI: RETURN [Numero di Linea]

ON GOSUB
Viene usato quando i sottoprogrammi sono più di uno e dobbiamo scegliere quale eseguire. Ammettiamo di voler creare un programma con 3 subroutine che verranno eseguite assecondo della scelta fatta: ON C GOSUB 100,200,300. Il comando deve avere sempre una variabile, è quella che decide dove mandare l’esecuzione. Questa ultima eseguirà le 3 subroutines se avrà il valore tra 1 e 3. Possiamo dire che i numeri di linea verranno eseguite in modo crescente, perciò la C = 1 manderà il programma alla linea 100, C = 2 alla 200 e C = 3 alla 300. Più sono le subroutine e più aumenterà la variabile usata. Se invece la variabile C è uguale a 0, ha valore negativo oppure supera il numero delle linee del comando, nel nostro caso 4 o superiori, non succede nulla. Il comando viene saltato proprio come succede con una funzione IF/THEN quando non si verifica la condizione.
SINTASSI: ON Variabile GOSUB Numero di linea, [Numero di linea], …….

ON GOTO
Ha le stesse funzionalità del ON GOSUB è vale tutto quello che ho detto sopra, ma come sappiamo, il GOTO crea il salto incondizionato e nient’altro. Per essere rieseguito si dovrà usare un altro GOTO.

INKEY$
Accetta qualsiasi carattere che viene premuto dalla tastiera quanto il programma incontra questa funzione. Se in quel momento non viene premuto nulla, riporta una stringa vuota. Può contenere solo un carattere. È consigliabile usarla sempre con delle condizioni (IF/THEN/ELSE) un buono risultato quando dobbiamo fare una scelta e non vogliamo che visualizzi nulla sullo schermo. Può essere usata singolarmente oppure dentro una variabile. Di seguito un piccolo programma d’esempio.

100 A$=INKEY$: IF A$="" THEN 100
PRINT "SCEGLI SI/NO"
110 IF A$="S" OR A$="s" THEN 10
120 IF A$="N" OR A$="n" THEN CLS: END ELSE 100

Come ho fatto la volta scorsa, ho creato un piccolo programma per fare capire meglio.

10 DEFINT A-Z: SCREEN 0
20 CLS:LOCATE 15,1: PRINT "M E N U": GOSUB 100
30 S$=INKEY$: IF S$="" THEN 30
40 IF S$<"1" OR S$>"4" THEN 30
50 ON VAL(S$) GOSUB 200,300,400,500
60 GOTO 30
100 LOCATE 1,4 : PRINT"1 - INSERIMENTO DATI"
110 LOCATE 1,8 : PRINT"2 - MODIFICA DATI"
120 LOCATE 1,12: PRINT"3 - VISUALIZZA DATI"
130 LOCATE 1,20: PRINT"4 - USCITA PROGRAMMA"
140 RETURN
200 CLS: LOCATE 12,0: PRINT "INSERIMENTO"
210 LOCATE 1,4:INPUT "NOME";N$
220 LOCATE 1,8: INPUT "INDIRIZZO";I$
230 LOCATE 1,12:INPUT "IMPORTO";IM
240 LOCATE 1,18: PRINT "CORRETTO (S/N)?"
250 S$=INKEY$: IF S$="" THEN 250
260 IF S$="s" OR S$="S" THEN RETURN 20
270 IF S$="N" OR S$="N" THEN 200 ELSE 250
300 CLS:LOCATE 15,0: PRINT "MODIFICA"
310 LOCATE 0,4:INPUT "NOME(Confermare per non cambiare)";N1$
320 IF N1$="" THEN LOCATE 1,29:PRINT N$ ELSE N$=N1$
330 LOCATE 0,8: INPUT "INDIRIZZO(Confermare per non cambiare)";I1$
340 IF I1$="" THEN LOCATE 0,9:PRINT I$ ELSE I$=I1$
350 LOCATE 0,12:INPUT "IMPORTO(Confermare per non cambiare)";IM$
360 IF IM$="" THEN LOCATE 0,13:PRINT IM ELSE IM=VAL(IM$)
370 CLS:RETURN
400 LOCATE 10,0: PRINT "VISUALIZZAZIONE"
410 LOCATE 1,4: PRINT "NOME :";N$
420 LOCATE 1,8: PRINT "INDIRIZZO :";I$
430 LOCATE 1,12: PRINT "IMPORTO :";IM
440 LOCATE 1,18:PRINT "Premere spazio per uscire"
450 IF INKEY$=" " THEN RETURN ELSE 450
500 CLS:END

Non ho usato L’ON GOTO, ma basta cambiare la riga 50 e le varie linee delle subroutines sostituendo il RETURN con GOTO Numero di linea e il gioco è fatto. Il programma è stato fatto in modo semplice per problemi di spazio, ma potete renderlo molto più “presentabile” facendo le vostre modifiche.

Alla prossima, grazie a tutti.

0 commenti

Invia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

Buongiorno a tutti, In questa puntata parlerò di un interrupt importante, specialmente per i giochi, quando vogliamo far apparire un nemico all'improvviso o un oggetto utile, ma anche per creare un cronometro o un orologio e tante altre cose. Il COMANDO sfrutta il...

it_ITIT_IT