Mercurial > repos > blastem
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); |