EVAS10N.RAS.DOT: il mio contributo alla DotJam

EVAS10N.RAS.DOT è un gioco estremamente semplice per Sinclair ZX Spectrum Next, simile a Breakout, realizzato per la DotJam utilizzando TRSE (Turbo Rascal Syntax Error).
Il file di progetto TRSE e il codice sorgente sono inclusi nell’archivio scaricabile sulla pagina del progetto.

Screenshot di EVAS10N.RAS.DOT.
Schermata di EVAS10N.RAS.DOT.

Nota importante: EVAS10N.RAS.DOT attualmente supporta solo la modalità video a 32 colonne!

TL; DR

Sono un utente Sinclair ZX Spectrum dal 1988 e un appassionato di ZX Spectrum Next da quando ne ho sentito parlare per la prima volta, nel 2017. Adoro i (retro)computer e soprattutto amo sviluppare applicazioni (principalmente videogiochi) per essi. Ho iniziato a programmare in BASIC da bambino e poi ho studiato Pascal , C , Java , C++ e C# , tra gli altri. Attualmente, il mio linguaggio di programmazione preferito per lo sviluppo retro è il C e la mia toolchain preferita è z88dk . Uno dei primi programmi che ho realizzato per ZX Spectrum Next è il comando more (precedentemente noto come readme), incluso nella distribuzione software ufficiale . Ho anche effettuato il port per ZX Spectrum Next di una semplice versione del programma scherzoso cowsay.

Cowsay in esecuzione su ZX Spectrum Next (emulatore ZEsarUX)
Dot command “Cowsay” in esecuzione su ZX Spectrum Next (emulatore ZEsarUX).

Nel 2019 ho realizzato BreakIn, un clone del gioco arcade Breakout, scritto in 20 righe di linguaggio BASIC per la Breakout Basic Challenge. L’anno successivo, ho scritto una versione ancora più piccola, chiamata Evas10n, per l’ edizione 2020 del BASIC 10Liner Contest.

Schermata di Evas10n (Basic 10 Liner).
Schermata di Evas10n (Basic 10 Liner).

Nell’aprile 2020, mi è stato finalmente consegnato il tanto atteso ZX Spectrum Next e ho immediatamente configurato l’ambiente CP/M e installato il compilatore Turbo Pascal 3.

Turbo Pascal (versione CP/M) in esecuzione su ZX Spectrum Next.
Turbo Pascal (versione CP/M) in esecuzione su ZX Spectrum Next (scusate per la pessima qualità dell’immagine).

Mi sono quindi divertito a riscrivere Evas10n in Pascal; il risultato è EVAS10N.PAS.

EVAS10N.PAS su ZX Spectrum Next
EVAS10N.PAS su ZX Spectrum Next emulato con #CSpect.

Recentemente, EVAS10N.PAS è stato migliorato e ottimizzato per CRISS CP/M, un interessante computer basato su microcontroller AVR e in grado di emulare la CPU Z80 e di eseguire il sistema operativo CP/M.

Video di Igor Reshetnikov che mostra la versione di EVAS10N.PAS modificata per CRISS CP/M.

Negli ultimi anni, ho sentito spesso parlare di TRSE (Turbo Rascal Syntax Error), una suite completa che include un moderno IDE e un cross-compiler Pascal e che supporta molti computer a 8 e 16 bit, basati su microprocessori come il MOS 6502, lo Zilog Z80, il Motorola 6800 o la linea X86. Penso che sia una suite eccellente e non vedevo l’ora di provarla!

Alcuni giorni fa è stata annunciata la DotJam. Lo scopo è provare a creare un gioco, una demo o un tool interessante sotto forma di file .dot. Pur desiderando partecipare alla DotJam, non sarei riuscito a trovare il tempo per ideare e realizzare qualcosa di nuovo. Poiché, tecnicamente parlando, qualsiasi file binario con estensione “.dot” e contenente fino a 8K di codice macchina che può essere eseguito dall’indirizzo $2000 (8192 in decimale) può essere un dot command e TRSE consente di specificare l’indirizzo di inizio del programma (menu Progetto => Impostazioni progetto = > scheda Target Settings), ho pensato di partecipare, convertendo EVAS10N.PAS da Turbo Pascal a TRSE, facendone un dot command!

Essendo il port di un programma per CP/M, EVAS10N.RAS.DOT non utilizza (ancora?) alcuna delle funzionalità di ZX Spectrum/Next, come colori, suono, grafica ad alta risoluzione, sprite, ecc… Sarebbe quindi interessante evolverlo per sfruttare appieno le capacità dello ZX Spectrum Next, magari mediante una unit dedicata (vedi file: next.tru).

Video di EVAS10N.RAS.DOT in azione.

Note di conversione

La conversione in TRSE non è stata così semplice e lineare come avrei inizialmente immaginato, a causa di alcune differenze tra TRSE e il dialetto Pascal che conosco, quindi annoterò alcune osservazioni. Per maggiori informazioni, potresti consultare la documentazione della sintassi TRSE .

Preciso inoltre che, avendo appena iniziato ad utilizzare TRSE, alcune delle mie ipotesi e considerazioni potrebbero essere sbagliate!

Cicli for

Il valore finale in un ciclo for non è incluso.

Quindi, ad esempio, questo ciclo:

for i := 0 to 10 do
begin
    txt::put_ch(48 + i);
end;

produce il seguente risultato: 0123456789 e questo ciclo:

for i := 2 to 5 do
begin
    txt::put_ch(48 + i);
end;

produce questo output: 234.

No array bidimensionali

Gli array di array non sono consentiti.

Quindi ho semplicemente sostituito:

var bricks: array[1..6] of array[1..32] of Boolean;
...
bricks[r, c] := true;

con:

var bricks: array[6*32] of Boolean;
...
bricks[(r * 32) + c] := True;

Condizioni annidate

Le condizioni annidate devono essere racchiuse tra parentesi, altrimenti accadranno cose terribili! si faccia riferimento alla sintassi TRSE per i dettagli.

Nomi di variabili locali

Il compilatore non consente lo stesso nome per più variabili, anche se il loro scope è diverso. Forse questo può essere risolto con il modificatore global… devo indagare ulteriormente!

Ecco un esempio in cui il compilatore segnalerà errori:

program Test;

function Square(val: Integer): Integer; // Fatal error: Variable 'val' is already defined! 
var newval: Integer; // Fatal error: variable 'newval' is already defined! 
begin
	newval := val * val;
	Square := newval;
end;

var  
	val, newval: Integer;

begin

	val := 5;
	newval := Square(val);

end.

Altre note

  • Prestare attenzione ai tipi di parametri di funzioni/procedure e alle variabili passate: passare un Integer dove è previsto un Byte o viceversa apparentemente può causare problemi.
  • Integer e Byte sono tipi senza segno!

Considerazioni finali

EVAS10N.RAS.DOT è stato realizzato in maniera spiccia, senza troppi test; pertanto il programma contiene sicuramente alcuni bug e può essere migliorato in molti modi.
Sono comunque felice di essermici dedicato, in quanto mi ha dato la possibilità di conoscere TRSE, un ottimo strumento di sviluppo!

Read in English

EVAS10N.PAS su CRISS CP/M

EVAS10N.PAS, il port in Turbo Pascal del gioco Evas10n, originariamente programmato in linguaggio BASIC, è stato recentemente adattato per il computer CRISS CP/M.

Screenshot di EVAS10N.PAS (ZX Spectrum Next emulato con #CSpect)
EVAS10N.PAS su ZX Spectrum Next emulato con #CSpect

CRISS CP/M è un progetto estremamente interessante: si tratta di un computer distribuito sia come kit di montaggio sia già assemblato, basato su microcontroller AVR e in grado di emulare la CPU Z80 e di eseguire il sistema operativo CP/M.

La resa di questa versione di EVAS10N.PAS su CRISS CP/M non è affatto male, come si può osservare in questo video:

EVAS10N.PAS adattato per CRISS CP/M

Che dire… un altro piccolo computer da aggiungere alla lista dei desideri! 😉

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

Risultati del BASIC 10Liner Contest 2020

L’edizione 2020 del BASIC 10Liner Contest, a cui ho partecipato con Evas10n e Sierpinski 10-Liner, si è da poco conclusa e i risultati sono stati recentemente pubblicati.
È tuttavia ancora possibile votare per la “Public’s Choice” su Twitter, esprimendo la propria preferenza con un ❤ sul tweet dedicato al gioco o programma preferito (qui i link per Evas10n e Sierpinski 10-Liner).

Sono particolarmente soddisfatto dei risultati ottenuti, in quanto Evas10n si è classificato al settimo posto su 87 nella categoria PUR-80, mentre Sierpinski 10-Liner ha ottenuto la seconda posizione su 12 nella categoria SCHAU!

Infine, tutti i 10 liner sono stati resi disponibili per il download!

Read in English

Evas10n: 10-liner Breakout (ZX Spectrum)

Evas10n: schermata di gioco

Recentemente, sono stato coinvolto nel BASIC 10Liner Contest tanto che, a pochi giorni di distanza dal mio precedente contributo, ho già completato e inviato un nuovo progetto!

Questa volta si tratta di Evas10n, videogioco in stile Breakout per il computer Sinclair ZX Spectrum, candidato alla categoria “PUR-80” (gioco realizzato in linguaggio BASIC in 10 righe, massimo 80 caratteri per riga). A differenza della maggior parte dei giochi appartenenti a questo genere, in Evas10n non occorre distruggere tutti i muri, ma lo scopo è farsi strada attraverso i muri per raggiungere la cima dello schermo. In questo aspetto, è simile all’implementazione per CHIP-8 di Carmelo Cortez (che puoi giocare online dal tuo browser utilizzando la mia macchina virtuale), a sua volta derivata da Wipe Off di Joseph Weisbecker.

Sebbene visivamente sia simile a Breakin, un altro gioco in stile Breakout che ho realizzato lo scorso anno, il programma di Evas10n è stato completamente riscritto, per rispettare il vincolo delle 10 righe di codice.

Video del gameplay, registrato durante lo sviluppo di Evas10n

Puoi sia scaricare un archivio .zip, contenente il codice sorgente, i file pronti per l’utilizzo con gli emulatori e tutta la documentazione (con istruzioni d’uso e spiegazione dettagliata del listato BASIC), che giocare a Evas10n con il tuo browser web (è richiesta la tastiera), mediante l’emulatore ZX Spectrum online. Il gioco è anche disponibile sulla pagina dedicata su itch.io.

I tasti per controllare la barra sono “z” (sinistra) e “x” (destra).
Fai rimbalzare la “palla” contro i mattoni per farti strada verso la parte superiore dello schermo. Per invertire la direzione della palla, colpiscila con uno dei vertici superiori della barra. Se la palla tocca il bordo inferiore dello schermo, sarà persa; hai 6 palle a disposizione. Il gioco termina quando palla raggiunge la parte superiore dello schermo; in tal caso la scritta “FREE!” sarà visualizzata e il gioco si bloccherà. Se fallisci, una nuova partita comincerà automaticamente.

Read in English