comparison m68k_to_x86.c @ 96:f894f85cf39d

Fix pc indexed addressing (probably) when used as a source
author Mike Pavone <pavone@retrodev.com>
date Thu, 27 Dec 2012 21:23:55 -0800
parents dd3c680c618c
children c7185fd840fc
comparison
equal deleted inserted replaced
95:dd3c680c618c 96:f894f85cf39d
243 ea->mode = MODE_REG_DIRECT; 243 ea->mode = MODE_REG_DIRECT;
244 ea->base = SCRATCH1; 244 ea->base = SCRATCH1;
245 break; 245 break;
246 case MODE_PC_INDEX_DISP8: 246 case MODE_PC_INDEX_DISP8:
247 out = cycles(out, 6); 247 out = cycles(out, 6);
248 out = mov_ir(out, inst->address, SCRATCH1, SZ_D); 248 out = mov_ir(out, inst->address+2, SCRATCH1, SZ_D);
249 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7; 249 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7;
250 if (inst->src.params.regs.sec & 1) { 250 if (inst->src.params.regs.sec & 1) {
251 if (inst->src.params.regs.sec & 0x10) { 251 if (inst->src.params.regs.sec & 0x10) {
252 if (opts->aregs[sec_reg] >= 0) { 252 if (opts->aregs[sec_reg] >= 0) {
253 out = add_rr(out, opts->aregs[sec_reg], SCRATCH1, SZ_D); 253 out = add_rr(out, opts->aregs[sec_reg], SCRATCH1, SZ_D);
278 out = add_rr(out, SCRATCH2, SCRATCH1, SZ_D); 278 out = add_rr(out, SCRATCH2, SCRATCH1, SZ_D);
279 } 279 }
280 if (inst->src.params.regs.displacement) { 280 if (inst->src.params.regs.displacement) {
281 out = add_ir(out, inst->src.params.regs.displacement, SCRATCH1, SZ_D); 281 out = add_ir(out, inst->src.params.regs.displacement, SCRATCH1, SZ_D);
282 } 282 }
283 switch (inst->extra.size)
284 {
285 case OPSIZE_BYTE:
286 out = call(out, (char *)m68k_read_byte_scratch1);
287 break;
288 case OPSIZE_WORD:
289 out = call(out, (char *)m68k_read_word_scratch1);
290 break;
291 case OPSIZE_LONG:
292 out = call(out, (char *)m68k_read_long_scratch1);
293 break;
294 }
295 ea->mode = MODE_REG_DIRECT;
296 ea->base = SCRATCH1;
283 break; 297 break;
284 case MODE_ABSOLUTE: 298 case MODE_ABSOLUTE:
285 case MODE_ABSOLUTE_SHORT: 299 case MODE_ABSOLUTE_SHORT:
286 if (inst->src.addr_mode == MODE_ABSOLUTE) { 300 if (inst->src.addr_mode == MODE_ABSOLUTE) {
287 out = cycles(out, BUS*2); 301 out = cycles(out, BUS*2);
485 } 499 }
486 500
487 uint8_t * get_native_address(native_map_slot * native_code_map, uint32_t address) 501 uint8_t * get_native_address(native_map_slot * native_code_map, uint32_t address)
488 { 502 {
489 address &= 0xFFFFFF; 503 address &= 0xFFFFFF;
490 //if (address > 0x400000) { 504 if (address > 0x400000) {
491 printf("get_native_address: %X\n", address); 505 printf("get_native_address: %X\n", address);
492 //} 506 }
493 address /= 2; 507 address /= 2;
494 uint32_t chunk = address / NATIVE_CHUNK_SIZE; 508 uint32_t chunk = address / NATIVE_CHUNK_SIZE;
495 if (!native_code_map[chunk].base) { 509 if (!native_code_map[chunk].base) {
496 return NULL; 510 return NULL;
497 } 511 }