1
0
mirror of https://github.com/sethm/symon.git synced 2024-06-15 08:29:27 +00:00

Implemented ADC

This commit is contained in:
Seth J. Morabito 2008-12-14 01:54:53 -08:00
parent 1c6c5fdaeb
commit 6443cacdb9
2 changed files with 111 additions and 1 deletions

View File

@ -329,7 +329,20 @@ public class Cpu implements InstructionTable {
break;
case 0x68: // n/a
break;
case 0x69: // n/a
case 0x69: // ADC - Immediate Mode
boolean sign = (a < 0x80);
a += (operands[0] + (carryFlag ? 1 : 0));
// Result overflowed a byte
if (a > 0xff) {
a &= 0xff;
setCarryFlag(true);
}
// Sign changed
if (sign != a < 0x80) {
setOverflowFlag(true);
}
setZeroFlag(a);
setNegativeFlag(a);
break;
case 0x6a: // n/a
break;

View File

@ -192,6 +192,103 @@ public class CpuImmediateModeTests extends TestCase {
/* ADC Immediate Mode Tests - 0x69 */
public void test_ADC_SetsAccumulator() {
bus.write(0x200, 0x69);
bus.write(0x201, 0x01);
cpu.step();
assertEquals(0x01, cpu.getAccumulator());
bus.write(0x202, 0x69);
bus.write(0x203, 0xa0);
cpu.step();
assertEquals(0xa1, cpu.getAccumulator());
bus.write(0x204, 0x69);
bus.write(0x205, 0x02);
cpu.step();
assertEquals(0xa3, cpu.getAccumulator());
bus.write(0x206, 0x69);
bus.write(0x207, 0x06);
cpu.step();
assertEquals(0xa9, cpu.getAccumulator());
}
public void test_ADC_IncludesCarry() {
cpu.setCarryFlag(true);
bus.write(0x200, 0x69);
bus.write(0x201, 0x01);
cpu.step();
assertEquals(0x02, cpu.getAccumulator());
}
public void test_ADC_SetsCarryIfResultOverflows() {
bus.write(0x200, 0xa9); // LDA #$fe
bus.write(0x201, 0xff);
cpu.step();
bus.write(0x202, 0x69); // ADC #$02
bus.write(0x203, 0x02);
cpu.step();
// $ff + $02 = $101 = [c] + $01
assertEquals(0x01, cpu.getAccumulator());
assertTrue(cpu.getCarryFlag());
}
public void test_ADC_SetsOverflowIfResultChangesSign() {
bus.write(0x200, 0xa9); // LDA #$7f
bus.write(0x201, 0x7f);
cpu.step();
bus.write(0x202, 0x69); // ADC #$01
bus.write(0x203, 0x01);
cpu.step();
assertEquals(0x80, cpu.getAccumulator());
assertTrue(cpu.getOverflowFlag());
}
public void test_ADC_SetsNegativeFlagIfResultIsNegative() {
bus.write(0x200, 0xa9); // LDA #$7f
bus.write(0x201, 0x7f);
cpu.step();
bus.write(0x202, 0x69); // ADC #$01
bus.write(0x203, 0x01);
cpu.step();
assertEquals(0x80, cpu.getAccumulator());
assertTrue(cpu.getNegativeFlag());
}
public void test_ADC_SetsZeroFlagIfResultIsZero() {
bus.write(0x200, 0xa9); // LDA #$ff
bus.write(0x201, 0xff);
cpu.step();
bus.write(0x202, 0x69); // ADC #$01
bus.write(0x203, 0x01);
cpu.step();
assertEquals(0x00, cpu.getAccumulator());
assertTrue(cpu.getZeroFlag());
}
public void test_ADC_DoesNotSetNegativeFlagIfResultNotNegative() {
bus.write(0x200, 0xa9); // LDA #$7f
bus.write(0x201, 0x7e);
cpu.step();
bus.write(0x202, 0x69); // ADC #$01
bus.write(0x203, 0x01);
cpu.step();
assertEquals(0x7f, cpu.getAccumulator());
assertFalse(cpu.getNegativeFlag());
}
public void test_ADC_DoesNotSetZeroFlagIfResultNotZero() {
bus.write(0x200, 0xa9); // LDA #$ff
bus.write(0x201, 0xff);
cpu.step();
bus.write(0x202, 0x69); // ADC #$01
bus.write(0x203, 0x03);
cpu.step();
assertEquals(0x2, cpu.getAccumulator());
assertFalse(cpu.getZeroFlag());
}
/* LDY Immediate Mode Tests - 0xa0 */
public void test_LDY_SetsYRegister() {