Release 971012
[wine.git] / msdos / vxd.c
blob643967fb96c5cb34bf0755209976241e31a3600e
1 /*
2 * VxD emulation
4 * Copyright 1995 Anand Kumria
5 */
7 #include <stdio.h>
8 #include "windows.h"
9 #include "msdos.h"
10 #include "miscemu.h"
11 #include "stddebug.h"
12 /* #define DEBUG_VXD */
13 #include "debug.h"
16 #define VXD_BARF(context,name) \
17 fprintf( stderr, "vxd %s: unknown/not implemented parameters:\n" \
18 "vxd %s: AX %04x, BX %04x, CX %04x, DX %04x, " \
19 "SI %04x, DI %04x, DS %04x, ES %04x\n", \
20 (name), (name), AX_reg(context), BX_reg(context), \
21 CX_reg(context), DX_reg(context), SI_reg(context), \
22 DI_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context) )
25 static WORD VXD_WinVersion(void)
27 WORD version = LOWORD(GetVersion16());
28 return (version >> 8) | (version << 8);
31 /***********************************************************************
32 * VXD_PageFile
34 void WINAPI VXD_PageFile( CONTEXT *context )
36 unsigned service = AX_reg(context);
38 /* taken from Ralf Brown's Interrupt List */
40 dprintf_vxd(stddeb,"VxD: [%04x] PageFile\n", (UINT16)service );
42 switch(service)
44 case 0x00: /* get version, is this windows version? */
45 dprintf_vxd(stddeb,"VxD PageFile: returning version\n");
46 AX_reg(context) = VXD_WinVersion();
47 RESET_CFLAG(context);
48 break;
50 case 0x01: /* get swap file info */
51 dprintf_vxd(stddeb,"VxD PageFile: returning swap file info\n");
52 AX_reg(context) = 0x00; /* paging disabled */
53 ECX_reg(context) = 0; /* maximum size of paging file */
54 /* FIXME: do I touch DS:SI or DS:DI? */
55 RESET_CFLAG(context);
56 break;
58 case 0x02: /* delete permanent swap on exit */
59 dprintf_vxd(stddeb,"VxD PageFile: supposed to delete swap\n");
60 RESET_CFLAG(context);
61 break;
63 case 0x03: /* current temporary swap file size */
64 dprintf_vxd(stddeb,"VxD PageFile: what is current temp. swap size\n");
65 RESET_CFLAG(context);
66 break;
68 case 0x04: /* read or write?? INTERRUP.D */
69 case 0x05: /* cancel?? INTERRUP.D */
70 case 0x06: /* test I/O valid INTERRUP.D */
71 default:
72 VXD_BARF( context, "pagefile" );
73 break;
78 /***********************************************************************
79 * VXD_Shell
81 void WINAPI VXD_Shell( CONTEXT *context )
83 unsigned service = DX_reg(context);
85 dprintf_vxd(stddeb,"VxD: [%04x] Shell\n", (UINT16)service);
87 switch (service) /* Ralf Brown says EDX, but I use DX instead */
89 case 0x0000:
90 dprintf_vxd(stddeb,"VxD Shell: returning version\n");
91 AX_reg(context) = VXD_WinVersion();
92 EBX_reg(context) = 1; /* system VM Handle */
93 break;
95 case 0x0001:
96 case 0x0002:
97 case 0x0003:
98 case 0x0004:
99 case 0x0005:
100 dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(context));
101 VXD_BARF( context, "shell" );
102 break;
104 case 0x0006: /* SHELL_Get_VM_State */
105 dprintf_vxd(stddeb,"VxD Shell: returning VM state\n");
106 /* Actually we don't, not yet. We have to return a structure
107 * and I am not to sure how to set it up and return it yet,
108 * so for now let's do nothing. I can (hopefully) get this
109 * by the next release
111 /* RESET_CFLAG(context); */
112 break;
114 case 0x0007:
115 case 0x0008:
116 case 0x0009:
117 case 0x000A:
118 case 0x000B:
119 case 0x000C:
120 case 0x000D:
121 case 0x000E:
122 case 0x000F:
123 case 0x0010:
124 case 0x0011:
125 case 0x0012:
126 case 0x0013:
127 case 0x0014:
128 case 0x0015:
129 case 0x0016:
130 default:
131 dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(context));
132 VXD_BARF( context, "shell");
133 break;
138 /***********************************************************************
139 * VXD_Comm
141 void WINAPI VXD_Comm( CONTEXT *context )
143 unsigned service = AX_reg(context);
145 dprintf_vxd(stddeb,"VxD: [%04x] Comm\n", (UINT16)service);
147 switch (service)
149 case 0x0000: /* get version */
150 dprintf_vxd(stddeb,"VxD Comm: returning version\n");
151 AX_reg(context) = VXD_WinVersion();
152 RESET_CFLAG(context);
153 break;
155 case 0x0001: /* set port global */
156 case 0x0002: /* get focus */
157 case 0x0003: /* virtualise port */
158 default:
159 VXD_BARF( context, "comm" );
163 /***********************************************************************
164 * VXD_Timer
166 void VXD_Timer( CONTEXT *context )
168 unsigned service = AX_reg(context);
170 dprintf_vxd(stddeb,"VxD: [%04x] Virtual Timer\n", (UINT16)service);
172 switch(service)
174 case 0x0000: /* version */
175 AX_reg(context) = VXD_WinVersion();
176 RESET_CFLAG(context);
177 break;
179 case 0x0100: /* clock tick time, in 840nsecs */
180 EAX_reg(context) = GetTickCount();
182 EDX_reg(context) = EAX_reg(context) >> 22;
183 EAX_reg(context) <<= 10; /* not very precise */
184 break;
186 case 0x0101: /* current Windows time, msecs */
187 case 0x0102: /* current VM time, msecs */
188 EAX_reg(context) = GetTickCount();
189 break;
191 default:
192 VXD_BARF( context, "VTD" );