diff --git a/src/main/java/com/loomcom/symon/Bus.java b/src/main/java/com/loomcom/symon/Bus.java index 5ec836e..1b36044 100644 --- a/src/main/java/com/loomcom/symon/Bus.java +++ b/src/main/java/com/loomcom/symon/Bus.java @@ -76,8 +76,7 @@ public class Bus { } private void buildDeviceAddressArray() { - // TODO: Find out why +2 and not +1 is needed here - int size = (this.endAddress - this.startAddress) + 2; + int size = (this.endAddress - this.startAddress) + 1; deviceAddressArray = new Device[size]; List priorities = new ArrayList(deviceMap.keySet()); @@ -88,7 +87,7 @@ public class Bus { for(Device device : deviceSet) { MemoryRange range = device.getMemoryRange(); for(int address = range.startAddress; address <= range.endAddress; ++address) { - deviceAddressArray[address] = device; + deviceAddressArray[address - this.startAddress] = device; } } } @@ -101,7 +100,16 @@ public class Bus { * @param device * @param priority */ - public void addDevice(Device device, int priority) { + public void addDevice(Device device, int priority) throws MemoryRangeException { + + MemoryRange range = device.getMemoryRange(); + if(range.startAddress() < this.startAddress || range.startAddress() > this.endAddress) { + throw new MemoryRangeException("start address of device " + device.getName() + " does not fall within the address range of the bus"); + } + if(range.endAddress() < this.startAddress || range.endAddress() > this.endAddress) { + throw new MemoryRangeException("end address of device " + device.getName() + " does not fall within the address range of the bus"); + } + SortedSet deviceSet = deviceMap.get(priority); if(deviceSet == null) { @@ -152,7 +160,7 @@ public class Bus { } for(int address = startAddress; address <= endAddress; ++address) { - if(deviceAddressArray[address] == null) { + if(deviceAddressArray[address - startAddress] == null) { return false; } } @@ -161,7 +169,7 @@ public class Bus { } public int read(int address) throws MemoryAccessException { - Device d = deviceAddressArray[address]; + Device d = deviceAddressArray[address - this.startAddress]; if(d != null) { MemoryRange range = d.getMemoryRange(); int devAddr = address - range.startAddress(); @@ -172,7 +180,7 @@ public class Bus { } public void write(int address, int value) throws MemoryAccessException { - Device d = deviceAddressArray[address]; + Device d = deviceAddressArray[address - this.startAddress]; if(d != null) { MemoryRange range = d.getMemoryRange(); int devAddr = address - range.startAddress(); diff --git a/src/test/java/com/loomcom/symon/CpuAbsoluteModeTest.java b/src/test/java/com/loomcom/symon/CpuAbsoluteModeTest.java index ea63c58..6921492 100644 --- a/src/test/java/com/loomcom/symon/CpuAbsoluteModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuAbsoluteModeTest.java @@ -14,7 +14,7 @@ public class CpuAbsoluteModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuAbsoluteXModeTest.java b/src/test/java/com/loomcom/symon/CpuAbsoluteXModeTest.java index 842f4b2..958e959 100644 --- a/src/test/java/com/loomcom/symon/CpuAbsoluteXModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuAbsoluteXModeTest.java @@ -14,7 +14,7 @@ public class CpuAbsoluteXModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuAbsoluteYModeTest.java b/src/test/java/com/loomcom/symon/CpuAbsoluteYModeTest.java index 8521ab0..284bf29 100644 --- a/src/test/java/com/loomcom/symon/CpuAbsoluteYModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuAbsoluteYModeTest.java @@ -14,7 +14,7 @@ public class CpuAbsoluteYModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuAccumulatorModeTest.java b/src/test/java/com/loomcom/symon/CpuAccumulatorModeTest.java index f036b9c..7b51770 100644 --- a/src/test/java/com/loomcom/symon/CpuAccumulatorModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuAccumulatorModeTest.java @@ -14,7 +14,7 @@ public class CpuAccumulatorModeTest extends TestCase { public void setUp() throws MemoryRangeException, MemoryAccessException { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuImmediateModeTest.java b/src/test/java/com/loomcom/symon/CpuImmediateModeTest.java index 628a6ec..148106d 100644 --- a/src/test/java/com/loomcom/symon/CpuImmediateModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuImmediateModeTest.java @@ -14,7 +14,7 @@ public class CpuImmediateModeTest extends TestCase { public void setUp() throws MemoryRangeException, MemoryAccessException { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuImpliedModeTest.java b/src/test/java/com/loomcom/symon/CpuImpliedModeTest.java index ae3d141..8363646 100644 --- a/src/test/java/com/loomcom/symon/CpuImpliedModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuImpliedModeTest.java @@ -17,7 +17,7 @@ public class CpuImpliedModeTest { public void setUp() throws MemoryRangeException, MemoryAccessException { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuIndexedIndirectModeTest.java b/src/test/java/com/loomcom/symon/CpuIndexedIndirectModeTest.java index 346dd0c..5bf39b5 100644 --- a/src/test/java/com/loomcom/symon/CpuIndexedIndirectModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuIndexedIndirectModeTest.java @@ -16,7 +16,7 @@ public class CpuIndexedIndirectModeTest { public void runBeforeEveryTest() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuIndirectIndexedModeTest.java b/src/test/java/com/loomcom/symon/CpuIndirectIndexedModeTest.java index 1e2c543..191e930 100644 --- a/src/test/java/com/loomcom/symon/CpuIndirectIndexedModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuIndirectIndexedModeTest.java @@ -16,7 +16,7 @@ public class CpuIndirectIndexedModeTest { public void runBeforeEveryTest() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuIndirectModeTest.java b/src/test/java/com/loomcom/symon/CpuIndirectModeTest.java index 910cb45..87f7442 100644 --- a/src/test/java/com/loomcom/symon/CpuIndirectModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuIndirectModeTest.java @@ -14,7 +14,7 @@ public class CpuIndirectModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuIndirectXModeTest.java b/src/test/java/com/loomcom/symon/CpuIndirectXModeTest.java index 92fcdaa..15ad0ce 100644 --- a/src/test/java/com/loomcom/symon/CpuIndirectXModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuIndirectXModeTest.java @@ -13,7 +13,7 @@ public class CpuIndirectXModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuRelativeModeTest.java b/src/test/java/com/loomcom/symon/CpuRelativeModeTest.java index 9a5f0fe..325bcf3 100644 --- a/src/test/java/com/loomcom/symon/CpuRelativeModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuRelativeModeTest.java @@ -14,7 +14,7 @@ public class CpuRelativeModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuTest.java b/src/test/java/com/loomcom/symon/CpuTest.java index a44e92d..d7e7cb4 100644 --- a/src/test/java/com/loomcom/symon/CpuTest.java +++ b/src/test/java/com/loomcom/symon/CpuTest.java @@ -25,7 +25,7 @@ public class CpuTest extends TestCase { public void setUp() throws MemoryRangeException, MemoryAccessException { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuZeroPageModeTest.java b/src/test/java/com/loomcom/symon/CpuZeroPageModeTest.java index 9ba2691..93ca971 100644 --- a/src/test/java/com/loomcom/symon/CpuZeroPageModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuZeroPageModeTest.java @@ -14,7 +14,7 @@ public class CpuZeroPageModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuZeroPageXModeTest.java b/src/test/java/com/loomcom/symon/CpuZeroPageXModeTest.java index b612d93..67d5f17 100644 --- a/src/test/java/com/loomcom/symon/CpuZeroPageXModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuZeroPageXModeTest.java @@ -14,7 +14,7 @@ public class CpuZeroPageXModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem); diff --git a/src/test/java/com/loomcom/symon/CpuZeroPageYModeTest.java b/src/test/java/com/loomcom/symon/CpuZeroPageYModeTest.java index ed23b98..e1ef721 100644 --- a/src/test/java/com/loomcom/symon/CpuZeroPageYModeTest.java +++ b/src/test/java/com/loomcom/symon/CpuZeroPageYModeTest.java @@ -14,7 +14,7 @@ public class CpuZeroPageYModeTest extends TestCase { protected void setUp() throws Exception { this.cpu = new Cpu(); this.bus = new Bus(0x0000, 0xffff); - this.mem = new Memory(0x0000, 0x10000); + this.mem = new Memory(0x0000, 0xffff); bus.addCpu(cpu); bus.addDevice(mem);