The photo above shows two in-circuit flash device programmers that I developed for a company to distribute with their line of single-board computers.
The units on the left are a universal programmer, which can connect to either a serial or parallel port of a PC, and prvides a rich command set to perform in-circuit programming and verification operations (no software is necessary other than the ability to send the commands and transfer the content of code files to the device.)
The units on the right are a "keyfob" programmer - Only about a cubix inch in volume, this device can store and program up to 64K bytes of code into an embedded system. Once loaded from a PC (using the programmer on the left), the programmer operates independendly - no PC or cables required. Simply plug it into the programming port on the target system, press the button, and wait for the tri-color LED to flash green for success, or an error code in red.
Both programmers were very well received due to their low cost, high programming speed and reliability.
There have been other device programmer projects which I've done in a bit more of a hurry. This photo shows two such devices. The one in the forground is a "quick and dirty" flash device programmer I built for a client in an afternoon when the commercial programmer he had purchased failed - with no time to wait for another one to be delivered, this little board (and some PC software to go with it) allowed us to complete the design on time. At the rear is a small adapter I built under similar circumstances to enable the programming of an 8751 type single-chip microcontroller with my clients standard EPROM programmer.
In times past, I used to build almost all of my own test equipment and technical tools. Most of them are long gone now, replaced by shiny commercial offerings. One item which remains and which I still use from time to time is this EPROM programmer I built around 1986.
It is based on a 6809 processor, has 32k RAM for storing the EPROM image, and 4K for it's own purposes. A 6821 PIO chip handles the bidirectional data bus, and TTL latches drive the remaining control signals. It uses RELAYS to switch the programming voltage around as required, and the actual voltage used is set by a manual switch. Firmware consists of a local keypad/7-segment interface, as well as a remote serial/RS-232 command interface. It supports standard and fast programming algorithms for a number of common EPROMS from the time period, and can upload and download common ASCII-HEX file formats.