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());