/* * Emulation of processor ioports. * * Copyright 1995 Morten Welinder */ /* Known problems: - only a few ports are emulated. - real-time clock in "cmos" is bogus. A nifty alarm() setup could fix that, I guess. */ #include #include #include #include "windows.h" #include "stddebug.h" /* #define DEBUG_INT */ #include "debug.h" static BYTE cmosaddress; static BYTE cmosimage[64] = { 0x27, 0x34, 0x31, 0x47, 0x16, 0x15, 0x00, 0x01, 0x04, 0x94, 0x26, 0x02, 0x50, 0x80, 0x00, 0x00, 0x40, 0xb1, 0x00, 0x9c, 0x01, 0x80, 0x02, 0x00, 0x1c, 0x00, 0x00, 0xad, 0x02, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x03, 0x58, 0x00, 0x1c, 0x19, 0x81, 0x00, 0x0e, 0x00, 0x80, 0x1b, 0x7b, 0x21, 0x00, 0x00, 0x00, 0x05, 0x5f }; DWORD inport( int port, int count ) { DWORD res = 0; BYTE b; dprintf_int(stddeb, "IO: %d bytes from port 0x%02x\n", count, port ); while (count-- > 0) { switch (port++) { case 0x70: b = cmosaddress; break; case 0x71: b = cmosimage[cmosaddress & 0x3f]; break; default: b = 0xff; } res = (res << 8) | b; } return res; } void outport( int port, int count, DWORD value ) { BYTE b; dprintf_int( stddeb, "IO: 0x%lx (%d bytes) to port 0x%02x\n", value, count, port ); while (count-- > 0) { b = value & 0xff; value >>= 8; switch (port++) { case 0x70: cmosaddress = b & 0x7f; break; case 0x71: cmosimage[cmosaddress & 0x3f] = b; break; default: /* Rien du tout. */ } } }