summaryrefslogtreecommitdiff
path: root/Emulator/Chip/BusDevice.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emulator/Chip/BusDevice.cs')
-rw-r--r--Emulator/Chip/BusDevice.cs49
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