Back in the days when lots of cartridges hadn't been converted to ROM image files, making a cartridge dumper was rather useful.
My first attempt was a DIP header plugged into an EPROM reader, hooked up to a few inches of ribbon cable, and wired to the appropriate pins of a salvaged Atari 2600 cartridge slot connector. This of course had many limitations, the main one being lack of support for bankswitched games, and the second one being lack of portability.
My second attempt was a 2600 cartridge slot connector hooked up to the ROM socket of a TRS-80 Color Computer disk cartridge. I wrote a DLOAD server for my Powerbook, which could load a cartridge dumper program written in BASIC. Because DLOAD used the serial port in a different way than printer output from BASIC did, I had to make a dual-headed serial cable. This dumper was quite a workhorse, and I even dumped River Patrol with it. But it still had one flaw: It couldn't dump Atari 7800 games.
So on to the third try. Since the 7800 contains a ROM with lots of extra space in it, and already has the needed cartridge slot, the obvious choice was to turn the 7800 into a cartridge dumper. At this point, two problems remained: how to detect unmapped memory addresses, and how to get the output to a computer.
The unmapped memory address problem turned out to be easier than I thought. I started with my 7800 EPROM modification, and only had to add one resistor block (image) (10K ohms was handy at the time) to pins 26 to 33 of the CPU, making a pull-up to +5 volts. This way, unmapped memory would read as all ones.
The output was a little more difficult, but I had seen code for 1200/2400 baud output through the joystick port which used the horizontal sync as a master clock. Then I used the cable from a TI 99/4 joystick (because it had the necessary pin and wire for five volts power) and a MAX-232 chip to generate the RS-232 output signal.
After this, it was all software. It was able to recognize and dump most 2600 and 7800 bankswitching methods, erring on the side of too much information when possible.
For user input, I had it check the pause button during startup. If the pause button was pressed, it would automatically start dumping the cartridge without the need for any more input. Otherwise it would play the game as normal. (I apparently got tired of this and commented out the jump before label LD5A5.) While I was at it, I also disabled the digital signature check to allow it to run unsigned games. (If you want to do that to a regular 7800 BIOS, just change the byte at F4F5 to zero.)
Binary boot ROM image: 7800dump.bin
Source code: 7800dump.asm
7800 BIOS ROM in Intel hex format: 7800bios.hex
Note: 7800dump.asm is meant to be overlaid on top of a standard 7800 BIOS ROM image! If you use an assembler which generates Intel hex output, you can just concatenate it after 7800bios.hex and make a ROM image from that. With my own assembler, the following commands will do this:
asm6502 -l -o -w -e dump.asm
cat 7800bios.hex dump.asm.hex | makerom -b E000 >7800dump.bin
Then burn 7800dump.bin to a 2764 EPROM. If you are using a 27128, simply change "-b E000" to "-b C000".