summaryrefslogtreecommitdiff
path: root/Q1.core
diff options
context:
space:
mode:
authorMelodi <62381002+Melodi17@users.noreply.github.com>2026-03-20 06:04:13 +1000
committerMelodi <62381002+Melodi17@users.noreply.github.com>2026-03-20 06:04:13 +1000
commit571e44a12d2a52e92c1165ec294469d3d384faef (patch)
treed278303fe080322a7a4aeb122c09b6cc4bafaee7 /Q1.core
parent6f8356eca832e2350424b417cdea2d8d8eb6b1e3 (diff)
change: Split addressable and bus device
Diffstat (limited to 'Q1.core')
-rw-r--r--Q1.core/Arch/Chip.cs2
-rw-r--r--Q1.core/Components/Bus.cs20
-rw-r--r--Q1.core/Components/IAddressable.cs6
-rw-r--r--Q1.core/Components/Memory.cs4
4 files changed, 18 insertions, 14 deletions
diff --git a/Q1.core/Arch/Chip.cs b/Q1.core/Arch/Chip.cs
index 0beeb26..2c79a4d 100644
--- a/Q1.core/Arch/Chip.cs
+++ b/Q1.core/Arch/Chip.cs
@@ -7,7 +7,7 @@ using Lookups;
// Big endian
public class Chip
{
- public IAddressable Bus;
+ public Bus Bus;
public u16 Pc, Sp;
public u16 Ax, Dx, Lx;
diff --git a/Q1.core/Components/Bus.cs b/Q1.core/Components/Bus.cs
index 02b20a7..46c5847 100644
--- a/Q1.core/Components/Bus.cs
+++ b/Q1.core/Components/Bus.cs
@@ -5,7 +5,7 @@ using Q1.core.Arch;
public class Bus : IAddressable
{
private Chip? _chip;
- private readonly List<IAddressable> _devices;
+ private readonly List<IBusDevice> _devices;
public u16 AddressableStart { get; }
public u16 AddressableEnd { get; }
@@ -34,7 +34,7 @@ public class Bus : IAddressable
chip.Bus = this;
}
- public void MountDevice(IAddressable device)
+ public void MountDevice(IBusDevice device)
{
if (device.AddressableStart >= device.AddressableEnd)
throw new ArgumentException("Addressable range is invalid.", nameof(device));
@@ -45,14 +45,14 @@ public class Bus : IAddressable
if (index > 0)
{
- IAddressable prev = this._devices[index - 1];
+ IBusDevice prev = this._devices[index - 1];
if (device.AddressableStart < prev.AddressableEnd)
throw new InvalidOperationException("Address range overlaps with previous device.");
}
if (index < this._devices.Count)
{
- IAddressable next = this._devices[index];
+ IBusDevice next = this._devices[index];
if (device.AddressableEnd > next.AddressableStart)
throw new InvalidOperationException("Address range overlaps with next device.");
}
@@ -60,9 +60,9 @@ public class Bus : IAddressable
this._devices.Insert(index, device);
}
- private IAddressable? GetDevice(u16 address)
+ private IBusDevice? GetDevice(u16 address)
{
- foreach (IAddressable device in this._devices)
+ foreach (IBusDevice device in this._devices)
{
if (address < device.AddressableStart)
break;
@@ -76,7 +76,7 @@ public class Bus : IAddressable
public u8 Read(u16 address)
{
- IAddressable? device = this.GetDevice(address);
+ IBusDevice? device = this.GetDevice(address);
if (device == null)
return 0;
@@ -85,7 +85,7 @@ public class Bus : IAddressable
public void Write(u16 address, u8 value)
{
- IAddressable? device = this.GetDevice(address);
+ IBusDevice? device = this.GetDevice(address);
if (device == null)
return;
@@ -94,7 +94,7 @@ public class Bus : IAddressable
public void Clock()
{
- foreach (IAddressable addressable in this._devices)
- addressable.Clock();
+ foreach (IBusDevice addressable in this._devices)
+ addressable.Clock(this);
}
} \ No newline at end of file
diff --git a/Q1.core/Components/IAddressable.cs b/Q1.core/Components/IAddressable.cs
index 54218d9..339f076 100644
--- a/Q1.core/Components/IAddressable.cs
+++ b/Q1.core/Components/IAddressable.cs
@@ -4,10 +4,14 @@ public interface IAddressable
{
public u8 Read(u16 address);
public void Write(u16 address, u8 value);
- public void Clock();
+}
+public interface IBusDevice : IAddressable
+{
public u16 AddressableStart { get; }
public u16 AddressableEnd { get; }
+
+ public void Clock(Bus bus);
}
public static class AddressableExtensions
diff --git a/Q1.core/Components/Memory.cs b/Q1.core/Components/Memory.cs
index 9d23c7a..38c33ee 100644
--- a/Q1.core/Components/Memory.cs
+++ b/Q1.core/Components/Memory.cs
@@ -1,6 +1,6 @@
namespace Q1.core.Components;
-public class Memory : IAddressable
+public class Memory : IBusDevice
{
private readonly u8[] _memory;
@@ -17,5 +17,5 @@ public class Memory : IAddressable
public u8 Read(u16 address) => this._memory[address];
public void Write(u16 address, u8 value) => this._memory[address] = value;
- public void Clock() { /* No timing behavior for simple memory */ }
+ public void Clock(Bus bus) { /* No timing behavior for simple memory */ }
} \ No newline at end of file