ORIC BOULDER DASH — ZX SPECTRUM 128K
R07, 15 ottobre 2026
2026 by Outsoftware
using ChatGPT & Codex

Port nativo C/Z80 compilato con z88dk. Analisi reale del binario 6502
con Ghidra e confronto con Oricutron, configurato come Oric Atmos.


VERIFICA AGGIUNTIVA R07
Sette menu:256passi consecutivi ciascuno,1792mappe e1792tabelle sprite
identiche al6502 originale e al binarioZ80 finale. Rockford compare al
passo51 in tutte le raccolte. Verifica da avvio fresco, non dopo campagna.
Menu: corretta soltanto l'inizializzazione CaveZ, riproducendo la fase
animata e la scansione preliminare originali, con intervallo ameba13.
Colori, composizione, renderer, audio e cadenza gameplay restano invariati.
B e N sono due tasti per cambiare colore, non una sigla bianco/nero.
Sette percorsi completati con soli input, confrontati con6502/C/Z80:
BD1/S, BD2/S, BD3/S, +1/D, Arno1/R, Arno2/T, Bonus/R (difficoltà1).
Sei sono stanze bonus; non equivalgono a completare le sette campagne.
La grotta normale +1/D è anche completata in Fuse100%, con281punti
ed ingresso nella stanza Q,131stati senza divergenze né scrittureRAM.
Rieseguite700combinazioni140x5 sul binarioR07,48321tick e100transizioni.
Il confronto6502 completo R06 resta pertinente: modificato solo CaveZ.
Il menu non ha tempo reale identico: Oric misurato10,618passi/s,
Spectrum limita il menu a un minimo8frame per passo (massimo6,25/s).
La verifica delle regole per passo non certifica identità del ritmo.

CONTENUTO
Sette raccolte originali: Boulder Dash 1, 2, 3, +1, Arno Dash 1, 2 e
Bonus Caves. Conservate 147 mappe: 140 grotte giocabili su cinque livelli
di difficoltà e sette mappe animate del menu. Tutte vengono caricate
all'avvio; durante il gioco non occorre ricaricare dal supporto.

GRAFICA R05: MENU ORIGINALE E CAMERA A UN PASSO
Ripristinate le 19 colonne originali del menu, il titolo centrale
ORIC BOULDER DASH, l'icona Rockford e gli oggetti animati. Nessuna
colonna eliminata, nessuna modifica alle sette mappe CaveZ originali.
Il menu conserva celle native12x16; il gioco mantiene la grafica16x16
approvata. Il menu usa carta nera comune e polarità normalizzata per
non far scontrare le celle12px con gli attributi Spectrum8x8.
Il riferimento Oric completo è alto224pixel, contro192 dello Spectrum:
i controlli occupano32pixel e la finestra mostra19x10celle. V alterna
le righe0..9 e2..11; tutte le12righe sono accessibili senza ridimensionare.
L'icona Rockford superiore è statica, gli oggetti della mappa si animano,
come distingue il codice originale. Il titolo resta al centro della scena.
M torna al selettore; I apre le istruzioni.
La figura iniziale è fissa: niente scorrimento automatico. Mostra le
righe8..183 dell'originale240x200 a dimensioni native; l'originale
integrale è negli asset. Istruzioni e selettore usano i font originali.

In gioco ogni casella occupa 16x16 pixel: i dodici pixel originali sono
centrati con due colonne aggiunte per lato. Solo muri e terreno
continuano la trama nei margini. Nessun ridimensionamento. Nei quattro
frame dei diamanti è invertita la polarità dei bit per conservare la
silhouette su carta nera ed eliminare il rettangolo lampeggiante.
Gli altri 51 frame mantengono identici i dodici pixel centrali.
La finestra 240x160 a (8,32) mostra 15x10 caselle della mappa 40x22.
Ogni casella possiede quattro attributi 8x8: Rockford ha parte superiore
gialla e inferiore verde, i diamanti bianco/ciano, l'ameba verde.
Il colore base varia usando il metadato cromatico della grotta; è un
miglioramento del port, poiché l'Oric usava normalmente un colore globale.
B/N conserva la scelta manuale anche nelle grotte successive.

Prima dello scroll lo schermo completo viene copiato in bank7 in tre
frame. Si visualizza quella copia mentre il motore aggiorna bank5; il
nuovo quadro compare solo quando è completo, al bordo dell'interrupt.
La camera segue nuovamente un passo alla volta alle soglie, secondo
la logica originale Oric, adattata alla finestra Spectrum15x10.
Rimossi i salti5x3 della R04. Non è uno scroll continuo al pixel.
Il renderer Z80 è stato ottimizzato: nel probe il ridisegno completo
passa da733557 a354469T-state, senza differenze di bitmap o attributi.
La copia protetta e il ridisegno costano ancora tempo: non si dichiara
la stessa velocità dell'Atmos. Movimento e regole per tick sono invariati.
Il gioco usa attributi 8x8, non vero 8x2. Il vero multicolore 8x2 NIRVANA+
resta nella schermata iniziale. Uscendo da questa compare una transizione
nera, evitando di mostrarla con attributi standard sbagliati.
Font originali 6x8 e 6x16, senza ridimensionamenti.

CARICAMENTO
Usare ZX Spectrum 128K, non la voce 48 BASIC che blocca il paging.
TAP: inserire il nastro e scegliere Tape Loader nel menu 128K.
MGT: interfaccia +D o DISCiPLE, disco 1, 128 BASIC, RUN.
OPD: Opus Discovery, disco 1, 128 BASIC, RUN; oppure LOAD*1;"run".
MDR: Interface 1, Microdrive 1, 128 BASIC, RUN; oppure LOAD*"m";1;"run".
MGT è un vero disco +D/DISCiPLE, non un'immagine SAM Coupé.
Il BASIC ha crediti centrati, si interrompe con CAPS SHIFT+SPACE
(BREAK) e rimane leggibile con LIST. Il TAP usa POKE 23739,111 per evitare che i nomi dei blocchi sporchino
la copertina. Una routine temporanea ripristina il canale video sia al
termine del caricamento sia in caso di errore/BREAK: LIST resta visibile.
Le immagini contengono già i file di avvio. Z80 è uno snapshot ausiliario della stessa build, per Fuse.

COMANDI
Q/A/O/P, 7/6/5/8 o Kempston: movimento.
SPACE/FIRE + direzione: scavare, prendere, spingere o usare una bomba
senza spostarsi, secondo le regole originali della grotta.
H: pausa/continua. R: suicidio quando si rimane bloccati.
Nel menu: sinistra/destra sceglie la grotta; su/giù la difficoltà;
B/N cambia colori; I apre le istruzioni; M cambia raccolta; V sposta il menu.
SPACE seleziona una raccolta e avvia la grotta scelta.

SUONO
Melodia originale a due voci e dieci effetti AY originali, con periodi
corretti per il clock Spectrum. L'Atmos ripristina realmente un timer
audio a 100 Hz dopo il caricamento: il driver avanza due tick originali
per interrupt Spectrum. Le note alternano 8/9 frame (media 0,17 s).
I toni più bassi del rotolamento e parte del rumore non sono riproducibili
alla stessa frequenza sul registro AY Spectrum: vengono limitati al
massimo periodo hardware. Gli effetti restano riconoscibili, ma non
si dichiara identità acustica assoluta.

PROVE E LIMITI
R06: tutte140grotte alle5difficoltà (700combinazioni) passano il controllo
automatico di inizializzazione, traccia deterministica, morte e riavvio:
48.321aggiornamenti confrontati con la logica6502 e poi con il binarioZ80
finale. Verificate100transizioni grotta/difficoltà,100uscite e100timeout in scenari
controllati, oltre a gameover/nuovogioco e pausa normale/bonus.
Questo verifica il motore; non equivale a risolvere tutte le grotte.
Report e script riproducibili in tests/release_r06/.
Le prove grafiche R05, con renderer invariato in R06, verificano55sprite
e sei casi di scroll:
bitmap, attributi e cache coincidono con il riferimento. Nel test dedicato
70raster Fuse mostrano solo il quadro precedente o quello nuovo, zero
frame parziali e nessun interrupt perso sui69osservati.
Tutti i sette menu ricontrollati con tasti SDL: intestazione invariata
prima/dopo V e titolo traslato32pixel con bitmap identica; M torna
al selettore. Prove in analysis/menu_r05_final_long.
Gli originali della splash coincidono
con Atmos prima della conversione cromatica, che approssima il colore
del 3,26% dei pixel per rispettare le coppie Spectrum.
Cave A completata nel vero emulatore Spectrum tramite tastiera:
passaggio a Cave B, 302 punti, tre vite, senza modificare la RAM.
I 324 stati del percorso coincidono con il codice 6502 originale.
TAP, MGT, OPD e MDR vengono collaudati dal rispettivo supporto in Fuse;
i risultati e gli hash della build esatta sono in verification/media_r06.
Il test TAP della R03, il cui loader è invariato, confronta i 6912 byte di SCREEN$ dopo il caricamento dei
banchi, prima di ridisegnare la copertina: nessuna differenza. Verificati
anche BREAK durante LOAD e LIST sul ROM 128K.
Il video è una cattura nativa 256x192 del raster SDL di Fuse al 100%,
con audio emulato, avvio da snapshot e ingressi da tastiera.
50 Hz descrive raster/audio, non gli aggiornamenti della logica.
R06: a schermata ferma il ritmo è11,765tick/s (alternanza4,4,4,5frame).
Misura nuova su Oricutron Atmos originale, senza movimento della camera:
203intervalli dopo la comparsa di Rockford,84.944cicli6502 medi,
11,772tick/s. R05 era12,5tick/s: circa6% troppo veloce. AY invariato.
Non viene aggiunta un'attesa se il ridisegno ha già superato tale durata.
Il ritmo Oric può variare con la grotta; questa taratura usa CaveA.
Corretto inoltre il wrap255->0 del contatore di crescita dell'ameba:
il confronto ora rilegge il byte, evitando una differenza del compilatore
sccz80 rispetto al6502 originale. Era osservabile in ArnoDash1, grottaM.
Nella route di Cave A R05 misurava8,096tick/s, escludendo il caricamento
della grotta successiva. Lo scroll mantiene il suo costo di ridisegno.
La grafica è protetta durante il ridisegno, ma restano pause di scroll.
Non sono state giocate a mano fino alla fine tutte le 140 grotte,
né è stato effettuato un collaudo su hardware fisico.

VERSIONE E FONTI
Nel sorgente fornito "1.1" identifica la ROM Atmos. Non è stata trovata
una release upstream del gioco numerata 1.1; R06 identifica questa revisione del port.
Originale: raspberrypioneer, Copyright 2025, licenza MIT inclusa.
https://github.com/raspberrypioneer/Oric-BoulderDash
La copertina di caricamento è la schermata Spectrum classica 256×192,
prelevata senza ridimensionamento da:
https://zxinfo.dk/media/zxscreens/0000639/BoulderDash-load.png
È distinta dalla figura iniziale Oric mostrata dentro il gioco.

Powered by NIRVANA+, developed by Einar Saukas.
ZX0 by Einar Saukas; z88dk runtime. Avvisi originali in licenses/.

RICOMPILAZIONE
Estrarre l'intero progetto mantenendo boulderdash128/ accanto a
source/Oric-BoulderDash-main/. Installare z88dk, Python3 e Pillow.
Da boulderdash128: Z88DK_ROOT=/percorso/z88dk bash build.sh
Se zcc e z88dk-zx0 sono già nel PATH e ZCCCFG è corretto, basta
bash build.sh. I quattro supporti vengono ricostruiti in build/.
Gli asset originali estratti sono già inclusi; tools/graphics.py
permette di rigenerarli. Il progetto Ghidra e gli export sono in
analysis/ghidra/. I test avanzati richiedono anche py65/SkoolKit e
i percorsi degli strumenti indicati nei singoli script/report.
