Alcuni potrebbero ricordare ROMBA, una scheda che ho rilasciato quasi 10 anni fa: era una Rombox con alcune funzionalità DMA limitate. Con il passare del tempo è arrivato il COVID, il CPLD utilizzato da quella scheda è passato da meno di 2 € al pezzo a più di 10 € al pezzo, e le pochissime persone interessate al progetto hanno perso interesse.
Dato che a quanto pare i prezzi dei CPLD con un gran numero di I/O non torneranno mai a quelli di una volta, qualche tempo fa ho iniziato a pensare a un nuovo design incentrato, ancora una volta, sull’economicità di realizzazione, aggiungendo al contempo qualche caratteristica in più. Vi presento ROMBA π (o ROMBA 3.14):
Il design è basato su RP2350B, un microcontrollore «pi-pico2» al posto di un CPLD. Questi microcontrollori sono economici, hanno un sacco di pin con tolleranza a 5V e supportano fino a 16 MiB di economica memoria flash QSPI. La scheda si collega alla porta di espansione e, come accadeva con la mia vecchia ROMBA, può essere collegata direttamente tramite un connettore edge, oppure attraverso una scheda MX4 tramite un connettore DIL.
L’uso di una MCU al posto di un CPLD/FPGA per l’interfaccia con il bus parallelo, combinato con l’uso di memoria flash QSPI anziché NOR parallela, ha reso il funzionamento come Rombox una bella sfida a causa delle latenze introdotte dal polling del bus e dalla lettura dal chip QSPI, ma eccola qui!
Le funzionalità attualmente implementate sono:
- Fino a 16 MiB (128 megabit) di capacità Flash ROM. La maggior parte è utilizzabile come memoria ROM per il CPC, a eccezione della quantità riservata al firmware (che attualmente è di circa 48 KiB, ma dovrebbe crescere man mano che verranno aggiunte nuove funzionalità).
- Porta USB host. Al momento è implementato il supporto per il mouse, ma si potrebbero aggiungere altre periferiche USB.
- Il supporto per il mouse include lo scaling frazionario configurabile (per regolare la sensibilità dal lato CPC), con impostazioni indipendenti per gli assi X, Y e la rotella.
- Compatibile con le Rombox per Amstrad CPC (fino a 256 slot).
- DMA hardware utilizzabile per copiare dati dalla ROM alla RAM interna (1 byte per microsecondo).
- Il motore DMA può copiare in modalità lineare e in modalità 2D, permettendo di copiare tile nella memoria video senza doversi preoccupare delle stranezze del CRTC e del GA.
- Il motore DMA in modalità 2D supporta anche il mirroring dei tile al volo per le 3 modalità grafiche.
Il supporto per le funzionalità sopra descritte è stabile, ma non considererei il firmware completo dal punto di vista delle funzionalità allo stato attuale (ci tornerò sopra tra poco). L’hardware permette di aggiungere il supporto anche per:
- Pixel shifting per i tile.
- Mascheramento dei pixel per i tile (attualmente implementato ma solo a livello di byte).
- Supporto per Lower ROM.
- Memory mapping più complesso.
- Espansione di RAM (l’MCU dispone di 512 KiB di RAM, e la quantità non utilizzata dal firmware potrebbe essere usata come RAM per il CPC).
- Funzionalità audio (capacità FM, riproduzione di campioni PCM).
- Salvataggio dati su Flash.
- Generatore programmabile di NMI.
- Supporto DMA da RAM interna del CPC a RAM interna del CPC (attualmente è supportato solo da ROM a RAM).
Qui potete vedere il supporto per il mouse in azione:
SyX ha patchato diversi giochi per supportare il mouse e dovrei fare un video anche di alcuni di questi
. Mi ha anche aiutato moltissimo a comprendere la struttura della memoria video, passandomi snippet di codice e programmi di test.
E qui potete vedere le funzionalità del DMA 2D all’opera:
Quello sprite è di 32x64 pixel (modo 0) e il DMA impiega circa 1 ms a disegnarlo (disegna due pixel del modo 0 per microsecondo). Il motore DMA 2D esegue anche il mirroring hardware al volo e gestisce clipping dello schermo e mascheramento (ma nella versione attuale tutto solo con granularità a livello di byte, quindi due pixel in modo 0).
Sia l’hardware che il firmware sono rilasciati come Open Source. Al momento manca la documentazione su come programmarli, ma ho intenzione di aggiungerla in seguito.
Ora, riguardo all’attuale stato «incompleto» del firmware: volevo aggiungere la maggior parte (se non tutte) le funzionalità elencate sopra che non sono ancora state implementate. Sembra però che una buona fetta (forse la maggioranza?) della community CPC si interessi solo ai traguardi software e consideri queste espansioni hardware come «anti-feature», del tipo «questo non è più un CPC» e cose simili. Quindi, invece di investire ulteriori sforzi in questo progetto, sto mettendo in pausa lo sviluppo finché non vedrò un reale interesse per la scheda. Intendo qualcuno realmente interessato a sviluppare per questa piattaforma sfruttando queste caratteristiche. Se deve essere il mio secondo progetto per CPC destinato a finire inutilizzato, preferisco dedicare il mio tempo ad altri progetti hardware che possano tornare utili ad altri sviluppatori.
Quindi, voi cosa ne pensate? Trovate interessante un progetto simile? C’è qualcuno interessato a sviluppare per queste schede così economiche e capaci? Oppure aggiungere qualsiasi cosa che non sia solo memoria è barare e l’idea andrebbe sepolta?

