Mercurial > repos > blastem
comparison m68k_to_x86.c @ 54:3b79cbcf6846
Get Flavio's color bar demo kind of sort of working
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 18 Dec 2012 02:16:42 -0800 |
parents | 44e661913a51 |
children | 32650c77008a |
comparison
equal
deleted
inserted
replaced
53:44e661913a51 | 54:3b79cbcf6846 |
---|---|
145 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 145 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
146 out = add_ir(out, inc_amount, opts->aregs[inst->src.params.regs.pri], SZ_D); | 146 out = add_ir(out, inc_amount, opts->aregs[inst->src.params.regs.pri], SZ_D); |
147 } else { | 147 } else { |
148 out = add_irdisp8(out, inc_amount, CONTEXT, reg_offset(&(inst->src)), SZ_D); | 148 out = add_irdisp8(out, inc_amount, CONTEXT, reg_offset(&(inst->src)), SZ_D); |
149 } | 149 } |
150 } | |
151 ea->mode = MODE_REG_DIRECT; | |
152 ea->base = SCRATCH1; | |
153 break; | |
154 case MODE_ABSOLUTE: | |
155 case MODE_ABSOLUTE_SHORT: | |
156 if (inst->src.addr_mode == MODE_ABSOLUTE) { | |
157 out = cycles(out, BUS*2); | |
158 } else { | |
159 out = cycles(out, BUS); | |
160 } | |
161 out = mov_ir(out, inst->src.params.immed, SCRATCH1, SZ_D); | |
162 out = check_cycles(out); | |
163 switch (inst->extra.size) | |
164 { | |
165 case OPSIZE_BYTE: | |
166 out = call(out, (char *)m68k_read_byte_scratch1); | |
167 break; | |
168 case OPSIZE_WORD: | |
169 out = call(out, (char *)m68k_read_word_scratch1); | |
170 break; | |
171 case OPSIZE_LONG: | |
172 out = call(out, (char *)m68k_read_long_scratch1); | |
173 break; | |
150 } | 174 } |
151 ea->mode = MODE_REG_DIRECT; | 175 ea->mode = MODE_REG_DIRECT; |
152 ea->base = SCRATCH1; | 176 ea->base = SCRATCH1; |
153 break; | 177 break; |
154 case MODE_IMMEDIATE: | 178 case MODE_IMMEDIATE: |
330 int32_t offset; | 354 int32_t offset; |
331 int32_t inc_amount, dec_amount; | 355 int32_t inc_amount, dec_amount; |
332 x86_ea src; | 356 x86_ea src; |
333 dst = translate_m68k_src(inst, &src, dst, opts); | 357 dst = translate_m68k_src(inst, &src, dst, opts); |
334 reg = native_reg(&(inst->dst), opts); | 358 reg = native_reg(&(inst->dst), opts); |
359 //update statically set flags | |
360 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | |
361 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | |
362 | |
335 if (src.mode == MODE_REG_DIRECT) { | 363 if (src.mode == MODE_REG_DIRECT) { |
336 flags_reg = src.base; | 364 flags_reg = src.base; |
337 } else { | 365 } else { |
338 if (reg >= 0) { | 366 if (reg >= 0) { |
339 flags_reg = reg; | 367 flags_reg = reg; |
360 printf("mov_rrdisp8 from reg %d to offset %d from reg %d (%d)\n", src.base, (int)reg_offset(&(inst->dst)), CONTEXT, inst->dst.params.regs.pri); | 388 printf("mov_rrdisp8 from reg %d to offset %d from reg %d (%d)\n", src.base, (int)reg_offset(&(inst->dst)), CONTEXT, inst->dst.params.regs.pri); |
361 dst = mov_rrdisp8(dst, src.base, CONTEXT, reg_offset(&(inst->dst)), inst->extra.size); | 389 dst = mov_rrdisp8(dst, src.base, CONTEXT, reg_offset(&(inst->dst)), inst->extra.size); |
362 } else { | 390 } else { |
363 dst = mov_irdisp8(dst, src.disp, CONTEXT, reg_offset(&(inst->dst)), inst->extra.size); | 391 dst = mov_irdisp8(dst, src.disp, CONTEXT, reg_offset(&(inst->dst)), inst->extra.size); |
364 } | 392 } |
393 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | |
394 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
395 dst = setcc_r(dst, CC_S, FLAG_N); | |
365 break; | 396 break; |
366 case MODE_AREG_PREDEC: | 397 case MODE_AREG_PREDEC: |
367 dec_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1); | 398 dec_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1); |
368 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { | 399 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { |
369 dst = sub_ir(dst, dec_amount, opts->aregs[inst->dst.params.regs.pri], SZ_D); | 400 dst = sub_ir(dst, dec_amount, opts->aregs[inst->dst.params.regs.pri], SZ_D); |
384 } else if (src.mode == MODE_REG_DISPLACE8) { | 415 } else if (src.mode == MODE_REG_DISPLACE8) { |
385 dst = mov_rdisp8r(dst, src.base, src.disp, SCRATCH1, inst->extra.size); | 416 dst = mov_rdisp8r(dst, src.base, src.disp, SCRATCH1, inst->extra.size); |
386 } else { | 417 } else { |
387 dst = mov_ir(dst, src.disp, SCRATCH1, inst->extra.size); | 418 dst = mov_ir(dst, src.disp, SCRATCH1, inst->extra.size); |
388 } | 419 } |
420 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | |
421 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
422 dst = setcc_r(dst, CC_S, FLAG_N); | |
389 switch (inst->extra.size) | 423 switch (inst->extra.size) |
390 { | 424 { |
391 case OPSIZE_BYTE: | 425 case OPSIZE_BYTE: |
392 dst = call(dst, (char *)m68k_write_byte); | 426 dst = call(dst, (char *)m68k_write_byte); |
393 break; | 427 break; |
405 } else { | 439 } else { |
406 dst = add_irdisp8(dst, inc_amount, CONTEXT, reg_offset(&(inst->dst)), SZ_D); | 440 dst = add_irdisp8(dst, inc_amount, CONTEXT, reg_offset(&(inst->dst)), SZ_D); |
407 } | 441 } |
408 } | 442 } |
409 break; | 443 break; |
444 case MODE_ABSOLUTE: | |
445 case MODE_ABSOLUTE_SHORT: | |
446 if (src.mode == MODE_REG_DIRECT) { | |
447 if (src.base != SCRATCH1) { | |
448 dst = mov_rr(dst, src.base, SCRATCH1, inst->extra.size); | |
449 } | |
450 } else if (src.mode == MODE_REG_DISPLACE8) { | |
451 dst = mov_rdisp8r(dst, src.base, src.disp, SCRATCH1, inst->extra.size); | |
452 } else { | |
453 dst = mov_ir(dst, src.disp, SCRATCH1, inst->extra.size); | |
454 } | |
455 if (inst->dst.addr_mode == MODE_ABSOLUTE) { | |
456 dst = cycles(dst, BUS*2); | |
457 } else { | |
458 dst = cycles(dst, BUS); | |
459 } | |
460 dst = mov_ir(dst, inst->dst.params.immed, SCRATCH2, SZ_D); | |
461 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | |
462 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
463 dst = setcc_r(dst, CC_S, FLAG_N); | |
464 dst = check_cycles(dst); | |
465 switch (inst->extra.size) | |
466 { | |
467 case OPSIZE_BYTE: | |
468 dst = call(dst, (char *)m68k_write_byte); | |
469 break; | |
470 case OPSIZE_WORD: | |
471 dst = call(dst, (char *)m68k_write_word); | |
472 break; | |
473 case OPSIZE_LONG: | |
474 dst = call(dst, (char *)m68k_write_long_highfirst); | |
475 break; | |
476 } | |
477 break; | |
410 default: | 478 default: |
411 printf("address mode %d not implemented (move dst)\n", inst->dst.addr_mode); | 479 printf("address mode %d not implemented (move dst)\n", inst->dst.addr_mode); |
412 exit(1); | 480 exit(1); |
413 } | 481 } |
414 | 482 |
415 //add cycles for prefetch | 483 //add cycles for prefetch |
416 dst = cycles(dst, BUS); | 484 dst = cycles(dst, BUS); |
417 //update flags | |
418 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | |
419 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | |
420 dst = cmp_ir(dst, 0, flags_reg, inst->extra.size); | |
421 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
422 dst = setcc_r(dst, CC_S, FLAG_N); | |
423 dst = check_cycles(dst); | 485 dst = check_cycles(dst); |
424 return dst; | 486 return dst; |
425 } | 487 } |
426 | 488 |
427 uint8_t * translate_m68k_clr(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 489 uint8_t * translate_m68k_clr(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |