Merge branch 'master' into crtc

Conflicts:
	src/main/java/com/loomcom/symon/Simulator.java
	src/main/java/com/loomcom/symon/devices/Device.java
	src/main/java/com/loomcom/symon/devices/Memory.java
This commit is contained in:
Seth Morabito committed 2013-12-28 23:35:22 -08:00
commit 070e9db813
10 files changed
+51 -66

No files matched your search

+5 -31
View File
@@ -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 {
@@ -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
@@ -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;
}
@@ -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
@@ -37,6 +37,11 @@ import java.util.Set;
public abstract class Device implements Comparable<Device> {
/**
* Size of the device in memory
*/
int size;
/**
* The memory range for this device.
*/
@@ -57,15 +62,16 @@ public abstract class Device implements Comparable<Device> {
*/
private Set<DeviceChangeListener> 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<DeviceChangeListener>();
}
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<Device> {
this.name = name;
}
public int getSize() {
return size;
}
public void registerListener(DeviceChangeListener listener) {
deviceChangeListeners.add(listener);
}
@@ -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;
}
}
}
@@ -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