comparison m68k_core_x86.c @ 1304:5b90d7669eee

Fix exit trace mode edge case. Call do_sync if trace mode bit is changed in eori sr
author Michael Pavone <pavone@retrodev.com>
date Tue, 28 Mar 2017 09:39:54 -0700
parents 208803173ebc
children 85a90964b557
comparison
equal deleted inserted replaced
1303:208803173ebc 1304:5b90d7669eee
2229 if (inst->src.params.immed & 0x10) { 2229 if (inst->src.params.immed & 0x10) {
2230 xor_flag(opts, 1, FLAG_X); 2230 xor_flag(opts, 1, FLAG_X);
2231 } 2231 }
2232 if (inst->op == M68K_EORI_SR) { 2232 if (inst->op == M68K_EORI_SR) {
2233 xor_irdisp(code, inst->src.params.immed >> 8, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B); 2233 xor_irdisp(code, inst->src.params.immed >> 8, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B);
2234 if (inst->src.params.immed & 0x700) { 2234 if (inst->src.params.immed & 0x8700) {
2235 //set int pending flag in case we trigger an interrupt as a result of the mask change 2235 //set int pending flag in case we trigger an interrupt as a result of the mask change
2236 mov_irdisp(code, INT_PENDING_SR_CHANGE, opts->gen.context_reg, offsetof(m68k_context, int_pending), SZ_B); 2236 mov_irdisp(code, INT_PENDING_SR_CHANGE, opts->gen.context_reg, offsetof(m68k_context, int_pending), SZ_B);
2237 call(code, opts->do_sync); 2237 call(code, opts->do_sync);
2238 } 2238 }
2239 } 2239 }
2927 opts->gen.handle_cycle_limit_int = code->cur; 2927 opts->gen.handle_cycle_limit_int = code->cur;
2928 //calculate stack adjust size 2928 //calculate stack adjust size
2929 add_ir(code, 16-sizeof(void*), RSP, SZ_PTR); 2929 add_ir(code, 16-sizeof(void*), RSP, SZ_PTR);
2930 uint32_t adjust_size = code->cur - opts->gen.handle_cycle_limit_int; 2930 uint32_t adjust_size = code->cur - opts->gen.handle_cycle_limit_int;
2931 code->cur = opts->gen.handle_cycle_limit_int; 2931 code->cur = opts->gen.handle_cycle_limit_int;
2932 //handle trace mode
2933 cmp_irdisp(code, 0, opts->gen.context_reg, offsetof(m68k_context, trace_pending), SZ_B);
2934 code_ptr do_trace = code->cur + 1;
2935 jcc(code, CC_NZ, do_trace);
2932 bt_irdisp(code, 7, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B); 2936 bt_irdisp(code, 7, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B);
2933 code_ptr no_trace = code->cur + 1; 2937 code_ptr no_trace = code->cur + 1;
2934 jcc(code, CC_NC, no_trace); 2938 jcc(code, CC_NC, no_trace);
2935 cmp_irdisp(code, 0, opts->gen.context_reg, offsetof(m68k_context, trace_pending), SZ_B);
2936 code_ptr do_trace = code->cur + 1;
2937 jcc(code, CC_NZ, do_trace);
2938 mov_irdisp(code, 1, opts->gen.context_reg, offsetof(m68k_context, trace_pending), SZ_B); 2939 mov_irdisp(code, 1, opts->gen.context_reg, offsetof(m68k_context, trace_pending), SZ_B);
2939 *no_trace = code->cur - (no_trace + 1); 2940 *no_trace = code->cur - (no_trace + 1);
2941 //handle interrupts
2940 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D); 2942 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D);
2941 code_ptr do_int = code->cur + 2; 2943 code_ptr do_int = code->cur + 2;
2942 jcc(code, CC_NC, do_int+512);//force 32-bit displacement 2944 jcc(code, CC_NC, do_int+512);//force 32-bit displacement
2945 //handle component synchronization
2943 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, sync_cycle), opts->gen.cycles, SZ_D); 2946 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, sync_cycle), opts->gen.cycles, SZ_D);
2944 skip_sync = code->cur + 1; 2947 skip_sync = code->cur + 1;
2945 jcc(code, CC_C, code->cur + 2); 2948 jcc(code, CC_C, code->cur + 2);
2946 call(code, opts->gen.save_context); 2949 call(code, opts->gen.save_context);
2947 call_args_abi(code, (code_ptr)sync_components, 2, opts->gen.context_reg, opts->gen.scratch1); 2950 call_args_abi(code, (code_ptr)sync_components, 2, opts->gen.context_reg, opts->gen.scratch1);