comparison m68k_to_x86.c @ 152:79958b95526f

Implement TRAP (untested)
author Mike Pavone <pavone@retrodev.com>
date Thu, 03 Jan 2013 22:49:21 -0800
parents 6b593ea0ed90
children 4791c0204410
comparison
equal deleted inserted replaced
151:6b593ea0ed90 152:79958b95526f
39 void m68k_write_byte(); 39 void m68k_write_byte();
40 void m68k_save_context(); 40 void m68k_save_context();
41 void m68k_modified_ret_addr(); 41 void m68k_modified_ret_addr();
42 void m68k_native_addr(); 42 void m68k_native_addr();
43 void m68k_native_addr_and_sync(); 43 void m68k_native_addr_and_sync();
44 void m68k_trap();
44 void set_sr(); 45 void set_sr();
45 void set_ccr(); 46 void set_ccr();
46 void get_sr(); 47 void get_sr();
47 void do_sync(); 48 void do_sync();
48 void m68k_start_context(uint8_t * addr, m68k_context * context); 49 void m68k_start_context(uint8_t * addr, m68k_context * context);
2965 dst = mov_ir(dst, 0, FLAG_C, SZ_B); 2966 dst = mov_ir(dst, 0, FLAG_C, SZ_B);
2966 dst = setcc_r(dst, CC_Z, FLAG_Z); 2967 dst = setcc_r(dst, CC_Z, FLAG_Z);
2967 dst = setcc_r(dst, CC_S, FLAG_N); 2968 dst = setcc_r(dst, CC_S, FLAG_N);
2968 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 2969 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
2969 break; 2970 break;
2970 /*case M68K_TAS: 2971 //case M68K_TAS:
2971 case M68K_TRAP: 2972 case M68K_TRAP:
2972 case M68K_TRAPV:*/ 2973 dst = mov_ir(dst, src_op.disp, SCRATCH2, SZ_D);
2974 dst = mov_ir(dst, inst->address, SCRATCH1, SZ_D);
2975 dst = jmp(dst, (uint8_t *)m68k_trap);
2976 break;
2977 //case M68K_TRAPV:
2973 case M68K_TST: 2978 case M68K_TST:
2974 dst = cycles(dst, BUS); 2979 dst = cycles(dst, BUS);
2975 if (src_op.mode == MODE_REG_DIRECT) { 2980 if (src_op.mode == MODE_REG_DIRECT) {
2976 dst = cmp_ir(dst, 0, src_op.base, inst->extra.size); 2981 dst = cmp_ir(dst, 0, src_op.base, inst->extra.size);
2977 } else { //M68000 doesn't support immedate operand for tst, so this must be MODE_REG_DISPLACE8 2982 } else { //M68000 doesn't support immedate operand for tst, so this must be MODE_REG_DISPLACE8
3045 address += (next-encoded)*2; 3050 address += (next-encoded)*2;
3046 encoded = next; 3051 encoded = next;
3047 //m68k_disasm(&instbuf, disbuf); 3052 //m68k_disasm(&instbuf, disbuf);
3048 //printf("%X: %s\n", instbuf.address, disbuf); 3053 //printf("%X: %s\n", instbuf.address, disbuf);
3049 dst = translate_m68k(dst, &instbuf, opts); 3054 dst = translate_m68k(dst, &instbuf, opts);
3050 } while(instbuf.op != M68K_ILLEGAL && instbuf.op != M68K_RTS && instbuf.op != M68K_RTE && !(instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) && instbuf.op != M68K_JMP); 3055 } while(instbuf.op != M68K_ILLEGAL && instbuf.op != M68K_TRAP && instbuf.op != M68K_RTS && instbuf.op != M68K_RTE && !(instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) && instbuf.op != M68K_JMP);
3051 process_deferred(opts); 3056 process_deferred(opts);
3052 if (opts->deferred) { 3057 if (opts->deferred) {
3053 address = opts->deferred->address; 3058 address = opts->deferred->address;
3054 if ((address & 0xFFFFFF) < 0x400000) { 3059 if ((address & 0xFFFFFF) < 0x400000) {
3055 encoded = context->mem_pointers[0] + (address & 0xFFFFFF)/2; 3060 encoded = context->mem_pointers[0] + (address & 0xFFFFFF)/2;