Renamed project to "Symon".
This commit is contained in:
1 parent
9a6a256073
commit
3f74489757
20 files changed
+102
-42
No files matched your search
@@ -0,0 +1,125 @@
|
||||
package com.loomcom.symon;
|
||||
|
||||
import junit.framework.*;
|
||||
|
||||
import com.loomcom.symon.devices.*;
|
||||
import com.loomcom.symon.exceptions.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class BusTest extends TestCase {
|
||||
|
||||
public BusTest(String testName) {
|
||||
super(testName);
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new TestSuite(BusTest.class);
|
||||
}
|
||||
|
||||
public void testCreatingWithStartAndEndAddresses() {
|
||||
Bus b = null;
|
||||
|
||||
b = new Bus(0x00, 0xff);
|
||||
assertEquals(0x00, b.startAddress());
|
||||
assertEquals(0xff, b.endAddress());
|
||||
|
||||
b = new Bus(0x20, 0xea);
|
||||
assertEquals(0x20, b.startAddress());
|
||||
assertEquals(0xea, b.endAddress());
|
||||
}
|
||||
|
||||
public void testCreatingWithSize() {
|
||||
Bus b = null;
|
||||
|
||||
b = new Bus(256);
|
||||
assertEquals(0x00, b.startAddress());
|
||||
assertEquals(0xff, b.endAddress());
|
||||
|
||||
b = new Bus(4096);
|
||||
assertEquals(0x000, b.startAddress());
|
||||
assertEquals(0xfff, b.endAddress());
|
||||
|
||||
b = new Bus(65536);
|
||||
assertEquals(0x0000, b.startAddress());
|
||||
assertEquals(0xffff, b.endAddress());
|
||||
}
|
||||
|
||||
public void testAddDevice() throws MemoryRangeException {
|
||||
Device memory = new Memory(0x0000, 0x0100, true);
|
||||
Device rom = new Memory(0x0100, 0x0200, false);
|
||||
|
||||
Bus b = new Bus(0x0000, 0xffff);
|
||||
|
||||
assertEquals(0, b.getDevices().size());
|
||||
b.addDevice(memory);
|
||||
assertEquals(1, b.getDevices().size());
|
||||
b.addDevice(rom);
|
||||
assertEquals(2, b.getDevices().size());
|
||||
}
|
||||
|
||||
public void testOverlappingDevicesShouldFail() throws MemoryRangeException {
|
||||
Device memory = new Memory(0x0000, 0x0100, true);
|
||||
Device rom = new Memory(0x00ff, 0x0200, false);
|
||||
|
||||
Bus b = new Bus(0x0000, 0xffff);
|
||||
|
||||
b.addDevice(memory);
|
||||
|
||||
try {
|
||||
b.addDevice(rom);
|
||||
fail("Should have thrown a MemoryRangeException.");
|
||||
} catch (MemoryRangeException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
public void testIsCompleteWithFirstDeviceNotStartingAtStartAddress() throws MemoryRangeException {
|
||||
Device memory = new Memory(0x00ff, 0xff00, true);
|
||||
|
||||
Bus b = new Bus(0x0000, 0xffff);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(memory);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
}
|
||||
|
||||
public void testIsCompleteWithOneDevice() throws MemoryRangeException {
|
||||
Device memory = new Memory(0x0000, 0x10000, true);
|
||||
|
||||
Bus b = new Bus(0x0000, 0xffff);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(memory);
|
||||
assertTrue("Address space should have been complete!", b.isComplete());
|
||||
}
|
||||
|
||||
public void testIsCompleteWithTwoDevices() throws MemoryRangeException {
|
||||
Device memory = new Memory(0x0000, 0x8000, true);
|
||||
Device rom = new Memory(0x8000, 0x8000, false);
|
||||
|
||||
Bus b = new Bus(0x0000, 0xffff);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(memory);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(rom);
|
||||
assertTrue("Address space should have been complete!", b.isComplete());
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
Bus b = new Bus(0x0000, 0xffff);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(memory);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(rom1);
|
||||
assertFalse("Address space was unexpectedly complete!", b.isComplete());
|
||||
b.addDevice(rom2);
|
||||
assertTrue("Address space should have been complete!", b.isComplete());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
package com.loomcom.symon;
|
||||
|
||||
import junit.framework.*;
|
||||
|
||||
import com.loomcom.symon.devices.*;
|
||||
import com.loomcom.symon.exceptions.*;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class CpuTest extends TestCase {
|
||||
|
||||
private Cpu cpu;
|
||||
private Bus bus;
|
||||
private Memory mem;
|
||||
|
||||
public CpuTest(String testName) {
|
||||
super(testName);
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new TestSuite(CpuTest.class);
|
||||
}
|
||||
|
||||
public void setUp() throws MemoryRangeException {
|
||||
this.cpu = new Cpu();
|
||||
this.bus = new Bus(0x0000, 0xffff);
|
||||
this.mem = new Memory(0x0000, 0x10000);
|
||||
bus.addCpu(cpu);
|
||||
bus.addDevice(new Memory(0x0000, 0x10000));
|
||||
|
||||
// All test programs start at 0x0200;
|
||||
bus.write(0xfffc, 0x00);
|
||||
bus.write(0xfffd, 0x02);
|
||||
|
||||
cpu.reset();
|
||||
}
|
||||
|
||||
public void testReset() {
|
||||
assertEquals(0, cpu.getAccumulator());
|
||||
assertEquals(0, cpu.getXRegister());
|
||||
assertEquals(0, cpu.getYRegister());
|
||||
assertEquals(0x0200, cpu.getProgramCounter());
|
||||
assertFalse(cpu.getCarryFlag());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getIrqDisableFlag());
|
||||
assertFalse(cpu.getDecimalModeFlag());
|
||||
assertFalse(cpu.getBreakFlag());
|
||||
assertFalse(cpu.getOverflowFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
/* LDA Immediate Mode Tests - 0xa9 */
|
||||
|
||||
public void test_LDA_IMM_SetsAccumulator() {
|
||||
bus.write(0x0200, 0xa9);
|
||||
bus.write(0x0201, 0x12);
|
||||
cpu.step();
|
||||
assertEquals(0x12, cpu.getAccumulator());
|
||||
}
|
||||
|
||||
public void test_LDA_IMM_SetsZeroFlagIfArgIsZero() {
|
||||
bus.write(0x0200, 0xa9);
|
||||
bus.write(0x0201, 0x00);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_LDA_IMM_DoesNotSetZeroFlagIfArgNotZero() {
|
||||
bus.write(0x0200, 0xa9);
|
||||
bus.write(0x0201, 0x12);
|
||||
cpu.step();
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_LDA_IMM_SetsNegativeFlagIfArgIsNegative() {
|
||||
bus.write(0x0200, 0xa9);
|
||||
bus.write(0x0201, 0x80);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_LDA_IMM_DoesNotSetNegativeFlagIfArgNotNegative() {
|
||||
bus.write(0x0200, 0xa9);
|
||||
bus.write(0x0201, 0x7f);
|
||||
cpu.step();
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
/* LDX Immediate Mode Tests - 0xa2 */
|
||||
|
||||
public void test_LDX_IMM_SetsXRegister() {
|
||||
bus.write(0x0200, 0xa2);
|
||||
bus.write(0x0201, 0x12);
|
||||
cpu.step();
|
||||
assertEquals(0x12, cpu.getXRegister());
|
||||
}
|
||||
|
||||
public void test_LDX_IMM_SetsZeroFlagIfArgIsZero() {
|
||||
bus.write(0x0200, 0xa2);
|
||||
bus.write(0x0201, 0x00);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_LDX_IMM_DoesNotSetZeroFlagIfArgNotZero() {
|
||||
bus.write(0x0200, 0xa2);
|
||||
bus.write(0x0201, 0x12);
|
||||
cpu.step();
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_LDX_IMM_SetsNegativeFlagIfArgIsNegative() {
|
||||
bus.write(0x0200, 0xa2);
|
||||
bus.write(0x0201, 0x80);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_LDX_IMM_DoesNotSetNegativeFlagIfArgNotNegative() {
|
||||
bus.write(0x0200, 0xa2);
|
||||
bus.write(0x0201, 0x7f);
|
||||
cpu.step();
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
/* LDY Immediate Mode Tests - 0xa0 */
|
||||
|
||||
public void test_LDY_IMM_SetsYRegister() {
|
||||
bus.write(0x0200, 0xa0);
|
||||
bus.write(0x0201, 0x12);
|
||||
cpu.step();
|
||||
assertEquals(0x12, cpu.getYRegister());
|
||||
}
|
||||
|
||||
public void test_LDY_IMM_SetsZeroFlagIfArgIsZero() {
|
||||
bus.write(0x0200, 0xa0);
|
||||
bus.write(0x0201, 0x00);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_LDY_IMM_DoesNotSetZeroFlagIfArgNotZero() {
|
||||
bus.write(0x0200, 0xa0);
|
||||
bus.write(0x0201, 0x12);
|
||||
cpu.step();
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_LDY_IMM_SetsNegativeFlagIfArgIsNegative() {
|
||||
bus.write(0x0200, 0xa0);
|
||||
bus.write(0x0201, 0x80);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_LDY_IMM_DoesNotSetNegativeFlagIfArgNotNegative() {
|
||||
bus.write(0x0200, 0xa0);
|
||||
bus.write(0x0201, 0x7f);
|
||||
cpu.step();
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.loomcom.symon;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class CpuUtilsTest extends TestCase {
|
||||
|
||||
public void testAddress() {
|
||||
assertEquals(0xf1ea, CpuUtils.address(0xea, 0xf1));
|
||||
assertEquals(0x00ea, CpuUtils.address(0xea, 0x00));
|
||||
assertEquals(0xf100, CpuUtils.address(0x00, 0xf1));
|
||||
assertEquals(0x1234, CpuUtils.address(0x34, 0x12));
|
||||
assertEquals(0xffff, CpuUtils.address(0xff, 0xff));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
package com.loomcom.symon;
|
||||
|
||||
import junit.framework.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.loomcom.symon.exceptions.*;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class MemoryRangeTest extends TestCase {
|
||||
|
||||
public MemoryRangeTest(String testName) {
|
||||
super(testName);
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new TestSuite(MemoryRangeTest.class);
|
||||
}
|
||||
|
||||
public void testConstructorThrowsWhenInvalid() {
|
||||
// All of these should raise MemoryRangeException
|
||||
doInvalidMemoryRangeTest(0, -1);
|
||||
doInvalidMemoryRangeTest(-1, 0);
|
||||
doInvalidMemoryRangeTest(0, 0);
|
||||
doInvalidMemoryRangeTest(1, 1);
|
||||
doInvalidMemoryRangeTest(1, 0);
|
||||
doInvalidMemoryRangeTest(2, 1);
|
||||
}
|
||||
|
||||
public void testConstructorShouldNotThrow() throws MemoryRangeException {
|
||||
// None of these should throw.
|
||||
new MemoryRange(0, 1);
|
||||
new MemoryRange(0, 2);
|
||||
new MemoryRange(1, 2);
|
||||
new MemoryRange(2, 10);
|
||||
}
|
||||
|
||||
public void testStartAddress() throws MemoryRangeException {
|
||||
MemoryRange r = new MemoryRange(0x101, 0x202);
|
||||
assertEquals(0x101, r.startAddress());
|
||||
}
|
||||
|
||||
public void testEndAddress() throws MemoryRangeException {
|
||||
MemoryRange r = new MemoryRange(0x101, 0x202);
|
||||
assertEquals(0x202, r.endAddress());
|
||||
}
|
||||
|
||||
public void testOverlaps() throws MemoryRangeException {
|
||||
MemoryRange a = new MemoryRange(0x0100, 0x01ff);
|
||||
MemoryRange b = new MemoryRange(0x0200, 0x02ff);
|
||||
|
||||
MemoryRange c = new MemoryRange(0x01a0, 0x01af); // inside a
|
||||
MemoryRange d = new MemoryRange(0x00ff, 0x01a0); // overlaps a
|
||||
MemoryRange e = new MemoryRange(0x01a0, 0x02ff); // overlaps a
|
||||
|
||||
MemoryRange f = new MemoryRange(0x02a0, 0x02af); // inside b
|
||||
MemoryRange g = new MemoryRange(0x01ff, 0x02a0); // overlaps b
|
||||
MemoryRange h = new MemoryRange(0x02a0, 0x03ff); // overlaps b
|
||||
|
||||
assertFalse(a.overlaps(b));
|
||||
assertFalse(b.overlaps(a));
|
||||
|
||||
assertTrue(a.overlaps(c));
|
||||
assertTrue(c.overlaps(a));
|
||||
|
||||
assertTrue(a.overlaps(d));
|
||||
assertTrue(d.overlaps(a));
|
||||
|
||||
assertTrue(a.overlaps(e));
|
||||
assertTrue(e.overlaps(a));
|
||||
|
||||
assertTrue(b.overlaps(f));
|
||||
assertTrue(f.overlaps(b));
|
||||
|
||||
assertTrue(b.overlaps(g));
|
||||
assertTrue(g.overlaps(b));
|
||||
|
||||
assertTrue(b.overlaps(h));
|
||||
assertTrue(h.overlaps(b));
|
||||
}
|
||||
|
||||
public void testToString() throws MemoryRangeException {
|
||||
MemoryRange a = new MemoryRange(0x0abf, 0xff00);
|
||||
assertEquals("@0x0abf-0xff00", a.toString());
|
||||
|
||||
MemoryRange b = new MemoryRange(0, 255);
|
||||
assertEquals("@0x0000-0x00ff", b.toString());
|
||||
|
||||
MemoryRange c = new MemoryRange(0, 65535);
|
||||
assertEquals("@0x0000-0xffff", c.toString());
|
||||
}
|
||||
|
||||
public void testIncluded() throws MemoryRangeException {
|
||||
MemoryRange a = new MemoryRange(0x0100, 0x0fff);
|
||||
|
||||
assertFalse(a.includes(0x0000));
|
||||
assertFalse(a.includes(0x00ff));
|
||||
assertTrue(a.includes(0x0100));
|
||||
assertTrue(a.includes(0x0fff));
|
||||
assertFalse(a.includes(0x1000));
|
||||
assertFalse(a.includes(0xffff));
|
||||
}
|
||||
|
||||
public void testCompareTo() throws MemoryRangeException {
|
||||
MemoryRange a = new MemoryRange(0x0000, 0x0100);
|
||||
MemoryRange b = new MemoryRange(0x0200, 0x0300);
|
||||
MemoryRange c = new MemoryRange(0x0200, 0x0300);
|
||||
// a < b
|
||||
assertTrue(a.compareTo(b) == -1);
|
||||
// b > a
|
||||
assertTrue(b.compareTo(a) == 1);
|
||||
// Identity
|
||||
assertTrue(a.compareTo(a) == 0);
|
||||
assertTrue(b.compareTo(b) == 0);
|
||||
// Equality
|
||||
assertTrue(b.compareTo(c) == 0);
|
||||
assertTrue(c.compareTo(b) == 0);
|
||||
// Null
|
||||
try {
|
||||
a.compareTo(null);
|
||||
fail("Should have thrown NullPointerException");
|
||||
} catch (NullPointerException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
// Helper method.
|
||||
public void doInvalidMemoryRangeTest(int start, int end) {
|
||||
try {
|
||||
new MemoryRange(start, end);
|
||||
fail("MemoryRangeException should have been thrown.");
|
||||
} catch (MemoryRangeException e) {
|
||||
// Expected.
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.loomcom.symon;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
/**
|
||||
* Unit test for the j6502 Simulator class.
|
||||
*/
|
||||
public class SimulatorTest extends TestCase {
|
||||
/**
|
||||
* Create the test case
|
||||
*
|
||||
* @param testName name of the test case
|
||||
*/
|
||||
public SimulatorTest(String testName) {
|
||||
super(testName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the suite of tests being tested
|
||||
*/
|
||||
public static Test suite() {
|
||||
return new TestSuite(SimulatorTest.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rigourous Test :-)
|
||||
*/
|
||||
public void testSimulator() {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user