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