diff options
Diffstat (limited to 'Emulator/Chip/BusDevice.cs')
| -rw-r--r-- | Emulator/Chip/BusDevice.cs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/Emulator/Chip/BusDevice.cs b/Emulator/Chip/BusDevice.cs new file mode 100644 index 0000000..1e1e972 --- /dev/null +++ b/Emulator/Chip/BusDevice.cs @@ -0,0 +1,49 @@ +namespace Q1.Emulator.Chip; + +using System.Runtime.CompilerServices; + +public abstract class BusDevice +{ + public BusDevice(u16 addressableStart, u16 addressableEnd) + { + this.AddressableStart = addressableStart; + this.AddressableEnd = addressableEnd; + } + + public Bus Bus { get; set; } + public abstract u8 Read(u16 address); + public abstract void Write(u16 address, u8 value); + + public u16 ReadWord(u16 address) + { + u8 high = this.Read(address); + u8 low = this.Read((u16) (address + 1)); + u16 value = Make.u16(high, low); + return value; + } + + public void WriteWord(u16 address, u16 value) + { + ref8 data = Make.ref8(value); + this.Write(address, data[0]); + this.Write((u16) (address + 1), data[1]); + } + + public virtual void Clock() { } + public virtual void Reset() { } + + public void AttachToBus(Bus bus) + { + this.Bus = bus; + bus.Devices.Add(this); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected u16 GetRelativeAddress(u16 address) + { + return (u16) (address - this.AddressableStart); + } + + public u16 AddressableStart { get; } + public u16 AddressableEnd { get; } +}
\ No newline at end of file |
