# HG changeset patch # User Michael Pavone # Date 1662695418 25200 # Node ID 0c42982dd4d86d1afad892078aedac3b7c1a978a # Parent 8e6fb2c060245a7736fe0fdb4ba7719fb36ff56e Make sure 68K interrupt is executed immediately when resuming core if it has a target cycle <= current. Fixes IRQ tests in mcd-verificator diff -r 8e6fb2c06024 -r 0c42982dd4d8 m68k_core_x86.c --- a/m68k_core_x86.c Thu Sep 08 18:56:34 2022 -0700 +++ b/m68k_core_x86.c Thu Sep 08 20:50:18 2022 -0700 @@ -2991,10 +2991,13 @@ *code = tmp_code; opts->gen.handle_cycle_limit_int = code->cur; - //calculate stack adjust size - add_ir(code, 16-sizeof(void*), RSP, SZ_PTR); + //calculate address adjust for sync return + check_cycles_int(&opts->gen, 0); uint32_t adjust_size = code->cur - opts->gen.handle_cycle_limit_int; code->cur = opts->gen.handle_cycle_limit_int; + add_ir(code, 16-sizeof(void *), RSP, SZ_PTR); + adjust_size -= code->cur - opts->gen.handle_cycle_limit_int; + code->cur = opts->gen.handle_cycle_limit_int; //handle trace mode cmp_irdisp(code, 0, opts->gen.context_reg, offsetof(m68k_context, trace_pending), SZ_B); code_ptr do_trace = code->cur + 1; @@ -3026,7 +3029,7 @@ //fetch return address and adjust RSP pop_r(code, opts->gen.scratch1); add_ir(code, 16-sizeof(void *), RSP, SZ_PTR); - add_ir(code, adjust_size, opts->gen.scratch1, SZ_PTR); + sub_ir(code, adjust_size, opts->gen.scratch1, SZ_PTR); //save return address for restoring later mov_rrdisp(code, opts->gen.scratch1, opts->gen.context_reg, offsetof(m68k_context, resume_pc), SZ_PTR); retn(code);