1 /******************************************************** 2 * 3 * Warning! 4 * This file was generated automatically. 5 * Please do not edit. Changes should be made in the 6 * appropriate *.tt file. 7 * 8 */ 9 10 using System; 11 using Antmicro.Renode.Core; 12 using Antmicro.Renode.Peripherals.Bus; 13 using Antmicro.Renode.Logging; 14 15 namespace Antmicro.Renode.Peripherals.Miscellaneous 16 { 17 public sealed class BitBanding : IBytePeripheral, IWordPeripheral, IDoubleWordPeripheral 18 { BitBanding(IMachine machine, ulong peripheralBase)19 public BitBanding(IMachine machine, ulong peripheralBase) 20 { 21 sysbus = machine.GetSystemBus(this); 22 this.peripheralBase = peripheralBase; 23 } 24 Reset()25 public void Reset() 26 { 27 // nothing happens 28 } 29 ReadByte(long offset)30 public byte ReadByte(long offset) 31 { 32 var realAddress = GetBitBandAddress(offset) & ~0UL; 33 var readValue = sysbus.ReadByte(realAddress); 34 var bitNumber = (int)(offset >> 2) & 7; 35 return (byte)((readValue >> bitNumber) & 1); 36 } 37 WriteByte(long offset, byte value)38 public void WriteByte(long offset, byte value) 39 { 40 var realAddress = GetBitBandAddress(offset) & ~0UL; 41 var readValue = sysbus.ReadByte(realAddress); 42 var bitNumber = (int)(offset >> 2) & 7; 43 var mask = (1 << bitNumber); 44 if((value & 1) == 1) 45 { 46 readValue |= (byte)mask; 47 } 48 else 49 { 50 readValue &= (byte)~mask; 51 } 52 sysbus.WriteByte(realAddress, readValue); 53 } 54 ReadWord(long offset)55 public ushort ReadWord(long offset) 56 { 57 var realAddress = GetBitBandAddress(offset) & ~1UL; 58 var readValue = sysbus.ReadWord(realAddress); 59 var bitNumber = (int)(offset >> 2) & 15; 60 return (ushort)((readValue >> bitNumber) & 1); 61 } 62 WriteWord(long offset, ushort value)63 public void WriteWord(long offset, ushort value) 64 { 65 var realAddress = GetBitBandAddress(offset) & ~1UL; 66 var readValue = sysbus.ReadWord(realAddress); 67 var bitNumber = (int)(offset >> 2) & 15; 68 var mask = (1 << bitNumber); 69 if((value & 1) == 1) 70 { 71 readValue |= (ushort)mask; 72 } 73 else 74 { 75 readValue &= (ushort)~mask; 76 } 77 sysbus.WriteWord(realAddress, readValue); 78 } 79 ReadDoubleWord(long offset)80 public uint ReadDoubleWord(long offset) 81 { 82 var realAddress = GetBitBandAddress(offset) & ~3UL; 83 var readValue = sysbus.ReadDoubleWord(realAddress); 84 var bitNumber = (int)(offset >> 2) & 31; 85 return (uint)((readValue >> bitNumber) & 1); 86 } 87 WriteDoubleWord(long offset, uint value)88 public void WriteDoubleWord(long offset, uint value) 89 { 90 var realAddress = GetBitBandAddress(offset) & ~3UL; 91 var readValue = sysbus.ReadDoubleWord(realAddress); 92 var bitNumber = (int)(offset >> 2) & 31; 93 var mask = (1 << bitNumber); 94 if((value & 1) == 1) 95 { 96 readValue |= (uint)mask; 97 } 98 else 99 { 100 readValue &= (uint)~mask; 101 } 102 sysbus.WriteDoubleWord(realAddress, readValue); 103 } 104 GetBitBandAddress(long from)105 private ulong GetBitBandAddress(long from) 106 { 107 var retval = peripheralBase + checked((ulong)(from >> 5)); 108 this.NoisyLog("Bit-band operation: 0x{0:X} -> 0x{1:X}.", from, retval); 109 return retval; 110 } 111 112 private readonly IBusController sysbus; 113 private readonly ulong peripheralBase; 114 } 115 } 116