mirror of
https://github.com/rkujawa/rk65c02.git
synced 2025-02-07 07:30:29 +00:00
Add CPX and CPY emulation and test cases.
This commit is contained in:
parent
3640a162a3
commit
4a8fbfbaeb
@ -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
|
||||
|
|
@ -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)
|
||||
|
@ -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);
|
||||
|
3
test/test_emulation_cpx_abs.s
Normal file
3
test/test_emulation_cpx_abs.s
Normal file
@ -0,0 +1,3 @@
|
||||
start: cpx 0x2010
|
||||
stp
|
||||
|
3
test/test_emulation_cpx_imm.s
Normal file
3
test/test_emulation_cpx_imm.s
Normal file
@ -0,0 +1,3 @@
|
||||
start: cpx #0xAA
|
||||
stp
|
||||
|
3
test/test_emulation_cpx_zp.s
Normal file
3
test/test_emulation_cpx_zp.s
Normal file
@ -0,0 +1,3 @@
|
||||
start: cpx 0x10
|
||||
stp
|
||||
|
3
test/test_emulation_cpy_abs.s
Normal file
3
test/test_emulation_cpy_abs.s
Normal file
@ -0,0 +1,3 @@
|
||||
start: cpy 0x2010
|
||||
stp
|
||||
|
3
test/test_emulation_cpy_imm.s
Normal file
3
test/test_emulation_cpy_imm.s
Normal file
@ -0,0 +1,3 @@
|
||||
start: cpy #0xAA
|
||||
stp
|
||||
|
3
test/test_emulation_cpy_zp.s
Normal file
3
test/test_emulation_cpy_zp.s
Normal file
@ -0,0 +1,3 @@
|
||||
start: cpy 0x10
|
||||
stp
|
||||
|
Loading…
x
Reference in New Issue
Block a user