diff --git a/README.md b/README.md index 1b38d43..3705692 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ SYMON - A 6502 System Simulator **NOTE: THIS SOFTWARE IS UNDER ACTIVE DEVELOPMENT. Feedback is welcome!** -**Version:** 0.8.5 +**Version:** 0.9.0 -**Last Updated:** 30 March, 2013 +**Last Updated:** 29 December, 2013 -Copyright (c) 2008-2013 Seth J. Morabito <web@loomcom.com> +Copyright (c) 2013 Seth J. Morabito <web@loomcom.com> See the file COPYING for license. @@ -139,6 +139,8 @@ running. ## 5.0 Revision History + - **0.9.0:** 29 December, 2013 - First pass at a 6545 CRTC simulation. + - **0.8.5:** 30 March, 2013 - ASCII display for memory window. Allows user to select a step count from a drop-down box. diff --git a/pom.xml b/pom.xml index b0e1648..15572c5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.loomcom.symon symon jar - 0.8.5 + 0.9.0 symon http://www.loomcom.com/symon diff --git a/src/main/java/com/loomcom/symon/Bus.java b/src/main/java/com/loomcom/symon/Bus.java index ec8334b..3ba26d1 100644 --- a/src/main/java/com/loomcom/symon/Bus.java +++ b/src/main/java/com/loomcom/symon/Bus.java @@ -114,40 +114,14 @@ public class Bus { return false; } - // Loop over devices and ensure they are contiguous. - MemoryRange prev = null; - int i = 0; - int length = devices.size(); + // Loop over devices and add their size + int filledMemory = 0; for (Device d : devices) { - MemoryRange cur = d.getMemoryRange(); - if (i == 0) { - // If the first entry doesn't start at 'startAddress', return false. - if (cur.startAddress() != startAddress) { - return false; - } - } - - if (prev != null && i < length - 1) { - // Otherwise, compare previous map's end against this map's - // endAddress. They must be adjacent! - if (cur.startAddress() - 1 != prev.endAddress()) { - return false; - } - } - - if (i == length - 1) { - // If the last entry doesn't end at endAddress, return false; - if (cur.endAddress() != endAddress) { - return false; - } - } - - i++; - prev = cur; + filledMemory += d.getSize(); } - // Must be complete. - return true; + // Returns if the total size of the devices fill the bus' memory space + return filledMemory == endAddress - startAddress + 1; } public int read(int address) throws MemoryAccessException { diff --git a/src/main/java/com/loomcom/symon/Simulator.java b/src/main/java/com/loomcom/symon/Simulator.java index 7b2845c..b31199e 100644 --- a/src/main/java/com/loomcom/symon/Simulator.java +++ b/src/main/java/com/loomcom/symon/Simulator.java @@ -61,6 +61,7 @@ public class Simulator { private static final int MEMORY_SIZE = 0x8000; // VIA at $8000-$800F + private static final int VIA_BASE = 0x8000; // ACIA at $8800-$8803 @@ -152,10 +153,9 @@ public class Simulator { private static final String[] STEPS = {"1", "5", "10", "20", "50", "100"}; public Simulator() throws MemoryRangeException, IOException { - this.ram = new Memory(MEMORY_BASE, MEMORY_SIZE, false); - this.bus = new Bus(BUS_BOTTOM, BUS_TOP); this.cpu = new Cpu(); + this.ram = new Memory(MEMORY_BASE, MEMORY_BASE + MEMORY_SIZE - 1, false); this.via = new Via(VIA_BASE); this.acia = new Acia(ACIA_BASE); this.crtc = new Crtc(CRTC_BASE, ram); @@ -171,11 +171,11 @@ public class Simulator { File romImage = new File("rom.bin"); if (romImage.canRead()) { logger.info("Loading ROM image from file " + romImage); - this.rom = Memory.makeROM(ROM_BASE, ROM_SIZE, romImage); + this.rom = Memory.makeROM(ROM_BASE, ROM_BASE + ROM_SIZE - 1, romImage); } else { logger.info("Default ROM file " + romImage + " not found, loading empty R/W memory image."); - this.rom = Memory.makeRAM(ROM_BASE, ROM_SIZE); + this.rom = Memory.makeRAM(ROM_BASE, ROM_BASE + ROM_SIZE - 1); } bus.addDevice(rom); @@ -585,7 +585,7 @@ public class Simulator { bus.removeDevice(rom); } // Load the new ROM image - rom = Memory.makeROM(ROM_BASE, ROM_SIZE, romFile); + rom = Memory.makeROM(ROM_BASE, ROM_BASE + ROM_SIZE - 1, romFile); bus.addDevice(rom); // Now, reset diff --git a/src/main/java/com/loomcom/symon/devices/Acia.java b/src/main/java/com/loomcom/symon/devices/Acia.java index c51f43d..95e624a 100644 --- a/src/main/java/com/loomcom/symon/devices/Acia.java +++ b/src/main/java/com/loomcom/symon/devices/Acia.java @@ -75,7 +75,7 @@ public class Acia extends Device { private boolean txEmpty = true; public Acia(int address) throws MemoryRangeException { - super(address, ACIA_SIZE, "ACIA"); + super(address, address + ACIA_SIZE - 1, "ACIA"); this.baseAddress = address; } diff --git a/src/main/java/com/loomcom/symon/devices/Crtc.java b/src/main/java/com/loomcom/symon/devices/Crtc.java index 63ce799..d9d1b12 100644 --- a/src/main/java/com/loomcom/symon/devices/Crtc.java +++ b/src/main/java/com/loomcom/symon/devices/Crtc.java @@ -68,7 +68,7 @@ public class Crtc extends Device { private Memory memory; public Crtc(int deviceAddress, Memory memory) throws MemoryRangeException, IOException { - super(deviceAddress, 2, "CRTC"); + super(deviceAddress, deviceAddress + 2, "CRTC"); this.memory = memory; // Defaults diff --git a/src/main/java/com/loomcom/symon/devices/Device.java b/src/main/java/com/loomcom/symon/devices/Device.java index d6361eb..c2d40ea 100644 --- a/src/main/java/com/loomcom/symon/devices/Device.java +++ b/src/main/java/com/loomcom/symon/devices/Device.java @@ -37,6 +37,11 @@ import java.util.Set; public abstract class Device implements Comparable { + /** + * Size of the device in memory + */ + int size; + /** * The memory range for this device. */ @@ -57,15 +62,16 @@ public abstract class Device implements Comparable { */ private Set deviceChangeListeners; - public Device(int address, int size, String name) + public Device(int startAddress, int endAddress, String name) throws MemoryRangeException { - this.memoryRange = new MemoryRange(address, address + size - 1); + this.memoryRange = new MemoryRange(startAddress, endAddress); + this.size = endAddress - startAddress + 1; this.name = name; this.deviceChangeListeners = new HashSet(); } - public Device(int address, int size) throws MemoryRangeException { - this(address, size, null); + public Device(int startAddress, int endAddress) throws MemoryRangeException { + this(startAddress, endAddress, null); } /* Methods required to be implemented by inheriting classes. */ @@ -103,6 +109,10 @@ public abstract class Device implements Comparable { this.name = name; } + public int getSize() { + return size; + } + public void registerListener(DeviceChangeListener listener) { deviceChangeListeners.add(listener); } diff --git a/src/main/java/com/loomcom/symon/devices/Memory.java b/src/main/java/com/loomcom/symon/devices/Memory.java index 32c65ae..6042584 100644 --- a/src/main/java/com/loomcom/symon/devices/Memory.java +++ b/src/main/java/com/loomcom/symon/devices/Memory.java @@ -38,26 +38,26 @@ public class Memory extends Device { /* Initialize all locations to 0x00 (BRK) */ private static final int DEFAULT_FILL = 0x00; - public Memory(int address, int size, boolean readOnly) + public Memory(int startAddress, int endAddress, boolean readOnly) throws MemoryRangeException { - super(address, size, (readOnly ? "RO Memory" : "RW Memory")); + super(startAddress, endAddress, (readOnly ? "RO Memory" : "RW Memory")); this.readOnly = readOnly; - this.mem = new int[size]; + this.mem = new int[this.size]; this.fill(DEFAULT_FILL); } - public Memory(int address, int size) throws MemoryRangeException { - this(address, size, false); + public Memory(int startAddress, int endAddress) throws MemoryRangeException { + this(startAddress, endAddress, false); } - public static Memory makeROM(int address, int size, File f) throws MemoryRangeException, IOException { - Memory memory = new Memory(address, size, true); + public static Memory makeROM(int startAddress, int endAddress, File f) throws MemoryRangeException, IOException { + Memory memory = new Memory(startAddress, endAddress, true); memory.loadFromFile(f); return memory; } - public static Memory makeRAM(int address, int size) throws MemoryRangeException { - Memory memory = new Memory(address, size, false); + public static Memory makeRAM(int startAddress, int endAddress) throws MemoryRangeException { + Memory memory = new Memory(startAddress, endAddress, false); return memory; } @@ -112,4 +112,4 @@ public class Memory extends Device { public int[] getDmaAccess() { return mem; } -} \ No newline at end of file +} diff --git a/src/main/java/com/loomcom/symon/devices/Via.java b/src/main/java/com/loomcom/symon/devices/Via.java index b1013cb..7209535 100644 --- a/src/main/java/com/loomcom/symon/devices/Via.java +++ b/src/main/java/com/loomcom/symon/devices/Via.java @@ -47,7 +47,7 @@ public class Via extends Device { private static final int ORA_H = 15; public Via(int address) throws MemoryRangeException { - super(address, VIA_SIZE, "VIA"); + super(address, address + VIA_SIZE - 1, "VIA"); } @Override diff --git a/src/test/java/com/loomcom/symon/BusTest.java b/src/test/java/com/loomcom/symon/BusTest.java index b6a4e6e..f4aedd0 100644 --- a/src/test/java/com/loomcom/symon/BusTest.java +++ b/src/test/java/com/loomcom/symon/BusTest.java @@ -47,8 +47,8 @@ public class BusTest extends TestCase { } public void testAddDevice() throws MemoryRangeException { - Device memory = new Memory(0x0000, 0x0100, true); - Device rom = new Memory(0x0100, 0x0200, false); + Device memory = new Memory(0x0000, 0x00ff, true); + Device rom = new Memory(0x0100, 0x02ff, false); Bus b = new Bus(0x0000, 0xffff); @@ -85,8 +85,7 @@ public class BusTest extends TestCase { } public void testIsCompleteWithOneDevice() throws MemoryRangeException { - Device memory = new Memory(0x0000, 0x10000, true); - + Device memory = new Memory(0x0000, 0xffff, true); Bus b = new Bus(0x0000, 0xffff); assertFalse("Address space was unexpectedly complete!", b.isComplete()); b.addDevice(memory); @@ -94,8 +93,8 @@ public class BusTest extends TestCase { } public void testIsCompleteWithTwoDevices() throws MemoryRangeException { - Device memory = new Memory(0x0000, 0x8000, true); - Device rom = new Memory(0x8000, 0x8000, false); + Device memory = new Memory(0x0000, 0x7fff, true); + Device rom = new Memory(0x8000, 0xffff, false); Bus b = new Bus(0x0000, 0xffff); assertFalse("Address space was unexpectedly complete!", b.isComplete()); @@ -106,9 +105,9 @@ public class BusTest extends TestCase { } public void testIsCompleteWithThreeDevices() throws MemoryRangeException { - Device memory = new Memory(0x0000, 0x8000, true); - Device rom1 = new Memory(0x8000, 0x4000, false); - Device rom2 = new Memory(0xC000, 0x4000, false); + Device memory = new Memory(0x0000, 0x7fff, true); + Device rom1 = new Memory(0x8000, 0xBfff, false); + Device rom2 = new Memory(0xC000, 0xffff, false); Bus b = new Bus(0x0000, 0xffff); assertFalse("Address space was unexpectedly complete!", b.isComplete());