Mercurial > repos > blastem
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 } |