// This file is part of the Noddybox.Emulation C# suite. // // Noddybox.Emulation is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Noddybox.Emulation is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Noddybox.Emulation. If not, see . // // 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 != 0x34 || r.high != 0x12) { throw new Exception("Compile time endian setting incorrect"); } } } }