winedos: Merge a number of tiny source files into interrupts.c.

This commit is contained in:
Alexandre Julliard 2007-05-30 13:12:09 +02:00
parent 7718d2bd7c
commit 7373ced544
14 changed files with 371 additions and 636 deletions

View file

@ -19,26 +19,15 @@ C_SRCS = \
himem.c \ himem.c \
int09.c \ int09.c \
int10.c \ int10.c \
int11.c \
int12.c \
int13.c \ int13.c \
int15.c \ int15.c \
int16.c \ int16.c \
int17.c \
int19.c \
int1a.c \
int20.c \
int21.c \ int21.c \
int25.c \ int25.c \
int26.c \ int26.c \
int29.c \
int2a.c \
int2f.c \ int2f.c \
int31.c \ int31.c \
int33.c \ int33.c \
int41.c \
int4b.c \
int5c.c \
int67.c \ int67.c \
interrupts.c \ interrupts.c \
ioports.c \ ioports.c \

View file

@ -427,35 +427,17 @@ 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 */
extern void WINAPI DOSVM_Int12Handler(CONTEXT86*);
/* int13.c */ /* int13.c */
extern void WINAPI DOSVM_Int13Handler(CONTEXT86*); extern void WINAPI DOSVM_Int13Handler(CONTEXT86*);
/* int15.c */ /* int15.c */
extern void WINAPI DOSVM_Int15Handler(CONTEXT86*); extern void WINAPI DOSVM_Int15Handler(CONTEXT86*);
/* int1a.c */
extern void WINAPI DOSVM_Int1aHandler(CONTEXT86*);
/* int16.c */ /* int16.c */
extern void WINAPI DOSVM_Int16Handler(CONTEXT86*); extern void WINAPI DOSVM_Int16Handler(CONTEXT86*);
extern BOOL WINAPI DOSVM_Int16ReadChar( BYTE *, BYTE *, CONTEXT86 * ); extern BOOL WINAPI DOSVM_Int16ReadChar( BYTE *, BYTE *, CONTEXT86 * );
extern int WINAPI DOSVM_Int16AddChar(BYTE ascii,BYTE scan); extern int WINAPI DOSVM_Int16AddChar(BYTE ascii,BYTE scan);
/* int17.c */
extern void WINAPI DOSVM_Int17Handler(CONTEXT86*);
/* int19.c */
extern void WINAPI DOSVM_Int19Handler(CONTEXT86*);
/* int20.c */
extern void WINAPI DOSVM_Int20Handler(CONTEXT86*);
/* int21.c */ /* int21.c */
extern void WINAPI DOSVM_Int21Handler(CONTEXT86*); extern void WINAPI DOSVM_Int21Handler(CONTEXT86*);
@ -467,12 +449,6 @@ void WINAPI DOSVM_Int25Handler( CONTEXT86 * );
BOOL DOSVM_RawWrite( BYTE, DWORD, DWORD, BYTE *, BOOL ); BOOL DOSVM_RawWrite( BYTE, DWORD, DWORD, BYTE *, BOOL );
void WINAPI DOSVM_Int26Handler( CONTEXT86 * ); void WINAPI DOSVM_Int26Handler( CONTEXT86 * );
/* int29.c */
extern void WINAPI DOSVM_Int29Handler(CONTEXT86*);
/* int2a.c */
extern void WINAPI DOSVM_Int2aHandler(CONTEXT86*);
/* int2f.c */ /* int2f.c */
extern void WINAPI DOSVM_Int2fHandler(CONTEXT86*); extern void WINAPI DOSVM_Int2fHandler(CONTEXT86*);
extern void MSCDEX_InstallCDROM(void); extern void MSCDEX_InstallCDROM(void);
@ -491,15 +467,6 @@ extern void WINAPI DOSVM_Int33Handler(CONTEXT86*);
extern void WINAPI DOSVM_Int33Message(UINT,WPARAM,LPARAM); extern void WINAPI DOSVM_Int33Message(UINT,WPARAM,LPARAM);
extern void WINAPI DOSVM_Int33Console(MOUSE_EVENT_RECORD*); extern void WINAPI DOSVM_Int33Console(MOUSE_EVENT_RECORD*);
/* int41.c */
extern void WINAPI DOSVM_Int41Handler(CONTEXT86*);
/* int4b.c */
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*);

View file

@ -1,114 +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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include "wine/port.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "dosexe.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++)
{
HANDLE handle;
char file[10];
/* serial port name */
sprintf( file, "\\\\.\\COM%d", x+1 );
handle = CreateFileA( file, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle( handle );
serialports++;
}
sprintf( file, "\\\\.\\LPT%d", x+1 );
handle = CreateFileA( file, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle( handle );
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

@ -1,15 +0,0 @@
/*
* BIOS interrupt 12h handler
*/
#include "dosexe.h"
/**********************************************************************
* DOSVM_Int12Handler (WINEDOS16.118)
*
* Handler for int 12h (get memory size).
*/
void WINAPI DOSVM_Int12Handler( CONTEXT86 *context )
{
SET_AX( context, 640 );
}

View file

@ -1,55 +0,0 @@
/*
* BIOS interrupt 17h handler
*
* Copyright 1998 Carl van Schaik
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include <stdlib.h>
#include "windef.h"
#include "winbase.h"
#include "dosexe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/**********************************************************************
* DOSVM_Int17Handler (WINEDOS16.123)
*
* Handler for int 17h (printer - output character).
*/
void WINAPI DOSVM_Int17Handler( CONTEXT86 *context )
{
switch( AH_reg(context) )
{
case 0x00:/* Send character*/
FIXME("Send character not supported yet\n");
SET_AH( context, 0x00 );/*Timeout*/
break;
case 0x01: /* PRINTER - INITIALIZE */
FIXME("Initialize Printer - Not Supported\n");
SET_AH( context, 0x30 ); /* selected | out of paper */
break;
case 0x02: /* PRINTER - GET STATUS */
FIXME("Get Printer Status - Not Supported\n");
break;
default:
SET_AH( context, 0 ); /* time out */
INT_BARF( context, 0x17 );
}
}

View file

@ -1,39 +0,0 @@
/*
* BIOS interrupt 19h handler
*
* Copyright 1998 Carl van Schaik
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdlib.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/**********************************************************************
* DOSVM_Int19Handler
*
* Handler for int 19h (Reboot).
*/
void WINAPI DOSVM_Int19Handler( CONTEXT86 *context )
{
TRACE( "Attempted Reboot\n" );
ExitProcess(0);
}

View file

@ -1,127 +0,0 @@
/*
* BIOS interrupt 1ah handler
*
* Copyright 1993 Erik Bos
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include "wine/debug.h"
#include "dosexe.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
#define BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
#define BIN_TO_BCD(x) ((x%10) + ((x/10)<<4))
/**********************************************************************
* DOSVM_Int1aHandler
*
* Handler for int 1ah.
*/
void WINAPI DOSVM_Int1aHandler( CONTEXT86 *context )
{
switch(AH_reg(context))
{
case 0x00: /* GET SYSTEM TIME */
{
BIOSDATA *data = DOSVM_BiosData();
SET_CX( context, HIWORD(data->Ticks) );
SET_DX( context, LOWORD(data->Ticks) );
SET_AL( context, 0 ); /* FIXME: midnight flag is unsupported */
TRACE( "GET SYSTEM TIME - ticks=%d\n", data->Ticks );
}
break;
case 0x01: /* SET SYSTEM TIME */
FIXME( "SET SYSTEM TIME - not allowed\n" );
break;
case 0x02: /* GET REAL-TIME CLOCK TIME */
TRACE( "GET REAL-TIME CLOCK TIME\n" );
{
SYSTEMTIME systime;
GetLocalTime( &systime );
SET_CH( context, BIN_TO_BCD(systime.wHour) );
SET_CL( context, BIN_TO_BCD(systime.wMinute) );
SET_DH( context, BIN_TO_BCD(systime.wSecond) );
SET_DL( context, 0 ); /* FIXME: assume no daylight saving */
RESET_CFLAG(context);
}
break;
case 0x03: /* SET REAL-TIME CLOCK TIME */
FIXME( "SET REAL-TIME CLOCK TIME - not allowed\n" );
break;
case 0x04: /* GET REAL-TIME CLOCK DATE */
TRACE( "GET REAL-TIME CLOCK DATE\n" );
{
SYSTEMTIME systime;
GetLocalTime( &systime );
SET_CH( context, BIN_TO_BCD(systime.wYear / 100) );
SET_CL( context, BIN_TO_BCD(systime.wYear % 100) );
SET_DH( context, BIN_TO_BCD(systime.wMonth) );
SET_DL( context, BIN_TO_BCD(systime.wDay) );
RESET_CFLAG(context);
}
break;
case 0x05: /* SET REAL-TIME CLOCK DATE */
FIXME( "SET REAL-TIME CLOCK DATE - not allowed\n" );
break;
case 0x06: /* SET ALARM */
FIXME( "SET ALARM - unimplemented\n" );
break;
case 0x07: /* CANCEL ALARM */
FIXME( "CANCEL ALARM - unimplemented\n" );
break;
case 0x08: /* SET RTC ACTIVATED POWER ON MODE */
case 0x09: /* READ RTC ALARM TIME AND STATUS */
case 0x0a: /* READ SYSTEM-TIMER DAY COUNTER */
case 0x0b: /* SET SYSTEM-TIMER DAY COUNTER */
case 0x0c: /* SET RTC DATE/TIME ACTIVATED POWER-ON MODE */
case 0x0d: /* RESET RTC DATE/TIME ACTIVATED POWER-ON MODE */
case 0x0e: /* GET RTC DATE/TIME ALARM AND STATUS */
case 0x0f: /* INITIALIZE REAL-TIME CLOCK */
INT_BARF( context, 0x1a );
break;
case 0xb0:
if (CX_reg(context) == 0x4d52 &&
DX_reg(context) == 0x4349 &&
AL_reg(context) == 0x01)
{
/*
* Microsoft Real-Time Compression Interface (MRCI).
* Ignoring this call indicates MRCI is not supported.
*/
TRACE( "Microsoft Real-Time Compression Interface - not supported\n" );
}
else
{
INT_BARF(context, 0x1a);
}
break;
default:
INT_BARF( context, 0x1a );
}
}

View file

@ -1,39 +0,0 @@
/*
* DOS interrupt 20h handler (TERMINATE PROGRAM)
*
* Copyright 1997 Andreas Mohr
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "dosexe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/**********************************************************************
* DOSVM_Int20Handler (WINEDOS16.132)
*
* Handler for int 20h.
*/
void WINAPI DOSVM_Int20Handler( CONTEXT86 *context )
{
if (DOSVM_IsWin16())
ExitThread( 0 );
else if(ISV86(context))
MZ_Exit( context, TRUE, 0 );
else
ERR( "Called from DOS protected mode\n" );
}

View file

@ -1,39 +0,0 @@
/*
* DOS interrupt 29h handler
*
* Copyright 1998 Joseph Pranevich
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "dosexe.h"
/**********************************************************************
* DOSVM_Int29Handler (WINEDOS16.141)
*
* Handler for int 29h (fast console output)
*/
void WINAPI DOSVM_Int29Handler( CONTEXT86 *context )
{
/* Yes, it seems that this is really all this interrupt does. */
DOSVM_PutChar(AL_reg(context));
}

View file

@ -1,26 +0,0 @@
/*
* DOS interrupt 2ah handler
*/
#include <stdlib.h>
#include "dosexe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/**********************************************************************
* DOSVM_Int2aHandler (WINEDOS16.142)
*
* Handler for int 2ah (network).
*/
void WINAPI DOSVM_Int2aHandler( CONTEXT86 *context )
{
switch(AH_reg(context))
{
case 0x00: /* NETWORK INSTALLATION CHECK */
break;
default:
INT_BARF( context, 0x2a );
}
}

View file

@ -1,70 +0,0 @@
/*
* DOS interrupt 41h handler -- Windows Kernel Debugger
*
* Check debugsys.inc from the DDK for docu.
*
* Copyright 1998 Ulrich Weigand
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include "dosexe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/***********************************************************************
* DOSVM_Int41Handler (WINEDOS16.165)
*
*/
void WINAPI DOSVM_Int41Handler( CONTEXT86 *context )
{
if ( ISV86(context) )
{
/* Real-mode debugger services */
switch ( AX_reg(context) )
{
default:
INT_BARF( context, 0x41 );
break;
}
}
else
{
/* Protected-mode debugger services */
switch ( AX_reg(context) )
{
case 0x4f:
case 0x50:
case 0x150:
case 0x51:
case 0x52:
case 0x152:
case 0x59:
case 0x5a:
case 0x5b:
case 0x5c:
case 0x5d:
/* Notifies the debugger of a lot of stuff. We simply ignore it
for now, but some of the info might actually be useful ... */
break;
default:
INT_BARF( context, 0x41 );
break;
}
}
}

View file

@ -1,29 +0,0 @@
/*
* DOS interrupt 4bh handler
*/
#include <stdio.h>
#include "dosexe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/***********************************************************************
* DOSVM_Int4bHandler (WINEDOS16.175)
*
*/
void WINAPI DOSVM_Int4bHandler( CONTEXT86 *context )
{
switch(AH_reg(context))
{
case 0x81: /* Virtual DMA Spec (IBM SCSI interface) */
if(AL_reg(context) != 0x02) /* if not install check */
{
SET_CFLAG(context);
SET_AL( context, 0x0f ); /* function is not implemented */
}
break;
default:
INT_BARF(context, 0x4b);
}
}

View file

@ -1,39 +0,0 @@
/*
* NetBIOS interrupt handling
*
* Copyright 1995 Alexandre Julliard, Alex Korobka
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "dosexe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
/***********************************************************************
* DOSVM_Int5cHandler (WINEDOS16.192)
*
* Called from NetBIOSCall16.
*/
void WINAPI DOSVM_Int5cHandler( CONTEXT86 *context )
{
BYTE* ptr;
ptr = MapSL( MAKESEGPTR(context->SegEs,BX_reg(context)) );
FIXME("(%p): command code %02x (ignored)\n",context, *ptr);
*(ptr+0x01) = 0xFB; /* NetBIOS emulator not found */
SET_AL( context, 0xFB );
}

View file

@ -20,6 +20,8 @@
#include "config.h" #include "config.h"
#include <stdio.h>
#include "dosexe.h" #include "dosexe.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/winbase16.h" #include "wine/winbase16.h"
@ -29,6 +31,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(int); WINE_DEFAULT_DEBUG_CHANNEL(int);
WINE_DECLARE_DEBUG_CHANNEL(relay); WINE_DECLARE_DEBUG_CHANNEL(relay);
#define BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
#define BIN_TO_BCD(x) ((x%10) + ((x/10)<<4))
static void WINAPI DOSVM_Int11Handler(CONTEXT86*);
static void WINAPI DOSVM_Int12Handler(CONTEXT86*);
static void WINAPI DOSVM_Int17Handler(CONTEXT86*);
static void WINAPI DOSVM_Int19Handler(CONTEXT86*);
static void WINAPI DOSVM_Int1aHandler(CONTEXT86*);
static void WINAPI DOSVM_Int20Handler(CONTEXT86*);
static void WINAPI DOSVM_Int29Handler(CONTEXT86*);
static void WINAPI DOSVM_Int2aHandler(CONTEXT86*);
static void WINAPI DOSVM_Int41Handler(CONTEXT86*);
static void WINAPI DOSVM_Int4bHandler(CONTEXT86*);
static void WINAPI DOSVM_Int5cHandler(CONTEXT86*);
static FARPROC16 DOSVM_Vectors16[256]; static FARPROC16 DOSVM_Vectors16[256];
static FARPROC48 DOSVM_Vectors48[256]; static FARPROC48 DOSVM_Vectors48[256];
@ -686,3 +702,358 @@ void WINAPI DOSVM_CallBuiltinHandler( CONTEXT86 *context, BYTE intnum )
INTPROC proc = DOSVM_GetBuiltinHandler( intnum ); INTPROC proc = DOSVM_GetBuiltinHandler( intnum );
proc( context ); proc( context );
} }
/**********************************************************************
* DOSVM_Int11Handler
*
* 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.
*/
static 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++)
{
HANDLE handle;
char file[10];
/* serial port name */
sprintf( file, "\\\\.\\COM%d", x+1 );
handle = CreateFileA( file, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle( handle );
serialports++;
}
sprintf( file, "\\\\.\\LPT%d", x+1 );
handle = CreateFileA( file, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle( handle );
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 );
}
/**********************************************************************
* DOSVM_Int12Handler
*
* Handler for int 12h (get memory size).
*/
static void WINAPI DOSVM_Int12Handler( CONTEXT86 *context )
{
SET_AX( context, 640 );
}
/**********************************************************************
* DOSVM_Int17Handler
*
* Handler for int 17h (printer - output character).
*/
static void WINAPI DOSVM_Int17Handler( CONTEXT86 *context )
{
switch( AH_reg(context) )
{
case 0x00:/* Send character*/
FIXME("Send character not supported yet\n");
SET_AH( context, 0x00 );/*Timeout*/
break;
case 0x01: /* PRINTER - INITIALIZE */
FIXME("Initialize Printer - Not Supported\n");
SET_AH( context, 0x30 ); /* selected | out of paper */
break;
case 0x02: /* PRINTER - GET STATUS */
FIXME("Get Printer Status - Not Supported\n");
break;
default:
SET_AH( context, 0 ); /* time out */
INT_BARF( context, 0x17 );
}
}
/**********************************************************************
* DOSVM_Int19Handler
*
* Handler for int 19h (Reboot).
*/
static void WINAPI DOSVM_Int19Handler( CONTEXT86 *context )
{
TRACE( "Attempted Reboot\n" );
ExitProcess(0);
}
/**********************************************************************
* DOSVM_Int1aHandler
*
* Handler for int 1ah.
*/
static void WINAPI DOSVM_Int1aHandler( CONTEXT86 *context )
{
switch(AH_reg(context))
{
case 0x00: /* GET SYSTEM TIME */
{
BIOSDATA *data = DOSVM_BiosData();
SET_CX( context, HIWORD(data->Ticks) );
SET_DX( context, LOWORD(data->Ticks) );
SET_AL( context, 0 ); /* FIXME: midnight flag is unsupported */
TRACE( "GET SYSTEM TIME - ticks=%d\n", data->Ticks );
}
break;
case 0x01: /* SET SYSTEM TIME */
FIXME( "SET SYSTEM TIME - not allowed\n" );
break;
case 0x02: /* GET REAL-TIME CLOCK TIME */
TRACE( "GET REAL-TIME CLOCK TIME\n" );
{
SYSTEMTIME systime;
GetLocalTime( &systime );
SET_CH( context, BIN_TO_BCD(systime.wHour) );
SET_CL( context, BIN_TO_BCD(systime.wMinute) );
SET_DH( context, BIN_TO_BCD(systime.wSecond) );
SET_DL( context, 0 ); /* FIXME: assume no daylight saving */
RESET_CFLAG(context);
}
break;
case 0x03: /* SET REAL-TIME CLOCK TIME */
FIXME( "SET REAL-TIME CLOCK TIME - not allowed\n" );
break;
case 0x04: /* GET REAL-TIME CLOCK DATE */
TRACE( "GET REAL-TIME CLOCK DATE\n" );
{
SYSTEMTIME systime;
GetLocalTime( &systime );
SET_CH( context, BIN_TO_BCD(systime.wYear / 100) );
SET_CL( context, BIN_TO_BCD(systime.wYear % 100) );
SET_DH( context, BIN_TO_BCD(systime.wMonth) );
SET_DL( context, BIN_TO_BCD(systime.wDay) );
RESET_CFLAG(context);
}
break;
case 0x05: /* SET REAL-TIME CLOCK DATE */
FIXME( "SET REAL-TIME CLOCK DATE - not allowed\n" );
break;
case 0x06: /* SET ALARM */
FIXME( "SET ALARM - unimplemented\n" );
break;
case 0x07: /* CANCEL ALARM */
FIXME( "CANCEL ALARM - unimplemented\n" );
break;
case 0x08: /* SET RTC ACTIVATED POWER ON MODE */
case 0x09: /* READ RTC ALARM TIME AND STATUS */
case 0x0a: /* READ SYSTEM-TIMER DAY COUNTER */
case 0x0b: /* SET SYSTEM-TIMER DAY COUNTER */
case 0x0c: /* SET RTC DATE/TIME ACTIVATED POWER-ON MODE */
case 0x0d: /* RESET RTC DATE/TIME ACTIVATED POWER-ON MODE */
case 0x0e: /* GET RTC DATE/TIME ALARM AND STATUS */
case 0x0f: /* INITIALIZE REAL-TIME CLOCK */
INT_BARF( context, 0x1a );
break;
case 0xb0:
if (CX_reg(context) == 0x4d52 &&
DX_reg(context) == 0x4349 &&
AL_reg(context) == 0x01)
{
/*
* Microsoft Real-Time Compression Interface (MRCI).
* Ignoring this call indicates MRCI is not supported.
*/
TRACE( "Microsoft Real-Time Compression Interface - not supported\n" );
}
else
{
INT_BARF(context, 0x1a);
}
break;
default:
INT_BARF( context, 0x1a );
}
}
/**********************************************************************
* DOSVM_Int20Handler
*
* Handler for int 20h.
*/
static void WINAPI DOSVM_Int20Handler( CONTEXT86 *context )
{
if (DOSVM_IsWin16())
ExitThread( 0 );
else if(ISV86(context))
MZ_Exit( context, TRUE, 0 );
else
ERR( "Called from DOS protected mode\n" );
}
/**********************************************************************
* DOSVM_Int29Handler
*
* Handler for int 29h (fast console output)
*/
static void WINAPI DOSVM_Int29Handler( CONTEXT86 *context )
{
/* Yes, it seems that this is really all this interrupt does. */
DOSVM_PutChar(AL_reg(context));
}
/**********************************************************************
* DOSVM_Int2aHandler
*
* Handler for int 2ah (network).
*/
static void WINAPI DOSVM_Int2aHandler( CONTEXT86 *context )
{
switch(AH_reg(context))
{
case 0x00: /* NETWORK INSTALLATION CHECK */
break;
default:
INT_BARF( context, 0x2a );
}
}
/***********************************************************************
* DOSVM_Int41Handler
*/
static void WINAPI DOSVM_Int41Handler( CONTEXT86 *context )
{
if ( ISV86(context) )
{
/* Real-mode debugger services */
switch ( AX_reg(context) )
{
default:
INT_BARF( context, 0x41 );
break;
}
}
else
{
/* Protected-mode debugger services */
switch ( AX_reg(context) )
{
case 0x4f:
case 0x50:
case 0x150:
case 0x51:
case 0x52:
case 0x152:
case 0x59:
case 0x5a:
case 0x5b:
case 0x5c:
case 0x5d:
/* Notifies the debugger of a lot of stuff. We simply ignore it
for now, but some of the info might actually be useful ... */
break;
default:
INT_BARF( context, 0x41 );
break;
}
}
}
/***********************************************************************
* DOSVM_Int4bHandler
*
*/
static void WINAPI DOSVM_Int4bHandler( CONTEXT86 *context )
{
switch(AH_reg(context))
{
case 0x81: /* Virtual DMA Spec (IBM SCSI interface) */
if(AL_reg(context) != 0x02) /* if not install check */
{
SET_CFLAG(context);
SET_AL( context, 0x0f ); /* function is not implemented */
}
break;
default:
INT_BARF(context, 0x4b);
}
}
/***********************************************************************
* DOSVM_Int5cHandler
*
* Called from NetBIOSCall16.
*/
static void WINAPI DOSVM_Int5cHandler( CONTEXT86 *context )
{
BYTE* ptr;
ptr = MapSL( MAKESEGPTR(context->SegEs,BX_reg(context)) );
FIXME("(%p): command code %02x (ignored)\n",context, *ptr);
*(ptr+0x01) = 0xFB; /* NetBIOS emulator not found */
SET_AL( context, 0xFB );
}