mirror of
https://github.com/sethm/symon.git
synced 2025-04-14 05:37:39 +00:00
Merge pull request #4 from Max840/master
New way of defining devices and a bit of optimization
This commit is contained in:
commit
e9a9786135
@ -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 {
|
||||
|
@ -152,7 +152,7 @@ public class Simulator {
|
||||
this.via = new Via(VIA_BASE);
|
||||
this.bus = new Bus(BUS_BOTTOM, BUS_TOP);
|
||||
this.cpu = new Cpu();
|
||||
this.ram = new Memory(MEMORY_BASE, MEMORY_SIZE, false);
|
||||
this.ram = new Memory(MEMORY_BASE, MEMORY_BASE + MEMORY_SIZE - 1, false);
|
||||
|
||||
bus.addCpu(cpu);
|
||||
bus.addDevice(ram);
|
||||
@ -163,11 +163,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);
|
||||
}
|
||||
@ -568,7 +568,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;
|
||||
}
|
||||
|
||||
|
@ -35,20 +35,24 @@ public abstract class Device implements Comparable<Device> {
|
||||
/** The memory range for this device. */
|
||||
private MemoryRange memoryRange;
|
||||
|
||||
/** Size of the device in memory **/
|
||||
int size;
|
||||
|
||||
/** The name of the device. */
|
||||
private String name;
|
||||
|
||||
/** Reference to the bus where this Device is attached. */
|
||||
private Bus bus;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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. */
|
||||
@ -80,6 +84,10 @@ public abstract class Device implements Comparable<Device> {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getSize(){
|
||||
return size;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
@ -109,4 +109,4 @@ public class Memory extends Device {
|
||||
return "Memory: " + getMemoryRange().toString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user