changeset 277:765e132edd71

Using push/pop inside translated code is not compatible with the current way the Z80 core returns to the caller
author Mike Pavone <pavone@retrodev.com>
date Fri, 03 May 2013 19:27:32 -0700
parents eec7072189a1
children 9578e5dea147
files z80_to_x86.c
diffstat 1 files changed, 12 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/z80_to_x86.c	Fri May 03 18:50:16 2013 -0700
+++ b/z80_to_x86.c	Fri May 03 19:27:32 2013 -0700
@@ -192,7 +192,8 @@
 		size = z80_size(inst);
 		if (read) {
 			if (modify) {
-				dst = push_r(dst, SCRATCH1);
+				//dst = push_r(dst, SCRATCH1);
+				dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(z80_context, scratch1), SZ_W);
 			}
 			if (size == SZ_B) {
 				dst = call(dst, (uint8_t *)z80_read_byte);
@@ -200,7 +201,8 @@
 				dst = call(dst, (uint8_t *)z80_read_word);
 			}
 			if (modify) {
-				dst = pop_r(dst, SCRATCH2);
+				//dst = pop_r(dst, SCRATCH2);
+				dst = mov_rdisp8r(dst, CONTEXT, offsetof(z80_context, scratch1), SCRATCH2, SZ_W);
 			}
 		}
 		ea->base = SCRATCH1;
@@ -213,16 +215,17 @@
 		dst = mov_ir(dst, inst->immed, areg, SZ_W);
 		size = z80_size(inst);
 		if (read) {
-			if (modify) {
+			/*if (modify) {
 				dst = push_r(dst, SCRATCH1);
-			}
+			}*/
 			if (size == SZ_B) {
 				dst = call(dst, (uint8_t *)z80_read_byte);
 			} else {
 				dst = call(dst, (uint8_t *)z80_read_word);
 			}
 			if (modify) {
-				dst = pop_r(dst, SCRATCH2);
+				//dst = pop_r(dst, SCRATCH2);
+				dst = mov_ir(dst, inst->immed, SCRATCH2, SZ_W);
 			}
 		}
 		ea->base = SCRATCH1;
@@ -235,7 +238,8 @@
 		size = z80_size(inst);
 		if (read) {
 			if (modify) {
-				dst = push_r(dst, SCRATCH1);
+				//dst = push_r(dst, SCRATCH1);
+				dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(z80_context, scratch1), SZ_W);
 			}
 			if (size == SZ_B) {
 				dst = call(dst, (uint8_t *)z80_read_byte);
@@ -243,7 +247,8 @@
 				dst = call(dst, (uint8_t *)z80_read_word);
 			}
 			if (modify) {
-				dst = pop_r(dst, SCRATCH2);
+				//dst = pop_r(dst, SCRATCH2);
+				dst = mov_rdisp8r(dst, CONTEXT, offsetof(z80_context, scratch1), SCRATCH2, SZ_W);
 			}
 		}
 		ea->base = SCRATCH1;