Salve a tutti. Dopo un breve periodo di assenza sono tornato con novità interessantissime! Sono lieto di presentarvi l’LM80C Color Computer 64K. Questa è la versione 2 del mio computer auto-costruito assemblato intorno alla CPU Zilog Z80. Ci sono un sacco di cambiamenti rispetto alla versione 1 dell’hardware, il più importante dei quali riguarda la RAM di sistema, salita a 64 KB.
Dato che lo Z80 può indirizzare 64 KB di memoria, per poter indirizzare i 32 KB di ROM ed i 64 KB di RAM ho dovuto usare un trucco. Gli altri computer del passato, come ad esempio il C64, avevano 64 KB di RAM ma per far sì che il computer fosse facilmente utilizzabile gli sviluppatori adottarono dei meccanismi di “bank switching”, di scambio dei banchi di memoria, per disattivare la ROM o la RAM oppure per passare dall’una all’altra in determinate condizioni: sul C64, se l’utente cercava di scrivere nell’area di memoria usata dal computer, il sistema operativo disabilitava la ROM, scriveva nella RAM sottostante, e poi riattivava la ROM. Ho deciso di risolvere il problema usando un approccio differente: invece di saltare tra RAM e ROM a seconda delle situazioni, ho semplicemente copiato l’intero contenuto della ROM nella RAM.
Quando l’utente accende la macchina, viene eseguito il solito test per verificare se si tratta di un avvio “a freddo” o “a caldo”. Nel caso di una avvio a freddo, il bootloader copia il firmware dal primo banco di 32 KB di memoria (occupato all’avvio da un chip ROM) nel secondo banco (occupato da un chip RAM) a partire dall’indirizzo $8000. Poi, salta alla RAM continuando ad eseguire il codice di scambio, che disabilita il banco di ROM ed abilita un altro banco di RAM. Adesso copia nuovamente l’intero firmware nel primo banco (a partire da $0000) e poi riprende dal codice di avvio originario. Il cambio di banchi è effettuato usando una linea del PIO, con una semplice istruzione OUT. Voglio anche deludere quelli che pensano che l’operazione è troppo lenta: usando l’istruzione LDIR dello Z80 il doppio trasferimento (da ROM a RAM, e poi da RAM a ROM) prende solo 0,2 secondi!
In questo modo, l’interprete BASIC può accedere all’intera memoria lasciata libera (circa 44 KB). Se l’utente ha bisogno dell’intero quantitativo di memoria RAM (64 KB) per le sue necessità, non deve fare altro che scrivere un piccolo caricatore in una qualsiasi porzione della RAM e sovrascrivere semplicemente il firmware originale.
Questo non è però l’unica modifica. Adesso il VD beneficia di 2 banchi di VRAM da 16 KB per memorizzare 2 diversi buffer video. Il trucco è lo stesso usato per la scambio della ROM/RAM di sistema: usare una linea del PIO collegata ad un piedino degli indirizzi del chip di VRAM. Inoltre e c’è inoltre uno switch sulla seriale per isolare la porta seriale nel caso in cui il computer non abbia ancora aperto la linea seriale. Infine, ho aggiunto uno switch 4066 per isolare i pin del SIO quando la linea seriale non è usata, non è stata ancora aperta, oppure è disattivata nel caso di eventi speciali (ad esempio un buffer overun).
Ecco l’elenco completo delle caratteristiche del nuovo hardware:
- CPU: Zilog Z80@3.68 MHz
- Memoria principale::
- 32 KB di ROM con l’interprete LM80C BASIC (una versione estesa del Microsoft BASIC 4.7) con speciali istruzioni per gestire la grafica ed il suono
- 64 KB di RAM, di cui circa 44 KB disponibili sotto BASIC
- Grafica:
- chip video VDP TMS9918A
- 32 KB VRAM (2 banchi da 16 KB)
- risoluzione di 256×192 pixel a15 colori
- 32 sprite (monocromatici)
- Audio:
- chip PSG YM2149F (or AY-3-8910)
- 3 canali analogici
- 8 ottave
- 2 porte ad 8 bit (usate per leggere la tastiera esterna)
- I/O:
- Z80 SIO (2 porte seriali con bps programmabili via software)
- Z80 PIO (2 porte parallele ad 8 bit – di cui una è usata per gestire le periferiche di sistema)
- Z80 CTC (timer/contatore, usato per fornire il clock seriale e per gestire il meccanismo di tick di sistema)
Ecco un piccolo video del nuovo sistema:
Il codice e gli schemi saranno disponibili a breve sul mio repo Github.