From 4a8fbfbaebf8eb2a12f0b5d16b6dde88ce3561da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Kujawa?= Date: Sat, 28 Jan 2017 14:04:20 +0100 Subject: [PATCH] Add CPX and CPY emulation and test cases. --- src/65c02isa.csv | 12 +++--- src/emulation.c | 36 +++++++++++++++++ test/test_emulation.c | 76 +++++++++++++++++++++++++++++++++++ test/test_emulation_cpx_abs.s | 3 ++ test/test_emulation_cpx_imm.s | 3 ++ test/test_emulation_cpx_zp.s | 3 ++ test/test_emulation_cpy_abs.s | 3 ++ test/test_emulation_cpy_imm.s | 3 ++ test/test_emulation_cpy_zp.s | 3 ++ 9 files changed, 136 insertions(+), 6 deletions(-) create mode 100644 test/test_emulation_cpx_abs.s create mode 100644 test/test_emulation_cpx_imm.s create mode 100644 test/test_emulation_cpx_zp.s create mode 100644 test/test_emulation_cpy_abs.s create mode 100644 test/test_emulation_cpy_imm.s create mode 100644 test/test_emulation_cpy_zp.s diff --git a/src/65c02isa.csv b/src/65c02isa.csv index b57f2df..e86bed9 100644 --- a/src/65c02isa.csv +++ b/src/65c02isa.csv @@ -191,11 +191,11 @@ OP_LDY_ABSX,"ldy",ABSOLUTEX,3,emul_ldy,false OP_LDA_ABSX,"lda",ABSOLUTEX,3,emul_lda,false OP_LDX_ABSY,"ldx",ABSOLUTEY,3,emul_ldx,false OP_BBS3_REL,"bbs3",ZPR,2,NULL,true -OP_CPY_IMM,"cpy",IMMEDIATE,2,NULL,false +OP_CPY_IMM,"cpy",IMMEDIATE,2,emul_cpy,false OP_CMP_IZPX,"cmp",IZPX,2,emul_cmp,false OP_NOPI_C3,"nop",IMMEDIATE,2,NULL,false OP_NOPI_C4,"nop",IMPLIED,1,NULL,false -OP_CPY_ZP,"cpy",ZP,2,NULL,false +OP_CPY_ZP,"cpy",ZP,2,emul_cpy,false OP_CMP_ZP,"cmp",ZP,2,emul_cmp,false OP_DEC_ZP,"dec",ZP,2,emul_dec,false OP_SMB4_ZP,"smb4",ZP,2,NULL,false @@ -203,7 +203,7 @@ OP_INY,"iny",IMPLIED,1,emul_iny,false OP_CMP_IMM,"cmp",IMMEDIATE,2,emul_cmp,false OP_DEX,"dex",IMPLIED,1,emul_dex,false OP_WAI,"wai",IMPLIED,1,NULL,false -OP_CPY_ABS,"cpy",ABSOLUTE,3,NULL,false +OP_CPY_ABS,"cpy",ABSOLUTE,3,emul_cpy,false OP_CMP_ABS,"cmp",ABSOLUTE,3,emul_cmp,false OP_DEC_ABS,"dec",ABSOLUTE,3,emul_dec,false OP_BBS4_REL,"bbs4",ZPR,2,NULL,true @@ -223,11 +223,11 @@ OP_NOPI_DD,"nop",ABSOLUTE,3,NULL,false OP_CMP_ABSX,"cmp",ABSOLUTEX,3,emul_cmp,false OP_DEC_ABSX,"dec",ABSOLUTEX,3,emul_dec,false OP_BBS5_REL,"bbs5",ZPR,2,NULL,true -OP_CPX_IMM,"cpx",IMMEDIATE,2,NULL,false +OP_CPX_IMM,"cpx",IMMEDIATE,2,emul_cpx,false OP_SBC_IZPX,"sbc",IZPX,2,NULL,false OP_NOPI_E3,"nop",IMMEDIATE,2,NULL,false OP_NOPI_E4,"nop",IMPLIED,1,NULL,false -OP_CPX_ZP,"cpx",ZP,2,NULL,false +OP_CPX_ZP,"cpx",ZP,2,emul_cpx,false OP_SBC_ZP,"sbc",ZP,2,NULL,false OP_INC_ZP,"inc",ZP,2,emul_inc,false OP_SMB6_ZP,"smb6",ZP,2,NULL,false @@ -235,7 +235,7 @@ OP_INX,"inx",IMPLIED,1,emul_inx,false OP_SBC_IMM,"sbc",IMMEDIATE,2,NULL,false OP_NOP,"nop",IMPLIED,1,emul_nop,false OP_NOPI_EC,"nop",IMPLIED,1,NULL,false -OP_CPX_ABS,"cpx",ABSOLUTE,3,NULL,false +OP_CPX_ABS,"cpx",ABSOLUTE,3,emul_cpx,false OP_SBC_ABS,"sbc",ABSOLUTE,3,NULL,false OP_INC_ABS,"inc",ABSOLUTE,3,emul_inc,false OP_BBS6_REL,"bbs6",ZPR,2,NULL,true diff --git a/src/emulation.c b/src/emulation.c index 56c77a0..5ec5334 100644 --- a/src/emulation.c +++ b/src/emulation.c @@ -104,6 +104,42 @@ emul_cmp(rk65c02emu_t *e, void *id, instruction_t *i) e->regs.P &= ~P_CARRY; } +/* CPX - compare X and memory location */ +void +emul_cpx(rk65c02emu_t *e, void *id, instruction_t *i) +{ + uint8_t val, sr; + + val = instruction_data_read_1(e, (instrdef_t *) id, i); + sr = e->regs.X - val; + + instruction_status_adjust_zero(e, sr); + instruction_status_adjust_negative(e, sr); + + if (e->regs.X < val) + e->regs.P |= P_CARRY; + else + e->regs.P &= ~P_CARRY; +} + +/* CPY - compare Y and memory location */ +void +emul_cpy(rk65c02emu_t *e, void *id, instruction_t *i) +{ + uint8_t val, sr; + + val = instruction_data_read_1(e, (instrdef_t *) id, i); + sr = e->regs.Y - val; + + instruction_status_adjust_zero(e, sr); + instruction_status_adjust_negative(e, sr); + + if (e->regs.Y < val) + e->regs.P |= P_CARRY; + else + e->regs.P &= ~P_CARRY; +} + /* DEC - decrement memory location/acumulator */ void emul_dec(rk65c02emu_t *e, void *id, instruction_t *i) diff --git a/test/test_emulation.c b/test/test_emulation.c index 154c1f9..4dc3a26 100644 --- a/test/test_emulation.c +++ b/test/test_emulation.c @@ -159,6 +159,80 @@ ATF_TC_BODY(emul_cmp, tc) ATF_CHECK(e.regs.P & P_NEGATIVE); } +ATF_TC_WITHOUT_HEAD(emul_cpx); +ATF_TC_BODY(emul_cpx, tc) +{ + rk65c02emu_t e; + bus_t b; + + b = bus_init(); + e = rk65c02_init(&b); + + /* CPX immediate */ + e.regs.X = 0xAA; + rk65c02_dump_regs(&e); + ATF_REQUIRE(rom_start(&e, "test_emulation_cpx_imm.rom", tc)); + rk65c02_dump_regs(&e); + ATF_CHECK(e.regs.P & P_ZERO); + ATF_CHECK(!(e.regs.P & P_CARRY)); + ATF_CHECK(!(e.regs.P & P_NEGATIVE)); + /* CPX zero page */ + e.regs.X = 0xAA; + bus_write_1(&b, 0x10, 0xAB); + rk65c02_dump_regs(&e); + ATF_REQUIRE(rom_start(&e, "test_emulation_cpx_zp.rom", tc)); + rk65c02_dump_regs(&e); + ATF_CHECK(!(e.regs.P & P_ZERO)); + ATF_CHECK(e.regs.P & P_CARRY); + ATF_CHECK(e.regs.P & P_NEGATIVE); + /* CPX absolute */ + e.regs.X = 0xFF; + bus_write_1(&b, 0x2010, 0xFE); + rk65c02_dump_regs(&e); + ATF_REQUIRE(rom_start(&e, "test_emulation_cpx_abs.rom", tc)); + rk65c02_dump_regs(&e); + ATF_CHECK(!(e.regs.P & P_ZERO)); + ATF_CHECK(!(e.regs.P & P_CARRY)); + ATF_CHECK(!(e.regs.P & P_NEGATIVE)); +} + +ATF_TC_WITHOUT_HEAD(emul_cpy); +ATF_TC_BODY(emul_cpy, tc) +{ + rk65c02emu_t e; + bus_t b; + + b = bus_init(); + e = rk65c02_init(&b); + + /* CPY immediate */ + e.regs.Y = 0xAA; + rk65c02_dump_regs(&e); + ATF_REQUIRE(rom_start(&e, "test_emulation_cpy_imm.rom", tc)); + rk65c02_dump_regs(&e); + ATF_CHECK(e.regs.P & P_ZERO); + ATF_CHECK(!(e.regs.P & P_CARRY)); + ATF_CHECK(!(e.regs.P & P_NEGATIVE)); + /* CPY zero page */ + e.regs.Y = 0xAA; + bus_write_1(&b, 0x10, 0xAB); + rk65c02_dump_regs(&e); + ATF_REQUIRE(rom_start(&e, "test_emulation_cpy_zp.rom", tc)); + rk65c02_dump_regs(&e); + ATF_CHECK(!(e.regs.P & P_ZERO)); + ATF_CHECK(e.regs.P & P_CARRY); + ATF_CHECK(e.regs.P & P_NEGATIVE); + /* CPY absolute */ + e.regs.Y = 0xFF; + bus_write_1(&b, 0x2010, 0xFE); + rk65c02_dump_regs(&e); + ATF_REQUIRE(rom_start(&e, "test_emulation_cpy_abs.rom", tc)); + rk65c02_dump_regs(&e); + ATF_CHECK(!(e.regs.P & P_ZERO)); + ATF_CHECK(!(e.regs.P & P_CARRY)); + ATF_CHECK(!(e.regs.P & P_NEGATIVE)); +} + ATF_TC_WITHOUT_HEAD(emul_dex_dey); ATF_TC_BODY(emul_dex_dey, tc) { @@ -801,6 +875,8 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, emul_and); ATF_TP_ADD_TC(tp, emul_bit); ATF_TP_ADD_TC(tp, emul_cmp); + ATF_TP_ADD_TC(tp, emul_cpx); + ATF_TP_ADD_TC(tp, emul_cpy); ATF_TP_ADD_TC(tp, emul_dec); ATF_TP_ADD_TC(tp, emul_dex_dey); ATF_TP_ADD_TC(tp, emul_clc_sec); diff --git a/test/test_emulation_cpx_abs.s b/test/test_emulation_cpx_abs.s new file mode 100644 index 0000000..b179b08 --- /dev/null +++ b/test/test_emulation_cpx_abs.s @@ -0,0 +1,3 @@ +start: cpx 0x2010 + stp + diff --git a/test/test_emulation_cpx_imm.s b/test/test_emulation_cpx_imm.s new file mode 100644 index 0000000..8368106 --- /dev/null +++ b/test/test_emulation_cpx_imm.s @@ -0,0 +1,3 @@ +start: cpx #0xAA + stp + diff --git a/test/test_emulation_cpx_zp.s b/test/test_emulation_cpx_zp.s new file mode 100644 index 0000000..ff163e9 --- /dev/null +++ b/test/test_emulation_cpx_zp.s @@ -0,0 +1,3 @@ +start: cpx 0x10 + stp + diff --git a/test/test_emulation_cpy_abs.s b/test/test_emulation_cpy_abs.s new file mode 100644 index 0000000..515da9d --- /dev/null +++ b/test/test_emulation_cpy_abs.s @@ -0,0 +1,3 @@ +start: cpy 0x2010 + stp + diff --git a/test/test_emulation_cpy_imm.s b/test/test_emulation_cpy_imm.s new file mode 100644 index 0000000..db86791 --- /dev/null +++ b/test/test_emulation_cpy_imm.s @@ -0,0 +1,3 @@ +start: cpy #0xAA + stp + diff --git a/test/test_emulation_cpy_zp.s b/test/test_emulation_cpy_zp.s new file mode 100644 index 0000000..eac432e --- /dev/null +++ b/test/test_emulation_cpy_zp.s @@ -0,0 +1,3 @@ +start: cpy 0x10 + stp +