From 52f4e9a00f352d7a6865d8be803ba87242307ba4 Mon Sep 17 00:00:00 2001 From: Maik Merten Date: Fri, 25 Jul 2014 21:24:16 +0200 Subject: [PATCH] enforce that the address range of devices falls within the address range of the bus. Turned out that the CPU tests instantiate memory with the last parameter as memory size, not end address (fixed now). Also make sure that the address lookup array takes the offset caused by non-zero starting addresses into account. --- src/main/java/com/loomcom/symon/Bus.java | 22 +++++++++++++------ .../loomcom/symon/CpuAbsoluteModeTest.java | 2 +- .../loomcom/symon/CpuAbsoluteXModeTest.java | 2 +- .../loomcom/symon/CpuAbsoluteYModeTest.java | 2 +- .../loomcom/symon/CpuAccumulatorModeTest.java | 2 +- .../loomcom/symon/CpuImmediateModeTest.java | 2 +- .../com/loomcom/symon/CpuImpliedModeTest.java | 2 +- .../symon/CpuIndexedIndirectModeTest.java | 2 +- .../symon/CpuIndirectIndexedModeTest.java | 2 +- .../loomcom/symon/CpuIndirectModeTest.java | 2 +- .../loomcom/symon/CpuIndirectXModeTest.java | 2 +- .../loomcom/symon/CpuRelativeModeTest.java | 2 +- src/test/java/com/loomcom/symon/CpuTest.java | 2 +- .../loomcom/symon/CpuZeroPageModeTest.java | 2 +- .../loomcom/symon/CpuZeroPageXModeTest.java | 2 +- .../loomcom/symon/CpuZeroPageYModeTest.java | 2 +- 16 files changed, 30 insertions(+), 22 deletions(-) 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);