[zxspectrum] Nuovo progetto ZX Spectrum 48K in VHDL

  • From: Alessandro Dorigatti <adorigatti@xxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Thu, 10 Feb 2011 22:42:45 +0100

Ciao a tutti,
questo è il mio primo post nella mailing list; desidero salutare tutti e
dire che, in quanto amante del retro-computing, è bello vedere che
esistono altri che, come me, hanno nostalgia dei tempi in cui gli ZX
Spectrum impazzavano.

Arrivo al punto. Tempo fa sono capitato nel sito di Chris Smith che
descrive la realizzazione del clone Harlequin e sono rimasto affascinato
dal progetto (anche per lo stile "pionieristico" con cui viene
descritto). In quel periodo avevo appena acquistato una scheda C-One con
il desiderio di addentrarmi nel mondo degli FPGA e, reduce da una prima
implementazione di Pong in VHDL, mi sono detto: perchè non cercare di
implementare Harlequin in VHDL?

Il percorso è stato ovviamente lungo, anche perchè personalmente non
sono certo un professionista, ma un autodidatta in termini di VHDL e
FPGA; tuttavia alla fine sono arrivato ad avere un primo core
funzionante! Poco dopo questo "successo" Chris ha pubblicato il suo
libro sull'ULA (che penso sarà noto ormai a tutti) e quindi mi sono
messo a studiarlo arrivando alla fine a modificare il mio core originale
per implementare (per quanto possibile ovviamente) la logica reale
descritta nel libro.

Stato ad oggi: ho codice "funzionante" (dopo giustificherò le
virgolette) che simula lo Spectrum 48K in modo egregio cercando di
riprodurre anche floating bus e contese in modo fedele. I sorgenti per
ora non sono pubblici, anche se ho intenzione di condividerli appena
risultino maturi per far crescere e migliorare il progetto con l'aiuto
di altri appassionati.

Veniamo a dettagli più tecnici, tenendo presente che il fatto che io
stia facendo girare questo core su un C-One non è vincolante al porting
su altre piattaforme.

Il core gira all'interno di un Cyclone III dell'Altera.

CLOCK: generato da uno dei PLL all'interno dell'FPGA; i vari blocchi
funzionali utilizzano un clock a 56MHz (multiplo dei 14MHz dell'ULA
originale)
CPU: lo Z80 è emulato dal core T80 disponibile su OpenCores
ULA: scritta da zero
RAM16K: blocco di memoria all'interno dell'FPGA
RAM32K: blocco di memoria all'interno dell'FPGA
OUTPUT VIDEO su VGA (mediante uno scandoubler che genera il segnale
video con refresh 50Hz, pixel-clock 28MHz e effetto "scanline").

A questi elementi si aggiunge la logica di gestione dei bus della
memoria e processore.

Infine ho realizzato un semplice blocco di emulazione di Tape che,
utilizzando SDRAM esterna, permette di leggere file in formato
"TAP" (non TZX).

In questo primo post non vorrei dilungarmi troppo sui dettagli che, se
interessati, potremo discutere a fondo successivamente; vorrei invece
condividere i risultati pratici (e quindi spiegare le virgolette sul
"funzionante" di cui sopra).

In pratica gran parte del software funziona bene: per quel che riguarda
i giochi, ho provato Manic Miner, Dynamite Dan, Jet Pac, Dark Star, Aqua
Plane, Maziacs, Vectron; Aqua Plane evidenzia un lieve problema di
"flickering" sul bordo sinistro dell'orizzonte.

Per quel che riguarda le demo, Shock Megademo funziona completamente,
NMI2 pure, Overscan è perfetto.

Arriviamo alle note dolenti: i programmi di test.

FloatSpy di RAMSOFT: riconosce la ULA 48K e il floating bus risulta
fornire la sequenza corretta ma a partire dal T-State 14346 invece che
dal 14347.

I test che seguono sono quelli che ho trovato a questo indirizzo:
http://wizard.ae.krakow.pl/~jb/qaop/tests.html

Fusetest: Frame Lenght OK, Machine type: 48K, Contention offset: no
sync, BIT n, (IX+d): failed, DAA: passed, LDIR: skipped e quindi il test
si blocca con un'ultima riga che riporta: Contended IN55.

BTime: in pratica questo test cambia il colore del bordo ad un
determinato T-State; il risultato è che con il T-State preimpostato
(14112+224) si ha una righetta che flickera a 50Hz subito sopra il primo
carattere in alto a sinistra dello schermo. Questo è interessante, in
quanto, spulciando la lista ho trovato un post in cui si evidenziava un
comportamento simile con lo ZX Badaloc; non ho visto però un post che
spiegasse se poi il problema è stato risolto. Tra l'altro questo è un
comportamento che si nota (come detto sopra) anche sull'orizzonte di
Aqua Plane. Se imposto come T-State 14111+224, la righetta appare
stabile e di lunghezza 3 caratteri; se imposto di nuovo il T-State 14112
+224 in alcuni casi la righetta rimane stabile, in altri torna a
flickerare.

STime: anche qui un problema analogo a quello evidenziato in BTime: la
righetta (in questo caso di 1 carattere e all'interno dell'area video,
non più sul bordo) con il preset è invisibile, diminuendo
progressivamente il numero del T-State si arriva al 14331 nel quale essa
è visibile in modo stabile.

ULATest3: si carica, parte e si pianta subito dopo aver stampato la
stringa "14329".

Penso di aver preso già troppo spazio. Passo quindi alle domande
fatidiche:

1) C'è nessuno che sia interessato al progetto?
2) I sintomi sopra riportati cosa evidenziano?
3) Che altri test posso condurre per cercare di diagnosticare la/le
causa/e dei malfunzionamenti?

A presto e grazie per aver avuto la pazienza di leggere sino a qui!

Alessandro




Other related posts: