Add CPX and CPY emulation and test cases.

This commit is contained in:
Radosław Kujawa 2017-01-28 14:04:20 +01:00
parent 3640a162a3
commit 4a8fbfbaeb
9 changed files with 136 additions and 6 deletions

View File

@ -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

1 opcode_id mnemonic addressing size emulation modify_pc
191 OP_LDA_ABSX lda ABSOLUTEX 3 emul_lda false
192 OP_LDX_ABSY ldx ABSOLUTEY 3 emul_ldx false
193 OP_BBS3_REL bbs3 ZPR 2 NULL true
194 OP_CPY_IMM cpy IMMEDIATE 2 NULL emul_cpy false
195 OP_CMP_IZPX cmp IZPX 2 emul_cmp false
196 OP_NOPI_C3 nop IMMEDIATE 2 NULL false
197 OP_NOPI_C4 nop IMPLIED 1 NULL false
198 OP_CPY_ZP cpy ZP 2 NULL emul_cpy false
199 OP_CMP_ZP cmp ZP 2 emul_cmp false
200 OP_DEC_ZP dec ZP 2 emul_dec false
201 OP_SMB4_ZP smb4 ZP 2 NULL false
203 OP_CMP_IMM cmp IMMEDIATE 2 emul_cmp false
204 OP_DEX dex IMPLIED 1 emul_dex false
205 OP_WAI wai IMPLIED 1 NULL false
206 OP_CPY_ABS cpy ABSOLUTE 3 NULL emul_cpy false
207 OP_CMP_ABS cmp ABSOLUTE 3 emul_cmp false
208 OP_DEC_ABS dec ABSOLUTE 3 emul_dec false
209 OP_BBS4_REL bbs4 ZPR 2 NULL true
223 OP_CMP_ABSX cmp ABSOLUTEX 3 emul_cmp false
224 OP_DEC_ABSX dec ABSOLUTEX 3 emul_dec false
225 OP_BBS5_REL bbs5 ZPR 2 NULL true
226 OP_CPX_IMM cpx IMMEDIATE 2 NULL emul_cpx false
227 OP_SBC_IZPX sbc IZPX 2 NULL false
228 OP_NOPI_E3 nop IMMEDIATE 2 NULL false
229 OP_NOPI_E4 nop IMPLIED 1 NULL false
230 OP_CPX_ZP cpx ZP 2 NULL emul_cpx false
231 OP_SBC_ZP sbc ZP 2 NULL false
232 OP_INC_ZP inc ZP 2 emul_inc false
233 OP_SMB6_ZP smb6 ZP 2 NULL false
235 OP_SBC_IMM sbc IMMEDIATE 2 NULL false
236 OP_NOP nop IMPLIED 1 emul_nop false
237 OP_NOPI_EC nop IMPLIED 1 NULL false
238 OP_CPX_ABS cpx ABSOLUTE 3 NULL emul_cpx false
239 OP_SBC_ABS sbc ABSOLUTE 3 NULL false
240 OP_INC_ABS inc ABSOLUTE 3 emul_inc false
241 OP_BBS6_REL bbs6 ZPR 2 NULL true

View File

@ -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)

View File

@ -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);

View File

@ -0,0 +1,3 @@
start: cpx 0x2010
stp

View File

@ -0,0 +1,3 @@
start: cpx #0xAA
stp

View File

@ -0,0 +1,3 @@
start: cpx 0x10
stp

View File

@ -0,0 +1,3 @@
start: cpy 0x2010
stp

View File

@ -0,0 +1,3 @@
start: cpy #0xAA
stp

View File

@ -0,0 +1,3 @@
start: cpy 0x10
stp