From 2b8d49726e448e22b5055da5ba4395d043030984 Mon Sep 17 00:00:00 2001 From: Ian C Date: Sun, 1 Jan 2012 14:21:26 +0000 Subject: Moved sources to help in compilation for other platforms and isolated phone projects. --- src/Noddybox.Emulation.EightBit/Register16.cs | 88 +++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/Noddybox.Emulation.EightBit/Register16.cs (limited to 'src/Noddybox.Emulation.EightBit/Register16.cs') diff --git a/src/Noddybox.Emulation.EightBit/Register16.cs b/src/Noddybox.Emulation.EightBit/Register16.cs new file mode 100644 index 0000000..06c9c01 --- /dev/null +++ b/src/Noddybox.Emulation.EightBit/Register16.cs @@ -0,0 +1,88 @@ +// +// Copyright (c) 2012 Ian Cowburn +// +using System; +using System.Runtime.InteropServices; + +namespace Noddybox.Emulation.EightBit +{ + /// + /// Provides a common 8-bit register pattern, which is two 8-bit registers rolled into one. + /// While this could be done at runtime using this + /// method was chosen for speed reasons; interfaces cannot define fields, which is sensible + /// enoough, but accessing fields directly would allow ref variables to be used with this type's + /// fields. + /// + [StructLayout(LayoutKind.Explicit)] + public struct Register16 + { +#if TARGET_IS_BIGENDIAN + + /// + /// The 16-bit register. + /// + [FieldOffset(0)] + public ushort reg; + + /// + /// The high 8-bits of the register. + /// + [FieldOffset(0)] + public byte high; + + /// + /// The low 8-bits of the register. + /// + [FieldOffset(1)] + public byte low; + +#else + + /// + /// The 16-bit register. + /// + [FieldOffset(0)] + public ushort reg; + + /// + /// The low 8-bits of the register. + /// + [FieldOffset(0)] + public byte low; + + /// + /// The high 8-bits of the register. + /// + [FieldOffset(1)] + public byte high; + +#endif + + /// + /// Public constructor. This is provided to stop the compiler complaining when you use the struct as it + /// doesn't realise that setting will also set and . + /// + /// The 16-bit value to assign. + public Register16(ushort val) + { + high = 0; + low = 0; + reg = val; + } + + /// + /// Used to verify the compile-time setting at runtime. + /// + public static void Verify() + { + Register16 r = new Register16(0); + + r.reg = 0x1234; + + if (r.low != 0x24 || r.high != 0x12) + { + throw new Exception("Compile time endian setting incorrect"); + } + } + } +} -- cgit v1.2.3