summaryrefslogtreecommitdiff
path: root/emu/tests/test_cpu_6502.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/tests/test_cpu_6502.c')
-rw-r--r--emu/tests/test_cpu_6502.c90
1 files changed, 81 insertions, 9 deletions
diff --git a/emu/tests/test_cpu_6502.c b/emu/tests/test_cpu_6502.c
index 6f53ff0..a6a97cc 100644
--- a/emu/tests/test_cpu_6502.c
+++ b/emu/tests/test_cpu_6502.c
@@ -51,18 +51,27 @@ void teardown( void )
START_TEST( test_cpu_6502_nop )
{
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] = 0xea; // NOP
codesize = 1;
memory_set( &rom, 0x00, code, codesize );
memcpy( &before_cpu, &cpu, sizeof( cpu ) );
+ memory_copy( &before_ram, &ram );
+
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+1 );
ck_assert_int_eq( cpu.SP, before_cpu.SP );
@@ -70,17 +79,22 @@ START_TEST( test_cpu_6502_nop )
ck_assert_int_eq( cpu.A, before_cpu.A );
ck_assert_int_eq( cpu.X, before_cpu.X );
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
START_TEST( test_cpu_6502_txs )
{
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] = 0x9a; // TXS
codesize = 1;
memory_set( &rom, 0x00, code, codesize );
@@ -88,7 +102,14 @@ START_TEST( test_cpu_6502_txs )
cpu.X = 0xff;
memcpy( &before_cpu, &cpu, sizeof( cpu ) );
+ memory_copy( &before_ram, &ram );
+
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+1 );
@@ -97,24 +118,75 @@ START_TEST( test_cpu_6502_txs )
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
+
+START_TEST( test_cpu_6502_ldx )
+{
+ 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] = 0x01; // #$1
+ codesize = 2;
+ memory_set( &rom, 0x00, code, codesize );
+
+ cpu.X = 0xff;
+
+ memcpy( &before_cpu, &cpu, sizeof( cpu ) );
+ memory_copy( &before_ram, &ram );
+
+ 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, 0x01 );
+ 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
Suite *make_cpu_6502_testsuite( void )
{
Suite *suite;
+ TCase *tc;
suite = suite_create( "6502 CPU tests" );
- TCase *tc_nop = tcase_create( "NOP" );
- tcase_add_checked_fixture( tc_nop, setup, teardown);
- tcase_add_test( tc_nop, test_cpu_6502_nop );
- suite_add_tcase( suite, tc_nop );
-
- TCase *tc_txs = tcase_create( "TXS" );
- tcase_add_checked_fixture( tc_txs, setup, teardown);
- tcase_add_test( tc_txs, test_cpu_6502_txs );
- suite_add_tcase( suite, tc_txs );
+ tc = tcase_create( "NOP" );
+ tcase_add_unchecked_fixture( tc, setup, teardown);
+ tcase_add_test( tc, test_cpu_6502_nop );
+ suite_add_tcase( suite, tc );
+
+ tc = tcase_create( "TXS" );
+ tcase_add_unchecked_fixture( tc, setup, teardown);
+ tcase_add_test( tc, test_cpu_6502_txs );
+ suite_add_tcase( suite, tc );
+
+ tc = tcase_create( "LDX" );
+ tcase_add_unchecked_fixture( tc, setup, teardown);
+ tcase_add_test( tc, test_cpu_6502_ldx );
+ suite_add_tcase( suite, tc );
return suite;
}