Mercurial > repos > blastem
comparison m68k_core_x86.c @ 1332:87bbc4bec958
Fix timing for branch not taken case in the M68K BCC intruction
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 26 Apr 2017 21:55:12 -0700 |
parents | 85a90964b557 |
children | df6af7187b36 |
comparison
equal
deleted
inserted
replaced
1331:9bba5ff5beb8 | 1332:87bbc4bec958 |
---|---|
792 } | 792 } |
793 | 793 |
794 void translate_m68k_bcc(m68k_options * opts, m68kinst * inst) | 794 void translate_m68k_bcc(m68k_options * opts, m68kinst * inst) |
795 { | 795 { |
796 code_info *code = &opts->gen.code; | 796 code_info *code = &opts->gen.code; |
797 cycles(&opts->gen, 10);//TODO: Adjust this for branch not taken case | 797 |
798 int32_t disp = inst->src.params.immed; | 798 int32_t disp = inst->src.params.immed; |
799 uint32_t after = inst->address + 2; | 799 uint32_t after = inst->address + 2; |
800 if (inst->extra.cond == COND_TRUE) { | 800 if (inst->extra.cond == COND_TRUE) { |
801 cycles(&opts->gen, 10); | |
801 jump_m68k_abs(opts, after + disp); | 802 jump_m68k_abs(opts, after + disp); |
802 } else { | 803 } else { |
804 uint8_t cond = m68k_eval_cond(opts, inst->extra.cond); | |
805 code_ptr do_branch = code->cur + 1; | |
806 jcc(code, cond, do_branch); | |
807 | |
808 cycles(&opts->gen, inst->variant == VAR_BYTE ? 8 : 12); | |
809 code_ptr done = code->cur + 1; | |
810 jmp(code, done); | |
811 | |
812 *do_branch = code->cur - (do_branch + 1); | |
813 cycles(&opts->gen, 10); | |
803 code_ptr dest_addr = get_native_address(opts, after + disp); | 814 code_ptr dest_addr = get_native_address(opts, after + disp); |
804 uint8_t cond = m68k_eval_cond(opts, inst->extra.cond); | |
805 if (!dest_addr) { | 815 if (!dest_addr) { |
806 opts->gen.deferred = defer_address(opts->gen.deferred, after + disp, code->cur + 2); | 816 opts->gen.deferred = defer_address(opts->gen.deferred, after + disp, code->cur + 1); |
807 //dummy address to be replaced later, make sure it generates a 4-byte displacement | 817 //dummy address to be replaced later, make sure it generates a 4-byte displacement |
808 dest_addr = code->cur + 256; | 818 dest_addr = code->cur + 256; |
809 } | 819 } |
810 jcc(code, cond, dest_addr); | 820 jmp(code, dest_addr); |
821 | |
822 *done = code->cur - (done + 1); | |
811 } | 823 } |
812 } | 824 } |
813 | 825 |
814 void translate_m68k_scc(m68k_options * opts, m68kinst * inst) | 826 void translate_m68k_scc(m68k_options * opts, m68kinst * inst) |
815 { | 827 { |