5 ms·
How do emulators work and how are they written?
- thinkbohemian 16y agoI've always wondered, thanks for the info!
- ThePinion 16y agoNow I know everything! Can't wait to whip out that Xbox 360 Natal emulator in the next couple days.
- palish 16y agoWow. For what it's worth, I thought it was funny.
- steveklabnik 16y agoThis isn't Reddit. While it may have been funny, comments that only contain comedy are generally looked down upon here, it would seem.
- anthonyb 16y agoIn my experience, comments that are funny generally get voted up. I'll leave you to join the dots on that one...
- steveklabnik 16y agoEvery hacker appreciates humor, but unless it's part of a more substantial post, it has to be a bit more clever than the modified 4chan memes that get massive upvotes on Reddit. I'm also not the HN culture police, and there are obviously exceptions. But with two -4 replies to each other, I figured I'd step in and mention why. Seems to be good netiquette.
- ThePinion 16y agoI can safely say I don't remember even posting this. My jealous sarcasm must have thought it was funny a few hours ago. Won't happen again.
- Simucal 16y agoI asked this question. I've been studying and working on emulators since then. Another good resource if you are interested in this sort of thing is Victor Barrio's thesis he wrote on the subject of emulation techniques (148pg - PDF): http://db.tt/dUJwwR http://db.tt/dUJwwR It provides a good overview to get you started.
- palish 16y agoIt looks like you asked this question about a year ago -- since then, what have you done with emulators? (Just curious.) Did you find it easy / hard to get started?
- Simucal 16y agoI'm at my college graduation ceremony right now replying on my phone, so bear with me. I'll try to expand on my posts when I get home. I didn't do anything with the information from this question for several months after asking it. Then, at a university programming competition one of the problem sets included a problem on implementing a simple virtual machine and interpretting a set of instructions. My team solved the problem in about 1.5 hours and it gave me a renewed interest in writing a game emulator. I also spend a lot of time studying reverse engineering which is somewhat related. I decided to write an NES emulator as my first serious attempt. Emulating the processor in my opinion is one of the easier tasks and I was able to bang it out in a couple weekends. Now I'm focusing on the graphics and sound systems and these take a little more effort. Also, emulating the system timing of the original CPU is a key consideration as well. I only wish I could somehow turn my emulator / reverse engineering hobbies into a career. I find the work much more rewarding than the typical software shop crud apps.
- videl 16y agoIt is really amazing. Kudos to you as I really still don't get it how to emulate hardware in software... you are a man!
- palish 16y agoThink of it this way. A program is just a set of bytes (which are numbers from 0 to 255) which describe what it should do. The goal of most programs is usually just to read in some data (again, just a set of bytes) which is stored in memory, then manipulate that data. The easiest way to understand how to emulate hardware in software is to just make up your own simple assembly language. For example, let's say you want to have these operations: "set <memory location> <value between 0 and 255>" -- sets the value at <memory location> to the specified value "add <src memory location 1> <src memory location 2>" -- adds the numbers at the two memory locations, and stores the result into memory location 1 The point is to keep it ridiculously simple for now, so let's assume the memory locations we provide are also values between 0 and 255 -- effectively giving us 256 bytes of memory to work with. So let's write a very simple program. It will perform 2 + 2. set 0 2 set 1 2 add 0 1 The result is now in memory location 0, and the result is "4" obviously. So what might the program look like on disk? Well, we only have two instructions, so let's say the code for "set" is "0" and the code for "add" is 1". If we store the program in a file, then it might look like this: 0 0 2 0 1 2 1 0 1 Now that we've defined an extremely simple assembly language, we can write a virtual machine for it as follows. First, write a program which allocates 256 bytes of memory. This is our virtual machine's memory space. - Read in the first byte of the program. - If it's 0 ("set"), then read in two more bytes (the dst and value arguments for "set"). Set mem[dst] = value. - If it's 1 ("add"), then read in two more bytes (the "dst" and "src" arguments for "add"). Set mem[dst] = mem[dst] + mem[src]. - If it's > 1, then abort (the program is invalid). If this all made sense to you, then you should be a stone's throw away from being able to write a VM for more complicated instruction sets. Just find out what the instruction set can do, and then write a VM which allows the instructions to do those things.
- zackattack 16y agoI lack formal CS training: "0 0 2 0 1 2 1 0 1" is a sequence of 9 integers. Why would you allocate 256 bytes? Edifying post, thanks.
- Hoff 16y agoIf you're interested in seeing (another) emulator implementation, the Computer History Simulation Project (simh) package <http://simh.trailing-edge.com/> http://simh.trailing-edge.com/> emulates various boxes.
- anthonyb 16y agoI found http://openbookproject.net/py4fun/ http://openbookproject.net/py4fun/ a while back. It has quite a few projects, one of which is a "toy computer" emulator written in Python. It goes from the raw emulator, through to writing a simple language and compiler for it. It is a toy example (hence the name, I guess), but a picture is worth a thousand words, if you're wondering about the nitty gritty of it all.