# HG changeset patch # User Mike Pavone # Date 1367634452 25200 # Node ID 765e132edd71b012bbce2bfd50ab16c9669d4838 # Parent eec7072189a14f5f3711223730d46e465f2bcfc2 Using push/pop inside translated code is not compatible with the current way the Z80 core returns to the caller diff -r eec7072189a1 -r 765e132edd71 z80_to_x86.c --- 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;