public void SetByteAt(uint address, byte value) { if ((address & 0xfffc) == 0x0800) { return; } // mirrored register else if ((address &= AddressMask) >= this.Storage.Length) { return; } this.Log("Set register byte at address " + address.ToString("x3") + " " + value.ToString("x")); IORegister reg = this.Storage[address]; bool offset = (address & 1) > 0; if (!offset) { reg.Set(value, true, false); } else { reg.Set((ushort)(value << 8), false, true); } }
public uint?GetWordAt(uint address) { if ((address & 0xfffc) == 0x0800) { return(null); } // mirrored register else if ((address &= AddressMask) >= this.Storage.Length) { return(null); } address &= 0x00ff_fffc; // force align this.Log("Get register word at address " + address.ToString("x")); IORegister reg = this.Storage[address]; // force alignment makes these accesses a lot simpler! return((uint)(reg.Get() | (this.Storage[address + 2].Get() << 16))); }
public void SetHalfWordAt(uint address, ushort value) { if ((address & 0xfffc) == 0x0800) { return; } // mirrored register else if ((address &= AddressMask) >= this.Storage.Length) { return; } address &= 0x00ff_fffe; // force align this.Log("Set register halfword at address " + address.ToString("x3") + " " + value.ToString("x")); IORegister reg = this.Storage[address]; // force alignment makes these accesses a lot simpler! reg.Set(value, true, true); }
public byte?GetByteAt(uint address) { if ((address & 0xfffc) == 0x0800) { return(null); } // mirrored register else if ((address &= AddressMask) >= this.Storage.Length) { return(null); } this.Log("Get register byte at address " + address.ToString("x3")); IORegister reg = this.Storage[address]; bool offset = (address & 1) > 0; if (!offset) { return((byte)reg.Get()); } else { return((byte)((reg.Get() & 0xff00) >> 8)); } }