I worked at a game company that (among other things) made “retro” game collections of Capcom and Atari games for PS2 and Xbox 360. Even they didn’t have the source code for most of the smaller titles; we had to reverse nearly all of them.
I've heard that one approach to these kinds of projects (small number of games, no original source code) is to translate the code to (really ugly) C and compile that into a library-like blob; this can require manual intervention for runtime-dispatched jumps, overlays/mappers, and other dynamic oddities. At that point you can start using host/target debugging tools and it's "just" a matter of finding the entry points and data structures that you care about (player inputs, graphics patterns/palettes/coordinates, timers, etc.) instead of trying to RE the entire ball of mud.
Come to think of it, I think I remember reading about someone that did that with some DOS-era games to port them to ARM handheld game systems. I've got a similar target in mind. I've played with manually translating some of the assembly listings to C. Maybe I ought to continue going down that road, or seeing if some previous work has made some tools to help automate it.