summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--x86_backend.c9
-rw-r--r--x86_backend.h1
-rw-r--r--z80_to_x86.c2
3 files changed, 12 insertions, 0 deletions
diff --git a/x86_backend.c b/x86_backend.c
index b03703e..e3fe0ce 100644
--- a/x86_backend.c
+++ b/x86_backend.c
@@ -10,6 +10,15 @@ deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_
return new_head;
}
+void remove_deferred_until(deferred_addr **head_ptr, deferred_addr * remove_to)
+{
+ for(deferred_addr *cur = *head_ptr; cur && cur != remove_to; cur = *head_ptr)
+ {
+ *head_ptr = cur->next;
+ free(cur);
+ }
+}
+
void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_func get_native)
{
deferred_addr * cur = *head_ptr;
diff --git a/x86_backend.h b/x86_backend.h
index 51189cb..f29200c 100644
--- a/x86_backend.h
+++ b/x86_backend.h
@@ -28,6 +28,7 @@ typedef struct deferred_addr {
typedef uint8_t * (*native_addr_func)(void * context, uint32_t address);
deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest);
+void remove_deferred_until(deferred_addr **head_ptr, deferred_addr * remove_to);
void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_func get_native);
#endif //X86_BACKEND_H_
diff --git a/z80_to_x86.c b/z80_to_x86.c
index 7cb6eef..20bd873 100644
--- a/z80_to_x86.c
+++ b/z80_to_x86.c
@@ -1567,10 +1567,12 @@ void * z80_retranslate_inst(uint32_t address, z80_context * context)
opts->code_end = dst_end = dst + size;
opts->cur_code = dst;
}
+ deferred_addr * orig_deferred = opts->deferred;
uint8_t * native_end = translate_z80inst(&instbuf, dst, context, address);
if ((native_end - dst) <= orig_size) {
uint8_t * native_next = z80_get_native_address(context, address + after-inst);
if (native_next && ((native_next == orig_start + orig_size) || (orig_size - (native_end - dst)) > 5)) {
+ remove_deferred_until(&opts->deferred, orig_deferred);
native_end = translate_z80inst(&instbuf, orig_start, context, address);
if (native_next == orig_start + orig_size && (native_next-native_end) < 2) {
while (native_end < orig_start + orig_size) {