Mercurial > repos > blastem
comparison m68k_to_x86.c @ 351:2f264d2a60c2
Support for SRAM with SEGA mapper. Half-finished support for SRAM without SEGA mapper.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 21 May 2013 22:08:59 -0700 |
parents | 91aa2aa05e68 |
children | 8c3409585130 |
comparison
equal
deleted
inserted
replaced
350:91aa2aa05e68 | 351:2f264d2a60c2 |
---|---|
4190 cfun = memmap[chunk].write_8; | 4190 cfun = memmap[chunk].write_8; |
4191 break; | 4191 break; |
4192 default: | 4192 default: |
4193 cfun = NULL; | 4193 cfun = NULL; |
4194 } | 4194 } |
4195 if (cfun) { | 4195 if(memmap[chunk].buffer && memmap[chunk].flags & access_flag) { |
4196 dst = call(dst, (uint8_t *)m68k_save_context); | 4196 if (memmap[chunk].flags & MMAP_PTR_IDX) { |
4197 if (is_write) { | 4197 if (memmap[chunk].flags & MMAP_FUNC_NULL) { |
4198 //SCRATCH2 is RDI, so no need to move it there | 4198 dst = cmp_irdisp8(dst, 0, CONTEXT, offsetof(m68k_context, mem_pointers) + sizeof(void*) * memmap[chunk].ptr_index, SZ_Q); |
4199 dst = mov_rr(dst, SCRATCH1, RDX, size); | 4199 uint8_t * not_null = dst+1; |
4200 } else { | 4200 dst = jcc(dst, CC_NZ, dst+2); |
4201 dst = push_r(dst, CONTEXT); | 4201 dst = call(dst, (uint8_t *)m68k_save_context); |
4202 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); | 4202 if (is_write) { |
4203 } | 4203 //SCRATCH2 is RDI, so no need to move it there |
4204 dst = call(dst, cfun); | 4204 dst = mov_rr(dst, SCRATCH1, RDX, size); |
4205 if (is_write) { | 4205 } else { |
4206 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); | 4206 dst = push_r(dst, CONTEXT); |
4207 } else { | 4207 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); |
4208 dst = pop_r(dst, CONTEXT); | 4208 } |
4209 dst = mov_rr(dst, RAX, SCRATCH1, size); | 4209 dst = call(dst, cfun); |
4210 } | 4210 if (is_write) { |
4211 dst = jmp(dst, (uint8_t *)m68k_load_context); | 4211 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); |
4212 } else if(memmap[chunk].buffer && memmap[chunk].flags & access_flag) { | 4212 } else { |
4213 if (size == SZ_B) { | 4213 dst = pop_r(dst, CONTEXT); |
4214 dst = xor_ir(dst, 1, adr_reg, SZ_D); | 4214 dst = mov_rr(dst, RAX, SCRATCH1, size); |
4215 } | 4215 } |
4216 if ((int64_t)memmap[chunk].buffer <= 0x7FFFFFFF && (int64_t)memmap[chunk].buffer >= -2147483648) { | 4216 dst = jmp(dst, (uint8_t *)m68k_load_context); |
4217 | |
4218 *not_null = dst - (not_null + 1); | |
4219 } | |
4220 if (size == SZ_B) { | |
4221 dst = xor_ir(dst, 1, adr_reg, SZ_D); | |
4222 } | |
4223 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, mem_pointers) + sizeof(void*) * memmap[chunk].ptr_index, adr_reg, SZ_Q); | |
4217 if (is_write) { | 4224 if (is_write) { |
4218 dst = mov_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, size); | |
4219 } else { | |
4220 dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, size); | |
4221 } | |
4222 } else { | |
4223 if (is_write) { | |
4224 dst = push_r(dst, SCRATCH1); | |
4225 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH1, SZ_Q); | |
4226 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_Q); | |
4227 dst = pop_r(dst, SCRATCH1); | |
4228 dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); | 4225 dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); |
4229 } else { | 4226 |
4230 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q); | 4227 } else { |
4231 dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, size); | 4228 dst = mov_rindr(dst, SCRATCH1, SCRATCH1, size); |
4229 } | |
4230 } else { | |
4231 if (size == SZ_B) { | |
4232 dst = xor_ir(dst, 1, adr_reg, SZ_D); | |
4233 } | |
4234 if ((int64_t)memmap[chunk].buffer <= 0x7FFFFFFF && (int64_t)memmap[chunk].buffer >= -2147483648) { | |
4235 if (is_write) { | |
4236 dst = mov_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, size); | |
4237 } else { | |
4238 dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, size); | |
4239 } | |
4240 } else { | |
4241 if (is_write) { | |
4242 dst = push_r(dst, SCRATCH1); | |
4243 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH1, SZ_Q); | |
4244 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_Q); | |
4245 dst = pop_r(dst, SCRATCH1); | |
4246 dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); | |
4247 } else { | |
4248 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q); | |
4249 dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, size); | |
4250 } | |
4232 } | 4251 } |
4233 } | 4252 } |
4234 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { | 4253 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { |
4235 dst = mov_rr(dst, SCRATCH2, SCRATCH1, SZ_D); | 4254 dst = mov_rr(dst, SCRATCH2, SCRATCH1, SZ_D); |
4236 dst = shr_ir(dst, 11, SCRATCH1, SZ_D); | 4255 dst = shr_ir(dst, 11, SCRATCH1, SZ_D); |
4242 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); | 4261 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); |
4243 dst = call(dst, (uint8_t *)m68k_load_context); | 4262 dst = call(dst, (uint8_t *)m68k_load_context); |
4244 *not_code = dst - (not_code+1); | 4263 *not_code = dst - (not_code+1); |
4245 } | 4264 } |
4246 dst = retn(dst); | 4265 dst = retn(dst); |
4266 } else if (cfun) { | |
4267 dst = call(dst, (uint8_t *)m68k_save_context); | |
4268 if (is_write) { | |
4269 //SCRATCH2 is RDI, so no need to move it there | |
4270 dst = mov_rr(dst, SCRATCH1, RDX, size); | |
4271 } else { | |
4272 dst = push_r(dst, CONTEXT); | |
4273 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); | |
4274 } | |
4275 dst = call(dst, cfun); | |
4276 if (is_write) { | |
4277 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); | |
4278 } else { | |
4279 dst = pop_r(dst, CONTEXT); | |
4280 dst = mov_rr(dst, RAX, SCRATCH1, size); | |
4281 } | |
4282 dst = jmp(dst, (uint8_t *)m68k_load_context); | |
4247 } else { | 4283 } else { |
4248 //Not sure the best course of action here | 4284 //Not sure the best course of action here |
4249 if (!is_write) { | 4285 if (!is_write) { |
4250 dst = mov_ir(dst, size == SZ_B ? 0xFF : 0xFFFF, SCRATCH1, size); | 4286 dst = mov_ir(dst, size == SZ_B ? 0xFF : 0xFFFF, SCRATCH1, size); |
4251 } | 4287 } |