Mercurial > repos > blastem
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]; |