From 5ba99092da61aa6aeaa91214ca18c8cf03356913 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 19 Dec 2020 12:40:50 +0100 Subject: some cleanup and refactoring in tests --- LINKS | 2 + emu/tests/test_cpu_6502.c | 112 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 99 insertions(+), 15 deletions(-) diff --git a/LINKS b/LINKS index 174a8aa..ed38050 100644 --- a/LINKS +++ b/LINKS @@ -75,6 +75,7 @@ https://en.wikipedia.org/wiki/Seven-segment_display 6502 links: https://www.eiroca.net/wiki/archive/awesome/6502 http://wilsonminesco.com/ +http://www.6502.org/tutorials/vflag.html practical stuff: https://www.instructables.com/Fix-a-broken-pin-on-an-IC-chip/ @@ -115,6 +116,7 @@ https://github.com/skilldrick/6502js http://rubbermallet.org/fake6502.c https://github.com/davepoo/6502Emulator https://github.com/spacerace/6502 +https://www.masswerk.at/products.php other emulators: https://github.com/pdewacht/oberon-risc-emu (RISC-5 Wirth Emulator, as inspiration) 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; } -- cgit v1.2.3-54-g00ecf