{"id":5495,"date":"2023-11-20T16:11:50","date_gmt":"2023-11-20T15:11:50","guid":{"rendered":"https:\/\/msxitalia.org\/?p=5495"},"modified":"2023-11-20T16:11:50","modified_gmt":"2023-11-20T15:11:50","slug":"msx-basic-lezione-11","status":"publish","type":"post","link":"https:\/\/msxitalia.org\/en\/msx-basic-lezione-11\/","title":{"rendered":"MSX BASIC \u2013 lesson 11"},"content":{"rendered":"<div class=\"\" dir=\"auto\">\n<div id=\":r49d:\" class=\"x1iorvi4 x1pi30zi x1swvt13 xjkvuk6\" data-ad-comet-preview=\"message\" data-ad-preview=\"message\">\n<div class=\"x78zum5 xdt5ytf xz62fqu x16ldp7u\">\n<div class=\"xdj266r x11i5rnm xat24cr x1mh8g0r x1vvkbs x126k92a\">\n<h1 dir=\"auto\"><img decoding=\"async\" data-src=\"https:\/\/msxitalia.org\/wp-content\/uploads\/2023\/11\/Corso-Basic-MSX1-OC-300x225.jpg\" class=\"size-medium wp-image-5338 aligncenter lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"\" width=\"300\" height=\"225\" \/><noscript><img decoding=\"async\" class=\"size-medium wp-image-5338 aligncenter\" src=\"https:\/\/msxitalia.org\/wp-content\/uploads\/2023\/11\/Corso-Basic-MSX1-OC-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\"><\/noscript><\/h1>\n<h1 dir=\"auto\" style=\"text-align: center;\">RUBRICA &#8220;MSX BASIC&#8221; a cura di Orazio Cacciola (parte 11)<\/h1>\n<h2 style=\"text-align: center;\">GOSUB\/RETURN\/ON GOSUB\/ON GOTO\/INKEY$<\/h2>\n<\/div>\n<p>In questa puntata parler\u00f2 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.<\/p>\n<p>GOSUB<br \/>\nManda il programma ad una subroutine, al termine di essa ritorner\u00e0 alla istruzione successiva. \u00c8 un comando simile al GOTO, in entrambi i casi manda l&#8217;esecuzione alla linea che segue subito dopo il comando. C&#8217;\u00e8 per\u00f2 una differenza tra i due, mentre il primo dopo aver fatto il &#8220;salto&#8221; prosegue normalmente, il secondo memorizza la posizione dove \u00e8 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 \u00e8 tanta, pi\u00f9 ne useremo e pi\u00f9 questa diminuir\u00e0.<br \/>\nSINTASSI: GOSUB Numero di Linea<\/p>\n<p>RETURN<br \/>\nComando che serve a chiudere la routine chiamata con GOSUB. Ogni GOSUB deve avere un RETURN. Infatti il RETURN oltre rimandare l&#8217;esecuzione del programma<br \/>\nall&#8217;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.<br \/>\nSINTASSI: RETURN [Numero di Linea]<\/p>\n<p>ON GOSUB<br \/>\nViene usato quando i sottoprogrammi sono pi\u00f9 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, \u00e8 quella che decide dove mandare l&#8217;esecuzione. Questa ultima eseguir\u00e0 le 3 subroutines se avr\u00e0 il valore tra 1 e 3. Possiamo dire che i numeri di linea verranno eseguite in modo crescente, perci\u00f2 la C = 1 mander\u00e0 il programma alla linea 100, C = 2 alla 200 e C = 3 alla 300. Pi\u00f9 sono le subroutine e pi\u00f9 aumenter\u00e0 la variabile usata. Se invece la variabile C \u00e8 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.<br \/>\nSINTASSI: ON Variabile GOSUB Numero di linea, [Numero di linea], &#8230;&#8230;.<\/p>\n<p>ON GOTO<br \/>\nHa le stesse funzionalit\u00e0 del ON GOSUB \u00e8 vale tutto quello che ho detto sopra, ma come sappiamo, il GOTO crea il salto incondizionato e nient&#8217;altro. Per essere rieseguito si dovr\u00e0 usare un altro GOTO.<\/p>\n<p>INKEY$<br \/>\nAccetta 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\u00f2 contenere solo un carattere. \u00c8 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\u00f2 essere usata singolarmente oppure dentro una variabile. Di seguito un piccolo programma d&#8217;esempio.<\/p>\n<pre>100 A$=INKEY$: IF A$=\"\" THEN 100\r\nPRINT \"SCEGLI SI\/NO\"\r\n110 IF A$=\"S\" OR A$=\"s\" THEN 10\r\n120 IF A$=\"N\" OR A$=\"n\" THEN CLS: END ELSE 100<\/pre>\n<p>Come ho fatto la volta scorsa, ho creato un piccolo programma per fare capire meglio.<\/p>\n<pre>10 DEFINT A-Z: SCREEN 0\r\n20 CLS:LOCATE 15,1: PRINT \"M E N U\": GOSUB 100\r\n30 S$=INKEY$: IF S$=\"\" THEN 30\r\n40 IF S$&lt;\"1\" OR S$&gt;\"4\" THEN 30\r\n50 ON VAL(S$) GOSUB 200,300,400,500\r\n60 GOTO 30\r\n100 LOCATE 1,4 : PRINT\"1 - INSERIMENTO DATI\"\r\n110 LOCATE 1,8 : PRINT\"2 - MODIFICA DATI\"\r\n120 LOCATE 1,12: PRINT\"3 - VISUALIZZA DATI\"\r\n130 LOCATE 1,20: PRINT\"4 - USCITA PROGRAMMA\"\r\n140 RETURN\r\n200 CLS: LOCATE 12,0: PRINT \"INSERIMENTO\"\r\n210 LOCATE 1,4:INPUT \"NOME\";N$\r\n220 LOCATE 1,8: INPUT \"INDIRIZZO\";I$\r\n230 LOCATE 1,12:INPUT \"IMPORTO\";IM\r\n240 LOCATE 1,18: PRINT \"CORRETTO (S\/N)?\"\r\n250 S$=INKEY$: IF S$=\"\" THEN 250\r\n260 IF S$=\"s\" OR S$=\"S\" THEN RETURN 20\r\n270 IF S$=\"N\" OR S$=\"N\" THEN 200 ELSE 250\r\n300 CLS:LOCATE 15,0: PRINT \"MODIFICA\"\r\n310 LOCATE 0,4:INPUT \"NOME(Confermare per non cambiare)\";N1$\r\n320 IF N1$=\"\" THEN LOCATE 1,29:PRINT N$ ELSE N$=N1$\r\n330 LOCATE 0,8: INPUT \"INDIRIZZO(Confermare per non cambiare)\";I1$\r\n340 IF I1$=\"\" THEN LOCATE 0,9:PRINT I$ ELSE I$=I1$\r\n350 LOCATE 0,12:INPUT \"IMPORTO(Confermare per non cambiare)\";IM$\r\n360 IF IM$=\"\" THEN LOCATE 0,13:PRINT IM ELSE IM=VAL(IM$)\r\n370 CLS:RETURN\r\n400 LOCATE 10,0: PRINT \"VISUALIZZAZIONE\"\r\n410 LOCATE 1,4: PRINT \"NOME :\";N$\r\n420 LOCATE 1,8: PRINT \"INDIRIZZO :\";I$\r\n430 LOCATE 1,12: PRINT \"IMPORTO :\";IM\r\n440 LOCATE 1,18:PRINT \"Premere spazio per uscire\"\r\n450 IF INKEY$=\" \" THEN RETURN ELSE 450\r\n500 CLS:END<\/pre>\n<p>Non ho usato L&#8217;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 \u00e8 fatto. Il programma \u00e8 stato fatto in modo semplice per problemi di spazio, ma potete renderlo molto pi\u00f9 &#8220;presentabile&#8221; facendo le vostre modifiche.<\/p>\n<p>Alla prossima, grazie a tutti.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>RUBRICA &#8220;MSX BASIC&#8221; a cura di Orazio Cacciola (parte 11) GOSUB\/RETURN\/ON GOSUB\/ON GOTO\/INKEY$ In questa puntata parler\u00f2 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\u00e0 [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[14],"tags":[],"dipi_cpt_category":[],"class_list":["post-5495","post","type-post","status-publish","format-standard","hentry","category-msx-basic"],"_links":{"self":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/5495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/comments?post=5495"}],"version-history":[{"count":2,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/5495\/revisions"}],"predecessor-version":[{"id":5497,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/5495\/revisions\/5497"}],"wp:attachment":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/media?parent=5495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/categories?post=5495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/tags?post=5495"},{"taxonomy":"dipi_cpt_category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/dipi_cpt_category?post=5495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}