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