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!

Risultati del BASIC 10Liner Contest 2022

Sabato scorso sono stati pubblicati i risutati dell’undicesima edizione del BASIC 10Liner contest, tradizionale competizione a cui si può partecipare realizzando giochi e programmi per computer a 8 bit in sole 10 righe di codice in linguaggio BASIC.

BASIC 10Liner Contest: “volantino” del concorso
BASIC 10Liner Contest: “volantino” del concorso

Analogamente allo scorso anno, ho partecipato per la categoria PUR-80 (massimo 80 caratteri per linea; abbreviazioni consentite) realizzando tre giochi, di cui due per ZX Spectrum (Bastilude, Fishie – Keep the sea plastic free!) e uno per ZX81 (JAMGame – Just Another Memory Game).

Fishie – Keep the sea plastic free! è entrato nella TOP 10, classificandosi 7° su 38 giochi in gara nella categoria PUR-80. Bastilude, nonostante la 25esima posizione, è stato particolarmente apprezzatto dal pubblico, che gli ha accordato il 2° posto nella classifica speciale Public’s Choice. JAMGame, infine, con la sua 18esima posizione si è assestato nella parte media della graduatoria.

Risultati del BASIC 10Liner Contest 2022.
Risultati del BASIC 10Liner Contest 2022 (grazie a Filippo Santellocco per l’immagine con tutti i risultati).
Nella classifica originale, Fishie è erroneamente associato al C64.

Nonostante sperassi in un posizionamento migliore di Bastilude, anche quest’anno posso ritenermi più che soddisfatto dei risultati raggiunti e come al solito ho già qualche idea che spero di poter sviluppare per la prossima edizione.

Ho avuto modo di esaminare o provare pochissimi dei giochi e programmi realizzati dagli altri concorrenti; tra questi ritengo particolarmente degni di nota 8-bit Sunset (vincitore della categoria SCHAU) e STOP THE micro EXPRESS (vincitore della categoria EXTREM-256). Quest’ultimo si avvale di una tecnica molto interessante di utilizzo dell’istruzione LPRINT, che ha consentito all’autore di rendere eccezionalmente fluide le animazioni.

Concludo con un ringraziamento a Gunnar, organizzatore del contest, ai giudici e a tutti i partecipanti!

Link e riferimenti

Read in English

Scroll in basso (ZX Spectrum)

In occasione del Crazy Climber Challenge, organizzata un paio di mesi fa dal gruppo Retro Programmers Inside, si discuteva di come realizzare, per i vari sistemi ammessi, routine di scroll verso il basso, funzionali allo sviluppo delle varie implementazioni del gioco. La mia attenzione, come di consueto, si è rivolta verso lo ZX Spectrum. L’effetto di scroll su questa macchina non è di immediata implementazione, a causa dell’organizzazione della memoria video.

Per lo scroll verso l’alto (utilizzato ad esempio nel mio 10 Liner 10 Miglia) me l’ero cavata semplicemente richiamando la routine implementata nella ROM all’indirizzo 3582 decimale.

Purtroppo, nella ROM dello Spectrum originale, non è presente una routine analoga per lo scroll verso il basso. Dato che i programmatori sono notoriamente pigri (e i retroprogrammatori ancora di più), prima di reinventare la ruota ho cercato altrove e ho trovato una soluzione nel libretto 77 Programmi per Spectrum di Gaetano Marano, fonte preziosa di utilissimi programmi per l’amato computer. Il codice si trova a pagina 95; di fatto è una routine assembly incorporata in un programma BASIC ed è fornito anche un esempio di utilizzo. Bando alle ciance quindi ed ecco il listato 😀:

66 REM Routine di SCROLL IN BASSO
77 REM da 77 Programmi per Spectrum di Gaetano Marano
99 BORDER 0: PAPER 0: INK 4: CLS
100 DATA 6,8,33,223,87,17,255,87,197,1,224,0,237,184,62,32,43,27,61,32,251,193,16,240
101 DATA 17,224,0,6,8,33,192,80,62,32,54,0,35,81,32,250,25,16,245
102 DATA 6,8,33,255,79,17,31,87,197,1,32,0,237,184,62,224,43,27,61,32,251,193,16,240
104 DATA 6,8,33,223,79,17,255,79,197,1,224,0,237,184,62,32,43,27,61,32,251,193,16,240
106 DATA 6,8,33,255,71,17,31,79,197,1,32,0,237,184,62,224,43,27,61,32,251,193,16,240
108 DATA 6,8,33,223,71,17,255,71,197,1,224,0,237,184,62,32,43,27,61,32,251,193,16,240
110 DATA 17,224,0,6,8,33,0,64,62,32,54,0,35,61,32,250,25,16,245
112 DATA 201
120 LET U=PEEK 23675+256*PEEK 23676
130 FOR A=U TO U+158
140 READ D: POKE A,D
150 NEXT A
999 REM ---------------------
1000 REM Programma di esempio
1010 REM --------------------
1020 FOR A=1 TO 1000
1030 PRINT AT 0, INT(RND*32);CHR$(36+(60*INT (RND*2)))
1040 LET S=USR U
1044 PAUSE 20
1050 NEXT A

L’animazione seguente mostra il programma in azione:

Animazione che mostra la routine di scroll in azione.
Programma di esempio che mostra la routine di scroll in azione (ZX Spectrum emulato con Fuse).

Se sei interessato al programma di scroll, puoi scaricarlo in formato TAP, oppure utilizzarlo nel tuo browser web, grazie all’emulatore online JSSpeccy.

Spunti di approfondimento

Quanto scritto, relativamente alla mancanza di una routine di scroll verso il basso nella ROM del sistema, è sicuramente valido per lo ZX Spectrum classico (16/48K). Tuttavia, i modelli successivi (128K, +2, +3 etc) sono dotati di un editor più evoluto, per cui non escludo che parti di esso possano essere sfruttate per implementare lo scroll verso il basso. Questo interessantissimo spunto è stato suggerito dall’amico Fabrizio Caruso e merita sicuramente un approfondimento!

JAMGame: solo un altro gioco di memoria (ZX81)

JAMGame (Just Another Memory Game) è un piccolo videogioco di memoria, ispirato al classico gioco elettronico Simon, per computer Sinclair ZX81.

JAMGame: schermata di gioco.
JAMGame: terzo livello; la sequenza proposta dal computer termina con “4” e il giocatore ha appena inserito la sequenza “1234”.

JAMGame è il mio terzo gioco in gara per l’undicesima edizione del BASIC 10Liner Contest, categoria PUR-80. In base alle regole della competizione, è stato realizzato con 10 linee di programma in linguaggio BASIC, con ciascun linea lunga al massimo 80 caratteri.

La realizzazione di programmi completi in sole 10 righe di codice risulta particolarmente sfidante su computer come lo ZX81, il cui interprete BASIC consente l’utilizzo di una sola istruzione per linea. Nella maggior parte dei dialetti BASIC, al contrario, è possibile introdurre più istruzioni per linea, separandole con il carattere “:”.

Listato di JAMGame (ZX81 emulato con EightyOne)

Navigando alla pagina di JAMGame su itch.io, potrai sia giocare online (dispositivi mobili non supportati), sia scaricare un archivio contenente il gioco stesso e la relativa documentazione, inclusa la spiegazione del codice.

Descrizione del gioco

JAMGame è un gioco di memoria per giocatore singolo. In ciascun round, il computer mostra una sequenza di numeri pseudocasuali compresi nell’intervallo tra 1 e 4, dopodiché il giocatore deve riprodurre la sequenza premendo i tasti corrispondenti, seguiti da “Enter”.
Con l’avanzare del gioco, la lunghezza della sequenza aumenta. Se il giocatore digita la
sequenza sbagliata, il gioco termina e per fare un’altra partita, il programma deve essere nuovamente eseguito.
L’alternanza di due caratteri grafici aiuta a distinguere le singole cifre della sequenza da riprodurre. Quando la sequenza presentata dal computer è terminata, il carattere “░” viene visualizzato vicino all’ultima cifra.

JAMGame: video di una partita (registrato con l’emulatore ZEsarUX).

Listato

Il codice del programma è riportato di seguito. Per una spiegazione dettagliata, rimando alla pagina di JAMGame su itch.io, da cui è possibile scaricare un archivio .zip contenente il gioco e la relativa documentazione.

1 LET L=3
2 LET A$=""
3 FOR I=1 TO L
4 LET A$=A$+STR$(1+INT(RND*4))
5 PRINT AT 0,0;"LEVEL:";L-2,,A$(I);" ";CHR$(9+(I/2=INT(I/2))*(I<L)-1*(I=L))
6 NEXT I
7 INPUT B$
8 IF B$<>A$ THEN STOP
9 LET L=L+1
10 GOTO 2

Link e riferimenti

Read in English

Pace (ZX Spectrum)

Animazione della bandiera arcobaleno della pace (ZX Spectrum)
Bandiera della pace (ZX Spectrum)
1 LET s$="PEACE":INK7:PAPER7:CLS:RESTORE1:DATA 27,9,47,39,55,82,18
2 LET m=22528:FOR i=1 TO 7:READ a:FOR j=1 TO 96:POKE m,a:LET m=m+1:NEXT j:NEXT i
3 PRINT INK3;PAPER3;AT 0,0;s$:FOR j=0 TO 7:FOR i=0 TO LEN s$*8-1:IF POINT(i,(175-j)) THEN GO SUB 9
4 NEXT i:NEXT j:PAUSE 0:STOP
9 FOR k=0 TO 5:FOR l=0 TO 6:PLOT 8+i*6+k, 119-j*7-l:NEXT l:NEXT k:RETURN

Spiegazione del programma

L’istruzione DATA alla linea 1 contiene i valori degli attributi (colore di “inchiostro” e “carta” e flag di luminosità) corrispondenti alle 7 strisce colorate.
Il ciclo FOR della linea 2 utilizza questi valori per disegnare lo sfondo della bandiera, scrivendoli direttamente nellla meoria degli attributi video, a partire dall’indirizzo 22528 (5800hex).
Nella linea 3, la stringa “PEACE”, contenuta nella variabile s$, è stampata in modo invisibile (utilizzando inchiostro magenta su carta magenta) nell’angolo in alto a sinistra dello schermo. Mediante l’istruzione POINT, vengono identificati i singoli pixel che costituiscono la scritta e per ciascuno di essi viene richiamata la subroutine alla linea 9, che ne effettua lo zoom e la stampa al centro dello schermo.

Video che mostra il programma in azione
Read in English

Fishie – Keep the sea plastic free! (ZX Spectrum)

Fishie – Keep the sea plastic free!: animazione del gameplay
Fishie: animazione del gioco

Fishie – Keep the sea plastic free! è un piccolo videogioco con un grande messaggio ecologista. Aiuta Fishie a mantenere il mare pulito dai rifiuti plastici trasportati dalle onde, catturando le bolle di ossigeno che emergono dall’acqua, prima che esplodano. Ogni volta che Fishie riesce ad acchiappare una bolla, la spazzatura che si trova sulla stessa linea scomparirà e il punteggio sarà incrementato. Il contatto con i rifiuti è dannoso e ti farà perdere una vita.

Fishie – Keep the sea plastic free! è stato programmato in 10 righe di codice in linguaggio BASIC per il computer Sinclair ZX Spectrum ed è il mio secondo gioco in gara (il primo è Bastilude) per l’undicesima edizione del BASIC 10 Liner Contest, categoria PUR-80.

Puoi sia scaricare Fishie – Keep the sea plastic free! (il download include il codice sorgente del programma e la documentazione dettagliata), sia giocare online sul tuo web browser (i dispositivi mobili non sono attualmentesupportati), semplicemente accedendo alla pagina del progetto.

Puoi anche votare Fishie – Keep the sea plastic free! per il premio speciale Public’s Choice, mettendo un like ❤️ a questo tweet: https://twitter.com/Basic10L/status/1502940791928463363.

Fishie
Fishie

Link e riferimenti relativi a Fishie – Keep the sea plastic free! e al BASIC 10 Liner Contest

Fishie: video del gameplay

Un doveroso e sincero ringraziamento a Gunnar per l’organizzazione di questo fantastico contest!

Read in English

Project: RE.VE.LA.TION premiato agli ZX Online Awards 2022

Si sono da poco concluse le votazioni per gli ZX Online Awards 2022, evento a cui qualsiasi gioco per ZX Spectrum rilasciato nel 2021 poteva partecipare.

Avevo candidato le mie realizzazioni del 2021 senza troppe pretese, trattandosi di piccoli progetti realizzati per i vari contest a cui ho partecipato. Proprio per questo motivo sono stao piacevolmente sorpreso nell’apprendere che Project: RE.VE.LA.TION, il mio videogioco in stile Lunar Lander, si è aggiudicato il premio speciale Best Well-polished Classics!

Il certificato Best Well-polished Classics
Il certificato Best Well-polished Classics

Consiglio di provare i vincitori di tute le categorie, in quanto lo scorso anno è stato ricco di uscite interessanti e di eccelsa qualità!

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! 😉

Bastilude: nuovo gioco BASIC 10 Liner per ZX Spectrum

Bastilude (BASIC Hastilude) è un videogioco d’azione, programmato in sole 10 righe in linguaggio BASIC per il computer Sinclair ZX Spectrum. Il gioco trae ispirazione del classico Joust, sviluppato da Williams e rilasciato nel 1982.

Screenshot: schermata del titolo.
Bastilude: schermata del titolo.

Il giocatore controlla, con un po’ d’immaginazione, un cavaliere che cavalca un drago verde. Lo scopo del gioco è disarcionare i cavalieri avversari, che montano draghi color magenta, in una sorta di giostra fantastica. Il vincitore del duello è il cavaliere che si trova in posizione più elevata al momento dell’impatto. La velocità dei cavalieri avversari aumenta man mano che questi sono sconfitti, determinando un incremento della difficoltà.

Screenshot: Il giocatore (drago verde) vince il duello.
Il giocatore (drago verde) vince il duello.
Screenshot: L'avversario (drago magenta) vince il duello.
L’avversario (drago magenta) vince il duello.

Bastilude è il mio (primo?) gioco in gara per l’11esima edizione del BASIC 10 Liner Contest, categoria PUR-80. Puoi sia scaricarlo (codice sorgente e documentazione completa sono inclusi) per utilizzarlo sul tuo ZX Spectrum o emulatore, sia giocarlo nel tuo web browser (in questo caso meglio da un computer; i dispositivi mobili non sono supportati), semplicemente navigando sulla pagina del progetto su itch.io.

Se hai apprezzato Bastilude, ti invito a votare per il premio speciale Public’s Choice, mettendo un like ❤️ su questo tweet.

Screenshot del gioco.
Prepararsi per la giostra!
Video del gameplay di Bastilude

In bocca al lupo per il torneo, o prode cavaliere!

Read in English