Execution Trace Log

Introduces an execution trace window that will keep track of the most
recent 10000 execution steps. I'm not entirely happy with the
implementation, yet.
This commit is contained in:
Seth Morabito committed 2012-12-09 17:04:31 -08:00
1 parent 38a4458aff
commit bc3de80892
11 files changed
+1268 -1256

No files matched your search

@@ -26,8 +26,8 @@ public class CpuAccumulatorModeTest extends TestCase {
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
@@ -7,31 +7,31 @@ import junit.framework.*;
public class CpuImpliedModeTest extends TestCase {
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
public void setUp() throws MemoryRangeException, MemoryAccessException {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
public void setUp() throws MemoryRangeException, MemoryAccessException {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00)>>>8);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00) >>> 8);
cpu.reset();
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
/*
* The following opcodes are tested for correctness in this file:
@@ -69,529 +69,529 @@ public class CpuImpliedModeTest extends TestCase {
/* BRK Tests - 0x00 */
public void test_BRK() throws MemoryAccessException {
cpu.setCarryFlag();
cpu.setOverflowFlag();
assertEquals(0x20|Cpu.P_CARRY|Cpu.P_OVERFLOW,
cpu.getProcessorStatus());
assertEquals(0x00, cpu.stackPeek());
assertFalse(cpu.getBreakFlag());
assertEquals(0x0200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
public void test_BRK() throws MemoryAccessException {
cpu.setCarryFlag();
cpu.setOverflowFlag();
assertEquals(0x20 | Cpu.P_CARRY | Cpu.P_OVERFLOW,
cpu.getProcessorStatus());
assertEquals(0x00, cpu.stackPeek());
assertFalse(cpu.getBreakFlag());
assertEquals(0x0200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
// Set the IRQ vector
bus.write(Cpu.IRQ_VECTOR_H, 0x12);
bus.write(Cpu.IRQ_VECTOR_L, 0x34);
// Set the IRQ vector
bus.write(Cpu.IRQ_VECTOR_H, 0x12);
bus.write(Cpu.IRQ_VECTOR_L, 0x34);
bus.loadProgram(0xea,
0xea,
0xea,
0x00,
0xea,
0xea);
bus.loadProgram(0xea,
0xea,
0xea,
0x00,
0xea,
0xea);
cpu.step(3); // Three NOP instructions
cpu.step(3); // Three NOP instructions
assertEquals(0x203, cpu.getProgramCounter());
assertEquals(0x203, cpu.getProgramCounter());
cpu.step(); // Triggers the BRK
cpu.step(); // Triggers the BRK
// Was at PC = 0x204. PC+2 should now be on the stack
assertEquals(0x02, bus.read(0x1ff)); // PC high byte
assertEquals(0x06, bus.read(0x1fe)); // PC low byte
assertEquals(0x20|Cpu.P_CARRY|Cpu.P_OVERFLOW|Cpu.P_BREAK,
bus.read(0x1fd)); // Processor Status, with B set
// Was at PC = 0x204. PC+2 should now be on the stack
assertEquals(0x02, bus.read(0x1ff)); // PC high byte
assertEquals(0x06, bus.read(0x1fe)); // PC low byte
assertEquals(0x20 | Cpu.P_CARRY | Cpu.P_OVERFLOW | Cpu.P_BREAK,
bus.read(0x1fd)); // Processor Status, with B set
// Interrupt vector held 0x1234, so we should be there.
assertEquals(0x1234, cpu.getProgramCounter());
assertEquals(0xfc, cpu.getStackPointer());
// Interrupt vector held 0x1234, so we should be there.
assertEquals(0x1234, cpu.getProgramCounter());
assertEquals(0xfc, cpu.getStackPointer());
// B and I flags should have been set on P
assertEquals(0x20|Cpu.P_CARRY|Cpu.P_OVERFLOW|Cpu.P_BREAK|
Cpu.P_IRQ_DISABLE,
cpu.getProcessorStatus());
}
// B and I flags should have been set on P
assertEquals(0x20 | Cpu.P_CARRY | Cpu.P_OVERFLOW | Cpu.P_BREAK |
Cpu.P_IRQ_DISABLE,
cpu.getProcessorStatus());
}
public void test_BRK_HonorsIrqDisableFlag() throws MemoryAccessException {
cpu.setIrqDisableFlag();
public void test_BRK_HonorsIrqDisableFlag() throws MemoryAccessException {
cpu.setIrqDisableFlag();
bus.loadProgram(0xea,
0xea,
0xea,
0x00,
0xea,
0xea);
bus.loadProgram(0xea,
0xea,
0xea,
0x00,
0xea,
0xea);
cpu.step(3); // Three NOP instructions
cpu.step(3); // Three NOP instructions
assertEquals(0x203, cpu.getProgramCounter());
assertEquals(0x203, cpu.getProgramCounter());
// Triggers the BRK, which should do nothing because
// of the Interrupt Disable flag
cpu.step();
// Triggers the BRK, which should do nothing because
// of the Interrupt Disable flag
cpu.step();
// Reset to original contents of PC
assertEquals(0x0204, cpu.getProgramCounter());
// Empty stack
assertEquals(0xff, cpu.getStackPointer());
// Reset to original contents of PC
assertEquals(0x0204, cpu.getProgramCounter());
// Empty stack
assertEquals(0xff, cpu.getStackPointer());
cpu.step(2); // Two more NOPs
cpu.step(2); // Two more NOPs
// Reset to original contents of PC
assertEquals(0x0206, cpu.getProgramCounter());
// Empty stack
assertEquals(0xff, cpu.getStackPointer());
}
// Reset to original contents of PC
assertEquals(0x0206, cpu.getProgramCounter());
// Empty stack
assertEquals(0xff, cpu.getStackPointer());
}
/* CLC - Clear Carry Flag - $18 */
public void test_CLC() throws MemoryAccessException {
cpu.setCarryFlag();
assertTrue(cpu.getCarryFlag());
/* CLC - Clear Carry Flag - $18 */
public void test_CLC() throws MemoryAccessException {
cpu.setCarryFlag();
assertTrue(cpu.getCarryFlag());
bus.loadProgram(0x18);
cpu.step();
bus.loadProgram(0x18);
cpu.step();
assertFalse(cpu.getCarryFlag());
}
assertFalse(cpu.getCarryFlag());
}
/* CLD - Clear Decimal Mode Flag - $d8 */
public void test_CLD() throws MemoryAccessException {
cpu.setDecimalModeFlag();
assertTrue(cpu.getDecimalModeFlag());
/* CLD - Clear Decimal Mode Flag - $d8 */
public void test_CLD() throws MemoryAccessException {
cpu.setDecimalModeFlag();
assertTrue(cpu.getDecimalModeFlag());
bus.loadProgram(0xd8);
cpu.step();
bus.loadProgram(0xd8);
cpu.step();
assertFalse(cpu.getDecimalModeFlag());
}
assertFalse(cpu.getDecimalModeFlag());
}
/* CLI - Clear Interrupt Disabled Flag - $58 */
public void test_CLI() throws MemoryAccessException {
cpu.setIrqDisableFlag();
assertTrue(cpu.getIrqDisableFlag());
/* CLI - Clear Interrupt Disabled Flag - $58 */
public void test_CLI() throws MemoryAccessException {
cpu.setIrqDisableFlag();
assertTrue(cpu.getIrqDisableFlag());
bus.loadProgram(0x58);
cpu.step();
bus.loadProgram(0x58);
cpu.step();
assertFalse(cpu.getIrqDisableFlag());
}
assertFalse(cpu.getIrqDisableFlag());
}
/* CLV - Clear Overflow Flag - $b8 */
public void test_CLV() throws MemoryAccessException {
cpu.setOverflowFlag();
assertTrue(cpu.getOverflowFlag());
/* CLV - Clear Overflow Flag - $b8 */
public void test_CLV() throws MemoryAccessException {
cpu.setOverflowFlag();
assertTrue(cpu.getOverflowFlag());
bus.loadProgram(0xb8);
cpu.step();
bus.loadProgram(0xb8);
cpu.step();
assertFalse(cpu.getOverflowFlag());
}
assertFalse(cpu.getOverflowFlag());
}
/* DEX - Decrement the X register - $ca */
public void test_DEX() throws MemoryAccessException {
bus.loadProgram(0xca);
cpu.setXRegister(0x02);
cpu.step();
assertEquals(0x01, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEX() throws MemoryAccessException {
bus.loadProgram(0xca);
cpu.setXRegister(0x02);
cpu.step();
assertEquals(0x01, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEX_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0xca);
cpu.setXRegister(0x01);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEX_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0xca);
cpu.setXRegister(0x01);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEX_SetsNegativeFlagWhen() throws MemoryAccessException {
bus.loadProgram(0xca);
cpu.step();
assertEquals(0xff, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_DEX_SetsNegativeFlagWhen() throws MemoryAccessException {
bus.loadProgram(0xca);
cpu.step();
assertEquals(0xff, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
/* DEY - Decrement the Y register - $88 */
public void test_DEY() throws MemoryAccessException {
bus.loadProgram(0x88);
cpu.setYRegister(0x02);
cpu.step();
assertEquals(0x01, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEY() throws MemoryAccessException {
bus.loadProgram(0x88);
cpu.setYRegister(0x02);
cpu.step();
assertEquals(0x01, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEY_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0x88);
cpu.setYRegister(0x01);
cpu.step();
assertEquals(0x00, cpu.getYRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEY_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0x88);
cpu.setYRegister(0x01);
cpu.step();
assertEquals(0x00, cpu.getYRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_DEY_SetsNegativeFlagWhen() throws MemoryAccessException {
bus.loadProgram(0x88);
cpu.step();
assertEquals(0xff, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_DEY_SetsNegativeFlagWhen() throws MemoryAccessException {
bus.loadProgram(0x88);
cpu.step();
assertEquals(0xff, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
/* INX - Increment the X register - $e8 */
public void test_INX() throws MemoryAccessException {
bus.loadProgram(0xe8);
cpu.step();
assertEquals(0x01, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_INX() throws MemoryAccessException {
bus.loadProgram(0xe8);
cpu.step();
assertEquals(0x01, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_INX_SetsNegativeFlagWhenNegative() throws MemoryAccessException {
bus.loadProgram(0xe8);
cpu.setXRegister(0x7f);
cpu.step();
assertEquals(0x80, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_INX_SetsNegativeFlagWhenNegative() throws MemoryAccessException {
bus.loadProgram(0xe8);
cpu.setXRegister(0x7f);
cpu.step();
assertEquals(0x80, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_INX_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0xe8);
cpu.setXRegister(0xff);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_INX_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0xe8);
cpu.setXRegister(0xff);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
/* INY - Increment the Y register - $c8 */
public void test_INY() throws MemoryAccessException {
bus.loadProgram(0xc8);
cpu.step();
assertEquals(0x01, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_INY() throws MemoryAccessException {
bus.loadProgram(0xc8);
cpu.step();
assertEquals(0x01, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_INY_SetsNegativeFlagWhenNegative() throws MemoryAccessException {
bus.loadProgram(0xc8);
cpu.setYRegister(0x7f);
cpu.step();
assertEquals(0x80, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_INY_SetsNegativeFlagWhenNegative() throws MemoryAccessException {
bus.loadProgram(0xc8);
cpu.setYRegister(0x7f);
cpu.step();
assertEquals(0x80, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_INY_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0xc8);
cpu.setYRegister(0xff);
cpu.step();
assertEquals(0x00, cpu.getYRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_INY_SetsZeroFlagWhenZero() throws MemoryAccessException {
bus.loadProgram(0xc8);
cpu.setYRegister(0xff);
cpu.step();
assertEquals(0x00, cpu.getYRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
/* NOP - No Operation - $ea */
public void test_NOP() throws MemoryAccessException {
bus.loadProgram(0xea);
cpu.step();
// Should just not change anything except PC
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x201, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
public void test_NOP() throws MemoryAccessException {
bus.loadProgram(0xea);
cpu.step();
// Should just not change anything except PC
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x201, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
/* PHA - Push Accumulator - $48 */
public void test_PHA() throws MemoryAccessException {
bus.loadProgram(0x48);
cpu.setAccumulator(0x3a);
cpu.step();
assertEquals(0xfe, cpu.getStackPointer());
assertEquals(0x3a, cpu.stackPeek());
}
public void test_PHA() throws MemoryAccessException {
bus.loadProgram(0x48);
cpu.setAccumulator(0x3a);
cpu.step();
assertEquals(0xfe, cpu.getStackPointer());
assertEquals(0x3a, cpu.stackPeek());
}
/* PHP - Push Processor Status - $08 */
public void test_PHP() throws MemoryAccessException {
bus.loadProgram(0x08);
cpu.setProcessorStatus(0x27);
cpu.step();
assertEquals(0xfe, cpu.getStackPointer());
assertEquals(0x27, cpu.stackPeek());
}
public void test_PHP() throws MemoryAccessException {
bus.loadProgram(0x08);
cpu.setProcessorStatus(0x27);
cpu.step();
assertEquals(0xfe, cpu.getStackPointer());
assertEquals(0x27, cpu.stackPeek());
}
/* PLA - Pul Accumulator - $68 */
public void test_PLA() throws MemoryAccessException {
cpu.stackPush(0x32);
bus.loadProgram(0x68);
cpu.step();
assertEquals(0x32, cpu.getAccumulator());
assertFalse(cpu.getNegativeFlag());
assertFalse(cpu.getZeroFlag());
}
public void test_PLA() throws MemoryAccessException {
cpu.stackPush(0x32);
bus.loadProgram(0x68);
cpu.step();
assertEquals(0x32, cpu.getAccumulator());
assertFalse(cpu.getNegativeFlag());
assertFalse(cpu.getZeroFlag());
}
public void test_PLA_SetsZeroIfAccumulatorIsZero() throws MemoryAccessException {
cpu.stackPush(0x00);
bus.loadProgram(0x68);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertFalse(cpu.getNegativeFlag());
assertTrue(cpu.getZeroFlag());
}
public void test_PLA_SetsZeroIfAccumulatorIsZero() throws MemoryAccessException {
cpu.stackPush(0x00);
bus.loadProgram(0x68);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertFalse(cpu.getNegativeFlag());
assertTrue(cpu.getZeroFlag());
}
public void test_PLA_SetsNegativeIfAccumulatorIsNegative() throws MemoryAccessException {
cpu.stackPush(0xff);
bus.loadProgram(0x68);
cpu.step();
assertEquals(0xff, cpu.getAccumulator());
assertTrue(cpu.getNegativeFlag());
assertFalse(cpu.getZeroFlag());
}
public void test_PLA_SetsNegativeIfAccumulatorIsNegative() throws MemoryAccessException {
cpu.stackPush(0xff);
bus.loadProgram(0x68);
cpu.step();
assertEquals(0xff, cpu.getAccumulator());
assertTrue(cpu.getNegativeFlag());
assertFalse(cpu.getZeroFlag());
}
/* PLP - Pull Processor Status - $28 */
public void test_PLP() throws MemoryAccessException {
cpu.stackPush(0x2f);
bus.loadProgram(0x28);
cpu.step();
assertEquals(0x2f, cpu.getProcessorStatus());
}
public void test_PLP() throws MemoryAccessException {
cpu.stackPush(0x2f);
bus.loadProgram(0x28);
cpu.step();
assertEquals(0x2f, cpu.getProcessorStatus());
}
/* RTI - Return from Interrupt - $40 */
public void test_RTI() throws MemoryAccessException {
cpu.stackPush(0x0f); // PC hi
cpu.stackPush(0x11); // PC lo
cpu.stackPush(0x29); // status
public void test_RTI() throws MemoryAccessException {
cpu.stackPush(0x0f); // PC hi
cpu.stackPush(0x11); // PC lo
cpu.stackPush(0x29); // status
bus.loadProgram(0x40);
cpu.step();
bus.loadProgram(0x40);
cpu.step();
assertEquals(0x0f11, cpu.getProgramCounter());
assertEquals(0x29, cpu.getProcessorStatus());
}
assertEquals(0x0f11, cpu.getProgramCounter());
assertEquals(0x29, cpu.getProcessorStatus());
}
/* RTS - Return from Subroutine - $60 */
public void test_RTS() throws MemoryAccessException {
cpu.stackPush(0x0f); // PC hi
cpu.stackPush(0x11); // PC lo
public void test_RTS() throws MemoryAccessException {
cpu.stackPush(0x0f); // PC hi
cpu.stackPush(0x11); // PC lo
bus.loadProgram(0x60);
cpu.step();
bus.loadProgram(0x60);
cpu.step();
assertEquals(0x0f12, cpu.getProgramCounter());
assertEquals(0x20, cpu.getProcessorStatus());
}
assertEquals(0x0f12, cpu.getProgramCounter());
assertEquals(0x20, cpu.getProcessorStatus());
}
/* SEC - Set Carry Flag - $38 */
public void test_SEC() throws MemoryAccessException {
bus.loadProgram(0x38);
cpu.step();
assertTrue(cpu.getCarryFlag());
}
public void test_SEC() throws MemoryAccessException {
bus.loadProgram(0x38);
cpu.step();
assertTrue(cpu.getCarryFlag());
}
/* SED - Set Decimal Mode Flag - $f8 */
public void test_SED() throws MemoryAccessException {
bus.loadProgram(0xf8);
cpu.step();
assertTrue(cpu.getDecimalModeFlag());
}
public void test_SED() throws MemoryAccessException {
bus.loadProgram(0xf8);
cpu.step();
assertTrue(cpu.getDecimalModeFlag());
}
/* SEI - Set Interrupt Disable Flag - $78 */
public void test_SEI() throws MemoryAccessException {
bus.loadProgram(0x78);
cpu.step();
assertTrue(cpu.getIrqDisableFlag());
}
public void test_SEI() throws MemoryAccessException {
bus.loadProgram(0x78);
cpu.step();
assertTrue(cpu.getIrqDisableFlag());
}
/* TAX - Transfer Accumulator to X Register - $aa */
public void test_TAX() throws MemoryAccessException {
cpu.setAccumulator(0x32);
bus.loadProgram(0xaa);
cpu.step();
assertEquals(0x32, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAX() throws MemoryAccessException {
cpu.setAccumulator(0x32);
bus.loadProgram(0xaa);
cpu.step();
assertEquals(0x32, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAX_SetsZeroFlagIfXIsZero() throws MemoryAccessException {
cpu.setAccumulator(0x00);
bus.loadProgram(0xaa);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAX_SetsZeroFlagIfXIsZero() throws MemoryAccessException {
cpu.setAccumulator(0x00);
bus.loadProgram(0xaa);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAX_SetsNegativeFlagIfXIsNegative() throws MemoryAccessException {
cpu.setAccumulator(0xff);
bus.loadProgram(0xaa);
cpu.step();
assertEquals(0xff, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_TAX_SetsNegativeFlagIfXIsNegative() throws MemoryAccessException {
cpu.setAccumulator(0xff);
bus.loadProgram(0xaa);
cpu.step();
assertEquals(0xff, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
/* TAY - Transfer Accumulator to Y Register - $a8 */
public void test_TAY() throws MemoryAccessException {
cpu.setAccumulator(0x32);
bus.loadProgram(0xa8);
cpu.step();
assertEquals(0x32, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAY() throws MemoryAccessException {
cpu.setAccumulator(0x32);
bus.loadProgram(0xa8);
cpu.step();
assertEquals(0x32, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAY_SetsZeroFlagIfYIsZero() throws MemoryAccessException {
cpu.setAccumulator(0x00);
bus.loadProgram(0xa8);
cpu.step();
assertEquals(0x00, cpu.getYRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAY_SetsZeroFlagIfYIsZero() throws MemoryAccessException {
cpu.setAccumulator(0x00);
bus.loadProgram(0xa8);
cpu.step();
assertEquals(0x00, cpu.getYRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TAY_SetsNegativeFlagIfYIsNegative() throws MemoryAccessException {
cpu.setAccumulator(0xff);
bus.loadProgram(0xa8);
cpu.step();
assertEquals(0xff, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_TAY_SetsNegativeFlagIfYIsNegative() throws MemoryAccessException {
cpu.setAccumulator(0xff);
bus.loadProgram(0xa8);
cpu.step();
assertEquals(0xff, cpu.getYRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
/* TSX - Transfer Stack Pointer to X Register - $ba */
public void test_TSX() throws MemoryAccessException {
cpu.setStackPointer(0x32);
bus.loadProgram(0xba);
cpu.step();
assertEquals(0x32, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TSX() throws MemoryAccessException {
cpu.setStackPointer(0x32);
bus.loadProgram(0xba);
cpu.step();
assertEquals(0x32, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TSX_SetsZeroFlagIfXIsZero() throws MemoryAccessException {
cpu.setStackPointer(0x00);
bus.loadProgram(0xba);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TSX_SetsZeroFlagIfXIsZero() throws MemoryAccessException {
cpu.setStackPointer(0x00);
bus.loadProgram(0xba);
cpu.step();
assertEquals(0x00, cpu.getXRegister());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TSX_SetsNegativeFlagIfXIsNegative() throws MemoryAccessException {
cpu.setStackPointer(0xff);
bus.loadProgram(0xba);
cpu.step();
assertEquals(0xff, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_TSX_SetsNegativeFlagIfXIsNegative() throws MemoryAccessException {
cpu.setStackPointer(0xff);
bus.loadProgram(0xba);
cpu.step();
assertEquals(0xff, cpu.getXRegister());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
/* TXA - Transfer X Register to Accumulator - $8a */
public void test_TXA() throws MemoryAccessException {
cpu.setXRegister(0x32);
bus.loadProgram(0x8a);
cpu.step();
assertEquals(0x32, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TXA() throws MemoryAccessException {
cpu.setXRegister(0x32);
bus.loadProgram(0x8a);
cpu.step();
assertEquals(0x32, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TXA_SetsZeroFlagIfAccumulatorIsZero() throws MemoryAccessException {
cpu.setXRegister(0x00);
bus.loadProgram(0x8a);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TXA_SetsZeroFlagIfAccumulatorIsZero() throws MemoryAccessException {
cpu.setXRegister(0x00);
bus.loadProgram(0x8a);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TXA_SetsNegativeFlagIfAccumulatorIsNegative() throws MemoryAccessException {
cpu.setXRegister(0xff);
bus.loadProgram(0x8a);
cpu.step();
assertEquals(0xff, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_TXA_SetsNegativeFlagIfAccumulatorIsNegative() throws MemoryAccessException {
cpu.setXRegister(0xff);
bus.loadProgram(0x8a);
cpu.step();
assertEquals(0xff, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
/* TXS - Transfer X Register to Stack Pointer - $9a */
public void test_TXS() throws MemoryAccessException {
cpu.setXRegister(0x32);
bus.loadProgram(0x9a);
cpu.step();
assertEquals(0x32, cpu.getStackPointer());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TXS() throws MemoryAccessException {
cpu.setXRegister(0x32);
bus.loadProgram(0x9a);
cpu.step();
assertEquals(0x32, cpu.getStackPointer());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TXS_DoesNotAffectProcessorStatus() throws MemoryAccessException {
cpu.setXRegister(0x00);
bus.loadProgram(0x9a);
cpu.step();
assertEquals(0x00, cpu.getStackPointer());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
public void test_TXS_DoesNotAffectProcessorStatus() throws MemoryAccessException {
cpu.setXRegister(0x00);
bus.loadProgram(0x9a);
cpu.step();
assertEquals(0x00, cpu.getStackPointer());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
cpu.setXRegister(0x80);
bus.loadProgram(0x9a);
cpu.step();
assertEquals(0x80, cpu.getStackPointer());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
cpu.setXRegister(0x80);
bus.loadProgram(0x9a);
cpu.step();
assertEquals(0x80, cpu.getStackPointer());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
/* TYA - Transfer Y Register to Accumulator - $98 */
public void test_TYA() throws MemoryAccessException {
cpu.setYRegister(0x32);
bus.loadProgram(0x98);
cpu.step();
assertEquals(0x32, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TYA() throws MemoryAccessException {
cpu.setYRegister(0x32);
bus.loadProgram(0x98);
cpu.step();
assertEquals(0x32, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TYA_SetsZeroFlagIfAccumulatorIsZero() throws MemoryAccessException {
cpu.setYRegister(0x00);
bus.loadProgram(0x98);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TYA_SetsZeroFlagIfAccumulatorIsZero() throws MemoryAccessException {
cpu.setYRegister(0x00);
bus.loadProgram(0x98);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertTrue(cpu.getZeroFlag());
assertFalse(cpu.getNegativeFlag());
}
public void test_TYA_SetsNegativeFlagIfAccumulatorIsNegative() throws MemoryAccessException {
cpu.setYRegister(0xff);
bus.loadProgram(0x98);
cpu.step();
assertEquals(0xff, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
public void test_TYA_SetsNegativeFlagIfAccumulatorIsNegative() throws MemoryAccessException {
cpu.setYRegister(0xff);
bus.loadProgram(0x98);
cpu.step();
assertEquals(0xff, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
assertTrue(cpu.getNegativeFlag());
}
}
@@ -3,79 +3,80 @@ package com.loomcom.symon;
import com.loomcom.symon.devices.Memory;
import org.junit.*;
import static org.junit.Assert.*;
public class CpuIndexedIndirectModeTest {
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
@Before
public void runBeforeEveryTest() throws Exception {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
@Before
public void runBeforeEveryTest() throws Exception {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00)>>>8);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00) >>> 8);
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
@Test
public void test_LDA() throws Exception {
bus.write(0x008c, 0x3f);
bus.write(0x008d, 0xc4);
bus.write(0xc43f, 0x45);
@Test
public void test_LDA() throws Exception {
bus.write(0x008c, 0x3f);
bus.write(0x008d, 0xc4);
bus.write(0xc43f, 0x45);
cpu.setXRegister(0x0c);
cpu.setXRegister(0x0c);
bus.loadProgram(0xa1, 0x80); // LDA ($80,X)
cpu.step(1);
bus.loadProgram(0xa1, 0x80); // LDA ($80,X)
cpu.step(1);
assertEquals(0x45, cpu.getAccumulator());
}
assertEquals(0x45, cpu.getAccumulator());
}
@Test
public void test_ORA() throws Exception {
bus.write(0x0012, 0x1f);
bus.write(0x0013, 0xc5);
bus.write(0xc51f, 0x31);
@Test
public void test_ORA() throws Exception {
bus.write(0x0012, 0x1f);
bus.write(0x0013, 0xc5);
bus.write(0xc51f, 0x31);
cpu.setXRegister(0x02);
cpu.setAccumulator(0x15);
cpu.setXRegister(0x02);
cpu.setAccumulator(0x15);
bus.loadProgram(0x01, 0x10); // ORA ($10,X)
cpu.step(1);
bus.loadProgram(0x01, 0x10); // ORA ($10,X)
cpu.step(1);
assertEquals(0x35, cpu.getAccumulator());
assertEquals(0x31, bus.read(0xc51f));
}
assertEquals(0x35, cpu.getAccumulator());
assertEquals(0x31, bus.read(0xc51f));
}
@Test
public void test_AND() throws Exception {
bus.write(0x0012, 0x1f);
bus.write(0x0013, 0xc5);
bus.write(0xc51f, 0x31);
@Test
public void test_AND() throws Exception {
bus.write(0x0012, 0x1f);
bus.write(0x0013, 0xc5);
bus.write(0xc51f, 0x31);
cpu.setXRegister(0x02);
cpu.setAccumulator(0x15);
cpu.setXRegister(0x02);
cpu.setAccumulator(0x15);
bus.loadProgram(0x21, 0x10); // AND ($10,X)
cpu.step(1);
bus.loadProgram(0x21, 0x10); // AND ($10,X)
cpu.step(1);
assertEquals(0x11, cpu.getAccumulator());
assertEquals(0x31, bus.read(0xc51f));
}
assertEquals(0x11, cpu.getAccumulator());
assertEquals(0x31, bus.read(0xc51f));
}
}
@@ -3,81 +3,82 @@ package com.loomcom.symon;
import com.loomcom.symon.devices.Memory;
import org.junit.*;
import static org.junit.Assert.*;
public class CpuIndirectIndexedModeTest {
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
@Before
public void runBeforeEveryTest() throws Exception {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
@Before
public void runBeforeEveryTest() throws Exception {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00)>>>8);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00) >>> 8);
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
@Test
public void test_LDA() throws Exception {
assertEquals(cpu.toString(), 0x00, cpu.getAccumulator());
bus.write(0x0014, 0x00);
bus.write(0x0015, 0xd8);
bus.write(0xd828, 0x03);
@Test
public void test_LDA() throws Exception {
assertEquals(cpu.toString(), 0x00, cpu.getAccumulator());
bus.write(0x0014, 0x00);
bus.write(0x0015, 0xd8);
bus.write(0xd828, 0x03);
cpu.setYRegister(0x28);
cpu.setYRegister(0x28);
bus.loadProgram(0xb1, 0x14); // LDA ($14),Y
cpu.step(1);
bus.loadProgram(0xb1, 0x14); // LDA ($14),Y
cpu.step(1);
assertEquals(0x03, cpu.getAccumulator());
}
assertEquals(0x03, cpu.getAccumulator());
}
@Test
public void test_ORA() throws Exception {
bus.write(0x0014, 0x00);
bus.write(0x0015, 0xd8);
bus.write(0xd828, 0xe3);
@Test
public void test_ORA() throws Exception {
bus.write(0x0014, 0x00);
bus.write(0x0015, 0xd8);
bus.write(0xd828, 0xe3);
cpu.setYRegister(0x28);
cpu.setAccumulator(0x32);
cpu.setYRegister(0x28);
cpu.setAccumulator(0x32);
bus.loadProgram(0x11, 0x14); // ORA ($14),Y
cpu.step(1);
bus.loadProgram(0x11, 0x14); // ORA ($14),Y
cpu.step(1);
assertEquals(0xf3, cpu.getAccumulator());
assertEquals(0xe3, bus.read(0xd828));
}
assertEquals(0xf3, cpu.getAccumulator());
assertEquals(0xe3, bus.read(0xd828));
}
@Test
public void test_AND() throws Exception {
bus.write(0x0014, 0x00);
bus.write(0x0015, 0xd8);
bus.write(0xd828, 0xe3);
@Test
public void test_AND() throws Exception {
bus.write(0x0014, 0x00);
bus.write(0x0015, 0xd8);
bus.write(0xd828, 0xe3);
cpu.setYRegister(0x28);
cpu.setAccumulator(0x32);
cpu.setYRegister(0x28);
cpu.setAccumulator(0x32);
bus.loadProgram(0x31, 0x14); // AND ($14),Y
cpu.step(1);
bus.loadProgram(0x31, 0x14); // AND ($14),Y
cpu.step(1);
assertEquals(0x22, cpu.getAccumulator());
assertEquals(0xe3, bus.read(0xd828));
}
assertEquals(0x22, cpu.getAccumulator());
assertEquals(0xe3, bus.read(0xd828));
}
}
@@ -2,7 +2,6 @@ package com.loomcom.symon;
import com.loomcom.symon.devices.Memory;
import com.loomcom.symon.exceptions.MemoryAccessException;
import com.loomcom.symon.InstructionTable;
import junit.framework.TestCase;
@@ -7,30 +7,30 @@ import junit.framework.TestCase;
public class CpuRelativeModeTest extends TestCase {
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
protected Cpu cpu;
protected Bus bus;
protected Memory mem;
protected void setUp() throws Exception {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
protected void setUp() throws Exception {
this.cpu = new Cpu();
this.bus = new Bus(0x0000, 0xffff);
this.mem = new Memory(0x0000, 0x10000);
bus.addCpu(cpu);
bus.addDevice(mem);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00)>>>8);
// Load the reset vector.
bus.write(0xfffc, Bus.DEFAULT_LOAD_ADDRESS & 0x00ff);
bus.write(0xfffd, (Bus.DEFAULT_LOAD_ADDRESS & 0xff00) >>> 8);
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
cpu.reset();
// Assert initial state
assertEquals(0, cpu.getAccumulator());
assertEquals(0, cpu.getXRegister());
assertEquals(0, cpu.getYRegister());
assertEquals(0x200, cpu.getProgramCounter());
assertEquals(0xff, cpu.getStackPointer());
assertEquals(0x20, cpu.getProcessorStatus());
}
/*
* The following opcodes are tested for correctness in this file:
@@ -48,234 +48,234 @@ public class CpuRelativeModeTest extends TestCase {
/* BPL - Branch if Positive - 0x10 */
public void test_BPL() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x10, 0x05); // BPL $05 ; *=$0202+$05 ($0207)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
public void test_BPL() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x10, 0x05); // BPL $05 ; *=$0202+$05 ($0207)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x10, 0x05); // BPL $05 ; *=$0202+$05 ($0207)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x10, 0x05); // BPL $05 ; *=$0202+$05 ($0207)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x10, 0xfb); // BPL $fb ; *=$0202-$05 ($01fd)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x10, 0xfb); // BPL $fb ; *=$0202-$05 ($01fd)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x10, 0xfb); // BPL $fb ; *=$0202-$05 ($01fd)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0x10, 0xfb); // BPL $fb ; *=$0202-$05 ($01fd)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
/* BMI - Branch if Minus - 0x30 */
public void test_BMI() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x30, 0x05); // BMI $05 ; *=$0202+$05 ($0207)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
public void test_BMI() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x30, 0x05); // BMI $05 ; *=$0202+$05 ($0207)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x30, 0x05); // BMI $05 ; *=$0202+$05 ($0207)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x30, 0x05); // BMI $05 ; *=$0202+$05 ($0207)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x30, 0xfb); // BMI $fb ; *=$0202-$05 ($01fd)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x30, 0xfb); // BMI $fb ; *=$0202-$05 ($01fd)
cpu.setNegativeFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x30, 0xfb); // BMI $fb ; *=$0202-$05 ($01fd)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0x30, 0xfb); // BMI $fb ; *=$0202-$05 ($01fd)
cpu.clearNegativeFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
/* BVC - Branch if Overflow Clear - 0x50 */
public void test_BVC() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x50, 0x05); // BVC $05 ; *=$0202+$05 ($0207)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
public void test_BVC() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x50, 0x05); // BVC $05 ; *=$0202+$05 ($0207)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x50, 0x05); // BVC $05 ; *=$0202+$05 ($0207)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x50, 0x05); // BVC $05 ; *=$0202+$05 ($0207)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x50, 0xfb); // BVC $fb ; *=$0202-$05 ($01fd)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x50, 0xfb); // BVC $fb ; *=$0202-$05 ($01fd)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x50, 0xfb); // BVC $fb ; *=$0202-$05 ($01fd)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0x50, 0xfb); // BVC $fb ; *=$0202-$05 ($01fd)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
/* BVS - Branch if Overflow Set - 0x70 */
public void test_BVS() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x70, 0x05); // BVS $05 ; *=$0202+$05 ($0207)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
public void test_BVS() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x70, 0x05); // BVS $05 ; *=$0202+$05 ($0207)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x70, 0x05); // BVS $05 ; *=$0202+$05 ($0207)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x70, 0x05); // BVS $05 ; *=$0202+$05 ($0207)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x70, 0xfb); // BVS $fb ; *=$0202-$05 ($01fd)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x70, 0xfb); // BVS $fb ; *=$0202-$05 ($01fd)
cpu.setOverflowFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x70, 0xfb); // BVS $fb ; *=$0202-$05 ($01fd)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0x70, 0xfb); // BVS $fb ; *=$0202-$05 ($01fd)
cpu.clearOverflowFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
/* BCC - Branch if Carry Clear - 0x90 */
public void test_BCC() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x90, 0x05); // BCC $05 ; *=$0202+$05 ($0207)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
public void test_BCC() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0x90, 0x05); // BCC $05 ; *=$0202+$05 ($0207)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x90, 0x05); // BCC $05 ; *=$0202+$05 ($0207)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x90, 0x05); // BCC $05 ; *=$0202+$05 ($0207)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x90, 0xfb); // BCC $fb ; *=$0202-$05 ($01fd)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0x90, 0xfb); // BCC $fb ; *=$0202-$05 ($01fd)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0x90, 0xfb); // BCC $fb ; *=$0202-$05 ($01fd)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0x90, 0xfb); // BCC $fb ; *=$0202-$05 ($01fd)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
/* BCS - Branch if Carry Set - 0xb0 */
public void test_BCS() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0xb0, 0x05); // BCS $05 ; *=$0202+$05 ($0207)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
public void test_BCS() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0xb0, 0x05); // BCS $05 ; *=$0202+$05 ($0207)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xb0, 0x05); // BCS $05 ; *=$0202+$05 ($0207)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xb0, 0x05); // BCS $05 ; *=$0202+$05 ($0207)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0xb0, 0xfb); // BCS $fb ; *=$0202-$05 ($01fd)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0xb0, 0xfb); // BCS $fb ; *=$0202-$05 ($01fd)
cpu.setCarryFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xb0, 0xfb); // BCS $fb ; *=$0202-$05 ($01fd)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0xb0, 0xfb); // BCS $fb ; *=$0202-$05 ($01fd)
cpu.clearCarryFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
/* BNE - Branch if Not Equal to Zero - 0xd0 */
public void test_BNE() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0xd0, 0x05); // BNE $05 ; *=$0202+$05 ($0207)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
public void test_BNE() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0xd0, 0x05); // BNE $05 ; *=$0202+$05 ($0207)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xd0, 0x05); // BNE $05 ; *=$0202+$05 ($0207)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xd0, 0x05); // BNE $05 ; *=$0202+$05 ($0207)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0xd0, 0xfb); // BNE $fb ; *=$0202-$05 ($01fd)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0xd0, 0xfb); // BNE $fb ; *=$0202-$05 ($01fd)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xd0, 0xfb); // BNE $fb ; *=$0202-$05 ($01fd)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0xd0, 0xfb); // BNE $fb ; *=$0202-$05 ($01fd)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
}
/* BEQ - Branch if Equal to Zero - 0xf0 */
public void test_BEQ() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0xf0, 0x05); // BEQ $05 ; *=$0202+$05 ($0207)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
public void test_BEQ() throws MemoryAccessException {
// Positive Offset
bus.loadProgram(0xf0, 0x05); // BEQ $05 ; *=$0202+$05 ($0207)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x207, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xf0, 0x05); // BEQ $05 ; *=$0202+$05 ($0207)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xf0, 0x05); // BEQ $05 ; *=$0202+$05 ($0207)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0xf0, 0xfb); // BEQ $fb ; *=$0202-$05 ($01fd)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
// Negative Offset
cpu.reset();
bus.loadProgram(0xf0, 0xfb); // BEQ $fb ; *=$0202-$05 ($01fd)
cpu.setZeroFlag();
cpu.step();
assertEquals(0x1fd, cpu.getProgramCounter());
cpu.reset();
bus.loadProgram(0xf0, 0xfb); // BEQ $fb ; *=$0202-$05 ($01fd)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
cpu.reset();
bus.loadProgram(0xf0, 0xfb); // BEQ $fb ; *=$0202-$05 ($01fd)
cpu.clearZeroFlag();
cpu.step();
assertEquals(0x202, cpu.getProgramCounter());
}
}
@@ -392,27 +392,4 @@ public class CpuTest extends TestCase {
cpu.setYRegister(0x95);
assertEquals(0x15, cpu.zpyAddress(0x80));
}
public void testPcStatus() {
cpu.setProgramCounter(0x03fa);
assertEquals("$03FA", cpu.getProgramCounterStatus());
}
public void testOpcodeStatus() throws MemoryAccessException {
// LDA (immediate)
bus.write(0x0200, 0xa9);
bus.write(0x0201, 0xef);
cpu.step();
assertEquals("LDA #$EF", cpu.getOpcodeStatus());
// BRK instruction
bus.write(0x0202, 0x00);
cpu.step();
assertEquals("BRK", cpu.getOpcodeStatus());
// Illegal opcode
cpu.step();
assertEquals("BRK", cpu.getOpcodeStatus());
}
}