2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: I/O Port Handlers
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
17 /* PRIVATE VARIABLES **********************************************************/
19 typedef struct _EMULATOR_IOPORT_HANDLER
22 EMULATOR_OUT_PROC Out
;
23 } EMULATOR_IOPORT_HANDLER
, *PEMULATOR_IOPORT_HANDLER
;
26 * This is the list of registered I/O Port handlers.
28 EMULATOR_IOPORT_HANDLER IoPortProc
[EMULATOR_MAX_IOPORTS_NUM
];
30 /* PUBLIC FUNCTIONS ***********************************************************/
32 VOID WINAPI
RegisterIoPort(ULONG Port
,
33 EMULATOR_IN_PROC InHandler
,
34 EMULATOR_OUT_PROC OutHandler
)
36 if (IoPortProc
[Port
].In
== NULL
)
37 IoPortProc
[Port
].In
= InHandler
;
39 DPRINT1("IoPortProc[0x%X].In already registered\n", Port
);
41 if (IoPortProc
[Port
].Out
== NULL
)
42 IoPortProc
[Port
].Out
= OutHandler
;
44 DPRINT1("IoPortProc[0x%X].Out already registered\n", Port
);
47 VOID WINAPI
UnregisterIoPort(ULONG Port
)
49 IoPortProc
[Port
].In
= NULL
;
50 IoPortProc
[Port
].Out
= NULL
;
54 EmulatorReadIo(PFAST486_STATE State
,
61 LPBYTE Address
= (LPBYTE
)Buffer
;
63 UNREFERENCED_PARAMETER(State
);
65 for (i
= 0; i
< DataCount
; i
++) for (j
= 0; j
< DataSize
; j
++)
67 ULONG CurrentPort
= Port
+ j
;
69 /* Call the IN Port handler */
70 if (IoPortProc
[CurrentPort
].In
!= NULL
)
72 *(Address
++) = IoPortProc
[CurrentPort
].In(CurrentPort
);
76 DPRINT1("Read from unknown port: 0x%X\n", CurrentPort
);
77 *(Address
++) = 0xFF; // Empty port value
83 EmulatorWriteIo(PFAST486_STATE State
,
90 LPBYTE Address
= (LPBYTE
)Buffer
;
92 UNREFERENCED_PARAMETER(State
);
94 for (i
= 0; i
< DataCount
; i
++) for (j
= 0; j
< DataSize
; j
++)
96 ULONG CurrentPort
= Port
+ j
;
98 /* Call the OUT Port handler */
99 if (IoPortProc
[CurrentPort
].Out
!= NULL
)
100 IoPortProc
[CurrentPort
].Out(CurrentPort
, *(Address
++));
102 DPRINT1("Write to unknown port: 0x%X\n", CurrentPort
);