MaN1cPuzzle in versione Tiny BASIC

Recentemente, mi sono divertito con la realizzazione di TinyBasicBlazor, un ambiente Tiny BASIC interattivo, basato sulla conversione in C# dell’interprete TinyBasic realizzato da Tom Pittman ed eseguito sui browser web grazie alla tecnologia WebAssembly.

Volendo aggiungere contenuti originali ai programmi di esempio già inclusi, ho deciso di convertire il mio MaN1cPuzzle, riscrivendolo in Tiny BASIC. MaN1cPuzzle è una generalizzazione del classico Gioco del 15, implementato originariamente per il computer ZX Spectrum in 20 linee di Sinclair BASIC. Il processo di coversione è stato tutto sommato semplice, a parte qualche minima difficoltà dovuta alle differenze tra i due dialetti del BASIC.

Screenshot di MaN1cPuzzle, versione ZX Spectrum
MaN1cPuzzle, versione ZX Spectrum

La differenza più evidente è che Tiny BASIC consente solo un’istruzione per riga. Di fatto questo non costituisce un problema, infatti, mentre sul MaN1cPuzzle originale ho sfruttato la possibilità di avere più istruzioni per linea per contenere il programma in 20 linee, con il porting a Tiny BASIC non ho dovuto soddisfare questo requisito. Quindi, ho approfittato di questa situazione per includere commenti esplicativi e rendere il codice più leggibile.
In secondo luogo, l’implementazione di Tiny BASIC di Tom Pittman non supporta i cicli FOR, introdotti con Tiny BASIC Extended. Tuttavia, questi possono essere facilmente sostituiti con istruzioni di GO TO, con buona pace dei puristi della programmazione strutturata, che non considerano i salti incondizionati una buona pratica (E. Dijkstra l’ha persino definita dannosa!).
Un’altra differenza sostanziale tra i dialetti è che Tiny BASIC supporta solo aritmetica a numeri interi. Tuttavia, anche se i numeri in virgola mobile potrebbero essere gestiti con una programmazione aggiuntiva, come descritto nel Tiny BASIC Experimenter’s Kit, non sono necessari in questo tipo di gioco.
Inoltre, Tiny BASIC non ha istruzioni per la grafica / i colori / il suono, ma per questo tipo di gioco è sufficiente l’output di testo con alcune pseudo grafiche realizzate con caratteri ASCII standard.

L’unico punto difficile del processo di porting è stata la mancanza del supporto agli array in Tiny BASIC. MaN1cPuzzle, infatti, utilizza un array bidimensionale per memorizzare le posizioni delle tessere nella griglia di gioco. Sono stato in grado di superare questo problema adottando l’approccio descritto in TIC-TAC-TOE IN TINY BASIC or How to Make a Program TINY di Tom Pittman, tramite le funzioni peek e poke, per leggere e scrivere il contenuto di posizioni contigue di memoria dall’indirizzo 0 all’indirizzo M * N-1 (dove M e N sono le dimensioni della griglia di gioco), simulando così un array. L’interprete Tiny BASIC, infatti, integra alcune routine che possono essere invocate con la funzione USR. In particolare, la funzione peek è disponibile all’indirizzo COLD_START + 20 e la funzione poke è disponibile all’indirizzo COLD_START + 24, essendo COLD_START uguale a 256 (100h) nell’implementazione dell’interprete utilizzata da TinyBasicBlazor.

Il risultato finale è mostrato nella figura sotto e il gioco è giocabile sul tuo browser web tramiteTinyBasicBlazor (è richiesta la tastiera). All’avvio, il programma richiede l’indirizzo COLD_START; inserisci semplicemente 256. Quindi il programma richiede le dimensioni della griglia e il numero di spostamenti casuali da utilizzare per il mescolamento iniziale della griglia. Ho previsto due shortcut che consentono l’avvio immediato del gioco, per giocare con 15 tessere su una griglia 4 × 4 o con 24 tessere su una griglia 5 × 5.
È disponibile anche il listato BASIC del gioco.

Screenshot di MaN1cPuzzle, versione Tiny BASIC
MaN1cPuzzle, versione Tiny BASIC, in esecuzione su web browser con TinyBasicBlazor

Link e riferimenti

Read in English

Un interprete Tiny BASIC sul tuo web browser!

Periodicamente, il mio interesse è catturato dagli interpreti BASIC, presenti su praticamente tutti i computer hobbistici e domestici a partire dalla metà degli anni ’70 ed in particolar modo negli anni ’80.
Tra i vari dialetti del BASIC, Tiny BASIC ricopre sicuramente un ruolo molto importante.
Tiny BASIC è stato ideato tra il 1975 e il 1976 e il suo sviluppo come alternativa aperta rispetto al costoso BASIC di Microsoft fu incentivato dalla controvèrsia sulla pirateria informatica, innescata dalla distribuzione non autorizzata di copie dello stesso, denunciata da Bill Gates nella sua Lettera aperta agli hobbisti.
Gli interpreti Tiny BASIC furono rilasciati gratuitamente o commercializzati a basso costo; tra questi, il più famoso è l’interprete implementato da Tom Pittman (Itty Bitty Computers) mediante macchina virtuale, alla cui storia Steven Levy ha dedicato un capitolo del suo Hackers: Gli eroi della rivoluzione informatica. Nel 2006, Tom Pittman rilasciò una versione aggiornata del suo interprete, riscritta in linguaggio C e successivamente Mohan Embar ne effettuò il porting in Java, C# e Flex/Actionscript.

Negli ultimi anni, la tecnologia WebAssembly (Wasm) si sta affermando come standard per lo sviluppo di applicazioni web performanti, realizzate in altri linguaggi oltre a Javascript.
In particolare, appena un mese fa, Microsoft ha rilasciato ufficialmente Blazor WebAssembly, ambiente basato su WebAssembly che consente l’esecuzione di codice .NET direttamente nel browser, senza necessità di installare alcun plugin aggiuntivo.

Lavorando quotidianamente con C#, il rilascio di Blazor WebAssembly ha destato il mio interesse e così ho deciso di coniugare il desiderio di approfondire questa nuova tecnologia con la passione per il retrocomputing, realizzando un ambiente Tiny BASIC contenuto in una pagina web ed eseguito sul browser. Blazor WebAssembly mi ha permesso di includere l’interprete di Mohan Embar senza alcuna modifica al codice sorgente e di realizzare una semplice console per l’I/O e i componenti per caricare ed eseguire alcuni programmi BASIC predefiniti, o altri programmi eventualmente presenti sul proprio computer.


Il risultato di questo progetto è TinyBasicBlazor, il cui codice sorgente è disponibile su GitHub. Per completare l’opera, ho iniziato la conversione di MaN1cPuzzle (versione del Gioco del 15 originariamente implementata in 20 linee di BASIC per ZX Spectrum) in Tiny BASIC e spero di includerla presto tra i programmi di esempio.

Con TinyBasicBlazor, puoi programmare come nel 1976 (ma su un browser moderno)!

Read in English

EVAS10N.PAS: implementazione di Evas10n in Turbo Pascal

Tra le varie ragioni per cui amo lo ZX Spectrum Next, c’è senza dubbio il supporto al sistema CP/M. Lo ZX Spectrum è stato il mio primo computer, con il quale ho imparato a programmare in BASIC, ma il primo linguaggio di programmazione che ho veramente apprezzato è stato il Turbo Pascal (su PC DOS; all’epoca non ero neanche a conoscenza del sistema CP/M). Posso ancora ricordare l’emozione che ho provato quando mi resi conto che potevo compilare i miei programmi in file eseguibili! Ora, con l’ambiente CP/M messo a disposizione dal Next, ho finalmente l’opportunità di programmare in Turbo Pascal su di uno ZX Spectrum!

Turbo Pascal (CP/M-80) sullo ZX Spectrum Next
Questa schermata richiama alla mente dolci ricordi…

Inoltre, digitare sulla tastiera del Next è un’esperienza veramente piacevole per cui, un po’ come tributo al gioco Turbo Breakout, incluso nella distribuzione Turbo Pascal 5, mi sono divertito a riscrivere il mio Evas10n (gioco in stile Breakout realizzato in BASIC) in Turbo Pascal 3, interamente sul Next.
Sia il codice sorgente Turbo Pascal che gli eseguibili compilati per CP/M e DOS sono disponibili nel repository GitHub dedicato.

Buon divertimento!

Read ion English