Improve the I/O read/write callbacks to allow multiple reads or writes
at once.


svn path=/branches/ntvdm/; revision=60849
This commit is contained in:
Aleksandar Andrejevic 2013-11-03 14:37:30 +00:00
parent c0a85cdfce
commit a0587b741a

View file

@ -82,146 +82,152 @@ static VOID WINAPI EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOI
static VOID WINAPI EmulatorReadIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Size) static VOID WINAPI EmulatorReadIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Size)
{ {
INT i;
LPBYTE Address = (LPBYTE)Buffer; LPBYTE Address = (LPBYTE)Buffer;
UNREFERENCED_PARAMETER(State); UNREFERENCED_PARAMETER(State);
UNREFERENCED_PARAMETER(Size);
switch (Port) for (i = 0; i < Size; i++)
{ {
case PIC_MASTER_CMD: switch (Port)
case PIC_SLAVE_CMD:
{ {
*Address = PicReadCommand(Port); case PIC_MASTER_CMD:
break; case PIC_SLAVE_CMD:
} {
*(Address++) = PicReadCommand(Port);
break;
}
case PIC_MASTER_DATA: case PIC_MASTER_DATA:
case PIC_SLAVE_DATA: case PIC_SLAVE_DATA:
{ {
*Address = PicReadData(Port); *(Address++) = PicReadData(Port);
break; break;
} }
case PIT_DATA_PORT(0): case PIT_DATA_PORT(0):
case PIT_DATA_PORT(1): case PIT_DATA_PORT(1):
case PIT_DATA_PORT(2): case PIT_DATA_PORT(2):
{ {
*Address = PitReadData(Port - PIT_DATA_PORT(0)); *(Address++) = PitReadData(Port - PIT_DATA_PORT(0));
break; break;
} }
case PS2_CONTROL_PORT: case PS2_CONTROL_PORT:
{ {
*Address = KeyboardReadStatus(); *(Address++) = KeyboardReadStatus();
break; break;
} }
case PS2_DATA_PORT: case PS2_DATA_PORT:
{ {
*Address = KeyboardReadData(); *(Address++) = KeyboardReadData();
break; break;
} }
case VGA_AC_WRITE: case VGA_AC_WRITE:
case VGA_AC_READ: case VGA_AC_READ:
case VGA_SEQ_INDEX: case VGA_SEQ_INDEX:
case VGA_SEQ_DATA: case VGA_SEQ_DATA:
case VGA_DAC_READ_INDEX: case VGA_DAC_READ_INDEX:
case VGA_DAC_WRITE_INDEX: case VGA_DAC_WRITE_INDEX:
case VGA_DAC_DATA: case VGA_DAC_DATA:
case VGA_MISC_READ: case VGA_MISC_READ:
case VGA_MISC_WRITE: case VGA_MISC_WRITE:
case VGA_CRTC_INDEX: case VGA_CRTC_INDEX:
case VGA_CRTC_DATA: case VGA_CRTC_DATA:
case VGA_GC_INDEX: case VGA_GC_INDEX:
case VGA_GC_DATA: case VGA_GC_DATA:
case VGA_STAT_MONO: case VGA_STAT_MONO:
case VGA_STAT_COLOR: case VGA_STAT_COLOR:
{ {
*Address = VgaReadPort(Port); *(Address++) = VgaReadPort(Port);
break; break;
} }
default: default:
{ {
DPRINT1("Read from unknown port: 0x%X\n", Port); DPRINT1("Read from unknown port: 0x%X\n", Port);
}
} }
} }
} }
static VOID WINAPI EmulatorWriteIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Size) static VOID WINAPI EmulatorWriteIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Size)
{ {
BYTE Byte = *(LPBYTE)Buffer; INT i;
LPBYTE Address = (LPBYTE)Buffer;
UNREFERENCED_PARAMETER(State); UNREFERENCED_PARAMETER(State);
UNREFERENCED_PARAMETER(Size);
switch (Port) for (i = 0; i < Size; i++)
{ {
case PIT_COMMAND_PORT: switch (Port)
{ {
PitWriteCommand(Byte); case PIT_COMMAND_PORT:
break; {
} PitWriteCommand(*(Address++));
break;
}
case PIT_DATA_PORT(0): case PIT_DATA_PORT(0):
case PIT_DATA_PORT(1): case PIT_DATA_PORT(1):
case PIT_DATA_PORT(2): case PIT_DATA_PORT(2):
{ {
PitWriteData(Port - PIT_DATA_PORT(0), Byte); PitWriteData(Port - PIT_DATA_PORT(0), *(Address++));
break; break;
} }
case PIC_MASTER_CMD: case PIC_MASTER_CMD:
case PIC_SLAVE_CMD: case PIC_SLAVE_CMD:
{ {
PicWriteCommand(Port, Byte); PicWriteCommand(Port, *(Address++));
break; break;
} }
case PIC_MASTER_DATA: case PIC_MASTER_DATA:
case PIC_SLAVE_DATA: case PIC_SLAVE_DATA:
{ {
PicWriteData(Port, Byte); PicWriteData(Port, *(Address++));
break; break;
} }
case PS2_CONTROL_PORT: case PS2_CONTROL_PORT:
{ {
KeyboardWriteCommand(Byte); KeyboardWriteCommand(*(Address++));
break; break;
} }
case PS2_DATA_PORT: case PS2_DATA_PORT:
{ {
KeyboardWriteData(Byte); KeyboardWriteData(*(Address++));
break; break;
} }
case VGA_AC_WRITE: case VGA_AC_WRITE:
case VGA_AC_READ: case VGA_AC_READ:
case VGA_SEQ_INDEX: case VGA_SEQ_INDEX:
case VGA_SEQ_DATA: case VGA_SEQ_DATA:
case VGA_DAC_READ_INDEX: case VGA_DAC_READ_INDEX:
case VGA_DAC_WRITE_INDEX: case VGA_DAC_WRITE_INDEX:
case VGA_DAC_DATA: case VGA_DAC_DATA:
case VGA_MISC_READ: case VGA_MISC_READ:
case VGA_MISC_WRITE: case VGA_MISC_WRITE:
case VGA_CRTC_INDEX: case VGA_CRTC_INDEX:
case VGA_CRTC_DATA: case VGA_CRTC_DATA:
case VGA_GC_INDEX: case VGA_GC_INDEX:
case VGA_GC_DATA: case VGA_GC_DATA:
case VGA_STAT_MONO: case VGA_STAT_MONO:
case VGA_STAT_COLOR: case VGA_STAT_COLOR:
{ {
VgaWritePort(Port, Byte); VgaWritePort(Port, *(Address++));
break; break;
} }
default: default:
{ {
DPRINT1("Write to unknown port: 0x%X\n", Port); DPRINT1("Write to unknown port: 0x%X\n", Port);
}
} }
} }
} }