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)