7 ms·
An NES emulator written in Go
- scosman 12y agoI like to imagine the creator came up with the name first (nintenGO) and said, well damn, now I need to write it.
- jmsdnns 12y agoThe author blogged some of the experience too. - http://nwidger.github.io/blog/post/writing-an-nes-emulator-in-go-part-1/ http://nwidger.github.io/blog/post/writing-an-nes-emulator-i... - http://nwidger.github.io/blog/post/writing-an-nes-emulator-in-go-part-2/ http://nwidger.github.io/blog/post/writing-an-nes-emulator-i... - http://nwidger.github.io/blog/post/writing-an-nes-emulator-in-go-part-3/ http://nwidger.github.io/blog/post/writing-an-nes-emulator-i...
- shurcooL 12y agoNice find. It doesn't load the css when you use https, so those links should be http.
- jmsdnns 12y agoOhhh hah i thought the author just didnt care. will edit the links. :)
- carbocation 12y agoAnother HTTPS Everywhere user, I see! What's nice is that this is still quite readable without the CSS anyway.
- NamPNQ 12y agotks, cool tut
- drbawb 12y agoThis is so cool; what a great read. I'm working on a Gameboy emulator in Rust at the moment and I'm in the same boat as the author: I know it has been done before; _but I've never done it before!_ It's awesome how the Gameboy kept me entertained for hundreds and hundreds of hours as a kid. -- Here I am over a decade later, and debugging my Gameboy [emulator] has kept me up into the wee hours of the night. (On more than one occasion, I might add.) --- Funny thing is I was actually going to write a NES emulator. On new-years day I decided I really wanted to write an emulator that could play the original MOTHER. After a little bit of cursory research: the Gameboy hardware seemed a tad more approachable. To be honest that's not terribly surprising: obviously to fit a game console in such a small package (for the time) you had to make a lot of sacrifices.
- bpowell 12y agoI'm in the process of doing the same thing. Instead of using Rust I'm going to try to use Go. Would you mind sharing any resources that you found to help write the emulator?
- drbawb 12y agoSure! This walkthrough[1] writing a Gameboy emulator in Javascript was very helpful in seeing how an emulator should be structured. -- Though the full source is available: the actual tutorial is more of a guideline that introduces you to the hardware and structure of the emulator. It often shows code-snippets instead of working code. The Gameboy CPU Manual[2] and OP code chart[3] have been invaluable tools. In my experience: I spent most of my time flipping between the opcode chart and my CPU implementation. As a tip: lots of the CPU instructions do the same thing w/ different register pairs. There is huge potential for code reuse here. In Rust I achieved it with macros, though. Lastly: the "Pan Docs"[4] are more or less the same thing as the CPU Manual, but in a slightly more readable format. Also there[5] are some test ROMs[6] that you can use for debugging. I'm trying to find a good way to verify their results using Rust's unit testing. `opus5.gb`[6] is a nice way to test the graphics subsystem; it's also a good "first ROM" to run because it has no additional ROM or RAM in the cartridge. In other-words: you don't need to implement the memory bank controllers to get it working. --- And a little bit of friendly advice: _always_ keep debugging in the back of your mind. I usually resort to "printf debugging" but that really doesn't work inside a loop that's supposed to be ticking at 4.19MHz! :) I accidentally filled up my disk once already; I forgot I had redirected STDERR to a file and it was pretty-printing registers after every tick. Yikes! Good luck! It really is a fun little machine. [1]: http://imrannazar.com/GameBoy-Emulation-in-JavaScript http://imrannazar.com/GameBoy-Emulation-in-JavaScript [2]: http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf [3]: http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html [4]: http://problemkaputt.de/pandocs.htm http://problemkaputt.de/pandocs.htm [5]: http://gbdev.gg8.se/wiki/articles/Test_ROMs http://gbdev.gg8.se/wiki/articles/Test_ROMs [6]: https://www.google.com/#q=opus5.gb https://www.google.com/#q=opus5.gb
- bmurphy1976 12y agoUnfortunately the author's RSS feed appears to be broken: http://nwidger.github.io/index.xml http://nwidger.github.io/index.xml is returning a 404 and redirecting to the blog. Niels, if you happen to read this, fix your RSS feed so we can follow your future progress more easily! :)
- jzelinskie 12y agoThere is also https://github.com/scottferg/Fergulator https://github.com/scottferg/Fergulator
- OedipusRex 12y agoReminds me of NESticles
- of 12y agolol who cares?
- recursivetheme 12y agoImpressive! How did they manage to build something some complex without generics?
- jamiltron 12y agoYou do realize that significantly more complex software has been written for decades without the use of generics, right?
- lloeki 12y agoI think you missed the irony.
- deleted 12y ago[deleted]
- kid0m4n 12y agoIf he had generics, he could have written an emulator for ALL devices in one Go. In the same amount of code (probably lesser) to boot!
- pjmlp 12y agoCtr-C, Ctrl-V Ctrl-Space, Alt/Meta-W, Ctrl-Y y, p
- shaan7 12y agobah you were 3 mins faster than me :P
- shaan7 12y agowell, you know, there is always copy and paste ;)
- commentzorro 12y agoThey did use generics via Go's research into "explicit generics." Sort of like Dependency Injection, Go's Explicit Generics allow you to "wire up" types in "code files" for proper use later at run time.
- la6470 12y agoWhat use is this?
- eidyia 12y agoyou are one of the reasons why we are stuck on this planet
- jimktrains2 12y agoWhat's the use of anything? Seriously, you're on HackerNews where all sorts of one-off projects with no purpose except to exist get displayed and you're asking what the use of an NES emulator is? Maybe the author wanted to learn about emulation, or found it a challenge to do in Go. Does it matter? If you don't enjoy it, move on.
- deleted 12y ago[deleted]
- la6470 12y agoNo I understand the point of learning. My question was what is the practical use of this?
- danmanstx 12y agocool project, better name! What advantages does Go add over other languages?
- zerr 12y agoCoolness? I doubt "NES emulator in Java" would get any upvotes with the nowadays userbase of HN... :)
- kid0m4n 12y agoYep, thats one of the main reasons of basing my startup on Go. For that eventual HN post!
- easytiger 12y agoIts definitely worth the drop in performance!
- 72deluxe 12y agoIs the language really that important to the end product? I know we like to write in our favourite languages or the language we think in, but when you use software daily, do you only use software written in C, for example? Do you refuse to use anything written in C++?
- 27182818284 12y agoNot directly, but very possibly indirectly because of the people a new language attracts: PG already touched on it: http://www.paulgraham.com/pypar.html http://www.paulgraham.com/pypar.html
- shurcooL 12y agoYou can do one command, `go get -u github.com/nwidger/nintengo` and it will be installed. No Makefiles, no header files when developing, the code is nice and clean. Those are some off the top of my head.
- bithush 12y agoIf you liked this you might also enjoy these videos about writing a NES emulator in C++11 https://www.youtube.com/watch?v=y71lli8MS8s https://www.youtube.com/watch?v=y71lli8MS8s
- Kurtz79 12y agoOn cursory glance I haven´t found a single comment, still I think the code is pretty readable, good job.
- studs_terkel 12y agoI wrote a mostly complete NES emulator in Go this past December. https://github.com/hkhalsa/helloworld https://github.com/hkhalsa/helloworld I haven't added audio support yet, and it isn't very go-gettable (yet). But! the code is reasonably well commented, and I have played through much of Super Mario with it. http://web.textfiles.com/games/nestech.txt http://web.textfiles.com/games/nestech.txt is probably the best overview about what's going on in the NES, though it's inaccurate in some places. http://wiki.nesdev.com/w/index.php/Nesdev_Wiki http://wiki.nesdev.com/w/index.php/Nesdev_Wiki is a great site with far more information about the NES than you'll need to write an emulator.
- drbawb 12y agoOut of curiosity: can anyone w/ the relevant experience explain why older consoles like the NES and the GB have "mirrors" in their memory map? I haven't programmed embedded systems so I really don't understand what the advantage might be. I thought the Gameboy was odd enough with it's 'echo' of WRAM. (Which isn't even a complete mirror; it stops partway through WRAM#1.) Reading the NES memory map though it gets quite silly! There's a mirror ($2008-$3FFF) that repeats a set of 8 registers ($2000-2007) _every 8 bytes._ Was this simply a matter of having more address space than physical memory? Or were these mirrors actually useful when programming these consoles? --- I thought it might have to do w/ different addressing modes; perhaps you could save some bytes by just storing offsets or something. But that makes no sense in the context of the Gameboy. Many of the z80's extended instructions are gone; the only "interesting" addressing mode is a handful of instructions which treat an 8-bit address as an offset from $FF00.
- wk_end 12y agoUsually it's just a side-effect of how the system is wired. Consider that GB WRAM mirror, where C000 = E000 all the way up to DDFF = FDFF. Let's look at these numbers in binary: C000 = 1100 0000 0000 0000 E000 = 1110 0000 0000 0000 DDFF = 1101 1101 1111 1111 FDFF = 1111 1101 1111 1111 If you notice, that third most significant bit is the only difference - and this is true the entire way through the mirror. Because that address line wasn't needed to access WRAM, it was probably never even wired to it - so on access the value of it is simply ignored.
- anonbanker 12y agoNiels Widger, the author of this emulator, was the hardest working guy in the emulation community, and single-handedly kept Zophar's Domain alive for years. It's awesome that his love of emulation hasn't died more than a decade later. Source: I've known the guy since he was thirteen.
- mrcactu5 12y agoI keep getting Failed to feed audio to OpenAL fast enough; resynching...