Mercurial > repos > blastem
comparison m68k_to_x86.c @ 105:1a0fd122ca8f
Implemented move from SR
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 28 Dec 2012 10:37:09 -0800 |
parents | a0fdaa134964 |
children | 1eba2b9455f8 |
comparison
equal
deleted
inserted
replaced
104:a0fdaa134964 | 105:1a0fd122ca8f |
---|---|
1441 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? | 1441 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? |
1442 dst = pop_r(dst, SCRATCH1); | 1442 dst = pop_r(dst, SCRATCH1); |
1443 break; | 1443 break; |
1444 default: | 1444 default: |
1445 printf("address mode %d not yet supported (jsr)\n", inst->src.addr_mode); | 1445 printf("address mode %d not yet supported (jsr)\n", inst->src.addr_mode); |
1446 exit(1); | |
1446 } | 1447 } |
1447 return dst; | 1448 return dst; |
1448 } | 1449 } |
1449 | 1450 |
1450 uint8_t * translate_m68k_rts(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 1451 uint8_t * translate_m68k_rts(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
1911 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D); | 1912 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D); |
1912 dst = mov_rrdisp8(dst, SCRATCH2, src_op.base, src_op.disp, SZ_D); | 1913 dst = mov_rrdisp8(dst, SCRATCH2, src_op.base, src_op.disp, SZ_D); |
1913 } | 1914 } |
1914 } | 1915 } |
1915 break; | 1916 break; |
1916 //case M68K_EXT: | |
1917 // break; | |
1918 case M68K_ILLEGAL: | 1917 case M68K_ILLEGAL: |
1919 dst = call(dst, (uint8_t *)m68k_save_context); | 1918 dst = call(dst, (uint8_t *)m68k_save_context); |
1920 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q); | 1919 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q); |
1921 dst = call(dst, (uint8_t *)print_regs_exit); | 1920 dst = call(dst, (uint8_t *)print_regs_exit); |
1922 break; | 1921 break; |
1923 /*case M68K_MOVE_FROM_SR: | 1922 case M68K_MOVE_FROM_SR: |
1924 break;*/ | 1923 //TODO: Trap if not in system mode |
1924 dst = call(dst, (uint8_t *)get_sr); | |
1925 if (dst_op.mode == MODE_REG_DIRECT) { | |
1926 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_W); | |
1927 } else { | |
1928 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_W); | |
1929 } | |
1930 dst = m68k_save_result(inst, dst, opts); | |
1931 break; | |
1925 case M68K_MOVE_CCR: | 1932 case M68K_MOVE_CCR: |
1926 case M68K_MOVE_SR: | 1933 case M68K_MOVE_SR: |
1927 //TODO: Privilege check for MOVE to SR | 1934 //TODO: Privilege check for MOVE to SR |
1928 if (src_op.mode == MODE_IMMED) { | 1935 if (src_op.mode == MODE_IMMED) { |
1929 dst = mov_ir(dst, src_op.disp & 0x1, FLAG_C, SZ_B); | 1936 dst = mov_ir(dst, src_op.disp & 0x1, FLAG_C, SZ_B); |