Inspired by Eric Lippert's series on creating a Z-Machine interpreter, I decided to create a Z80 CPU Emulator and write about it.
This will very much be a 'I'm just going to do it' and then learn from it, so expect me to make some very silly stupid mistakes as well as going back on decisions that I have made in the past.
I am in the enviable position of having no deadline and doing this just for the fun of it, so I will probably spend a lot of time re factoring; to make the code neater and easier to understand.
A CPU performs a set of instructions that have been supplied to it. Each instruction is specified by an instruction code specified in a byte; this is known as an opcode.
An opcode may require a number of operands, which supply extra information to the opcode. In the case of the Z80 CPU, an opcode can have 0, 1 or 2 operands each of which are also a byte.
There is a lot more to emulating a CPU than just performing operations; things such as timing, interrupts and pin usage needs to be configured but I'm going to start with operations and work my way up.
To begin with, I need to define some classes.
Since all of the opcodes and operations are definable as bytes, I could use the built in byte class but I don't really want to do that. So instead, I am going to define my own
ZByte class which is a collection of 8 bits.
So I need a
Bit which I am going to define as an
public enum Bit
public class ZByte
private Bit _bits = new Bit;
public Bit this[ByteBitLocation location]
_bits[(int)location] = value;
ByteBitLocation being defined as:
public enum ByteBitLocation : int
Zero = 0,
One = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7
There is an argument that this is more verbose than required and that using integers would be simpler and easier, but I want to take advantage of compile time checking as much as possible, so that means not using primitive types where possible.
Next week, we will start on our first operation.CodeProject