6 ms·
I made an NES emulator – What I learned about the original Nintendo
- coldpie 12y agoIf you're into this kind of thing, just dig in and give it a shot! Old systems are surprisingly understandable after a few hours' research and fooling around. There's a community that looks for unused content that remains in games. The main wiki for this community is <http://tcrf.net/ http://tcrf.net/ >, which contains a fascinating amount of material. If you don't see your favorite old game on there, why not dissect it and try to find some unused stuff? I did this for a favorite old game of mine called M.C. Kids. I reverse-engineered the game's level and graphics data formats and managed to create a level dumper for the game. Then, I did the same for a leaked prototype version of the game. I took the dumped images and made a page on TCRF comparing them: http://tcrf.net/Proto:M.C._Kids http://tcrf.net/Proto:M.C._Kids It took a few months on afternoons and weekends. It was very challenging, but I never felt overwhelmed by the details. There's really only so much you can do with three registers and little more than adding and branching instructions. If you're curious to see what a reverse-engineered level dumper looks like, the code is available at <https://gitlab.com/mcmapper/mcmapper/blob/master/main.c https://gitlab.com/mcmapper/mcmapper/blob/master/main.c >.
- ayuvar 12y agoIt's pretty fun to work on this kind of stuff. I wrote an OperaFS (3DO CD filesystem) extractor in Go to get at a video file that was contained in an old game. Admittedly, I should get back to work - because I still don't know how to play the video file that I pulled out.
- jdalgetty 12y agoMC Kids was one of your favorite games? My wife and I actually played that the other night and wondered who actually bought it when it came out? Was it something you wanted or was it a random gift of some sort?
- coldpie 12y agoHonestly, I don't remember how we got it. I was four years old when it was released. My mom used to go into Funcoland and just buy whatever looked good, or maybe what an employee recommended. Actually, I should ask her if she remembers. And yeah, I'm a big fan. Aside from just growing up with it, it's a really solid NES-era platformer. If you're curious to learn more about it, one of the developers actually maintains a blog and has written about it a few times. He also posts on HN infrequently. http://games.greggman.com/game/m_c_kids/ http://games.greggman.com/game/m_c_kids/ http://games.greggman.com/game/programming_m_c__kids/ http://games.greggman.com/game/programming_m_c__kids/ Also he & the other two primary developers actually signed my cartridge: http://gamesplusone.com/mckidscart.jpg http://gamesplusone.com/mckidscart.jpg I'm a dork.
- Jeremy1026 12y agoIt was a solid game. It was dynamic enough to remain interesting. And the difficulty level was perfect for my ~6 year old self. Though, I don't think I ever actually beat it. Got stuck on Hamburgler too many times.
- bitJericho 12y agoCinemassacre did a really good review of it here: http://cinemassacre.com/2006/09/01/mckids/ http://cinemassacre.com/2006/09/01/mckids/
- fit2rule 12y ago>Old systems are surprisingly understandable after a few hours' research and fooling around. This is why I say old computers never die - their owners do! Old systems have lots of technology to engage the hacker mind. By the way, my favourite emulator is Oriculator, which emulates the Oric-1/Atmos/Telestrat/Pravetz 8-bit machines that never had much of a chance in the 80's .. just look at this beautiful code, for example, of how to emulate a 6502: https://code.google.com/p/oriculator/source/browse/trunk/6502.c https://code.google.com/p/oriculator/source/browse/trunk/650... With the revival of emulation of these systems, we're even getting new software written for them - in the modern era, titles are being released for these old machines that we would never have though possible in the 80's. Just look at this beautiful collection for the Oric-1 - all made in the 21st Century - for example: http://space1999.defence-force.org/ http://space1999.defence-force.org/ http://stormlord.defence-force.org/ http://stormlord.defence-force.org/ http://1337.defence-force.org/ http://1337.defence-force.org/ http://im.defence-force.org/ http://im.defence-force.org/ http://skooldaze.defence-force.org/ http://skooldaze.defence-force.org/ http://oricium.defence-force.org/ http://oricium.defence-force.org/ Featuring Gameplay and Graphics that we would never have thought possible in the 80's! http://www.oric.org/software/pulsoids-1515.html http://www.oric.org/software/pulsoids-1515.html Check out this collection from Twilighte, who before his untimely departure was a real master of this platform in the 21st century: http://www.oric.org/index.php?page=software&fille=softwaresearch http://www.oric.org/index.php?page=software&fille=softwarese... So much fun to be had on these old machines!
- henrikschroder 12y agoI wonder why it's possible to get "better" programs for old hardware now. Is it because the field of CS has advanced further, which means that we can apply modern ideas and algorithms? Or is it because we can cheat and have a toolchain running on vastly superior hardware, which enables us to use it in ways that would have been too time-consuming to develop back in the day?
- pascal_cuoq 12y agoProbably a bit of these two, and a third one: today, we have plenty of programmers who have been at it for thirty years. They got started on these very machines, and in the meantime they have been doing other things on other computers—but which were still programming—and now, if they decide to go back to the original computers, their instincts more than compensate for the lost familiarity. In some of my last years as a student (late nineties), I dug up my old ZX81 from my parents' basement, and the effects of all three items were visible: I had access to a cross-assembler that I ran on a SPARC workstation. Techniques that may or may not have been known in the 1980s were now published and available on the Internet for anyone curious about them. And my ability to concentrate and understand the issues I was facing was better than when I was eight.
- ewams 12y agoI have always wondered how did they get all the ROMS for the games. Any insight?
- kevinchen 12y agoUse a ROM dumper! You need access to the original hardware, then the dumper reads out the chip. To make a dumper you first need to find the ROM pinouts for the chips they used. This tells you which pins select an address, which pins output data, etc. Then, build a dumper (for example writing an Arduino program) that selects each address one by one, and outputs the response from the chip in a format your computer can read.
- pcunite 12y agoThis same person has made a simplistic clone of MineCraft in C. http://www.michaelfogleman.com/craft/ http://www.michaelfogleman.com/craft/
- Scuds 12y agoWatching the sprites in vram while the game runs is really neat, and shows a bit about how the game is put together. For instance in Kirby's Adventure, (IIRC)Kirby's walking sprites take up about half the available RAM, and they get swapped out for the flying sprites when he jumps. Compare this to some of the early non bank switched games where the all sprites fit entirely in memory, with some creative tweaks (bushes are recolored clouds, etc). It's a bit myopic of Nintendo that on-cartridge mappers had to be necessary, but on the other hand, it's early 80's consumer hardware; it was probably state of the art in the late 70's ... which makes it hilarious that Wario's Woods was released in 1994.
- throwawayspeccy 12y agoIn Battletoads, Rare went a step further and kept only a single frame for each player loaded in CHR RAM, copying over it for each frame of animation. As for mappers, the 6502 (along with most other 8-bit CPUs from that era) has 16 address lines, imposing a hard-limit of 64 kilobytes of CPU-side address space. Without bank switching hardware somewhere, there was just no other practical way to access any more program ROM than that. Now, Nintendo could have pulled a PC-Engine/TurboGrafx-16 and embedded a bank switching unit somewhere in the console itself, but hindsight is 20/20.
- fogleman 12y agoThat's really cool... I thought about writing a visualizer to display stuff like that but I haven't yet.
- SyncOnGreen 12y agoI've coded a NES emulator for my C++ programming course (https://github.com/JaCzekanski/AnotherNES https://github.com/JaCzekanski/AnotherNES) and one of the features is live view of RAM and PPU registers (check out Screenshots at bottom of Readme). As for now only RAM can be changed during game play but I plan to carry on with development and create emulator with ability to change every register of console in realtime (like ICU64 here: https://www.youtube.com/watch?v=tjcvR5McmSg https://www.youtube.com/watch?v=tjcvR5McmSg)
- deleted 12y ago[deleted]
- fsniper 12y agoThe source code is really clean and easily comprehensible. I really liked how you handled cpu frequency with console stepping on gl updates.
- billymeter 12y agoGreat! It's an interesting experiment, eh? A couple of other students and I did this same thing, but in Python, for the final project in our Python class. The result was excruciatingly slow. It still has some bugs, and we haven't touched it in almost a year, but we all learned a lot along the way. If you're interested in taking a look, or providing some feedback, the repo is here: https://github.com/billymeter/pynes https://github.com/billymeter/pynes
- mind_heist 12y agowow ! this one is cool ! From looking at the Repo - I see that you have used pygame in your project. So , how did it help in implementing the Emulator ?
- yodsanklai 12y agoCongratulations for this nice project. I wonder, how to write such an emulator? My initial idea would be to write an interpreter for the processor instruction set with a big array representing the RAM. Then some callback functions are registered via openGL. They are called when there are some inputs (eg. joystick). When this happens, they put something in the simulated memory (some mapped area for I/O or specific registers) and set up some interrupt flags. Does it make sense? then how to simulate accurately the processor (and coprocessors ?) frequency? any other difficulties I haven't seen?
- mattdotc 12y agoI believe you're thinking along the right lines. If you're really curious to learn more, check out this series which I have enjoyed reading: http://imrannazar.com/GameBoy-Emulation-in-JavaScript http://imrannazar.com/GameBoy-Emulation-in-JavaScript
- icesoldier 12y agoRelated to this is Lizard, a Kickstarter project that got funded last year, where one person is writing a new game for the NES. He's posted some development blogs as updates to the project, and it's fascinating reading about the design considerations he's taken: https://www.kickstarter.com/projects/1101008925/lizard/updates https://www.kickstarter.com/projects/1101008925/lizard/updat... (Of note, this is the same one who made MOON8 - a cover project for Pink Floyd's Dark Side of the Moon for the NES [0] - and more recently, getting the "2A03 Puritans" album, a NES chiptune collaboration album, onto a rom and cartridge [1].) [0] http://rainwarrior.ca/music/moon8.html http://rainwarrior.ca/music/moon8.html [1] http://rainwarrior.ca/projects/nes/2a03puritans.html http://rainwarrior.ca/projects/nes/2a03puritans.html --- I've personally only messed with the NES from an audio perspective, having spent a lot of time a few years back in FamiTracker [2] to write music for it. I always found it interesting that the Famicom had the ability for cartridges to include their own audio hardware in addition to the mapper, battery-RAM, etc. Like the mappers, the vast majority of these games that included expansion audio chips kept to a small-ish set of chips. Chiptune (especially Famicom chiptune, due to the time I spent tinkering with it) is a fascination of mine, so I could point out some samples for the various expansion audio chips if anyone would like. [2] http://famitracker.com/ http://famitracker.com/
- emodendroket 12y agoCool. I've always wanted to make an emulator and this article makes it seem less intimidating than it would.
- bigjoecumbo 12y agoCheck out the source code...it's surprisingly good!
- yamaneko 12y agoI would like to learn how to do that. For curiosity, why did you use Go? Is it a matter of speed or libraries? Would you get the same result if you used Python?