Release 980601
[wine/multimedia.git] / msdos / vxd.c
blob708cd360569fbcd73be06b26ea69ecd11cd0a1d5
1 /*
2 * VxD emulation
4 * Copyright 1995 Anand Kumria
5 */
7 #include "windows.h"
8 #include "msdos.h"
9 #include "miscemu.h"
10 #include "debug.h"
13 #define VXD_BARF(context,name) \
14 DUMP( "vxd %s: unknown/not implemented parameters:\n" \
15 "vxd %s: AX %04x, BX %04x, CX %04x, DX %04x, " \
16 "SI %04x, DI %04x, DS %04x, ES %04x\n", \
17 (name), (name), AX_reg(context), BX_reg(context), \
18 CX_reg(context), DX_reg(context), SI_reg(context), \
19 DI_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context) )
22 static WORD VXD_WinVersion(void)
24 WORD version = LOWORD(GetVersion16());
25 return (version >> 8) | (version << 8);
28 /***********************************************************************
29 * VXD_PageFile
31 void WINAPI VXD_PageFile( CONTEXT *context )
33 unsigned service = AX_reg(context);
35 /* taken from Ralf Brown's Interrupt List */
37 TRACE(vxd,"[%04x] PageFile\n", (UINT16)service );
39 switch(service)
41 case 0x00: /* get version, is this windows version? */
42 TRACE(vxd,"returning version\n");
43 AX_reg(context) = VXD_WinVersion();
44 RESET_CFLAG(context);
45 break;
47 case 0x01: /* get swap file info */
48 TRACE(vxd,"VxD PageFile: returning swap file info\n");
49 AX_reg(context) = 0x00; /* paging disabled */
50 ECX_reg(context) = 0; /* maximum size of paging file */
51 /* FIXME: do I touch DS:SI or DS:DI? */
52 RESET_CFLAG(context);
53 break;
55 case 0x02: /* delete permanent swap on exit */
56 TRACE(vxd,"VxD PageFile: supposed to delete swap\n");
57 RESET_CFLAG(context);
58 break;
60 case 0x03: /* current temporary swap file size */
61 TRACE(vxd,"VxD PageFile: what is current temp. swap size\n");
62 RESET_CFLAG(context);
63 break;
65 case 0x04: /* read or write?? INTERRUP.D */
66 case 0x05: /* cancel?? INTERRUP.D */
67 case 0x06: /* test I/O valid INTERRUP.D */
68 default:
69 VXD_BARF( context, "pagefile" );
70 break;
75 /***********************************************************************
76 * VXD_Shell
78 void WINAPI VXD_Shell( CONTEXT *context )
80 unsigned service = DX_reg(context);
82 TRACE(vxd,"[%04x] Shell\n", (UINT16)service);
84 switch (service) /* Ralf Brown says EDX, but I use DX instead */
86 case 0x0000:
87 TRACE(vxd,"returning version\n");
88 AX_reg(context) = VXD_WinVersion();
89 EBX_reg(context) = 1; /* system VM Handle */
90 break;
92 case 0x0001:
93 case 0x0002:
94 case 0x0003:
95 case 0x0004:
96 case 0x0005:
97 TRACE(vxd,"VxD Shell: EDX = %08lx\n",EDX_reg(context));
98 VXD_BARF( context, "shell" );
99 break;
101 case 0x0006: /* SHELL_Get_VM_State */
102 TRACE(vxd,"VxD Shell: returning VM state\n");
103 /* Actually we don't, not yet. We have to return a structure
104 * and I am not to sure how to set it up and return it yet,
105 * so for now let's do nothing. I can (hopefully) get this
106 * by the next release
108 /* RESET_CFLAG(context); */
109 break;
111 case 0x0007:
112 case 0x0008:
113 case 0x0009:
114 case 0x000A:
115 case 0x000B:
116 case 0x000C:
117 case 0x000D:
118 case 0x000E:
119 case 0x000F:
120 case 0x0010:
121 case 0x0011:
122 case 0x0012:
123 case 0x0013:
124 case 0x0014:
125 case 0x0015:
126 case 0x0016:
127 default:
128 TRACE(vxd,"VxD Shell: EDX = %08lx\n",EDX_reg(context));
129 VXD_BARF( context, "shell");
130 break;
135 /***********************************************************************
136 * VXD_Comm
138 void WINAPI VXD_Comm( CONTEXT *context )
140 unsigned service = AX_reg(context);
142 TRACE(vxd,"[%04x] Comm\n", (UINT16)service);
144 switch (service)
146 case 0x0000: /* get version */
147 TRACE(vxd,"returning version\n");
148 AX_reg(context) = VXD_WinVersion();
149 RESET_CFLAG(context);
150 break;
152 case 0x0001: /* set port global */
153 case 0x0002: /* get focus */
154 case 0x0003: /* virtualise port */
155 default:
156 VXD_BARF( context, "comm" );
160 /***********************************************************************
161 * VXD_Timer
163 void VXD_Timer( CONTEXT *context )
165 unsigned service = AX_reg(context);
167 TRACE(vxd,"[%04x] Virtual Timer\n", (UINT16)service);
169 switch(service)
171 case 0x0000: /* version */
172 AX_reg(context) = VXD_WinVersion();
173 RESET_CFLAG(context);
174 break;
176 case 0x0100: /* clock tick time, in 840nsecs */
177 EAX_reg(context) = GetTickCount();
179 EDX_reg(context) = EAX_reg(context) >> 22;
180 EAX_reg(context) <<= 10; /* not very precise */
181 break;
183 case 0x0101: /* current Windows time, msecs */
184 case 0x0102: /* current VM time, msecs */
185 EAX_reg(context) = GetTickCount();
186 break;
188 default:
189 VXD_BARF( context, "VTD" );