NEC INM/OUTM instructions (#14)
This commit is contained in:
@@ -1678,6 +1678,27 @@ cpu_data_opff_rm(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
cpu_inw(uint16_t port) {
|
||||||
|
if (is8086 && !(port & 1)) {
|
||||||
|
wait(4, 0);
|
||||||
|
} else {
|
||||||
|
wait(8, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return inw(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cpu_outw(uint16_t port, uint16_t val) {
|
||||||
|
if (is8086 && !(port & 1)) {
|
||||||
|
wait(4, 0);
|
||||||
|
} else {
|
||||||
|
wait(8, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return outw(port, val);
|
||||||
|
}
|
||||||
|
|
||||||
/* Executes instructions up to the specified number of cycles. */
|
/* Executes instructions up to the specified number of cycles. */
|
||||||
void
|
void
|
||||||
@@ -1710,6 +1731,57 @@ execx86(int cycs)
|
|||||||
// pclog("[%04X:%04X] Opcode: %02X\n", CS, cpu_state.pc, opcode);
|
// pclog("[%04X:%04X] Opcode: %02X\n", CS, cpu_state.pc, opcode);
|
||||||
if (is186) {
|
if (is186) {
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
|
case 0x6c: case 0x6d: /* INM dst, DW/INS dst, DX */
|
||||||
|
{
|
||||||
|
bits = 8 << (opcode & 1);
|
||||||
|
if (!repeating) wait(2, 0);
|
||||||
|
|
||||||
|
if (rep_action(bits)) {
|
||||||
|
break;
|
||||||
|
} else if (!repeating) {
|
||||||
|
wait(7, 0);
|
||||||
|
}
|
||||||
|
if (bits == 16) {
|
||||||
|
writememw(es, DI, cpu_inw(DX));
|
||||||
|
DI += (cpu_state.flags & D_FLAG) ? -2 : 2;
|
||||||
|
} else {
|
||||||
|
wait(4, 0);
|
||||||
|
writememb(es, DI, inb(DX));
|
||||||
|
DI += (cpu_state.flags & D_FLAG) ? -1 : 1;
|
||||||
|
}
|
||||||
|
if (in_rep == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
repeating = 1;
|
||||||
|
clock_end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x6e: case 0x6f: /* OUTM DW, src/OUTS DX, src */
|
||||||
|
{
|
||||||
|
uint32_t dest_seg = ovr_seg ? *ovr_seg : ds;
|
||||||
|
bits = 8 << (opcode & 1);
|
||||||
|
if (!repeating) wait(2, 0);
|
||||||
|
|
||||||
|
if (rep_action(bits)) {
|
||||||
|
break;
|
||||||
|
} else if (!repeating) {
|
||||||
|
wait(7, 0);
|
||||||
|
}
|
||||||
|
if (bits == 16) {
|
||||||
|
cpu_outw(DX, readmemw(dest_seg, SI));
|
||||||
|
SI += (cpu_state.flags & D_FLAG) ? -2 : 2;
|
||||||
|
} else {
|
||||||
|
wait(4, 0);
|
||||||
|
outb(DX, readmemb(dest_seg + SI));
|
||||||
|
SI += (cpu_state.flags & D_FLAG) ? -1 : 1;
|
||||||
|
}
|
||||||
|
if (in_rep == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
repeating = 1;
|
||||||
|
clock_end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 0xC8: /* ENTER/PREPARE */
|
case 0xC8: /* ENTER/PREPARE */
|
||||||
{
|
{
|
||||||
uint16_t temp = 0;
|
uint16_t temp = 0;
|
||||||
|
Reference in New Issue
Block a user