Moved handlers for int11, int15 and int5c to winedos.

This commit is contained in:
Jukka Heinonen 2002-11-24 22:34:04 +00:00 committed by Alexandre Julliard
parent 710b86e43e
commit 98058eb14d
11 changed files with 184 additions and 137 deletions

View File

@ -1051,11 +1051,8 @@
@ cdecl DOSMEM_GetBlock(long ptr) DOSMEM_GetBlock @ cdecl DOSMEM_GetBlock(long ptr) DOSMEM_GetBlock
@ cdecl DOSMEM_GetDPMISegments() DOSMEM_GetDPMISegments @ cdecl DOSMEM_GetDPMISegments() DOSMEM_GetDPMISegments
@ cdecl DOSMEM_Init(long) DOSMEM_Init @ cdecl DOSMEM_Init(long) DOSMEM_Init
@ stdcall INT_Int11Handler(ptr) INT_Int11Handler
@ stdcall INT_Int15Handler(ptr) INT_Int15Handler
@ stdcall INT_Int25Handler(ptr) INT_Int25Handler @ stdcall INT_Int25Handler(ptr) INT_Int25Handler
@ stdcall INT_Int26Handler(ptr) INT_Int26Handler @ stdcall INT_Int26Handler(ptr) INT_Int26Handler
@ stdcall NetBIOSCall16(ptr) NetBIOSCall16
@ cdecl LOCAL_Alloc(long long long) LOCAL_Alloc @ cdecl LOCAL_Alloc(long long long) LOCAL_Alloc
@ cdecl LOCAL_Compact(long long long) LOCAL_Compact @ cdecl LOCAL_Compact(long long long) LOCAL_Compact
@ cdecl LOCAL_CountFree(long) LOCAL_CountFree @ cdecl LOCAL_CountFree(long) LOCAL_CountFree

View File

@ -50,12 +50,9 @@ C_SRCS = \
$(TOPOBJDIR)/msdos/dosconf.c \ $(TOPOBJDIR)/msdos/dosconf.c \
$(TOPOBJDIR)/msdos/dosmem.c \ $(TOPOBJDIR)/msdos/dosmem.c \
$(TOPOBJDIR)/msdos/dpmi.c \ $(TOPOBJDIR)/msdos/dpmi.c \
$(TOPOBJDIR)/msdos/int11.c \
$(TOPOBJDIR)/msdos/int15.c \
$(TOPOBJDIR)/msdos/int21.c \ $(TOPOBJDIR)/msdos/int21.c \
$(TOPOBJDIR)/msdos/int25.c \ $(TOPOBJDIR)/msdos/int25.c \
$(TOPOBJDIR)/msdos/int26.c \ $(TOPOBJDIR)/msdos/int26.c \
$(TOPOBJDIR)/msdos/int5c.c \
$(TOPOBJDIR)/msdos/ioports.c \ $(TOPOBJDIR)/msdos/ioports.c \
$(TOPOBJDIR)/msdos/ppdev.c \ $(TOPOBJDIR)/msdos/ppdev.c \
$(TOPOBJDIR)/msdos/vxd.c \ $(TOPOBJDIR)/msdos/vxd.c \

View File

@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@ SRCDIR = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MODULE = winedos.dll MODULE = winedos.dll
IMPORTS = user32 kernel32 ntdll IMPORTS = user32 advapi32 kernel32 ntdll
ALTNAMES = winedos16.dll ALTNAMES = winedos16.dll
EXTRALIBS = $(LIBUNICODE) EXTRALIBS = $(LIBUNICODE)
@ -18,8 +18,10 @@ C_SRCS = \
fpu.c \ fpu.c \
int09.c \ int09.c \
int10.c \ int10.c \
int11.c \
int12.c \ int12.c \
int13.c \ int13.c \
int15.c \
int16.c \ int16.c \
int17.c \ int17.c \
int19.c \ int19.c \
@ -33,6 +35,7 @@ C_SRCS = \
int33.c \ int33.c \
int41.c \ int41.c \
int4b.c \ int4b.c \
int5c.c \
int67.c \ int67.c \
interrupts.c \ interrupts.c \
ioports.c \ ioports.c \

View File

@ -116,12 +116,18 @@ extern BYTE WINAPI DOSVM_Int09ReadScan(BYTE*ascii);
extern void WINAPI DOSVM_Int10Handler(CONTEXT86*); extern void WINAPI DOSVM_Int10Handler(CONTEXT86*);
extern void WINAPI DOSVM_PutChar(BYTE ascii); extern void WINAPI DOSVM_PutChar(BYTE ascii);
/* int11.c */
extern void WINAPI DOSVM_Int11Handler(CONTEXT86*);
/* int12.c */ /* int12.c */
extern void WINAPI DOSVM_Int12Handler(CONTEXT86*); extern void WINAPI DOSVM_Int12Handler(CONTEXT86*);
/* int13.c */ /* int13.c */
extern void WINAPI DOSVM_Int13Handler(CONTEXT86*); extern void WINAPI DOSVM_Int13Handler(CONTEXT86*);
/* int15.c */
extern void WINAPI DOSVM_Int15Handler(CONTEXT86*);
/* int1a.c */ /* int1a.c */
extern void WINAPI DOSVM_Int1aHandler(CONTEXT86*); extern void WINAPI DOSVM_Int1aHandler(CONTEXT86*);
@ -169,6 +175,9 @@ extern void WINAPI DOSVM_Int41Handler(CONTEXT86*);
/* int4b.c */ /* int4b.c */
extern void WINAPI DOSVM_Int4bHandler(CONTEXT86*); extern void WINAPI DOSVM_Int4bHandler(CONTEXT86*);
/* int5c.c */
extern void WINAPI DOSVM_Int5cHandler(CONTEXT86*);
/* int67.c */ /* int67.c */
extern void WINAPI DOSVM_Int67Handler(CONTEXT86*); extern void WINAPI DOSVM_Int67Handler(CONTEXT86*);
extern void WINAPI EMS_Ioctl_Handler(CONTEXT86*); extern void WINAPI EMS_Ioctl_Handler(CONTEXT86*);

141
dlls/winedos/int11.c Normal file
View File

@ -0,0 +1,141 @@
/*
* BIOS interrupt 11h handler
*
* Copyright 1996 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include "wine/port.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "windef.h"
#include "winreg.h"
#include "miscemu.h"
#include "msdos.h"
#include "file.h"
#include "wine/unicode.h"
#include "wine/debug.h"
/**********************************************************************
* DOSVM_Int11Handler (WINEDOS16.117)
*
* Handler for int 11h (get equipment list).
*
*
* Borrowed from Ralph Brown's interrupt lists:
*
* bits 15-14: number of parallel devices
* bit 13: [Conv] Internal modem
* bit 12: reserved
* bits 11- 9: number of serial devices
* bit 8: reserved
* bits 7- 6: number of diskette drives minus one
* bits 5- 4: Initial video mode:
* 00b = EGA,VGA,PGA
* 01b = 40 x 25 color
* 10b = 80 x 25 color
* 11b = 80 x 25 mono
* bit 3: reserved
* bit 2: [PS] =1 if pointing device
* [non-PS] reserved
* bit 1: =1 if math co-processor
* bit 0: =1 if diskette available for boot
*
*
* Currently the only of these bits correctly set are:
*
* bits 15-14 } Added by William Owen Smith,
* bits 11-9 } wos@dcs.warwick.ac.uk
* bits 7-6
* bit 2 (always set) ( bit 2 = 4 )
* bit 1 } Robert 'Admiral' Coeyman
* All *nix systems either have a math processor or
* emulate one.
*/
void WINAPI DOSVM_Int11Handler( CONTEXT86 *context )
{
int diskdrives = 0;
int parallelports = 0;
int serialports = 0;
int x;
if (GetDriveTypeA("A:\\") == DRIVE_REMOVABLE) diskdrives++;
if (GetDriveTypeA("B:\\") == DRIVE_REMOVABLE) diskdrives++;
if (diskdrives) diskdrives--;
for (x=0; x < 9; x++)
{
HKEY hkey;
char option[10];
char temp[256];
/* serial port name */
strcpy( option, "COMx" );
option[3] = '1' + x;
option[4] = '\0';
/* default value */
strcpy( temp, "*" );
if (!RegOpenKeyA(HKEY_LOCAL_MACHINE,
"Software\\Wine\\Wine\\Config\\serialports",
&hkey))
{
DWORD type;
DWORD count = sizeof(temp);
RegQueryValueExA( hkey, option, 0, &type, temp, &count );
RegCloseKey( hkey );
}
if (strcmp(temp, "*") && *temp != '\0')
serialports++;
/* parallel port name */
strcpy( option, "LPTx" );
option[3] = '1' + x;
option[4] = '\0';
/* default value */
strcpy( temp, "*" );
if (!RegOpenKeyA(HKEY_LOCAL_MACHINE,
"Software\\Wine\\Wine\\Config\\parallelports",
&hkey))
{
DWORD type;
DWORD count = sizeof(temp);
RegQueryValueExA( hkey, option, 0, &type, temp, &count );
RegCloseKey( hkey );
}
if (strcmp(temp, "*") && *temp != '\0')
parallelports++;
}
if (serialports > 7) /* 3 bits -- maximum value = 7 */
serialports = 7;
if (parallelports > 3) /* 2 bits -- maximum value = 3 */
parallelports = 3;
SET_AX( context,
(diskdrives << 6) | (serialports << 9) | (parallelports << 14) | 0x06 );
}

View File

@ -21,16 +21,17 @@
#include <stdlib.h> #include <stdlib.h>
#include "miscemu.h" #include "miscemu.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/winbase16.h"
WINE_DEFAULT_DEBUG_CHANNEL(int); WINE_DEFAULT_DEBUG_CHANNEL(int);
/********************************************************************** /**********************************************************************
* INT_Int15Handler (WPROCS.121) * DOSVM_Int15Handler (WINEDOS16.121)
* *
* Handler for int 15h * Handler for int 15h
*/ */
void WINAPI INT_Int15Handler( CONTEXT86 *context ) void WINAPI DOSVM_Int15Handler( CONTEXT86 *context )
{ {
switch(AH_reg(context)) switch(AH_reg(context))
{ {
@ -55,7 +56,6 @@ void WINAPI INT_Int15Handler( CONTEXT86 *context )
} }
RESET_CFLAG(context); RESET_CFLAG(context);
break; break;
case 0x88: /* get size of memory above 1 M */ case 0x88: /* get size of memory above 1 M */
@ -64,14 +64,23 @@ void WINAPI INT_Int15Handler( CONTEXT86 *context )
break; break;
case 0xc0: /* GET CONFIGURATION */ case 0xc0: /* GET CONFIGURATION */
if (ISV86(context)) /* real */ if (ISV86(context))
{
/* real mode segment */
context->SegEs = 0xf000; context->SegEs = 0xf000;
}
else else
context->SegEs = DOSMEM_BiosSysSeg; {
/* KERNEL.194: __F000H - protected mode selector */
FARPROC16 proc = GetProcAddress16( GetModuleHandle16("KERNEL"),
(LPCSTR)(ULONG_PTR)194 );
context->SegEs = LOWORD(proc);
}
SET_BX( context, 0xe6f5 ); SET_BX( context, 0xe6f5 );
SET_AH( context, 0x0 ); SET_AH( context, 0x0 );
RESET_CFLAG(context); RESET_CFLAG(context);
break; break;
case 0xc2: case 0xc2:
switch(AL_reg(context)) switch(AL_reg(context))
{ {
@ -98,7 +107,8 @@ void WINAPI INT_Int15Handler( CONTEXT86 *context )
break; break;
case 0x04: /* Get Pointing Device Type */ case 0x04: /* Get Pointing Device Type */
FIXME("Get Pointing Device Type - not implemented\n"); FIXME("Get Pointing Device Type - not implemented\n");
SET_BH( context, 0x01 );/*Device id FIXME what is it supposed to be?*/ /* FIXME: BH = Device id, What is it supposed to be? */
SET_BH( context, 0x01 );
break; break;
default: default:
INT_BARF( context, 0x15 ); INT_BARF( context, 0x15 );

View File

@ -25,12 +25,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(int);
/*********************************************************************** /***********************************************************************
* NetBIOSCall (KERNEL.103) * DOSVM_Int5cHandler (WINEDOS16.192)
* INT_Int5cHandler (WPROCS.192)
* *
* Also handler for interrupt 5c. * Called from NetBIOSCall16.
*/ */
void WINAPI NetBIOSCall16( CONTEXT86 *context ) void WINAPI DOSVM_Int5cHandler( CONTEXT86 *context )
{ {
BYTE* ptr; BYTE* ptr;
ptr = MapSL( MAKESEGPTR(context->SegEs,BX_reg(context)) ); ptr = MapSL( MAKESEGPTR(context->SegEs,BX_reg(context)) );

View File

@ -25,21 +25,15 @@
WINE_DEFAULT_DEBUG_CHANNEL(int); WINE_DEFAULT_DEBUG_CHANNEL(int);
/*********************************************************************** /***********************************************************************
* DOSVM_Int11Handler (WINEDOS16.117)
* DOSVM_Int15Handler (WINEDOS16.121)
* DOSVM_Int25Handler (WINEDOS16.137) * DOSVM_Int25Handler (WINEDOS16.137)
* DOSVM_Int26Handler (WINEDOS16.138) * DOSVM_Int26Handler (WINEDOS16.138)
* DOSVM_Int5cHandler (WINEDOS16.192)
* *
* FIXME: Interrupt handlers for interrupts implemented in other DLLs. * FIXME: Interrupt handlers for interrupts implemented in other DLLs.
* These functions should be removed when the interrupt handlers have * These functions should be removed when the interrupt handlers have
* been moved to winedos. * been moved to winedos.
*/ */
void WINAPI DOSVM_Int11Handler( CONTEXT86 *context ) { INT_Int11Handler(context); }
void WINAPI DOSVM_Int15Handler( CONTEXT86 *context ) { INT_Int15Handler(context); }
void WINAPI DOSVM_Int25Handler( CONTEXT86 *context ) { INT_Int25Handler(context); } void WINAPI DOSVM_Int25Handler( CONTEXT86 *context ) { INT_Int25Handler(context); }
void WINAPI DOSVM_Int26Handler( CONTEXT86 *context ) { INT_Int26Handler(context); } void WINAPI DOSVM_Int26Handler( CONTEXT86 *context ) { INT_Int26Handler(context); }
void WINAPI DOSVM_Int5cHandler( CONTEXT86 *context ) { NetBIOSCall16(context); }
static FARPROC16 DOSVM_Vectors16[256]; static FARPROC16 DOSVM_Vectors16[256];
static FARPROC48 DOSVM_Vectors48[256]; static FARPROC48 DOSVM_Vectors48[256];

View File

@ -196,21 +196,12 @@ extern BOOL INSTR_EmulateInstruction( CONTEXT86 *context );
extern DWORD IO_inport( int port, int count ); extern DWORD IO_inport( int port, int count );
extern void IO_outport( int port, int count, DWORD value ); extern void IO_outport( int port, int count, DWORD value );
/* msdos/int11.c */
extern void WINAPI INT_Int11Handler(CONTEXT86*);
/* msdos/int15.c */
extern void WINAPI INT_Int15Handler(CONTEXT86*);
/* msdos/int25.c */ /* msdos/int25.c */
extern void WINAPI INT_Int25Handler(CONTEXT86*); extern void WINAPI INT_Int25Handler(CONTEXT86*);
/* msdos/int26.c */ /* msdos/int26.c */
extern void WINAPI INT_Int26Handler(CONTEXT86*); extern void WINAPI INT_Int26Handler(CONTEXT86*);
/* msdos/int5c.c */
extern void WINAPI NetBIOSCall16(CONTEXT86*);
/* msdos/dpmi.c */ /* msdos/dpmi.c */
extern BOOL DPMI_LoadDosSystem(void); extern BOOL DPMI_LoadDosSystem(void);

View File

@ -55,3 +55,14 @@ BOOL DPMI_LoadDosSystem(void)
#undef GET_ADDR #undef GET_ADDR
return TRUE; return TRUE;
} }
/***********************************************************************
* NetBIOSCall (KERNEL.103)
*
*/
void WINAPI NetBIOSCall16( CONTEXT86 *context )
{
if (Dosvm.CallBuiltinHandler || DPMI_LoadDosSystem())
Dosvm.CallBuiltinHandler( context, 0x5c );
}

View File

@ -1,105 +0,0 @@
/*
* BIOS interrupt 11h handler
*
* Copyright 1996 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include "wine/port.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "windef.h"
#include "miscemu.h"
#include "msdos.h"
#include "file.h"
#include "wine/unicode.h"
#include "wine/debug.h"
/**********************************************************************
* INT_Int11Handler (WPROCS.117)
*
* Handler for int 11h (get equipment list).
*/
void WINAPI INT_Int11Handler( CONTEXT86 *context )
{
int diskdrives = 0;
int parallelports = 0;
int serialports = 0;
int x;
/* borrowed from Ralph Brown's interrupt lists
bits 15-14: number of parallel devices
bit 13: [Conv] Internal modem
bit 12: reserved
bits 11- 9: number of serial devices
bit 8: reserved
bits 7- 6: number of diskette drives minus one
bits 5- 4: Initial video mode:
00b = EGA,VGA,PGA
01b = 40 x 25 color
10b = 80 x 25 color
11b = 80 x 25 mono
bit 3: reserved
bit 2: [PS] =1 if pointing device
[non-PS] reserved
bit 1: =1 if math co-processor
bit 0: =1 if diskette available for boot
*/
/* Currently the only of these bits correctly set are:
bits 15-14 } Added by William Owen Smith,
bits 11-9 } wos@dcs.warwick.ac.uk
bits 7-6
bit 2 (always set) ( bit 2 = 4 )
bit 1 } Robert 'Admiral' Coeyman
All *nix systems either have a math processor or
emmulate one.
*/
if (GetDriveTypeA("A:\\") == DRIVE_REMOVABLE) diskdrives++;
if (GetDriveTypeA("B:\\") == DRIVE_REMOVABLE) diskdrives++;
if (diskdrives) diskdrives--;
for (x=0; x < 9; x++)
{
WCHAR temp[16];
WCHAR comW[] = {'C','O','M','?',0};
WCHAR lptW[] = {'L','P','T','?',0};
static const WCHAR serialportsW[] = {'s','e','r','i','a','l','p','o','r','t','s',0};
static const WCHAR parallelportsW[] = {'p','a','r','a','l','l','e','l','p','o','r','t','s',0};
static const WCHAR asteriskW[] = {'*',0};
comW[3] = '0' + x;
PROFILE_GetWineIniString(serialportsW, comW, asteriskW, temp, 16);
if(strcmpW(temp, asteriskW))
serialports++;
lptW[3] = '0' + x;
PROFILE_GetWineIniString(parallelportsW, lptW, asteriskW, temp, 16);
if(strcmpW(temp, asteriskW))
parallelports++;
}
if (serialports > 7) /* 3 bits -- maximum value = 7 */
serialports=7;
if (parallelports > 3) /* 2 bits -- maximum value = 3 */
parallelports=3;
SET_AX( context, (diskdrives << 6) | (serialports << 9) | (parallelports << 14) | 0x06 );
}