The last days I’ve been playing around a new virtual machine. This VM is known as Chip16 and its specification can be obtained from Ngemu. The Chip16 is quite simple, it has only 19 registers (including PC and SP), the CPU speed is only 1Mhz, memory’s size 64 KB (65536 bytes). The main way you to interact with the machine is by mapped io. The set of instruction (at version 0.7) is around 48. It’s a start project for those want to learn a little bit of emulation. Maybe you know its father Chip8 that has some inconsistencies and undocumented features.
Emulator Basic flow
-  Load ROM -> ROM it’s the input of the machine, sometimes it can be a ISO image or a specific structure created by community. It’s a file (structured or not) that contains the data to be executed and read by the machine.
-  Load Memory -> You need to know the memory map of target system. So you properly fill the memory with data from ROM at the correct addresses.
-  Initiate Machine -> It’s the initial state of the machine, some of them used to start with random data all over the RAM, and it used to have the initial address for the first opcode among other tasks.
-  Decode Opcode -> It’s basically the act of read the opcode from memory (pointed by PC) and its parameters too.
-  Execute Instruction -> With the full set of data, you know how to execute the instruction (using the parameters).
-  Events -> Eventually the machine does some events or some interruptions are raised.
-  Cycle Tasks -> This are the tasks performed at given time (measured by clock (number of cycles) or time (ms)): update screen, update inputs and etc.
I did a simplest implementation using Java as language/platform and Java2D as render engine. The idea is: implement this vm and have fun with object-oriented programming. I’ve divide this into several objects. I tried to apply some design patterns, basic oop and etc. The core is the facade Machine which provide methods for start, pause, resume, see the internal state of CPU, draw and etc. The coolest part (IMHO) is the CPU, full of internal classes composing the instruction table which is findable by opcode. For graphics it used a simple short multidimensional array, acting like a screen of pixels.
You can access the source code at GitHub.