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);