From 2e3102879b2d3059f4ce0efc1a0ecd4bc3142a99 Mon Sep 17 00:00:00 2001 From: Ian C Date: Wed, 28 Dec 2011 00:11:12 +0000 Subject: Added some more base classes and started on the Z80 implementation. --- Noddybox.Emulation.EightBit/ICpu.cs | 54 ++++++++++++++++++++++ Noddybox.Emulation.EightBit/IDevice.cs | 4 +- Noddybox.Emulation.EightBit/IMemory.cs | 4 +- Noddybox.Emulation.EightBit/IRegister16.cs | 34 ++++++++++++++ .../Noddybox.Emulation.EightBit.csproj | 11 +++++ Noddybox.Emulation.EightBit/Register16BigEndian.cs | 53 +++++++++++++++++++++ Noddybox.Emulation.EightBit/Register16Factory.cs | 31 +++++++++++++ .../Register16LittleEndian.cs | 53 +++++++++++++++++++++ 8 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 Noddybox.Emulation.EightBit/ICpu.cs create mode 100644 Noddybox.Emulation.EightBit/IRegister16.cs create mode 100644 Noddybox.Emulation.EightBit/Register16BigEndian.cs create mode 100644 Noddybox.Emulation.EightBit/Register16Factory.cs create mode 100644 Noddybox.Emulation.EightBit/Register16LittleEndian.cs (limited to 'Noddybox.Emulation.EightBit') diff --git a/Noddybox.Emulation.EightBit/ICpu.cs b/Noddybox.Emulation.EightBit/ICpu.cs new file mode 100644 index 0000000..139933d --- /dev/null +++ b/Noddybox.Emulation.EightBit/ICpu.cs @@ -0,0 +1,54 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; + +namespace Noddybox.Emulation.EightBit +{ + /// + /// Defines an 8-bit CPU. + /// + public interface ICpu + { + /// + /// Initialise the CPU to give it access to memory and devices. + /// + /// The memory to access. + /// The devices to access. + /// The clock to use. + void Initialise(IMemory memory, IDevice device, Clock clock); + + /// + /// Resets the CPU to its initial state. + /// + void Reset(); + + /// + /// Runs the next instruction. + /// + void Step(); + + /// + /// Runs the CPU until the next frame flyback. + /// + void Run(); + + /// + /// Generates a maskable interrupt to the CPU. + /// + /// Optional value from an interrupting device. May be ignored depending on the CPU type. + void MaskableInterrupt(byte value); + + /// + /// Generates a non-maskable interrupt to the CPU. + /// + /// Optional value from an interrupting device. May be ignored depending on the CPU type. + void NonMaskableInterrupt(byte value); + } +} diff --git a/Noddybox.Emulation.EightBit/IDevice.cs b/Noddybox.Emulation.EightBit/IDevice.cs index 108adf9..00ef38d 100644 --- a/Noddybox.Emulation.EightBit/IDevice.cs +++ b/Noddybox.Emulation.EightBit/IDevice.cs @@ -22,13 +22,13 @@ namespace Noddybox.Emulation.EightBit /// /// The address of the device. /// The byte returned from the device. - byte Read(UInt16 device); + byte Read(ushort device); /// /// Write to a device. /// /// The address of the device. /// The value to write to the device. - void Write(UInt16 device, byte value); + void Write(ushort device, byte value); } } diff --git a/Noddybox.Emulation.EightBit/IMemory.cs b/Noddybox.Emulation.EightBit/IMemory.cs index 5131eb0..2c842a5 100644 --- a/Noddybox.Emulation.EightBit/IMemory.cs +++ b/Noddybox.Emulation.EightBit/IMemory.cs @@ -21,13 +21,13 @@ namespace Noddybox.Emulation.EightBit /// /// The address to read. /// The value at that address. - byte Read(UInt16 address); + byte Read(ushort address); /// /// Writes a byte at a given address. /// /// The address to write to. /// The value to write. - void Write(UInt16 address, byte value); + void Write(ushort address, byte value); } } diff --git a/Noddybox.Emulation.EightBit/IRegister16.cs b/Noddybox.Emulation.EightBit/IRegister16.cs new file mode 100644 index 0000000..e3bfc69 --- /dev/null +++ b/Noddybox.Emulation.EightBit/IRegister16.cs @@ -0,0 +1,34 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; + +namespace Noddybox.Emulation.EightBit +{ + /// + /// Provides a common 8-bit register pattern, which is two 8-bit registers rolled into one. + /// + public interface IRegister16 + { + /// + /// Get/set the low byte of the 16-bit register. + /// + byte Low {get; set;} + + /// + /// Get/set the high byte of the 16-bit register. + /// + byte High {get; set;} + + /// + /// Get/set the value of the 16-bit register. + /// + ushort Value {get; set;} + } +} diff --git a/Noddybox.Emulation.EightBit/Noddybox.Emulation.EightBit.csproj b/Noddybox.Emulation.EightBit/Noddybox.Emulation.EightBit.csproj index 316b00b..c7d5924 100644 --- a/Noddybox.Emulation.EightBit/Noddybox.Emulation.EightBit.csproj +++ b/Noddybox.Emulation.EightBit/Noddybox.Emulation.EightBit.csproj @@ -49,9 +49,20 @@ + + + + + + + + + {A2478066-4DFD-4042-BF98-963922DC97F8} + Noddybox.Emulation + diff --git a/Noddybox.Emulation.EightBit/Register16BigEndian.cs b/Noddybox.Emulation.EightBit/Register16BigEndian.cs new file mode 100644 index 0000000..8378543 --- /dev/null +++ b/Noddybox.Emulation.EightBit/Register16BigEndian.cs @@ -0,0 +1,53 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using System.Runtime.InteropServices; + +namespace Noddybox.Emulation.EightBit +{ + [StructLayout(LayoutKind.Explicit)] + public struct Register16BigEndian : IRegister16 + { + #region Register fields + + [FieldOffset(0)] + ushort reg; + + [FieldOffset(1)] + byte low; + + [FieldOffset(0)] + byte high; + + #endregion + + #region IRegister16 Members + + public byte Low + { + get {return low;} + set {low = value;} + } + + public byte High + { + get {return high;} + set {high = value;} + } + + public ushort Value + { + get {return reg;} + set {reg = value;} + } + + #endregion + } +} diff --git a/Noddybox.Emulation.EightBit/Register16Factory.cs b/Noddybox.Emulation.EightBit/Register16Factory.cs new file mode 100644 index 0000000..fd31fe4 --- /dev/null +++ b/Noddybox.Emulation.EightBit/Register16Factory.cs @@ -0,0 +1,31 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; + +namespace Noddybox.Emulation.EightBit +{ + /// + /// Defines a common 16-bit register, which is two bytes which are separately addressable. + /// + public static class Register16Factory + { + public static IRegister16 Create() + { + if (BitConverter.IsLittleEndian) + { + return new Register16LittleEndian(); + } + else + { + return new Register16BigEndian(); + } + } + } +} diff --git a/Noddybox.Emulation.EightBit/Register16LittleEndian.cs b/Noddybox.Emulation.EightBit/Register16LittleEndian.cs new file mode 100644 index 0000000..a2cf8a8 --- /dev/null +++ b/Noddybox.Emulation.EightBit/Register16LittleEndian.cs @@ -0,0 +1,53 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using System.Runtime.InteropServices; + +namespace Noddybox.Emulation.EightBit +{ + [StructLayout(LayoutKind.Explicit)] + public struct Register16LittleEndian : IRegister16 + { + #region Register fields + + [FieldOffset(0)] + ushort reg; + + [FieldOffset(0)] + byte low; + + [FieldOffset(1)] + byte high; + + #endregion + + #region IRegister16 Members + + public byte Low + { + get {return low;} + set {low = value;} + } + + public byte High + { + get {return high;} + set {high = value;} + } + + public ushort Value + { + get {return reg;} + set {reg = value;} + } + + #endregion + } +} -- cgit v1.2.3