Add PHX, PLX, PHY, PLY emulation and test cases.

This commit is contained in:
Radosław Kujawa 2017-01-25 13:14:00 +01:00
parent acc0fad32e
commit 13ef3e2d08
7 changed files with 91 additions and 4 deletions

View File

@ -89,7 +89,7 @@ OP_LSR_ZPX,"lsr",ZPX,2,NULL
OP_RMB5_ZP,"rmb5",ZP,2,NULL
OP_CLI,"cli",IMPLIED,1,NULL
OP_EOR_ABSY,"eor",ABSOLUTEY,3,emul_eor
OP_PHY,"phy",IMPLIED,1,NULL
OP_PHY,"phy",IMPLIED,1,emul_phy
OP_NOPI_5C,"nop",IMPLIED,1,NULL
OP_NOPI_5D,"nop",ABSOLUTE,3,NULL
OP_EOR_ABSX,"eor",ABSOLUTEX,3,emul_eor
@ -121,7 +121,7 @@ OP_ROR_ZPX,"ror",ZPX,2,emul_ror
OP_RMB7_ZP,"rmb7",ZP,2,NULL
OP_SEI,"sei",IMPLIED,1,NULL
OP_ADC_ABSY,"adc",ABSOLUTEY,3,NULL
OP_PLY,"ply",IMPLIED,1,NULL
OP_PLY,"ply",IMPLIED,1,emul_ply
OP_NOPI_7C,"nop",IMPLIED,1,NULL
OP_JMP_IABSX,"jmp",IABSOLUTEX,3,NULL
OP_ADC_ABSX,"adc",ABSOLUTEX,3,NULL
@ -217,7 +217,7 @@ OP_DEC_ZPX,"dec",ZPX,2,NULL
OP_SMB5_ZP,"smb5",ZP,2,NULL
OP_CLD,"cld",IMPLIED,1,NULL
OP_CMP_ABSY,"cmp",ABSOLUTEY,3,NULL
OP_PHX,"phx",IMPLIED,1,NULL
OP_PHX,"phx",IMPLIED,1,emul_phx
OP_STP,"stp",IMPLIED,1,emul_stp
OP_NOPI_DD,"nop",ABSOLUTE,3,NULL
OP_CMP_ABSX,"cmp",ABSOLUTEX,3,NULL
@ -249,7 +249,7 @@ OP_INC_ZPX,"inc",ZPX,2,NULL
OP_SMB7_ZP,"smb7",ZP,2,NULL
OP_SED,"sed",IMPLIED,1,NULL
OP_SBC_ABSY,"sbc",ABSOLUTEY,3,NULL
OP_PLX,"plx",IMPLIED,1,NULL
OP_PLX,"plx",IMPLIED,1,emul_plx
OP_NOPI_FC,"nop",IMPLIED,1,NULL
OP_NOPI_FD,"nop",ABSOLUTE,3,NULL
OP_SBC_ABSX,"sbc",ABSOLUTEX,3,NULL

1 opcode_id mnemonic addressing size emulation
89 OP_RMB5_ZP rmb5 ZP 2 NULL
90 OP_CLI cli IMPLIED 1 NULL
91 OP_EOR_ABSY eor ABSOLUTEY 3 emul_eor
92 OP_PHY phy IMPLIED 1 NULL emul_phy
93 OP_NOPI_5C nop IMPLIED 1 NULL
94 OP_NOPI_5D nop ABSOLUTE 3 NULL
95 OP_EOR_ABSX eor ABSOLUTEX 3 emul_eor
121 OP_RMB7_ZP rmb7 ZP 2 NULL
122 OP_SEI sei IMPLIED 1 NULL
123 OP_ADC_ABSY adc ABSOLUTEY 3 NULL
124 OP_PLY ply IMPLIED 1 NULL emul_ply
125 OP_NOPI_7C nop IMPLIED 1 NULL
126 OP_JMP_IABSX jmp IABSOLUTEX 3 NULL
127 OP_ADC_ABSX adc ABSOLUTEX 3 NULL
217 OP_SMB5_ZP smb5 ZP 2 NULL
218 OP_CLD cld IMPLIED 1 NULL
219 OP_CMP_ABSY cmp ABSOLUTEY 3 NULL
220 OP_PHX phx IMPLIED 1 NULL emul_phx
221 OP_STP stp IMPLIED 1 emul_stp
222 OP_NOPI_DD nop ABSOLUTE 3 NULL
223 OP_CMP_ABSX cmp ABSOLUTEX 3 NULL
249 OP_SMB7_ZP smb7 ZP 2 NULL
250 OP_SED sed IMPLIED 1 NULL
251 OP_SBC_ABSY sbc ABSOLUTEY 3 NULL
252 OP_PLX plx IMPLIED 1 NULL emul_plx
253 OP_NOPI_FC nop IMPLIED 1 NULL
254 OP_NOPI_FD nop ABSOLUTE 3 NULL
255 OP_SBC_ABSX sbc ABSOLUTEX 3 NULL

View File

@ -153,6 +153,20 @@ emul_php(rk65c02emu_t *e, void *id, instruction_t *i)
stack_push(e, e->regs.P);
}
/* PHX - push X to stack */
void
emul_phx(rk65c02emu_t *e, void *id, instruction_t *i)
{
stack_push(e, e->regs.X);
}
/* PHY - push Y to stack */
void
emul_phy(rk65c02emu_t *e, void *id, instruction_t *i)
{
stack_push(e, e->regs.Y);
}
/* PLA - pull from stack to accumulator */
void
emul_pla(rk65c02emu_t *e, void *id, instruction_t *i)
@ -170,6 +184,20 @@ emul_plp(rk65c02emu_t *e, void *id, instruction_t *i)
e->regs.P = stack_pop(e) | P_UNDEFINED;
}
/* PLX - pull from stack to X */
void
emul_plx(rk65c02emu_t *e, void *id, instruction_t *i)
{
e->regs.X = stack_pop(e);
}
/* PLY - pull from stack to X */
void
emul_ply(rk65c02emu_t *e, void *id, instruction_t *i)
{
e->regs.Y = stack_pop(e);
}
/* ROL - rotate left */
void
emul_rol(rk65c02emu_t *e, void *id, instruction_t *i)

View File

@ -470,6 +470,52 @@ ATF_TC_BODY(emul_php_plp, tc)
bus_finish(&b);
}
ATF_TC_WITHOUT_HEAD(emul_phx_phy_plx_ply);
ATF_TC_BODY(emul_phx_phy_plx_ply, tc)
{
rk65c02emu_t e;
bus_t b;
b = bus_init();
e = rk65c02_init(&b);
/* check push X to stack */
e.regs.X = 0xAA;
e.regs.SP = 0xFF;
ATF_REQUIRE(rom_start(&e, "test_emulation_phx.rom"));
ATF_CHECK(e.regs.SP == 0xFE);
ATF_CHECK(bus_read_1(e.bus, STACK_END) == 0xAA);
/* check pull X from stack */
e.regs.X = 0;
ATF_REQUIRE(rom_start(&e, "test_emulation_plx.rom"));
ATF_CHECK(e.regs.SP == 0xFF);
ATF_CHECK(e.regs.X == 0xAA);
/* check push Y to stack */
e.regs.Y = 0x55;
e.regs.SP = 0xFF;
ATF_REQUIRE(rom_start(&e, "test_emulation_phy.rom"));
ATF_CHECK(e.regs.SP == 0xFE);
ATF_CHECK(bus_read_1(e.bus, STACK_END) == 0x55);
/* check pull X from stack */
e.regs.Y = 0xFF;
ATF_REQUIRE(rom_start(&e, "test_emulation_ply.rom"));
ATF_CHECK(e.regs.SP == 0xFF);
ATF_CHECK(e.regs.Y == 0x55);
bus_finish(&b);
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, emul_and);
@ -482,6 +528,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, emul_ora);
ATF_TP_ADD_TC(tp, emul_stz);
ATF_TP_ADD_TC(tp, emul_php_plp);
ATF_TP_ADD_TC(tp, emul_phx_phy_plx_ply);
ATF_TP_ADD_TC(tp, emul_stack);
ATF_TP_ADD_TC(tp, emul_txa_tya_tax_tay);
ATF_TP_ADD_TC(tp, emul_sta);

View File

@ -0,0 +1,3 @@
start: phx
stp

View File

@ -0,0 +1,3 @@
start: phy
stp

View File

@ -0,0 +1,3 @@
start: plx
stp

View File

@ -0,0 +1,3 @@
start: ply
stp