Sat Jul 19 13:03:01 1997 Alexandre Julliard <julliard@lrc.epfl.ch> * [tools/build.c] [include/stackframe.h] Save the complete %ebp register in CallFrom16; fixes a crash with LabView reported by Andreas Mohr. * [loader/main.c] Avoid executing a built-in DLL. * [controls/static.c] Converted static window procedure to Win32. * [windows/message.c] [windows/queue.c] [include/queue.h] Hacked SendMessage functions to support inter-task messages with SendMessage32A/W. Sun Jul 13 16:55:35 1997 Bernhard Rosenkraenzer <bero@bero-online.ml.org> * [ipc/bit_array.c] Don't use bitops.h in Linux 2.1.x (these versions do not return the previous state for clear_bit and set_bit) * [ipc/shm_main_blk.c] Adapt to GLIBC's ipc_perm structure. * [memory/ldt.c] Include <asm/unistd.h> on Linux/GLIBC systems (required for _syscall3). Wed Jul 9 23:53:19 1997 David A. Cuthbert <dacut@henry.ece.cmu.edu> * [include/options.h] [files/profile.c] Added PROFILE_GetWineIniBool and PROFILE_EnumerateWineIniSection. * [include/sysmetrics.h] [include/windows.h] [windows/sysmetrics.c] All sysmetrics moved to array (no more constant macros). Added MOUSEWHEELPRESENT metric. * [include/bitmap.h] [objects/oembitmap.c] Added OBM_Init() (see also loader/main.c) and more support for Win95 bitmaps; added size info to OEM bitmaps. * [include/graphics.h] [windows/graphics.h] Added GRAPH_DrawGenericReliefRect. * [loader/main.c] Added TWEAK_Init() and TWEAK_CheckConfiguration() calls (the latter checks for invalid entries in wine.conf). * [include/debug.h] [include/stddebug.h] [include/nonclient.h] [include/tweak.h] [controls/menu.c] [misc/tweak.c] [objects/gdiobj.c] [windows/syscolor.c] [windows/nonclient.c] [BUGS] [documentation/win95look] Added tweaks for Windows 95 interface support. See documentation/win95look for more information. * [controls/edit.c] Fixed EDIT_MoveHome bug. * [misc/ver.c] Changed name of dprintf_ver_string to ver_dstring to fix problem with tools/make_debug utility. Wed Jul 9 21:31:54 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [objects/dib.c] Don't use palettes with dibs with biBitCount > 8. * [misc/ole2nls.c][misc/ver.c] IsValidLocale, EnumSystemLocales fixed (winhlp32.exe works) Some VerLanguage coded moved to ole2nls.c, some cleanups. * [multimedia/mcistring.c] Fixed "capabilities <dev> device type" crash (cool.exe). * [misc/main.c] SystemParametersInfo*: added stub option 41 (GETNONCLIENTMETRICS), duplicated some stuff away from SPI16 that writes 32bit vars.(one COMCTL32.DLL crash, freecell.exe) Tue Jul 8 22:40:53 1997 Morten Welinder <terra@diku.dk> * [if1632/shell32.spec] Use Windows 95's ordinals. Help wanted, inquire within. Mon Jul 7 11:20:36 1997 Philippe De Muyter <phdm@info.ucl.ac.be> * [if1632/relay.c] [if1632/user.spec] [if1632/kernel.spec] [tools/build-spec.txt] [tools/build.c] Added type 'segstr' (segmented pointer to null-terminated string) to .spec files. * [windows/user.c] [if1632/user.spec] ExitWindowsExec stub function added. Mon Jul 7 01:18:25 1997 U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de> * [files/file.c] [include/winbase.h] [if1632/kernel32.spec] Implement MoveFileEx32, some enhancement for Movefile32. Sat Jul 5 18:13:48 1997 Bruce Milner <Bruce.Milner@genetics.utah.edu. * [files/file.c] [if1632/kernel32.spec] [include/winerror.h] [msdos/int21.c] [win32/file.c] Add LockFile/UnlockFile implementation. Add back in int21 func(0x5c) Record locking functions. * [files/file.c] Fixed bug with OF_REOPEN in FILE_DoOpenFile. Fri Jul 4 12:00:00 1997 Henrik Olsen <Henrik.Olsen@iaeste.dk> * [misc/ole2nls.c] [programs/progman/Da.rc] [programs/winhelp/Da.rc] [resources/sysres_Da.rc] Added/updated Danish language support. Thu Jul 3 13:04:20 1997 Claus Fischer <fischer@iue.tuwien.ac.at> * [files/dos_fs.c] Properly implemented DOSFS_UnixTimeToFileTime and DOSFS_FileTimeToUnixTime. * [documentation/wine.texinfo] First version of texinfo documentation.
248 lines
4.8 KiB
C
248 lines
4.8 KiB
C
/*
|
|
* 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.
|
|
*/
|
|
|
|
#ifdef linux
|
|
#include <ctype.h>
|
|
#include <unistd.h>
|
|
#include <asm/io.h>
|
|
#include <string.h>
|
|
#include "options.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#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
|
|
};
|
|
|
|
#ifdef linux
|
|
char do_direct_port_access = 0;
|
|
char port_permissions[0x10000];
|
|
#endif
|
|
|
|
/**********************************************************************
|
|
* IO_port_init
|
|
*/
|
|
|
|
/* set_IO_permissions(int val1, int val)
|
|
* Helper function for IO_port_init
|
|
*/
|
|
#ifdef linux
|
|
void set_IO_permissions(int val1, int val, char rw)
|
|
{
|
|
int j;
|
|
if (val1 != -1) {
|
|
if (val == -1) val = 0x3ff;
|
|
for (j = val1; j <= val; j++)
|
|
port_permissions[j] |= rw;
|
|
|
|
do_direct_port_access = 1;
|
|
|
|
val1 = -1;
|
|
} else if (val != -1) {
|
|
do_direct_port_access = 1;
|
|
|
|
port_permissions[val] |= rw;
|
|
}
|
|
|
|
}
|
|
|
|
/* do_IO_port_init_read_or_write(char* temp, char rw)
|
|
* Helper function for IO_port_init
|
|
*/
|
|
|
|
void do_IO_port_init_read_or_write(char* temp, char rw)
|
|
{
|
|
int val, val1, i, len;
|
|
if (!strcasecmp(temp, "all")) {
|
|
fprintf(stderr, "Warning!!! Granting FULL IO port access to"
|
|
" windoze programs!\nWarning!!! "
|
|
"*** THIS IS NOT AT ALL "
|
|
"RECOMMENDED!!! ***\n");
|
|
for (i=0; i < sizeof(port_permissions); i++)
|
|
port_permissions[i] |= rw;
|
|
|
|
} else if (!(!strcmp(temp, "*") || *temp == '\0')) {
|
|
len = strlen(temp);
|
|
val = -1;
|
|
val1 = -1;
|
|
for (i = 0; i < len; i++) {
|
|
switch (temp[i]) {
|
|
case '0':
|
|
if (temp[i+1] == 'x' || temp[i+1] == 'X') {
|
|
sscanf(temp+i, "%x", &val);
|
|
i += 2;
|
|
} else {
|
|
sscanf(temp+i, "%d", &val);
|
|
}
|
|
while (isxdigit(temp[i]))
|
|
i++;
|
|
i--;
|
|
break;
|
|
case ',':
|
|
case ' ':
|
|
case '\t':
|
|
set_IO_permissions(val1, val, rw);
|
|
val1 = -1; val = -1;
|
|
break;
|
|
case '-':
|
|
val1 = val;
|
|
if (val1 == -1) val1 = 0;
|
|
break;
|
|
default:
|
|
if (temp[i] >= '0' && temp[i] <= '9') {
|
|
sscanf(temp+i, "%d", &val);
|
|
while (isdigit(temp[i]))
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
set_IO_permissions(val1, val, rw);
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
void IO_port_init()
|
|
{
|
|
#ifdef linux
|
|
char temp[1024];
|
|
|
|
memset(port_permissions, 0, sizeof(port_permissions));
|
|
do_direct_port_access = 0;
|
|
|
|
/* Can we do that? */
|
|
if (!iopl(3)) {
|
|
iopl(0);
|
|
|
|
PROFILE_GetWineIniString( "ports", "read", "*",
|
|
temp, sizeof(temp) );
|
|
do_IO_port_init_read_or_write(temp, 1);
|
|
PROFILE_GetWineIniString( "ports", "write", "*",
|
|
temp, sizeof(temp) );
|
|
do_IO_port_init_read_or_write(temp, 2);
|
|
}
|
|
|
|
|
|
#endif
|
|
}
|
|
|
|
/**********************************************************************
|
|
* IO_inport
|
|
*/
|
|
DWORD IO_inport( int port, int count )
|
|
{
|
|
DWORD res = 0;
|
|
BYTE b;
|
|
|
|
#ifdef linux
|
|
if (do_direct_port_access) iopl(3);
|
|
#endif
|
|
|
|
dprintf_int(stddeb, "IO: %d bytes from port 0x%02x ", count, port );
|
|
|
|
while (count-- > 0)
|
|
{
|
|
#ifdef linux
|
|
if(port_permissions[port] & 1) {
|
|
b = inb(port);
|
|
} else
|
|
#endif
|
|
{
|
|
switch (port)
|
|
{
|
|
case 0x70:
|
|
b = cmosaddress;
|
|
break;
|
|
case 0x71:
|
|
b = cmosimage[cmosaddress & 0x3f];
|
|
break;
|
|
default:
|
|
fprintf( stderr,
|
|
"Direct I/O read attempted "
|
|
"from port %x\n", port);
|
|
b = 0xff;
|
|
break;
|
|
}
|
|
}
|
|
|
|
port++;
|
|
res = (res << 8) | b;
|
|
}
|
|
#ifdef linux
|
|
if (do_direct_port_access) iopl(0);
|
|
#endif
|
|
dprintf_int(stddeb, "( 0x%lx )\n", res );
|
|
return res;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* IO_outport
|
|
*/
|
|
void IO_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 );
|
|
|
|
#ifdef linux
|
|
if (do_direct_port_access) iopl(3);
|
|
#endif
|
|
|
|
while (count-- > 0)
|
|
{
|
|
b = value & 0xff;
|
|
value >>= 8;
|
|
#ifdef linux
|
|
if (port_permissions[port] & 2) {
|
|
outb(b, port);
|
|
} else
|
|
#endif
|
|
{
|
|
switch (port)
|
|
{
|
|
case 0x70:
|
|
cmosaddress = b & 0x7f;
|
|
break;
|
|
case 0x71:
|
|
cmosimage[cmosaddress & 0x3f] = b;
|
|
break;
|
|
default:
|
|
fprintf( stderr, "Direct I/O write attempted "
|
|
"to port %x\n", port );
|
|
break;
|
|
}
|
|
}
|
|
port++;
|
|
}
|
|
#ifdef linux
|
|
if (do_direct_port_access) iopl(0);
|
|
#endif
|
|
}
|