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