Mercurial > repos > blastem
comparison m68k_to_x86.c @ 352:8c3409585130
Finish SRAM support for games without a SEGA mapper
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 21 May 2013 23:29:48 -0700 |
parents | 2f264d2a60c2 |
children | 8e136187c0e0 |
comparison
equal
deleted
inserted
replaced
351:2f264d2a60c2 | 352:8c3409585130 |
---|---|
4226 | 4226 |
4227 } else { | 4227 } else { |
4228 dst = mov_rindr(dst, SCRATCH1, SCRATCH1, size); | 4228 dst = mov_rindr(dst, SCRATCH1, SCRATCH1, size); |
4229 } | 4229 } |
4230 } else { | 4230 } else { |
4231 uint8_t tmp_size = size; | |
4231 if (size == SZ_B) { | 4232 if (size == SZ_B) { |
4232 dst = xor_ir(dst, 1, adr_reg, SZ_D); | 4233 if ((memmap[chunk].flags & MMAP_ONLY_ODD) || (memmap[chunk].flags & MMAP_ONLY_EVEN)) { |
4234 dst = bt_ir(dst, 0, adr_reg, SZ_D); | |
4235 uint8_t * good_addr = dst + 1; | |
4236 dst = jcc(dst, (memmap[chunk].flags & MMAP_ONLY_ODD) ? CC_C : CC_NC, dst+2); | |
4237 if (!is_write) { | |
4238 dst = mov_ir(dst, 0xFF, SCRATCH1, SZ_B); | |
4239 } | |
4240 dst = retn(dst); | |
4241 *good_addr = dst - (good_addr + 1); | |
4242 dst = shr_ir(dst, 1, adr_reg, SZ_D); | |
4243 } else { | |
4244 dst = xor_ir(dst, 1, adr_reg, SZ_D); | |
4245 } | |
4246 } else if ((memmap[chunk].flags & MMAP_ONLY_ODD) || (memmap[chunk].flags & MMAP_ONLY_EVEN)) { | |
4247 tmp_size = SZ_B; | |
4248 dst = shr_ir(dst, 1, adr_reg, SZ_D); | |
4249 if ((memmap[chunk].flags & MMAP_ONLY_EVEN) && is_write) { | |
4250 dst = shr_ir(dst, 8, SCRATCH1, SZ_W); | |
4251 } | |
4233 } | 4252 } |
4234 if ((int64_t)memmap[chunk].buffer <= 0x7FFFFFFF && (int64_t)memmap[chunk].buffer >= -2147483648) { | 4253 if ((int64_t)memmap[chunk].buffer <= 0x7FFFFFFF && (int64_t)memmap[chunk].buffer >= -2147483648) { |
4235 if (is_write) { | 4254 if (is_write) { |
4236 dst = mov_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, size); | 4255 dst = mov_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, tmp_size); |
4237 } else { | 4256 } else { |
4238 dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, size); | 4257 dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, tmp_size); |
4239 } | 4258 } |
4240 } else { | 4259 } else { |
4241 if (is_write) { | 4260 if (is_write) { |
4242 dst = push_r(dst, SCRATCH1); | 4261 dst = push_r(dst, SCRATCH1); |
4243 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH1, SZ_Q); | 4262 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH1, SZ_Q); |
4244 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_Q); | 4263 dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_Q); |
4245 dst = pop_r(dst, SCRATCH1); | 4264 dst = pop_r(dst, SCRATCH1); |
4246 dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); | 4265 dst = mov_rrind(dst, SCRATCH1, SCRATCH2, tmp_size); |
4247 } else { | 4266 } else { |
4248 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q); | 4267 dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q); |
4249 dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, size); | 4268 dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, tmp_size); |
4269 } | |
4270 } | |
4271 if (size != tmp_size && !is_write) { | |
4272 if (memmap[chunk].flags & MMAP_ONLY_EVEN) { | |
4273 dst = shl_ir(dst, 8, SCRATCH1, SZ_W); | |
4274 dst = mov_ir(dst, 0xFF, SCRATCH1, SZ_B); | |
4275 } else { | |
4276 dst = or_ir(dst, 0xFF00, SCRATCH1, SZ_W); | |
4250 } | 4277 } |
4251 } | 4278 } |
4252 } | 4279 } |
4253 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { | 4280 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { |
4254 dst = mov_rr(dst, SCRATCH2, SCRATCH1, SZ_D); | 4281 dst = mov_rr(dst, SCRATCH2, SCRATCH1, SZ_D); |