changeset 170:7d1b04537377

Implement RTR
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jan 2013 13:58:33 -0800
parents c07713463c91
children f03db3db48fb
files m68k_to_x86.c
diffstat 1 files changed, 15 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/m68k_to_x86.c	Sun Jan 06 13:42:13 2013 -0800
+++ b/m68k_to_x86.c	Sun Jan 06 13:58:33 2013 -0800
@@ -3143,6 +3143,7 @@
 		}
 		break;
 	case M68K_RTE:
+		//TODO: Trap if not in system mode
 		dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
 		dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
 		dst = push_r(dst, SCRATCH1);
@@ -3162,8 +3163,20 @@
 		dst = call(dst, (uint8_t *)m68k_native_addr_and_sync);
 		dst = jmp_r(dst, SCRATCH1);
 		break;
-	/*case M68K_RTR:
-	case M68K_SBCD:
+	case M68K_RTR:
+		dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
+		dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
+		dst = push_r(dst, SCRATCH1);
+		dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
+		dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
+		dst = call(dst, (uint8_t *)m68k_read_word_scratch1);
+		dst = add_ir(dst, 2, opts->aregs[7], SZ_D);
+		dst = call(dst, (uint8_t *)set_ccr);
+		dst = pop_r(dst, SCRATCH1);
+		dst = call(dst, (uint8_t *)m68k_native_addr_and_sync);
+		dst = jmp_r(dst, SCRATCH1);
+		break;
+	/*case M68K_SBCD:
 	case M68K_STOP:
 		break;*/
 	case M68K_SUB: