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.c412
1 files changed, 412 insertions, 0 deletions
diff --git a/emu/tests/test_cpu_6502.c b/emu/tests/test_cpu_6502.c
index 94b68b4..2425be8 100644
--- a/emu/tests/test_cpu_6502.c
+++ b/emu/tests/test_cpu_6502.c
@@ -148,6 +148,68 @@ START_TEST( test_cpu_6502_txs )
}
END_TEST
+// CLI
+
+START_TEST( test_cpu_6502_cli )
+{
+ INIT_CPU_TEST
+
+ CODE_SET1( 0x58 ); // CLI
+
+ cpu.PS |= PS_I;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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 );
+ ck_assert_int_eq( cpu.PS & ~PS_I, before_cpu.PS & ~PS_I );
+ ck_assert( !cpu_6502_is_interrupt( &cpu ) );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+// SEI
+
+START_TEST( test_cpu_6502_sei )
+{
+ INIT_CPU_TEST
+
+ CODE_SET1( 0x78 ); // SEI
+
+ cpu.PS &= ~PS_I;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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 );
+ ck_assert_int_eq( cpu.PS & ~PS_I, before_cpu.PS & ~PS_I );
+ ck_assert( cpu_6502_is_interrupt( &cpu ) );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
// LDA
START_TEST( test_cpu_6502_lda_flags_positive )
@@ -238,6 +300,37 @@ START_TEST( test_cpu_6502_lda_flags_zero )
}
END_TEST
+START_TEST( test_cpu_6502_lda_addr_abs )
+{
+ INIT_CPU_TEST
+
+ CODE_SET3( 0xad, 0x03, 0x01 ); // LDA #$0103
+
+ cpu.A = 0xff;
+ ram.cell[0x0103] = 0xea;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ ck_assert_int_eq( cpu.error_state, ERROR_STATE_OK );
+ ck_assert_int_eq( cpu.PC, before_cpu.PC+3 );
+ 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, 0xea );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 4 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
// LDY
START_TEST( test_cpu_6502_ldy_flags_positive )
@@ -480,6 +573,68 @@ START_TEST( test_cpu_6502_stx_addr_abs )
}
END_TEST
+// STA
+
+START_TEST( test_cpu_6502_sta_addr_zero )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x85, 0x03 ); // STA $03
+
+ cpu.A = 0xea;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, before_cpu.PS );
+ 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[0x0], &before_ram.cell[0x0], 3 );
+ ck_assert_int_eq( ram.cell[0x03], 0xea );
+ ck_assert_mem_eq( &ram.cell[0x04], &before_ram.cell[0x04], 0x1FF - 0x03 );
+ ck_assert_int_eq( cpu.cycles, 3 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_sta_addr_abs )
+{
+ INIT_CPU_TEST
+
+ CODE_SET3( 0x8d, 0x03, 0x01 ); // STA #$0103
+
+ cpu.A = 0xea;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ ck_assert_int_eq( cpu.error_state, ERROR_STATE_OK );
+ ck_assert_int_eq( cpu.PC, before_cpu.PC+3 );
+ ck_assert_int_eq( cpu.SP, before_cpu.SP );
+ ck_assert_int_eq( cpu.PS, before_cpu.PS );
+ 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[0x0], &before_ram.cell[0x0], 0x102 );
+ ck_assert_int_eq( ram.cell[0x0103], 0xea ); // modified value in memory
+ ck_assert_mem_eq( &ram.cell[0x104], &before_ram.cell[0x104], 0x1FF - 0x103 );
+ ck_assert_int_eq( cpu.cycles, 4 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
// INC
START_TEST( test_cpu_6502_inc_flags_positive )
@@ -888,6 +1043,250 @@ START_TEST( test_cpu_6502_rol_flags_accumulator_carry )
}
END_TEST
+// AND
+
+START_TEST( test_cpu_6502_and_flags_positive )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x29, 0x0f ); // AND #$0f
+
+ cpu.A = 0x36;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0x06 );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_and_flags_negative )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x29, 0x8f ); // AND #$8f
+
+ cpu.A = 0xf6;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0x86 );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_and_flags_zero )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x29, 0x00 ); // AND #$00
+
+ cpu.A = 0xf6;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0x00 );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_and_addr_imm )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x29, 0xf0 ); // AND #$f0
+
+ cpu.A = 0xff;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0xf0 );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+// ORA
+
+START_TEST( test_cpu_6502_ora_flags_positive )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x09, 0x0f ); // ORA #$08
+
+ cpu.A = 0x37;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0x3f );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_ora_flags_negative )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x09, 0x22 ); // ORA #$22
+
+ cpu.A = 0x86;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0xa6 );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_ora_flags_zero )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x09, 0x00 ); // ORA #$00
+
+ cpu.A = 0x00;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0x00 );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
+START_TEST( test_cpu_6502_ora_addr_imm )
+{
+ INIT_CPU_TEST
+
+ CODE_SET2( 0x09, 0x55 ); // ORA #$55
+
+ cpu.A = 0x1a;
+
+ COPY_CPU_TEST
+
+ cpu_6502_run_steps( &cpu, 1 );
+
+ PRINT_CPU_TEST
+
+ 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, 0x5f );
+ 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 );
+ ck_assert_int_eq( cpu.cycles, 2 );
+
+ DEINIT_CPU_TEST
+}
+END_TEST
+
// CPX
START_TEST( test_cpu_6502_cpx_flags_equals )
@@ -1267,9 +1666,12 @@ static Suite *make_cpu_6502_testsuite( void )
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, "CLI", test_cpu_6502_cli );
+ create_cpu_6502_testcase( suite, "SEI", test_cpu_6502_sei );
create_cpu_6502_testcase( suite, "LDA (flags, positive)", test_cpu_6502_lda_flags_positive );
create_cpu_6502_testcase( suite, "LDA (flags, negative)", test_cpu_6502_lda_flags_negative );
create_cpu_6502_testcase( suite, "LDA (flags, zero)", test_cpu_6502_lda_flags_zero );
+ create_cpu_6502_testcase( suite, "LDA (addr, absolute)", test_cpu_6502_lda_addr_abs );
create_cpu_6502_testcase( suite, "LDX (flags, positive)", test_cpu_6502_ldx_flags_positive );
create_cpu_6502_testcase( suite, "LDX (flags, negative)", test_cpu_6502_ldx_flags_negative );
create_cpu_6502_testcase( suite, "LDX (flags, zero)", test_cpu_6502_ldx_flags_zero );
@@ -1278,6 +1680,8 @@ static Suite *make_cpu_6502_testsuite( void )
create_cpu_6502_testcase( suite, "LDY (flags, zero)", test_cpu_6502_ldy_flags_zero );
create_cpu_6502_testcase( suite, "STX (addr, zero)", test_cpu_6502_stx_addr_zero );
create_cpu_6502_testcase( suite, "STX (addr, absolute)", test_cpu_6502_stx_addr_abs );
+ create_cpu_6502_testcase( suite, "STA (addr, zero)", test_cpu_6502_sta_addr_zero );
+ create_cpu_6502_testcase( suite, "STA (addr, absolute)", test_cpu_6502_sta_addr_abs );
create_cpu_6502_testcase( suite, "INC (flags, positive)", test_cpu_6502_inc_flags_positive );
create_cpu_6502_testcase( suite, "INC (flags, negative)", test_cpu_6502_inc_flags_negative );
create_cpu_6502_testcase( suite, "INC (flags, zero)", test_cpu_6502_inc_flags_zero );
@@ -1291,6 +1695,14 @@ static Suite *make_cpu_6502_testsuite( void )
create_cpu_6502_testcase( suite, "DEY (flags, negative)", test_cpu_6502_dey_flags_negative );
create_cpu_6502_testcase( suite, "DEY (flags, zero)", test_cpu_6502_dey_flags_zero );
create_cpu_6502_testcase( suite, "ROL (flags, carry)", test_cpu_6502_rol_flags_accumulator_carry );
+ create_cpu_6502_testcase( suite, "AND (flags, positive)", test_cpu_6502_and_flags_positive );
+ create_cpu_6502_testcase( suite, "AND (flags, negative)", test_cpu_6502_and_flags_negative );
+ create_cpu_6502_testcase( suite, "AND (flags, zero)", test_cpu_6502_and_flags_zero );
+ create_cpu_6502_testcase( suite, "AND (addr, immediate)", test_cpu_6502_and_addr_imm );
+ create_cpu_6502_testcase( suite, "ORA (flags, positive)", test_cpu_6502_ora_flags_positive );
+ create_cpu_6502_testcase( suite, "ORA (flags, negative)", test_cpu_6502_ora_flags_negative );
+ create_cpu_6502_testcase( suite, "ORA (flags, zero)", test_cpu_6502_ora_flags_zero );
+ create_cpu_6502_testcase( suite, "ORA (addr, immediate)", test_cpu_6502_ora_addr_imm );
create_cpu_6502_testcase( suite, "CPX (flags, equals)", test_cpu_6502_cpx_flags_equals );
create_cpu_6502_testcase( suite, "CPX (flags, less)", test_cpu_6502_cpx_flags_less );
create_cpu_6502_testcase( suite, "CPX (flags, greater)", test_cpu_6502_cpx_flags_greater );