Mercurial > repos > blastem
comparison m68k_to_x86.c @ 53:44e661913a51
Add preliminary support for JMP
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 16 Dec 2012 22:25:29 -0800 |
parents | f02ba3808757 |
children | 3b79cbcf6846 |
comparison
equal
deleted
inserted
replaced
52:f02ba3808757 | 53:44e661913a51 |
---|---|
34 void m68k_write_long_lowfirst(); | 34 void m68k_write_long_lowfirst(); |
35 void m68k_write_long_highfirst(); | 35 void m68k_write_long_highfirst(); |
36 void m68k_write_byte(); | 36 void m68k_write_byte(); |
37 void m68k_save_context(); | 37 void m68k_save_context(); |
38 void m68k_modified_ret_addr(); | 38 void m68k_modified_ret_addr(); |
39 void m68k_native_addr(); | |
39 void m68k_start_context(uint8_t * addr, m68k_context * context); | 40 void m68k_start_context(uint8_t * addr, m68k_context * context); |
40 | 41 |
41 uint8_t * cycles(uint8_t * dst, uint32_t num) | 42 uint8_t * cycles(uint8_t * dst, uint32_t num) |
42 { | 43 { |
43 dst = add_ir(dst, num, CYCLES, SZ_D); | 44 dst = add_ir(dst, num, CYCLES, SZ_D); |
616 dst = jcc(dst, cond, dest_addr); | 617 dst = jcc(dst, cond, dest_addr); |
617 } | 618 } |
618 return dst; | 619 return dst; |
619 } | 620 } |
620 | 621 |
622 uint8_t * translate_m68k_jmp(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | |
623 { | |
624 uint8_t * dest_addr; | |
625 switch(inst->src.addr_mode) | |
626 { | |
627 case MODE_AREG_INDIRECT: | |
628 dst = cycles(dst, BUS); | |
629 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | |
630 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); | |
631 } else { | |
632 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); | |
633 } | |
634 dst = check_cycles(dst); | |
635 dst = call(dst, (uint8_t *)m68k_native_addr); | |
636 //TODO: Finish me | |
637 //TODO: Fix timing | |
638 break; | |
639 case MODE_ABSOLUTE: | |
640 case MODE_ABSOLUTE_SHORT: | |
641 dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); | |
642 dst = check_cycles(dst); | |
643 dest_addr = get_native_address(opts->native_code_map, inst->src.params.immed); | |
644 if (!dest_addr) { | |
645 opts->deferred = defer_address(opts->deferred, inst->src.params.immed, dst + 1); | |
646 //dummy address to be replaced later, make sure it generates a 4-byte displacement | |
647 dest_addr = dst + 256; | |
648 } | |
649 dst = jmp(dst, dest_addr); | |
650 break; | |
651 } | |
652 return dst; | |
653 } | |
654 | |
621 uint8_t * translate_m68k_rts(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 655 uint8_t * translate_m68k_rts(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
622 { | 656 { |
623 //TODO: Add cycles | 657 //TODO: Add cycles |
624 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 658 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); |
625 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); | 659 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); |
827 return translate_m68k_lea(dst, inst, opts); | 861 return translate_m68k_lea(dst, inst, opts); |
828 } else if(inst->op == M68K_BSR) { | 862 } else if(inst->op == M68K_BSR) { |
829 return translate_m68k_bsr(dst, inst, opts); | 863 return translate_m68k_bsr(dst, inst, opts); |
830 } else if(inst->op == M68K_BCC) { | 864 } else if(inst->op == M68K_BCC) { |
831 return translate_m68k_bcc(dst, inst, opts); | 865 return translate_m68k_bcc(dst, inst, opts); |
866 } else if(inst->op == M68K_JMP) { | |
867 return translate_m68k_jmp(dst, inst, opts); | |
832 } else if(inst->op == M68K_RTS) { | 868 } else if(inst->op == M68K_RTS) { |
833 return translate_m68k_rts(dst, inst, opts); | 869 return translate_m68k_rts(dst, inst, opts); |
834 } else if(inst->op == M68K_DBCC) { | 870 } else if(inst->op == M68K_DBCC) { |
835 return translate_m68k_dbcc(dst, inst, opts); | 871 return translate_m68k_dbcc(dst, inst, opts); |
836 } else if(inst->op == M68K_CLR) { | 872 } else if(inst->op == M68K_CLR) { |