Updated: Feb 11
Over the past five months, I have built a few 6502 computers, starting with Ben Eater's 6502 kit. See My 6502+... a little background. Along the way, I have been incrementally adding functionality to my 6502 systems. Most recently, I added a Field-Programmable Gate Array (FPGA)-based Video Graphics Array (VGA) circuit and have started developing a basic game.
In this post, I'll walk through the current state of my 6502 system.
I hope this is of some value to those of you building 6502-based systems, or minimally, of some entertainment value. :) I have thoroughly enjoyed working on this project over the months!
First off, this has been a tremendous learning experience. In the past five months, I have been able to learn about:
Transistor–Transistor Logic (TTL)
Complementary-symmetry Metal–Oxide–Semiconductor (CMOS)
Electronic circuit design
Printed Circuit Board (PCB) design
6502 assembly programming
Serial Peripheral Interface (SPI)
Programmable Sound Generators (PSGs)
VHSIC (Very High-Speed Integrated Circuits) Hardware Description Language (VHDL)
Core 6502 PCB
W65C02 8-bit microprocessor (started with Ben Eater's 6502 design) running at 5 MHz. 5-volt system.
32k word x 8 bit SRAM.
32k word x 8 bit ROM.
VGA with 100x64 resolution (based on Ben Eeater's World's Worst Video Card). Currently disabled.
W65C22 Versatile Interface Adapter (VIA), quantity 5.
Power distribution circuit
Improved reset circuit
Four AY-3-8910 programmable sound generators, each supporting three audio channels (total of 6x2 stereo output).
16k word x 8 bit ROM.
Joystick port. Can support two joysticks, currently using a single joystick. Alternatively, can support a secondary ROM.
Sound level display to left and right channels (i.e., bar graphs).
Integrated analog amplifier.
2 MHz clock.
SPI expansion card
8+ SPI ports for easy expansion to SPI devices.
External (from VIA) shift registers.
Three onboard Arduino Nanos for additional expansion. Currently unused.
Implemented on an Arduino Mega 2560 with a USB host shield.
The Arduino is connected to the 6502 core through a VIA.
High-speed 6502-to-PC bi-directional bridge
Arduino Due using Native port for Due-to-PC communication, running at full USB speed.
SPI through SPI expansion card for 6502-to-Due communication.
Dual OLED displays to display communication status.
5 V to 3.3 V level shifter (Due runs at 3.3 V).
Arduino Mega 2560 expansion
Additional Arduino available for expansion. Currently unused.
FPGA VGA smart display
Currently running 800x600 at 60 Hz. Capable of 1920x1080 at 60 Hz (possibly higher).
VGA circuit implemented in VHDL.
Leverages a Digilent Arty A7-100T FPGA.
Running soft microprocessor core for smart display management (e.g., sprite management and drawing commands).
5 V to 3.3 V level shifters (FPGA runs at 3.3 V).
6502 assembly and data on 6502 core ROM.
Data on sound card ROM.
C code for mouse support - on Arduino Mega 2560.
C code for 6502-to-PC bridge - on Arduino Due.
VHDL on FPGA.
C code for soft microprocessor on FPGA.
C# for supporting utilities listed above.
Here's a video walkthrough of the current high-level design.
Along the way, I developed a few supporting utilities that sped up the development process of the overall 6502 system.
In my solution, I chose to build the fonts from the ground up, both in early 6502 assembly and later in FPGA C. This simple utility allows quick drawing of font characters and then creates assembly or C code to represent the drawn font.
The AY-3-8910 PSGs offer many configuration options that affect the sound output. This utility allows easy manipulation and live testing of the PSG configuration options through runtime communication to the 6502 system through the high-speed 6502-to-PC bi-directional bridge. The utility also supports creating sequences and capture MIDI data from a USB MIDI keyboard, converting the data to sequences that can be played on the PSGs.
This simple utility extracts ARGB data from images and formats the data into raw ROM data or C array format.
If you're interested in additional details, below are some links to previous, related posts.
Source Designs and Code
I have posted the current sources for this project on my GitHub. Much of this can be significantly improved, and while it may not always be the most elegant solution, I hope it can be helpful.
Source Application / Format
6502 Core PCB EasyEDA 6.4.x
Power distribution PCB EasyEDA 6.4.x
Sound card PCB EasyEDA 6.4.x
SPI PCB EasyEDA 6.4.x
FPGA VHDL Xilinx Vivado 2021.2
6502 Core Assembly ASM text
USB Mouse Arduino C text
6502-to-PC bridge Arduino C text
FPGA soft microprocessor MicroBlaze C Xilinx Vitis 2021.2
Font builder (Winforms C#) Visual Studio 2022
Sound editor (Winforms C#) Visual Studio 2022
Sprite importer (Winforms C#) Visual Studio 2022
Questions or Suggestions?
If you have questions or suggestions, please drop me a note. Thanks!
My Next Project
I have ordered initial parts to (attempt to) build a W65C816S-based system (breadboard). This seems like a natural extension to what I have been learning on the 8-bit W65C02.
The WDC W65C816S is a fully static CMOS 16-bit microprocessor featuring software compatibility with the 8-bit NMOS and CMOS 6500-series predecessors. The W65C816S extends addressing to a full 16 megabytes. --WDC
On order: W65C816S8P-14 microprocessor, AS7C1024B-15TJC SRAM (and a DIP breakout board), and SST39SF040-70-4C-PHE flash memory.