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) {