More implied mode instructions implemented, with tests.
This commit is contained in:
1 parent
473b47e832
commit
f012ba7775
2 files changed
+327
-12
No files matched your search
@@ -22,6 +22,14 @@ public class CpuImpliedModeTest extends TestCase {
|
||||
bus.write(0xfffd, (Cpu.DEFAULT_BASE_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());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -127,4 +135,288 @@ public class CpuImpliedModeTest extends TestCase {
|
||||
assertEquals(0xff, cpu.getStackPointer());
|
||||
}
|
||||
|
||||
/* CLC - Clear Carry Flag - $18 */
|
||||
public void test_CLC() {
|
||||
cpu.setCarryFlag();
|
||||
assertTrue(cpu.getCarryFlag());
|
||||
|
||||
bus.loadProgram(0x18);
|
||||
cpu.step();
|
||||
|
||||
assertFalse(cpu.getCarryFlag());
|
||||
}
|
||||
|
||||
/* CLD - Clear Decimal Mode Flag - $d8 */
|
||||
public void test_CLD() {
|
||||
cpu.setDecimalModeFlag();
|
||||
assertTrue(cpu.getDecimalModeFlag());
|
||||
|
||||
bus.loadProgram(0xd8);
|
||||
cpu.step();
|
||||
|
||||
assertFalse(cpu.getDecimalModeFlag());
|
||||
}
|
||||
|
||||
/* CLI - Clear Interrupt Disabled Flag - $58 */
|
||||
public void test_CLI() {
|
||||
cpu.setIrqDisableFlag();
|
||||
assertTrue(cpu.getIrqDisableFlag());
|
||||
|
||||
bus.loadProgram(0x58);
|
||||
cpu.step();
|
||||
|
||||
assertFalse(cpu.getIrqDisableFlag());
|
||||
}
|
||||
|
||||
/* CLV - Clear Overflow Flag - $b8 */
|
||||
public void test_CLV() {
|
||||
cpu.setOverflowFlag();
|
||||
assertTrue(cpu.getOverflowFlag());
|
||||
|
||||
bus.loadProgram(0xb8);
|
||||
cpu.step();
|
||||
|
||||
assertFalse(cpu.getOverflowFlag());
|
||||
}
|
||||
|
||||
/* DEX - Decrement the X register - $ca */
|
||||
|
||||
public void test_DEX() {
|
||||
bus.loadProgram(0xca);
|
||||
cpu.setXRegister(0x02);
|
||||
cpu.step();
|
||||
assertEquals(0x01, cpu.getXRegister());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_DEX_SetsZeroFlagWhenZero() {
|
||||
bus.loadProgram(0xca);
|
||||
cpu.setXRegister(0x01);
|
||||
cpu.step();
|
||||
assertEquals(0x00, cpu.getXRegister());
|
||||
assertTrue(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_DEX_SetsNegativeFlagWhen() {
|
||||
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() {
|
||||
bus.loadProgram(0x88);
|
||||
cpu.setYRegister(0x02);
|
||||
cpu.step();
|
||||
assertEquals(0x01, cpu.getYRegister());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_DEY_SetsZeroFlagWhenZero() {
|
||||
bus.loadProgram(0x88);
|
||||
cpu.setYRegister(0x01);
|
||||
cpu.step();
|
||||
assertEquals(0x00, cpu.getYRegister());
|
||||
assertTrue(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_DEY_SetsNegativeFlagWhen() {
|
||||
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() {
|
||||
bus.loadProgram(0xe8);
|
||||
cpu.step();
|
||||
assertEquals(0x01, cpu.getXRegister());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_INX_SetsNegativeFlagWhenNegative() {
|
||||
bus.loadProgram(0xe8);
|
||||
cpu.setXRegister(0x7f);
|
||||
cpu.step();
|
||||
assertEquals(0x80, cpu.getXRegister());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertTrue(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_INX_SetsZeroFlagWhenZero() {
|
||||
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() {
|
||||
bus.loadProgram(0xc8);
|
||||
cpu.step();
|
||||
assertEquals(0x01, cpu.getYRegister());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_INY_SetsNegativeFlagWhenNegative() {
|
||||
bus.loadProgram(0xc8);
|
||||
cpu.setYRegister(0x7f);
|
||||
cpu.step();
|
||||
assertEquals(0x80, cpu.getYRegister());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
assertTrue(cpu.getNegativeFlag());
|
||||
}
|
||||
|
||||
public void test_INY_SetsZeroFlagWhenZero() {
|
||||
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() {
|
||||
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() {
|
||||
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() {
|
||||
bus.loadProgram(0x08);
|
||||
cpu.setProcessorStatus(0x27);
|
||||
cpu.step();
|
||||
assertEquals(0xfe, cpu.getStackPointer());
|
||||
assertEquals(0x27, cpu.stackPeek());
|
||||
}
|
||||
|
||||
/* PLA - Pul Accumulator - $68 */
|
||||
|
||||
public void test_PLA() {
|
||||
cpu.stackPush(0x32);
|
||||
bus.loadProgram(0x68);
|
||||
cpu.step();
|
||||
assertEquals(0x32, cpu.getAccumulator());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
assertFalse(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_PLA_SetsZeroIfAccumulatorIsZero() {
|
||||
cpu.stackPush(0x00);
|
||||
bus.loadProgram(0x68);
|
||||
cpu.step();
|
||||
assertEquals(0x00, cpu.getAccumulator());
|
||||
assertFalse(cpu.getNegativeFlag());
|
||||
assertTrue(cpu.getZeroFlag());
|
||||
}
|
||||
|
||||
public void test_PLA_SetsNegativeIfAccumulatorIsNegative() {
|
||||
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() {
|
||||
cpu.stackPush(0x2f);
|
||||
bus.loadProgram(0x28);
|
||||
cpu.step();
|
||||
assertEquals(0x2f, cpu.getProcessorStatus());
|
||||
}
|
||||
|
||||
/* RTI - Return from Interrupt - $40 */
|
||||
|
||||
public void test_RTI() {
|
||||
cpu.stackPush(0x0f); // PC hi
|
||||
cpu.stackPush(0x11); // PC lo
|
||||
cpu.stackPush(0x29); // status
|
||||
|
||||
bus.loadProgram(0x40);
|
||||
cpu.step();
|
||||
|
||||
assertEquals(0x0f11, cpu.getProgramCounter());
|
||||
assertEquals(0x29, cpu.getProcessorStatus());
|
||||
}
|
||||
|
||||
/* RTS - Return from Subroutine - $60 */
|
||||
|
||||
public void test_RTS() {
|
||||
cpu.stackPush(0x0f); // PC hi
|
||||
cpu.stackPush(0x11); // PC lo
|
||||
|
||||
bus.loadProgram(0x60);
|
||||
cpu.step();
|
||||
|
||||
assertEquals(0x0f10, cpu.getProgramCounter());
|
||||
assertEquals(0x20, cpu.getProcessorStatus());
|
||||
}
|
||||
|
||||
/* SEC - Set Carry Flag - $38 */
|
||||
|
||||
public void test_SEC() {
|
||||
bus.loadProgram(0x38);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getCarryFlag());
|
||||
}
|
||||
|
||||
/* SED - Set Decimal Mode Flag - $f8 */
|
||||
|
||||
public void test_SED() {
|
||||
bus.loadProgram(0xf8);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getDecimalModeFlag());
|
||||
}
|
||||
|
||||
/* SEI - Set Interrupt Disable Flag - $78 */
|
||||
|
||||
public void test_SEI() {
|
||||
bus.loadProgram(0x78);
|
||||
cpu.step();
|
||||
assertTrue(cpu.getIrqDisableFlag());
|
||||
}
|
||||
|
||||
/* TAX - - $aa */
|
||||
|
||||
public void test_TAX() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user