1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-07-07 15:29:04 +00:00
erc-c/tests/mos6502.arith.c
Peter Evans 00ff9f069d Vastly simplify unit tests for mos6502
Criterion's init and fini config options allow us to register setup and
teardown functions. We now use this to register the common cpu variable
for the mos6502 tests, albeit through the use of a global variable.

Doing so necessitated that each of the different test files have their
own suites, due to some implementation details in Criterion, but this is
No Big Deal.
2017-12-06 15:57:15 -06:00

123 lines
2.6 KiB
C

#include <criterion/criterion.h>
#include "mos6502.h"
#include "mos6502.enums.h"
#include "mos6502.tests.h"
TestSuite(mos6502_arith, .init = setup, .fini = teardown);
Test(mos6502_arith, adc)
{
cpu->A = 5;
mos6502_handle_adc(cpu, 3);
cr_assert_eq(cpu->A, 8);
cpu->P |= CARRY;
mos6502_handle_adc(cpu, 64);
cr_assert_eq(cpu->A, 73);
}
Test(mos6502_arith, cmp)
{
cpu->A = 5;
mos6502_handle_cmp(cpu, 3);
cr_assert_eq(cpu->P & CARRY, CARRY);
cr_assert_eq(cpu->P & NEGATIVE, 0);
cr_assert_eq(cpu->P & ZERO, 0);
cpu->A = 3;
mos6502_handle_cmp(cpu, 3);
cr_assert_eq(cpu->P & CARRY, 0);
cr_assert_eq(cpu->P & NEGATIVE, 0);
cr_assert_eq(cpu->P & ZERO, ZERO);
cpu->A = 192;
mos6502_handle_cmp(cpu, 3);
cr_assert_eq(cpu->P & CARRY, CARRY);
cr_assert_eq(cpu->P & NEGATIVE, NEGATIVE);
cr_assert_eq(cpu->P & ZERO, 0);
}
Test(mos6502_arith, cpx)
{
cpu->X = 5;
mos6502_handle_cpx(cpu, 3);
cr_assert_eq(cpu->P & CARRY, CARRY);
cr_assert_eq(cpu->P & NEGATIVE, 0);
cr_assert_eq(cpu->P & ZERO, 0);
}
Test(mos6502_arith, cpy)
{
cpu->Y = 5;
mos6502_handle_cpy(cpu, 3);
cr_assert_eq(cpu->P & CARRY, CARRY);
cr_assert_eq(cpu->P & NEGATIVE, 0);
cr_assert_eq(cpu->P & ZERO, 0);
}
Test(mos6502_arith, dec)
{
// Note that DEC does NOT decrement the accumulator if the last
// address is not set. It does _nothing_.
cpu->A = 5;
mos6502_handle_dec(cpu, 0);
cr_assert_neq(cpu->A, 4);
cpu->last_addr = 123;
vm_segment_set(cpu->memory, 123, 44);
// Note _also_ that DEC expects the number to be decremented will be
// passed in as the effective operand, although it doesn't
// necessarily need for that to be so.
mos6502_handle_dec(cpu, 44);
cr_assert_eq(vm_segment_get(cpu->memory, 123), 43);
}
Test(mos6502_arith, dex)
{
cpu->X = 5;
mos6502_handle_dex(cpu, 0);
cr_assert_eq(cpu->X, 4);
}
Test(mos6502_arith, dey)
{
cpu->Y = 5;
mos6502_handle_dey(cpu, 0);
cr_assert_eq(cpu->Y, 4);
}
Test(mos6502_arith, inc)
{
cpu->last_addr = 123;
mos6502_handle_inc(cpu, 55);
cr_assert_eq(vm_segment_get(cpu->memory, 123), 56);
}
Test(mos6502_arith, inx)
{
cpu->X = 5;
mos6502_handle_inx(cpu, 0);
cr_assert_eq(cpu->X, 6);
}
Test(mos6502_arith, iny)
{
cpu->Y = 5;
mos6502_handle_iny(cpu, 0);
cr_assert_eq(cpu->Y, 6);
}
Test(mos6502_arith, sbc)
{
cpu->A = 5;
mos6502_handle_sbc(cpu, 3);
cr_assert_eq(cpu->A, 2);
cpu->P |= CARRY;
cpu->A = 16;
mos6502_handle_sbc(cpu, 8);
cr_assert_eq(cpu->A, 7);
}