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 }