re-order instructions so zero/negative flags are set AFTER memory write (which may abort)

This commit is contained in:
Kelvin Sherlock 2019-01-28 22:01:29 -05:00
parent 8d60a2d437
commit 0e2f35e7fe
2 changed files with 17 additions and 12 deletions

View File

@ -1055,14 +1055,14 @@ defs_instr_start_16 .word 0
# define TSB_INST(in_bank) \
tmp1 = arg | acc; \
CYCLES_PLUS_1; \
zero = arg & acc; \
SET_MEMORY8(addr_latch, tmp1);
SET_MEMORY8(addr_latch, tmp1); \
zero = arg & acc;
# else
# define TSB_INST(in_bank) \
tmp1 = arg | acc; \
CYCLES_PLUS_1; \
zero = arg & acc; \
SET_MEMORY16(addr_latch, tmp1, in_bank);
SET_MEMORY16(addr_latch, tmp1, in_bank); \
zero = arg & acc;
# endif
#endif
@ -1107,15 +1107,15 @@ defs_instr_start_16 .word 0
psr = (psr & 0x1fe) + ((arg >> 7) & 1); \
tmp1 = (arg << 1) & 0xff; \
CYCLES_PLUS_1; \
SET_NEG_ZERO8(tmp1); \
SET_MEMORY8(addr_latch, tmp1);
SET_MEMORY8(addr_latch, tmp1); \
SET_NEG_ZERO8(tmp1);
# else
# define ASL_INST(in_bank) \
psr = (psr & 0x1fe) + ((arg >> 15) & 1);\
tmp1 = (arg << 1) & 0xffff; \
CYCLES_PLUS_1; \
SET_NEG_ZERO16(tmp1); \
SET_MEMORY16(addr_latch, tmp1, in_bank);
SET_MEMORY16(addr_latch, tmp1, in_bank);\
SET_NEG_ZERO16(tmp1);
# endif
#endif
@ -1302,14 +1302,14 @@ defs_instr_start_16 .word 0
arg = arg & 0xff; \
tmp1 = arg & ~acc; \
CYCLES_PLUS_1; \
zero = arg & acc; \
SET_MEMORY8(addr_latch, tmp1);
SET_MEMORY8(addr_latch, tmp1); \
zero = arg & acc;
# else
# define TRB_INST(in_bank) \
tmp1 = arg & ~acc; \
CYCLES_PLUS_1; \
zero = arg & acc; \
SET_MEMORY16(addr_latch, tmp1, in_bank);
SET_MEMORY16(addr_latch, tmp1, in_bank);\
zero = arg & acc;
# endif
#endif

View File

@ -230,6 +230,9 @@ extern word32 slow_mem_changed[];
g_ret2 = saved_pc; \
kpc = saved_pc;
goto abort; \
kpc = saved_pc; \
psr = saved_psr; \
goto finish; \
}
#else
#define MMU_CHECK(addr, val, bytes, in_page, in_bank)
@ -936,6 +939,7 @@ word32 get_remaining_operands(word32 addr, word32 opcode, word32 psr, Fplus *fpl
#define FETCH_OPCODE \
addr = saved_pc = kpc; \
saved_psr = psr; \
CYCLES_PLUS_2; \
stat = GET_PAGE_INFO_RD(((addr) >> 8) & 0xffff); \
wstat = PTR2WORD(stat) & 0xff; \
@ -1008,6 +1012,7 @@ int enter_engine(Engine_reg *engine_ptr) {
word32 tmp1, tmp2;
word32 saved_pc = 0;
word32 saved_psr = 0;
word32 abort_support = g_num_breakpoints ? 1 : 0;
word32 kpc_support = g_num_kpc_breakpoints ? 1 : 0;