comparison z80_to_x86.c @ 284:ed7098f717d7

Implement IN and OUT (untested)
author Mike Pavone <pavone@retrodev.com>
date Sat, 04 May 2013 15:58:15 -0700
parents 61f5d88ea01a
children 021aeb6df19b
comparison
equal deleted inserted replaced
283:61f5d88ea01a 284:ed7098f717d7
31 void z80_save_context(); 31 void z80_save_context();
32 void z80_native_addr(); 32 void z80_native_addr();
33 void z80_do_sync(); 33 void z80_do_sync();
34 void z80_handle_cycle_limit_int(); 34 void z80_handle_cycle_limit_int();
35 void z80_retrans_stub(); 35 void z80_retrans_stub();
36 void z80_io_read();
37 void z80_io_write();
36 38
37 uint8_t z80_size(z80inst * inst) 39 uint8_t z80_size(z80inst * inst)
38 { 40 {
39 uint8_t reg = (inst->reg & 0x1F); 41 uint8_t reg = (inst->reg & 0x1F);
40 if (reg != Z80_UNUSED && reg != Z80_USE_IMMED) { 42 if (reg != Z80_UNUSED && reg != Z80_USE_IMMED) {
1405 call_dst = dst + 256; 1407 call_dst = dst + 256;
1406 } 1408 }
1407 dst = jmp(dst, call_dst); 1409 dst = jmp(dst, call_dst);
1408 break; 1410 break;
1409 } 1411 }
1410 /*case Z80_IN: 1412 case Z80_IN:
1411 case Z80_INI: 1413 dst = zcycles(dst, inst->reg == Z80_A ? 7 : 8);//T States: 4 3/4
1414 if (inst->addr_mode == Z80_IMMED_INDIRECT) {
1415 dst = mov_ir(dst, inst->immed, SCRATCH1, SZ_B);
1416 } else {
1417 dst = mov_rr(dst, opts->regs[Z80_C], SCRATCH1, SZ_B);
1418 }
1419 dst = call(dst, (uint8_t *)z80_io_read);
1420 translate_z80_reg(inst, &dst_op, dst, opts);
1421 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_B);
1422 dst = z80_save_reg(dst, inst, opts);
1423 break;
1424 /*case Z80_INI:
1412 case Z80_INIR: 1425 case Z80_INIR:
1413 case Z80_IND: 1426 case Z80_IND:
1414 case Z80_INDR: 1427 case Z80_INDR:*/
1415 case Z80_OUT: 1428 case Z80_OUT:
1416 case Z80_OUTI: 1429 dst = zcycles(dst, inst->reg == Z80_A ? 7 : 8);//T States: 4 3/4
1430 if ((inst->addr_mode & 0x1F) == Z80_IMMED_INDIRECT) {
1431 dst = mov_ir(dst, inst->immed, SCRATCH2, SZ_B);
1432 } else {
1433 dst = mov_rr(dst, opts->regs[Z80_C], SCRATCH2, SZ_B);
1434 }
1435 translate_z80_reg(inst, &src_op, dst, opts);
1436 dst = mov_rr(dst, dst_op.base, SCRATCH1, SZ_B);
1437 dst = call(dst, (uint8_t *)z80_io_write);
1438 dst = z80_save_reg(dst, inst, opts);
1439 break;
1440 /*case Z80_OUTI:
1417 case Z80_OTIR: 1441 case Z80_OTIR:
1418 case Z80_OUTD: 1442 case Z80_OUTD:
1419 case Z80_OTDR:*/ 1443 case Z80_OTDR:*/
1420 default: { 1444 default: {
1421 char disbuf[80]; 1445 char disbuf[80];