| /* | 
 |  * BIOS interrupt 15h handler | 
 |  * | 
 |  * Copyright 1997 Jan Willamowius | 
 |  * | 
 |  * 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 <stdlib.h> | 
 | #include "dosexe.h" | 
 | #include "wine/debug.h" | 
 | #include "wine/winbase16.h" | 
 |  | 
 | WINE_DEFAULT_DEBUG_CHANNEL(int); | 
 |  | 
 |  | 
 | /********************************************************************** | 
 |  *	    DOSVM_Int15Handler (WINEDOS16.121) | 
 |  * | 
 |  * Handler for int 15h | 
 |  */ | 
 | void WINAPI DOSVM_Int15Handler( CONTEXT86 *context ) | 
 | { | 
 |     switch(AH_reg(context)) | 
 |     { | 
 |     case 0x4f: /*catch keyboard*/ | 
 |         FIXME("INT15: intercept keyboard not handled yet\n"); | 
 |         break; | 
 |     case 0x83: /* start timer*/ | 
 |         switch(AL_reg(context)) | 
 |         { | 
 |         case 0x00: /* Start Timer*/ | 
 |             FIXME("INT15: Start Timer not handled yet\n"); | 
 |             break; | 
 |         case 0x01: /* stop  timer*/ | 
 |             FIXME("INT15: Stop Timer not handled yet\n"); | 
 |             break; | 
 |         } | 
 |         break; | 
 |     case 0x84: /* read joystick information */ | 
 |         FIXME("Read joystick information not implemented\n"); | 
 |  | 
 |         /* FIXME: report status as if no game port exists */ | 
 |         switch(DX_reg(context)) | 
 |         { | 
 |         case 0x0: /* read joystick switches */ | 
 |             SET_AL( context, 0x0 ); /* all switches open */ | 
 |             break; | 
 |         case 0x1: /* read joystick position */ | 
 |             SET_AX( context, 0x0 ); | 
 |             SET_BX( context, 0x0 ); | 
 |             SET_CX( context, 0x0 ); | 
 |             SET_DX( context, 0x0 ); | 
 |             break; | 
 | 	default: | 
 |             INT_BARF( context, 0x15 ); | 
 |             break; | 
 |         } | 
 |  | 
 |         RESET_CFLAG(context); | 
 |         break; | 
 |     case 0x85: /* sysreq - key  used*/ | 
 |         FIXME("INT15: SysReq - Key not handled yet\n"); | 
 |         break; | 
 |     case 0x86: /* wait*/ | 
 |         FIXME("INT15: Wait not correctly handled yet\n"); | 
 |         if ( AL_reg( context ) != 0x00 ) ERR("Invalid Input to Int15 function 0x86h AL != 0x00\n"); | 
 |         break; | 
 |     case 0x87: /* move memory regions*/ | 
 |         FIXME("INT15: Move memory regions not implemented\n"); | 
 |         break; | 
 |  | 
 |     case 0x88: /* get size of memory above 1 M */ | 
 |         SET_AX( context, 64 );  /* FIXME: are 64K ok? */ | 
 |         RESET_CFLAG(context); | 
 |         break; | 
 |     case 0x89: /*  Switch to protected mode*/ | 
 |         FIXME("INT15: switching to protected mode not supported\n"); | 
 |         break; | 
 |     case 0x90:/* OS hook  - Device busy*/ | 
 |         FIXME("INT15: OS hook - device busy\n"); | 
 |         break; | 
 |     case 0x91: /* OS hook -  Device post*/ | 
 |         FIXME("INT15: OS hook - device post\n"); | 
 |         break; | 
 |  | 
 |     case 0xc0: /* GET CONFIGURATION */ | 
 |         if (ISV86(context)) | 
 |         { | 
 |             /* real mode segment */ | 
 |             context->SegEs = 0xf000; | 
 |         } | 
 |         else | 
 |         { | 
 |             /* KERNEL.194: __F000H - protected mode selector */ | 
 |             FARPROC16 proc = GetProcAddress16( GetModuleHandle16("KERNEL"), | 
 |                                                (LPCSTR)(ULONG_PTR)194 ); | 
 |             context->SegEs = LOWORD(proc); | 
 |         } | 
 |         SET_BX( context, 0xe6f5 ); | 
 |         SET_AH( context, 0x0 ); | 
 |         RESET_CFLAG(context); | 
 |         break; | 
 |  | 
 |     case 0xc2: | 
 | 	switch(AL_reg(context)) | 
 | 	{ | 
 | 	case 0x00: /* Enable-Disable Pointing Device (mouse) */ | 
 | 	    /* BH = newstate, 00h = disabled 01h = enabled */ | 
 | 	    switch(BH_reg(context)) | 
 | 	    { | 
 | 	        case 0x00: | 
 | 	    	    FIXME("Disable Pointing Device - not implemented\n"); | 
 | 		    break; | 
 | 	    	case 0x01: | 
 | 	    	    FIXME("Enable Pointing Device - not implemented\n"); | 
 | 		    break; | 
 | 	    	default: | 
 | 		    INT_BARF( context, 0x15 ); | 
 | 		    break; | 
 | 	    } | 
 | 	    SET_AH( context, 0x00 ); /* successful */ | 
 | 	    break; | 
 | 	case 0x02: /* Set Sampling Rate */ | 
 | 	    /* BH = sampling rate */ | 
 | 	    FIXME("Set Sampling Rate - not implemented\n"); | 
 | 	    SET_AH( context, 0x00 ); /* successful */ | 
 | 	    break; | 
 | 	case 0x04: /* Get Pointing Device Type */ | 
 | 	    FIXME("Get Pointing Device Type - not implemented\n"); | 
 |             /* FIXME: BH = Device id, What is it supposed to be? */ | 
 | 	    SET_BH( context, 0x01 ); | 
 | 	    break; | 
 | 	default: | 
 | 	    INT_BARF( context, 0x15 ); | 
 | 	} | 
 |         break; | 
 |     case 0xc3: /* set carry flag, so BorlandRTM doesn't  assume a Vectra/PS2*/ | 
 | 	FIXME("INT15: 0xc3\n"); | 
 | 	SET_AH( context , 0x86 ); | 
 | 	break; | 
 |     case 0xc4: /*  BIOS POS Programm option select  */ | 
 | 	FIXME("INT15: option 0xc4 not handled!\n"); | 
 | 	break; | 
 |  | 
 |     default: | 
 |         INT_BARF( context, 0x15 ); | 
 |     } | 
 | } |