Dopo un breve periodo di assenza ho rimesso le mani sul mio LM80C. Ho collegato lo Yamaha YM2149F (quanto segue è valido anche per il GI AY-3-8910), il chip audio (“programmable sound generator”, PSG), che ho comprato tempo fa ed ho poi collegato l’uscita audio all’ingresso RCA mono del mio TV, ottenendo i primi vagiti dal mio computer auto-costruito.
Nel video qui sotto potete sentire che c’è un audio complesso. Infatti, in questo primo test ho attivato tutti e 3 i canali analogici: il canale A sta riproducendo un tono fisso; il canale B sta riproducendo una nota fissa miscelata con del rumore bianco; il canale C sta riproducendo un tono usando una modalità di inviluppo (dente di sega). Per ottenere il suono ho semplicemente connesso l’input audio mono della porta RCA del mio televisore.
Per ottenere questo risultato ho dovuto aggiungere un altro decoder di indirizzi al mio circuito, dato che in origine l’AY-3-8910 di General Instrument (ma anche il clone YM2149F di Yamaha, ovviamente) era stato sviluppato per lavorare in congiunzione con il vecchio microprocessore CP1600 sempre di GI, che usava 3 linee per impostare le modalità operative del PSG. Dato che le impostazioni del PSG erano ridondanti (ci sono diverse impostazioni che ottengono lo stesso effetto), fu lo stesso produttore a suggerire di fissare ad un livello alto una delle linee di settaggio ed usare solo le altre due. Grazie a questa soluzione possiamo usare 3 segnali soltanto: uno per la selezione del chip, uno per scegliere fra le modalità registro e dato, e l’ultima per scegliere fra le operazioni di lettura/scrittura sul PSG.
Il PSG è un processore sonoro basato su registri: questo significa che la CPU deve solo spedire i dati al PSG, che memorizza queste informazioni nei suoi registri e le usa successivamente per generare i suoni, così che la CPU non deve prendere più parte nel processo una volta che il PSG inizia il suo lavoro. Ho però scoperto un problema riguardante il modo in cui si devono scegliere i registri: nel datasheet i registri vanno da 0 a 7 e poi da 10 a 17 ma in realtà essi vanno da 0 a 15. Non ho indagato molto sul perché per scegliere il registro 10 devo spedire il valore 8, e così via.** Nel video potete vedere il listato del programma che ho usato per generare i suoni che sentite. Come si nota, ci sono un sacco di OUT: mandando un valore sulla porta 64 si seleziona la modalità di scrittura nel registro identificato dal valore passato, seguito da un valore spedito alla porta 65 per impostare il valore da scrivere in quel registro.
Una volta che sono riuscito ad ottenere dei suoni dal PSG ho aggiunto un paio di istruzioni al NASCOM BASIC per leggere/scrivere dai registri del PSG. Il firmware in versione R2.0 adesso contiene il comando SREG (da “Sound REGister”) e la funzione SSTAT (da “Sound STATus”). Il primo è usato per scrivere un byte in uno specifico registro mentre il secondo è usato per leggere da uno dei registri.
Il nuovo firmware e gli schemi aggiornati sono disponibili sul mio repository Github.
**AGGIORNAMENTO: ho capito il mistero. Sul datasheet il produttore indicava i registri con il sistema di numerazione OTTALE senza però né indicarlo esplicitamente né usando il prefisso che in informatica introduce i numeri ottali, ossia lo “0” (zero). Ad esempio se scriviamo 7 questo è sempre sette sia in ottale che in decimale. Se però scriviamo 10 siamo portati a pensare in decimale e leggerlo come dieci. Se vogliamo rappresentarli in ottale dobbiamo anteporre uno zero, per cui dobbiamo scrivere 010. Sul datasheet invece ciò non è stato fatto! Scrivevano 10 ma intendevano 010, ossia 8 in decimale! E così via. Ci ho perso alcuni giorni, prima di capire questa cosa…
Years ago I picked up about a dozen AY-3-8910 chips from a Radio Shack clearance sale. So I guess I’d use two of them for stereo output, or 6 voices. I also have a 74ALS series memory mapper chip that can extend the address bus of the Z80. I have a ton of 32×8 and 128×8 100ns sram chips, as well as 32kx8 eprom chips (and some eeprom and FRAM chips in SMT). So I quite a few options. I have some Z80H CPU chips (6mhz) that I can use, but these will need some wait states for the sound chips and the TMS9918A.
I was pondering what kind of ‘ancient’ computer to build, perhaps a WDC65C816 based system or a Digital Tiny 11 (I have a DEC T11 CPU chip I got as a sample years ago, along with a DLART). The Tiny-PDP-11 would require a lot of software work, I don’t think I could port RT-11 to it, even if I could find the source code.
The Z80 probably makes the most sense, because of the huge amount of available software.
I discarded the 65xx family of CPUs for their lack of internal registers (just 1 accumulator and 2 index registers, no general-purpose registers nor 16 bit registers) and limitations of the stack pointer (8 bit). And for the absence of 16 registers.
I personally recommend the Z80 for there reasons.
BTW, everything is related to one question: what do you want to build? I wanted to replicate a common 8-bit machine with graphics and sound capabilities so the mix Z80/TMS9918A/AY-3-8910 would fit perfectly to me.