From 0a00fa0d27971967797f2d93398af129b7471847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Sat, 10 Nov 2007 17:45:38 +0000 Subject: dos2unix svn path=/trunk/externals/zexy/; revision=8977 --- src/winNT_portio.c | 254 ++++++++++++++++++++++++++--------------------------- 1 file changed, 127 insertions(+), 127 deletions(-) (limited to 'src/winNT_portio.c') diff --git a/src/winNT_portio.c b/src/winNT_portio.c index f06b997..83fe89e 100644 --- a/src/winNT_portio.c +++ b/src/winNT_portio.c @@ -1,127 +1,127 @@ -/* - * this is a wrapper for the cor port i/o functions for WinNT/2000/XP. - * this is to be replaced by some functions that are platform/interface - * specific to access the data lines. - * for now, this is only for parport access, but in future there will be a way - * to plug this on the usb bus. - * if the interface changes, only this file has to be adopted for the target system - */ -#if defined __WIN32__ && defined Z_WANT_LPT - -#include -#include - -int read_parport(int port); -void write_parport(int port, int value); -int open_port(int port); - -static BOOL bPrivException = FALSE; - -int read_parport(int port) -{ - // byte = _inp((unsigned short)port); - unsigned char value; -#ifdef _MSC_VER - __asm mov edx,port - __asm in al,dx - __asm mov value,al -#else - // hmm, i should read some documentation about inline assembler - post("lpt: cannot read from parport (recompile!)"); - return 0; -#endif - return (int)value; -} - -void write_parport(int port, int invalue) -{ - // _outp((unsigned short)port, value); - BYTE value = (BYTE)invalue; -#ifdef _MSC_VER - __asm mov edx,port - __asm mov al,value - __asm out dx,al -#else - // hmm, i should read some documentation about inline assembler - // and probably about assembler in general... - post("lpt: cannot write to parport (recompile!)"); - /* - asm( - "mov %%edx,%0\n" - "mov %%al,%1\n" - "out %%dx,%%al\n" - : - : "a"(port),"b"(value) - ); - */ -#endif -} - -static LONG WINAPI HandlerExceptionFilter ( EXCEPTION_POINTERS *pExPtrs ) -{ - - if (pExPtrs->ExceptionRecord->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION) - { - pExPtrs->ContextRecord->Eip ++; // Skip the OUT or IN instruction that caused the exception - bPrivException = TRUE; - return EXCEPTION_CONTINUE_EXECUTION; - } - else - return EXCEPTION_CONTINUE_SEARCH; -} - -static BOOL StartUpIoPorts(UINT PortToAccess, BOOL bShowMessageBox, HWND hParentWnd) -{ - HANDLE hUserPort; - - hUserPort = CreateFile("\\\\.\\UserPort", GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - CloseHandle(hUserPort); // Activate the driver - Sleep(100); // We must make a process switch - - SetUnhandledExceptionFilter(HandlerExceptionFilter); - - bPrivException = FALSE; - read_parport(PortToAccess); // Try to access the given port address - - if (bPrivException) - { - if (bShowMessageBox) - { -#if 0 - MessageBox(hParentWnd,"Privileged instruction exception has occured!\r\n\r\n" - "To use this external under Windows NT, 2000 or XP\r\n" - "you need to install the driver 'UserPort.sys' and grant\r\n" - "access to the ports used by this program.\r\n\r\n" - "See the file README for further information!\r\n", NULL, MB_OK); -#endif - } - return FALSE; - } - return TRUE; -} - /* check if we are running NT/2k/XP */ -static int IsWinNT(void) -{ - OSVERSIONINFO OSVersionInfo; - OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - - GetVersionEx(&OSVersionInfo); - - return OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT; -} - - /* open parport */ -int open_port(int port) -{ - if(IsWinNT()) /* we are under NT and need kernel driver */ - { - if(StartUpIoPorts(port, 1, 0)) - return(0); - return(-1); - } - else /* no need to use kernel driver */ - { - return(0); - } -} -#endif /* __WIN32__ & Z_WANT_LPT */ +/* + * this is a wrapper for the cor port i/o functions for WinNT/2000/XP. + * this is to be replaced by some functions that are platform/interface + * specific to access the data lines. + * for now, this is only for parport access, but in future there will be a way + * to plug this on the usb bus. + * if the interface changes, only this file has to be adopted for the target system + */ +#if defined __WIN32__ && defined Z_WANT_LPT + +#include +#include + +int read_parport(int port); +void write_parport(int port, int value); +int open_port(int port); + +static BOOL bPrivException = FALSE; + +int read_parport(int port) +{ + // byte = _inp((unsigned short)port); + unsigned char value; +#ifdef _MSC_VER + __asm mov edx,port + __asm in al,dx + __asm mov value,al +#else + // hmm, i should read some documentation about inline assembler + post("lpt: cannot read from parport (recompile!)"); + return 0; +#endif + return (int)value; +} + +void write_parport(int port, int invalue) +{ + // _outp((unsigned short)port, value); + BYTE value = (BYTE)invalue; +#ifdef _MSC_VER + __asm mov edx,port + __asm mov al,value + __asm out dx,al +#else + // hmm, i should read some documentation about inline assembler + // and probably about assembler in general... + post("lpt: cannot write to parport (recompile!)"); + /* + asm( + "mov %%edx,%0\n" + "mov %%al,%1\n" + "out %%dx,%%al\n" + : + : "a"(port),"b"(value) + ); + */ +#endif +} + +static LONG WINAPI HandlerExceptionFilter ( EXCEPTION_POINTERS *pExPtrs ) +{ + + if (pExPtrs->ExceptionRecord->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION) + { + pExPtrs->ContextRecord->Eip ++; // Skip the OUT or IN instruction that caused the exception + bPrivException = TRUE; + return EXCEPTION_CONTINUE_EXECUTION; + } + else + return EXCEPTION_CONTINUE_SEARCH; +} + +static BOOL StartUpIoPorts(UINT PortToAccess, BOOL bShowMessageBox, HWND hParentWnd) +{ + HANDLE hUserPort; + + hUserPort = CreateFile("\\\\.\\UserPort", GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + CloseHandle(hUserPort); // Activate the driver + Sleep(100); // We must make a process switch + + SetUnhandledExceptionFilter(HandlerExceptionFilter); + + bPrivException = FALSE; + read_parport(PortToAccess); // Try to access the given port address + + if (bPrivException) + { + if (bShowMessageBox) + { +#if 0 + MessageBox(hParentWnd,"Privileged instruction exception has occured!\r\n\r\n" + "To use this external under Windows NT, 2000 or XP\r\n" + "you need to install the driver 'UserPort.sys' and grant\r\n" + "access to the ports used by this program.\r\n\r\n" + "See the file README for further information!\r\n", NULL, MB_OK); +#endif + } + return FALSE; + } + return TRUE; +} + /* check if we are running NT/2k/XP */ +static int IsWinNT(void) +{ + OSVERSIONINFO OSVersionInfo; + OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + GetVersionEx(&OSVersionInfo); + + return OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT; +} + + /* open parport */ +int open_port(int port) +{ + if(IsWinNT()) /* we are under NT and need kernel driver */ + { + if(StartUpIoPorts(port, 1, 0)) + return(0); + return(-1); + } + else /* no need to use kernel driver */ + { + return(0); + } +} +#endif /* __WIN32__ & Z_WANT_LPT */ -- cgit v1.2.1