Mercurial > repos > blastem
comparison z80_to_x86.c @ 899:07bfbbbb4b2e
Fix for Z80 retranslation post alignment rework
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 26 Nov 2015 22:30:41 -0800 |
parents | 2f1157f00dc6 |
children | 30efd12b1be1 |
comparison
equal
deleted
inserted
replaced
898:2f1157f00dc6 | 899:07bfbbbb4b2e |
---|---|
2093 z80_context * z80_handle_code_write(uint32_t address, z80_context * context) | 2093 z80_context * z80_handle_code_write(uint32_t address, z80_context * context) |
2094 { | 2094 { |
2095 uint32_t inst_start = z80_get_instruction_start(context->static_code_map, address); | 2095 uint32_t inst_start = z80_get_instruction_start(context->static_code_map, address); |
2096 if (inst_start != INVALID_INSTRUCTION_START) { | 2096 if (inst_start != INVALID_INSTRUCTION_START) { |
2097 code_ptr dst = z80_get_native_address(context, inst_start); | 2097 code_ptr dst = z80_get_native_address(context, inst_start); |
2098 code_info code = {dst, dst+16}; | 2098 code_info code = {dst, dst+32, 0}; |
2099 z80_options * opts = context->options; | 2099 z80_options * opts = context->options; |
2100 dprintf("patching code at %p for Z80 instruction at %X due to write to %X\n", code.cur, inst_start, address); | 2100 dprintf("patching code at %p for Z80 instruction at %X due to write to %X\n", code.cur, inst_start, address); |
2101 mov_ir(&code, inst_start, opts->gen.scratch1, SZ_D); | 2101 mov_ir(&code, inst_start, opts->gen.scratch1, SZ_D); |
2102 call(&code, opts->retrans_stub); | 2102 call(&code, opts->retrans_stub); |
2103 } | 2103 } |
2534 call(code, options->write_8_noinc); | 2534 call(code, options->write_8_noinc); |
2535 retn(code); | 2535 retn(code); |
2536 | 2536 |
2537 options->retrans_stub = code->cur; | 2537 options->retrans_stub = code->cur; |
2538 tmp_stack_off = code->stack_off; | 2538 tmp_stack_off = code->stack_off; |
2539 //calculate size of patch | |
2540 mov_ir(code, 0x7FFF, options->gen.scratch1, SZ_D); | |
2541 code->stack_off += sizeof(void *); | |
2542 if (code->stack_off & 0xF) { | |
2543 sub_ir(code, 16 - (code->stack_off & 0xF), RSP, SZ_PTR); | |
2544 } | |
2545 call_noalign(code, options->retrans_stub); | |
2546 uint32_t patch_size = code->cur - options->retrans_stub; | |
2547 code->cur = options->retrans_stub; | |
2548 code->stack_off = tmp_stack_off; | |
2549 | |
2539 //pop return address | 2550 //pop return address |
2540 pop_r(code, options->gen.scratch2); | 2551 pop_r(code, options->gen.scratch2); |
2541 add_ir(code, 16-sizeof(void*), RSP, SZ_PTR); | 2552 add_ir(code, 16-sizeof(void*), RSP, SZ_PTR); |
2542 code->stack_off = tmp_stack_off; | 2553 code->stack_off = tmp_stack_off; |
2543 call(code, options->gen.save_context); | 2554 call(code, options->gen.save_context); |
2544 //adjust pointer before move and call instructions that got us here | 2555 //adjust pointer before move and call instructions that got us here |
2545 sub_ir(code, options->gen.scratch1 >= R8 ? 11 : 10, options->gen.scratch2, SZ_PTR); | 2556 sub_ir(code, patch_size, options->gen.scratch2, SZ_PTR); |
2546 push_r(code, options->gen.context_reg); | 2557 push_r(code, options->gen.context_reg); |
2547 call_args(code, (code_ptr)z80_retranslate_inst, 3, options->gen.scratch1, options->gen.context_reg, options->gen.scratch2); | 2558 call_args(code, (code_ptr)z80_retranslate_inst, 3, options->gen.scratch1, options->gen.context_reg, options->gen.scratch2); |
2548 pop_r(code, options->gen.context_reg); | 2559 pop_r(code, options->gen.context_reg); |
2549 mov_rr(code, RAX, options->gen.scratch1, SZ_PTR); | 2560 mov_rr(code, RAX, options->gen.scratch1, SZ_PTR); |
2550 call(code, options->gen.load_context); | 2561 call(code, options->gen.load_context); |