142 lines
3.5 KiB
C
142 lines
3.5 KiB
C
|
/*
|
||
|
* VxD emulation
|
||
|
*
|
||
|
* Copyright 1995 Anand Kumria
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include "windows.h"
|
||
|
#include "msdos.h"
|
||
|
#include "miscemu.h"
|
||
|
#include "wine.h"
|
||
|
#include "stddebug.h"
|
||
|
/* #define DEBUG_VXD */
|
||
|
#include "debug.h"
|
||
|
|
||
|
|
||
|
/***********************************************************************
|
||
|
* VXD_PageFile
|
||
|
*/
|
||
|
void VXD_PageFile( struct sigcontext_struct context )
|
||
|
{
|
||
|
/* taken from Ralf Brown's Interrupt List */
|
||
|
|
||
|
dprintf_vxd(stddeb,"VxD PageFile called ...\n");
|
||
|
|
||
|
switch(AX_reg(&context))
|
||
|
{
|
||
|
case 0x00: /* get version, is this windows version? */
|
||
|
dprintf_vxd(stddeb,"VxD PageFile: returning version\n");
|
||
|
AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
|
||
|
RESET_CFLAG(&context);
|
||
|
break;
|
||
|
|
||
|
case 0x01: /* get swap file info */
|
||
|
dprintf_vxd(stddeb,"VxD PageFile: returning swap file info\n");
|
||
|
AX_reg(&context) = 0x00; /* paging disabled */
|
||
|
ECX_reg(&context) = 0; /* maximum size of paging file */
|
||
|
/* FIXME: do I touch DS:SI or DS:DI? */
|
||
|
RESET_CFLAG(&context);
|
||
|
break;
|
||
|
|
||
|
case 0x02: /* delete permanent swap on exit */
|
||
|
dprintf_vxd(stddeb,"VxD PageFile: supposed to delete swap\n");
|
||
|
RESET_CFLAG(&context);
|
||
|
break;
|
||
|
|
||
|
case 0x03: /* current temporary swap file size */
|
||
|
dprintf_vxd(stddeb,"VxD PageFile: what is current temp. swap size\n");
|
||
|
RESET_CFLAG(&context);
|
||
|
break;
|
||
|
|
||
|
case 0x04: /* read or write?? INTERRUP.D */
|
||
|
case 0x05: /* cancel?? INTERRUP.D */
|
||
|
case 0x06: /* test I/O valid INTERRUP.D */
|
||
|
default:
|
||
|
INT_BARF( &context, 0x2f);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************
|
||
|
* VXD_Shell
|
||
|
*/
|
||
|
void VXD_Shell( struct sigcontext_struct context )
|
||
|
{
|
||
|
dprintf_vxd(stddeb,"VxD Shell called ...\n");
|
||
|
|
||
|
switch (DX_reg(&context)) /* Ralf Brown says EDX, but I use DX instead */
|
||
|
{
|
||
|
case 0x0000:
|
||
|
dprintf_vxd(stddeb,"VxD Shell: returning version\n");
|
||
|
AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
|
||
|
EBX_reg(&context) = 1; /* system VM Handle */
|
||
|
break;
|
||
|
|
||
|
case 0x0001:
|
||
|
case 0x0002:
|
||
|
case 0x0003:
|
||
|
case 0x0004:
|
||
|
case 0x0005:
|
||
|
dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(&context));
|
||
|
INT_BARF( &context, 0x2f);
|
||
|
break;
|
||
|
|
||
|
case 0x0006: /* SHELL_Get_VM_State */
|
||
|
dprintf_vxd(stddeb,"VxD Shell: returning VM state\n");
|
||
|
/* Actually we don't, not yet. We have to return a structure
|
||
|
* and I am not to sure how to set it up and return it yet,
|
||
|
* so for now let's do nothing. I can (hopefully) get this
|
||
|
* by the next release
|
||
|
*/
|
||
|
/* RESET_CFLAG(&context); */
|
||
|
break;
|
||
|
|
||
|
case 0x0007:
|
||
|
case 0x0008:
|
||
|
case 0x0009:
|
||
|
case 0x000A:
|
||
|
case 0x000B:
|
||
|
case 0x000C:
|
||
|
case 0x000D:
|
||
|
case 0x000E:
|
||
|
case 0x000F:
|
||
|
case 0x0010:
|
||
|
case 0x0011:
|
||
|
case 0x0012:
|
||
|
case 0x0013:
|
||
|
case 0x0014:
|
||
|
case 0x0015:
|
||
|
case 0x0016:
|
||
|
default:
|
||
|
dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(&context));
|
||
|
INT_BARF( &context, 0x2f);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************
|
||
|
* VXD_Comm
|
||
|
*/
|
||
|
void VXD_Comm( struct sigcontext_struct context )
|
||
|
{
|
||
|
dprintf_vxd(stddeb,"VxD Comm called ...\n");
|
||
|
|
||
|
switch (AX_reg(&context))
|
||
|
{
|
||
|
case 0x0000: /* get version */
|
||
|
dprintf_vxd(stddeb,"VxD Comm: returning version\n");
|
||
|
AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
|
||
|
RESET_CFLAG(&context);
|
||
|
break;
|
||
|
|
||
|
case 0x0001: /* set port global */
|
||
|
case 0x0002: /* get focus */
|
||
|
case 0x0003: /* virtualise port */
|
||
|
default:
|
||
|
INT_BARF( &context, 0x2f);
|
||
|
}
|
||
|
}
|