summaryrefslogtreecommitdiff
path: root/emu
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-12-19 12:40:50 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2020-12-19 12:40:50 +0100
commit5ba99092da61aa6aeaa91214ca18c8cf03356913 (patch)
treed7dd0053947a8dd77248b8f0e3c610cedf83ef48 /emu
parent8dde478cfc2174f198290be40a633a4c9c9db833 (diff)
download6502-5ba99092da61aa6aeaa91214ca18c8cf03356913.tar.gz
6502-5ba99092da61aa6aeaa91214ca18c8cf03356913.tar.bz2
some cleanup and refactoring in tests
Diffstat (limited to 'emu')
-rw-r--r--emu/tests/test_cpu_6502.c112
1 files changed, 97 insertions, 15 deletions
diff --git a/emu/tests/test_cpu_6502.c b/emu/tests/test_cpu_6502.c
index a6a97cc..396c671 100644
--- a/emu/tests/test_cpu_6502.c
+++ b/emu/tests/test_cpu_6502.c
@@ -124,7 +124,7 @@ START_TEST( test_cpu_6502_txs )
}
END_TEST
-START_TEST( test_cpu_6502_ldx )
+START_TEST( test_cpu_6502_ldx_pos )
{
cpu_6502_t before_cpu;
memory_t before_ram;
@@ -166,27 +166,109 @@ START_TEST( test_cpu_6502_ldx )
}
END_TEST
-Suite *make_cpu_6502_testsuite( void )
+START_TEST( test_cpu_6502_ldx_neg )
{
- Suite *suite;
- TCase *tc;
+ cpu_6502_t before_cpu;
+ memory_t before_ram;
- suite = suite_create( "6502 CPU tests" );
+ cpu_6502_reset( &cpu );
+ memory_reset( &rom );
+ memory_reset( &ram );
+
+ memset( code, 0, ROM_SIZE );
+ code[0] = 0xa2; // LDX immediate
+ code[1] = 0xff; // #-1
+ codesize = 2;
+ memory_set( &rom, 0x00, code, codesize );
+
+ memcpy( &before_cpu, &cpu, sizeof( cpu ) );
+ memory_copy( &before_ram, &ram );
+
+ cpu_6502_run( &cpu, 1 );
- tc = tcase_create( "NOP" );
- tcase_add_unchecked_fixture( tc, setup, teardown);
- tcase_add_test( tc, test_cpu_6502_nop );
- suite_add_tcase( suite, tc );
+ fprintf( stderr, "state before:\n" );
+ cpu_6502_print_debug( &before_cpu );
+ fprintf( stderr, "state after:\n" );
+ cpu_6502_print_debug( &cpu );
+
+ ck_assert_int_eq( cpu.error_state, ERROR_STATE_OK );
+ ck_assert_int_eq( cpu.PC, before_cpu.PC+2 );
+ ck_assert_int_eq( cpu.SP, before_cpu.SP );
+ ck_assert_int_eq( cpu.PS & ~( PS_N | PS_Z ), before_cpu.PS & ~( PS_N | PS_Z ) );
+ ck_assert( !cpu_6502_is_zero( &cpu ) );
+ ck_assert( cpu_6502_is_negative( &cpu ) );
+ ck_assert_int_eq( cpu.A, before_cpu.A );
+ ck_assert_int_eq( cpu.X, 0xff );
+ ck_assert_int_eq( cpu.Y, before_cpu.Y );
+ ck_assert_mem_eq( ram.cell, before_ram.cell, ram.size );
+
+ memory_deinit( &before_ram );
+}
+END_TEST
- tc = tcase_create( "TXS" );
- tcase_add_unchecked_fixture( tc, setup, teardown);
- tcase_add_test( tc, test_cpu_6502_txs );
- suite_add_tcase( suite, tc );
+START_TEST( test_cpu_6502_ldx_zero )
+{
+ cpu_6502_t before_cpu;
+ memory_t before_ram;
+
+ cpu_6502_reset( &cpu );
+ memory_reset( &rom );
+ memory_reset( &ram );
+
+ memset( code, 0, ROM_SIZE );
+ code[0] = 0xa2; // LDX immediate
+ code[1] = 0x00; // #$0
+ codesize = 2;
+ memory_set( &rom, 0x00, code, codesize );
+
+ cpu.X = 0xff;
+
+ memcpy( &before_cpu, &cpu, sizeof( cpu ) );
+ memory_copy( &before_ram, &ram );
- tc = tcase_create( "LDX" );
+ cpu_6502_run( &cpu, 1 );
+
+ fprintf( stderr, "state before:\n" );
+ cpu_6502_print_debug( &before_cpu );
+ fprintf( stderr, "state after:\n" );
+ cpu_6502_print_debug( &cpu );
+
+ ck_assert_int_eq( cpu.error_state, ERROR_STATE_OK );
+ ck_assert_int_eq( cpu.PC, before_cpu.PC+2 );
+ ck_assert_int_eq( cpu.SP, before_cpu.SP );
+ ck_assert_int_eq( cpu.PS & ~( PS_N | PS_Z ), before_cpu.PS & ~( PS_N | PS_Z ) );
+ ck_assert( cpu_6502_is_zero( &cpu ) );
+ ck_assert( !cpu_6502_is_negative( &cpu ) );
+ ck_assert_int_eq( cpu.A, before_cpu.A );
+ ck_assert_int_eq( cpu.X, 0x00 );
+ ck_assert_int_eq( cpu.Y, before_cpu.Y );
+ ck_assert_mem_eq( ram.cell, before_ram.cell, ram.size );
+
+ memory_deinit( &before_ram );
+}
+END_TEST
+
+static void create_cpu_6502_testcase( Suite *suite, const char *name, const TTest *test_func )
+{
+ TCase *tc;
+
+ tc = tcase_create( name );
tcase_add_unchecked_fixture( tc, setup, teardown);
- tcase_add_test( tc, test_cpu_6502_ldx );
+ tcase_add_test( tc, test_func );
suite_add_tcase( suite, tc );
+}
+
+static Suite *make_cpu_6502_testsuite( void )
+{
+ Suite *suite;
+
+ suite = suite_create( "6502 CPU tests" );
+
+ create_cpu_6502_testcase( suite, "NOP", test_cpu_6502_nop );
+ create_cpu_6502_testcase( suite, "TXS", test_cpu_6502_txs );
+ create_cpu_6502_testcase( suite, "LDX (positive)", test_cpu_6502_ldx_pos );
+ create_cpu_6502_testcase( suite, "LDX (negative)", test_cpu_6502_ldx_neg );
+ create_cpu_6502_testcase( suite, "LDX (zero)", test_cpu_6502_ldx_zero );
return suite;
}