The goal of this project was to program a flash chip with code to run on my Z80 computer. Due to problems with both the computer and the programmer, I only ran a small (7 bytes) I/O test.
The programmer is based around an ATmega328P microcontroller, which is programmed in assembly. The microcontroller shifts the address into 74164s, and then reads and writes the data in parallel.
In an age where Arduino is the most popular development board/IDE for AVR programming, assembly seems like a very strange choice; in fact, if I redid this project, I would probably use C instead. The reason I used assembly was because it was much faster than C when I tested it. I performed one test, using both Arduino and assembly, which counted from zero to 2^24 - 1 and shifted out the result. I do not remember the exact time it took to run each program, but it was somewhere around 44 minutes for the Arduino version and 4 minutes for the assembly version. The control over timing that assembly provided turned out to be another benefit. The code ran so quickly that it was necessary to insert nops while the flash chip performed a lengthy operation. I now realize that I could have used SPI to control the shift registers, which may have let me use C without worrying about timing.
I only used this device once, mainly because the size of the file would have to be limited to 2 KiB and manually entered into the program. I would like to make a new version in the future that eliminates these problems by streaming the data from the host PC to a buffer that would then be programmed into the flash chip.
Files:
Flash Programmer Schematic (pdf)