Just last night with a half hour to go before the new decade, I finished soldering the last board for my game console. (With the caveat that this is the non-compactized proof of concept version)
I haven't done much on the software side yet, other than a sound test program that plays "Solfeggietto" by C.P.E. Bach on the first square wave channel.
The specs are:
- 128x100 256-color graphics over composite video (NTSC)
- Sound generator with 2 programmable square waves, a programmable LFSR noise channel, and a PCM sample looper
- Two controller input ports compatible with Sega Genesis controllers, (possibly also with Atari/C64 controllers but I hadn't thought too hard about those)
- DMA controller for copying rectangular sections of dedicated Graphics RAM (assets) into Video RAM (framebuffer)
- Currently has a 3.5MHz oscillator installed as main clock. Might push this higher, but with the DMA I might not need to.
- Cartridge port exposes IRQ, Reset, and Clock; connections to the audio output lines; as well as an I2C port driven by the 65C22 VIA
Apart from the WDC 65C02, VIA, memory, and analog chips, the ICs are 74HC series. (Except for the one 74LS07 used as an open collector IRQ driver). Anywhere that the schematic says otherwise is because I'm too lazy to re-label the parts in the EagleCAD libraries.
Some more info:
- The "256 colors" spec comes from having 8bpp, mapping 3 bits to luma and hue with 2 bits for saturation. Because hue (shouldn't) matter when saturation is zero, I've set it up to use the hue bits as extra luma bits when the sat bits are zero. Still have to test this part, as expanding the resistor ladder DAC on my breadboard seemed too daunting. (Though now that I look at it again, maybe I should've just used the 7524 DAC chip I used on the soundcard. So this is what they meant by "Hindsight is 2020")
- The soundcard has a 4 kilobyte dual-ported SRAM for its wavetable. Programmable counters march through the address space, and the data output is connected to the input of a DAC. The counters get reloaded whenever the RAM outputs a 0xFF byte, or when the register holding the start address gets written.
- Not shown in the photos is that this prototype actually requires connecting the select pins on the expansion cards to headers on the address decoder with jumper wires. Convenient-ish for prototyping because it makes the system more modular, but it's also kind of ugly and I wish a little bit that I just included these select pins on the backplane headers.
- The cartridge loaded in the picture is a hastily-cobbled ZIF socket adapter.
I've been working on/towards this for about a year and a half now, on-and-off. My background is in software engineering and gamedev so I've been learning as I go. My previous electronics experience mostly consisted of premade Arduino and Raspberry Pi modules. I had played a couple of games centered around hardware design and assembly programming, and when I came across a pinout for the 6502 I thought "wow this looks like it'd be fun to interface with". So I of course did the logical next steps: Buy a 6502 on eBay, stick it in my desk drawer, work on peripheral devices for a year, order a 65C02 when I find out it's easier to use, and finally design a motherboard after designing every possible other piece; only running the first test programs onto it a couple of weeks ago.
I'm looking forward to writing up some routines for controlling the I/O hardware in the next few weeks, then finally putting some games together on this thing. Eventually I hope to make a more compact version with SMD components that fits into a neat little enclosure that evokes a console of the 8-bit era; and share the designs as open-source including some nice programming documentation.
Thanks for checking out my post! Would love to hear what folks around here think of what I've got so far. Critiques, suggestions, general feedback all welcomed. Reading these boards and the primer have been exceedingly helpful on this journey.