Skylie33 wrote:
However, I do not want user programs to be loaded into RAM, because since they can vary by size, that means you'd have to carefully split up how much your program takes up and how much RAM it uses. I would prefer to "stream it" from the SD card, so to speak.
Program size doesn't matter as long as the code will fit into one bank. In the 6502 universe, a 64KB program is a monstrosity and virtually unheard-of. The largest single 6502 assembly language program I ever wrote was about 27KB of machine code—it was part of a modularized business application that
en toto was around a meg of programs, all in assembly language.
If your application is something with many aspects to it (games are an example of that sort of software), it should built as a set of loadable modules, with some sort of "executive" as a common return point when a new function has to be loaded. With a reasonable hardware design, you can have megabytes of RAM (Garth makes a 4MB plug-in SRAM module that would be a good choice) and therefore a lot of space in which to execute code and store run-time data. You could place your "executive" in one bank, along with a data table that keeps track of which banks are assigned to modules, and of course, the modules' names. Data can go anywhere programs are not executing, as unlike programs, data fields can span banks.
As for streaming from an SD card, I have a suspicion you wouldn't be impressed with the performance. As soon as I/O gets involved things will slow down. Better to load an entire module into core in one operation and only touch mass storage when absolutely necessary. That's how it is done in professionally-developed operating environments.
As for cost, one CPLD can do the work of 10 GALs, and cost less in the process. If you are truly desiring to build this system you need to consider a CPLD or FPGA as glue logic. In any case, I think you need to learn a bit more about how this all works before you start making too many design choices.