comparison z80_to_x86.c @ 663:7a5461001242

Sync Z80 when taking an interrupt so that int_cycle gets updated
author Michael Pavone <pavone@retrodev.com>
date Fri, 02 Jan 2015 00:19:10 -0800
parents 66388360f873
children bca748422bf0
comparison
equal deleted inserted replaced
662:66388360f873 663:7a5461001242
2101 //dispose of return address as we'll be jumping somewhere else 2101 //dispose of return address as we'll be jumping somewhere else
2102 pop_r(code, options->gen.scratch2); 2102 pop_r(code, options->gen.scratch2);
2103 //TODO: Support interrupt mode 0 and 2 2103 //TODO: Support interrupt mode 0 and 2
2104 mov_ir(code, 0x38, options->gen.scratch1, SZ_W); 2104 mov_ir(code, 0x38, options->gen.scratch1, SZ_W);
2105 call(code, options->native_addr); 2105 call(code, options->native_addr);
2106 jmp_r(code, options->gen.scratch1); 2106 mov_rrind(code, options->gen.scratch1, options->gen.context_reg, SZ_PTR);
2107 //restore callee saved registers
2108 pop_r(code, R15);
2109 pop_r(code, R14);
2110 pop_r(code, R13);
2111 pop_r(code, R12);
2112 pop_r(code, RBP);
2113 pop_r(code, RBX);
2114 //return to caller of z80_run to sync
2115 retn(code);
2107 *skip_int = code->cur - (skip_int+1); 2116 *skip_int = code->cur - (skip_int+1);
2108 cmp_rdispr(code, options->gen.context_reg, offsetof(z80_context, sync_cycle), options->gen.cycles, SZ_D); 2117 cmp_rdispr(code, options->gen.context_reg, offsetof(z80_context, sync_cycle), options->gen.cycles, SZ_D);
2109 code_ptr skip_sync = code->cur + 1; 2118 code_ptr skip_sync = code->cur + 1;
2110 jcc(code, CC_B, skip_sync); 2119 jcc(code, CC_B, skip_sync);
2111 options->do_sync = code->cur; 2120 options->do_sync = code->cur;