Farmer Sam’s Dog Day: lavori in corso

Per celebrare la consegna delle unità ZX Spectrum Next prodotte per la seconda campagna KickStarter, avvenuta nelle scorse settimane in tutto il mondo, sto lavorando a una nuova versione di Farmer Sam’s Dog Day, il platformer da me realizzato.

Farmer Sam ha appena ricevuto il suo ZX Spectrum Next

La nuova verisone includerà alcune migliorie e soprattutto molti nuovi livelli! Per avere un assaggio della prossima uscita, ti invito a scaricare la demo che ho appena pubblicato sulla pagina del gioco sulla piattaforma itch.io.

Ma non è tutto: l’uscita di una versione fisica del gioco è all’orizzonte!

Resta sintonizzato per aggiornamenti!

Leggi in Inglese

Un po’ di rock’n’roll sullo Spectrum Next

Gli utenti dello ZX Spectrum Next hanno mostrato notevole apprezzamento per playvid, il comando realizzato da Allen Albright che ha esteso le potenzialità del nostro amato computer, permettendo la riproduzione di file video opportunamente codificati.

Dopo il rilascio da parte di em00k di makevid, front-end per ffmpeg che permette di semplificare la transcodifica di file video nei formati supportati da playvid, ho deciso di sperimentare la conversione. Per lo scopo, ho scelto un filmato che ritrare l’esecuzione del brano Hellish Rock’n’Roll registrata ad un concerto dei Doctor Feast, gruppo rock in cui suono la batteria. Purtroppo, sul PC che sto utilizzando non sono riuscito a portare a termine la conversione e sto cercando di capirne il motivo.

Fortunatamente, Xalior ha realizzato convert.py, un altro frontend per ffmpeg, questa volta in forma di script python. Tramite questo strumento, sono riuscito a portare a termine il lavoro.

Mi sono proposto di realizzare un video unico, non limitandomi a convertire la versione del brano registrata durante il concerto, bensì mixando la traccia video dell’esecuzione dal vivo con l’audio registrato in studio.

Il video, che puoi scaricare qui, è tutt’altro che perfetto, infatti la sincronizzazione tra audio e video non è precisa; inoltre il rapporto d’aspetto è 16/9, mentre sarebbe stato più adeguato 4/3, per coerenza col display dello ZX Spectrum.
Che dire, tutto in pieno spirito Punk!

Serpenti, serpenti e ancora serpenti!

Il 10 aprile sarà il termine ultimo per partecipare alla Retro Snake Game Jam, sfida di retro-programmazione organizzata dal gruppo Retro Programmers Inside in collaborazione con Phaze101 e ospitata sulla piattaforma itch.io. Lo scopo della sfida è la realizzazione di un gioco in cui vi sia un serpentello, non importa che sia il protagonista del gioco o il “cattivo” da evitare o da sconfiggere. Sono ammessi giochi per computer e console a 8/16 bit basati sulle CPU appartenenti alle “famiglie” Z80, 6502 e Motorola 68K.

baSnake

Ho quindi pensato bene di candidare il mio baSnake, realizzato ormai 6 anni fa in BASIC per lo ZX Spectrum, proprio in occasione di un’altra game jam su itch.io e successivamente arricchito per sfruttare alcune caratteristiche dello ZX Spectrum Next. Per poter partecipare, ho dovuto preparare una versione ad hoc, contenente il messaggio “Partecipante alla Retro Programmers Inside (RPI) and Phaze101 Game Jam“, come richiesto dal regolamento della Retro Snake Game Jam. Tale versione è disponibile, insieme alle precedenti, sulla pagina itch.io di baSnake.

baSnake in esecuzione sullo ZX Spectrum Next

YAS

baSnake non è stato l’unico progetto in cui ho avuto a che fare con serpentelli pixellosi. Nel 2015, infatti, mentre mi dilettavo con lo sviluppo di CHIP-OTTO, il mio interprete CHIP-8 per ZX Spectrum e di WEB-OTTO, la controparte per browser web, ho realizzato un clone di Snake proprio per questa piattaforma, chiamato – guarda un pò – YAS – Yet Another Snake (ancora un altro serpente). Sebbene scritti in linguaggi completamente diversi, baSnake eredita da YAS la possibilità di selezionare lo scenario in cui giocare.

Recentemente, ho appreso con piacere che YAS è stato incluso nella distribuzione ufficiale di EMMA02, emulatore multipiattaforma in grado di eseguire l’interprete CHIP-8 originariamente sviluppato per i computer della serie Cosmac.

Video che mostra YAS in azione sul port per ZX Spectrum Next di CHIP-OTTO

ZNAKE

Non è ancora tutto: per arrivare alla mia prima implementazione di un gioco in stile Snake, occorre andare ancora più indietro nel tempo, per l’esattezza al 2005. In quell’anno, infatti, realizzai ZNAKE, il mio primo progetto completo (seppur minimale) di videogioco per retrocomputer.

ZNAKE è infatti un semplice giochino in stile Snake, Worm, Nibbles, etc… per Sinclair ZX Spectrum. Lo scopo del gioco è pilotare il serpente (nelle direzioni alto / basso / sinistra / destra ) in modo che possa mangiare le mele che appaiono sullo schermo, evitando di urtare i muri o il serpente stesso. Per ogni mela ingerita, il giocatore guadagna punti, ma il corpo del serpente si allunga, rendendo così più difficile la partita.

Caricamento di Znake nell’emulatore RealSpectrum, su Windows XP

ZNAKE nasceva dal desiderio di realizzare un gioco, seppur semplice, per il celebre computer ZX Spectrum, al quale sono particolarmente affezionato. Già da tempo avevo avuto modo di conoscere il fantastico Z88DK, ma non ero mai andato oltre qualche semplice prova finchè un giorno, nel 2005, ispirato da un tutorial (purtroppo ho perso il riferimento, si parla di troppi anni fa) sul sistema a finestre X, decisi di implementare il serpentello come lista concatenata. Giocando così con malloc e putchar, ho implementato ZNAKE quasi completamente in C, utilizzando un minimo di Assembly. Non pago, per completare l’opera ho poi provveduto a trasferire ZNAKE su nastro, in modo da poterlo giocare sul vero Spectrum, oltre che sugli emulatori.

Successivamente, grazie all’emulatore Qaop, avevo anche creato un widget di Dashboard (che adesso chiameremmo “app“) per MacOSX e una versione per qualche desktop di Linux.

ZNAKE è quindi un progetto doppiamente retro, in quanto si tratta di un gioco per retrocomputer, realizzato quasi 20 anni fa (l’iBook G4 che utilizzavo all’epoca è ormai un retrocomputer esso stesso!). Tuttavia, giocando a ZNAKE, si può già avere un’idea di quale sarà lo stile di baSnake.

Dopo questo tuffo nel passato, ho pensato che anche ZNAKE avrebbe potuto partecipare alla Retro Snake Game Jam, previo inserimento del succitato messaggio. Il programma originale non è compatibile con le versioni recenti di z88dk, per cui ho dovuto fare alcune modifiche, cogliendo l’occasione per migliorare il codice, eliminando parti scritte da me a favore delle funzioni presenti nelle librerie fornite con z88dk. Il risultato è quindi, come al solito, disponibile per il download o per giocare tramite browser web (grazie all’emulatore JSSpeccy3) sulla pagina dedicata nella piattaforma itch.io.

Video che mostra il gameplay di ZNAKE

Direi, quindi, che 3 implementazioni di Snake bastano e avanzano!
Anche se una versione BASIC 10 Liner, magari… 🙂

Link e riferimenti

English version

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

Pringles Sonic Chip: ZX Spectrum e patatine

Le patatine Pringles possono piacere o meno, ma sicuramente l’iniziativa recentemente lanciata dal noto marchio, facente capo al gruppo Kellog, non lascerà indifferenti i retrogamer e in particolare i fan del Sinclair ZX Spectrum. A 40 anni dal lancio dello ZX Spectrum, Pringles ha infatti deciso di omaggiare l’iconico computer con il concorso Pringles Sonic Chip, che consiste nel decodificare il programma contenuto nella traccia audio del seguente video, utilizzando uno ZX Spectrum, reale o emulato:

Pringlesonic: il video di Pringles con la traccia audio da decodificare.

I primi che riusciranno nell’impresa, si aggiudicheranno una lattina speciale di patatine Pringles.

La comunità dello ZX Spectrum ha accolto la sfida con entusiasmo e il programma contenuto nel video di Pringles è stato prontamente decodificato:

Pringlesonic: il programma è stato decodificato.

Pur non potendo partecipare, in quanto l’iniziativa è riservata agli utenti del Regno Unito, ho comunque deciso di cimentarmi con la sfida.

La parte più difficile è stata ottenere una traccia audio di buona qualità, che potesse essere caricata sullo ZX Spectrum oppure convertita nei formati TZX e TAP, utilizzati comunemente dagli emulatori. Inizialmente, ho provato più volte a registrare l’output audio del video in riproduzione sul web browser del mio portatile, utilizzando Audacity; tuttavia, non sono mai riuscito ad ottenere un file WAV di qualità sufficiente per la conversione in TZX senza errori.
Fortunatamente, mi sono imbattutto nel metodo indicato da Rui F Ribeiro sul gruppo Facebook World of Spectrum, basato sul tool yt-dlp per estrarre l’audio da un video YouTube (nota: è richiesta la presenza di FFmpeg):

yt-dlp -ci -f 'bestvideo[ext=mp4]+bestaudio' -x --audio-format wav "https://www.youtube.com/watch?v=z1375a8rW0k"

Una volta ottenuto il file WAV, l’ho rinominato in pringlesonic.wav e convertito in formato TZX mediante l’utility audio2tape, disponibile nel pacchetto fuse-utils:

audio2tape pringlesonic.wav pringlesonic.tzx

Sono quindi finalmente riuscito a caricare il file TZX ottenuto sull’emulatore Fuse senza problemi.

Caricamento del programma contenuto nella traccia del video (emulatore Fuse).
Caricamento del programma contenuto nel video di Pringles (emulatore Fuse).

Per rendere più autentica l’esperienza, volevo comunque caricare il programma su di un vero ZX Spectrum; nella fattispecie ho pensato allo Spectrum Next che giace sulla mia scrivania, impaziente di essere utilizzato. Purtroppo, anche qui si è verificato un intoppo, infatti l’uscita audio del portatile non è sufficientemente potente e non avevo nell’immediato la possibilità di amplificare il segnale. Tuttavia, essendo il mio ZX Spectrum Next dotato di scheda acceleratrice Raspberry PI 0, mi sono avvalso della possibilità di caricare il file TZX a velocità massima, copiandolo preventivamente sulla scheda SD. Se non avessi avuto la scheda acceleratrice, avrei comunque potuto convertire il file TZX in formato TAP e trasferire quello su scheda SD.

Il video seguente mostra il risultato di cotanto lavoro:

Pringlesonic: caricamento del programma su ZX Spectrum Next.

Bene, mi è proprio venuta voglia di uno snack!