|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Additional Win32 helper functions not calling any system routines
5: *
6: * (c) 1997 Mathias Ortmann
7: */
8:
9: #include "config.h"
10: #include "sysconfig.h"
11:
12: #include <assert.h>
13: #include <ctype.h>
14: #include <signal.h>
15: #include <windows.h>
16:
17: #include "sysdeps.h"
18: #include "uae.h"
19: #include "options.h"
20: #include "threaddep/penguin.h"
21: #include "include/memory.h"
22: #include "custom.h"
23: #include "readcpu.h"
24: #include "newcpu.h"
25: #include "keyboard.h"
26: #include "xwin.h"
27: #include "disk.h"
28: #include "keybuf.h"
29: #include "gui.h"
30:
31: static int keystate[256];
32:
33: static int helppressed (void)
34: {
35: return GetAsyncKeyState (VK_END) & 0x8000;
36: }
37:
38: static int shiftpressed (void)
39: {
40: return GetAsyncKeyState (VK_SHIFT) & 0x8000 ? 1 : 0;
41: }
42:
43: static int getcapslock (void)
44: {
45: BYTE keyState[256];
46:
47: GetKeyboardState (keyState);
48: return keyState[VK_CAPITAL] & 1;
49: }
50:
51:
52: /* there's a problem remaining with the semantics of the '#' key on U.S. keyboards */
53: static int scancode2amiga (int keycode, int scancode)
54: {
55: switch (keycode & 0xff) {
56: case VK_INSERT:
57: case VK_LWIN:
58: return AK_LAMI;
59: case VK_HOME:
60: case VK_RWIN:
61: return AK_RAMI;
62: case VK_DECIMAL:
63: return 0x3c;
64: case VK_SCROLL:
65: return AK_inhibit;
66: case VK_F12:
67: case VK_APPS:
68: return -2;
69: case VK_PAUSE:
70: return -3;
71: case VK_DIVIDE:
72: return AK_NPDIV;
73: case VK_MULTIPLY:
74: return AK_NPMUL;
75: case VK_SUBTRACT:
76: return AK_NPSUB;
77: case VK_ADD:
78: return AK_NPADD;
79: case VK_NUMPAD0:
80: return AK_NP0;
81: case VK_NUMPAD1:
82: return AK_NP1;
83: case VK_NUMPAD2:
84: return AK_NP2;
85: case VK_NUMPAD3:
86: return AK_NP3;
87: case VK_NUMPAD4:
88: return AK_NP4;
89: case VK_NUMPAD5:
90: return AK_NP5;
91: case VK_NUMPAD6:
92: return AK_NP6;
93: case VK_NUMPAD7:
94: return AK_NP7;
95: case VK_NUMPAD8:
96: return AK_NP8;
97: case VK_NUMPAD9:
98: return AK_NP9;
99: case VK_UP:
100: return AK_UP;
101: case VK_DOWN:
102: return AK_DN;
103: case VK_LEFT:
104: return AK_LF;
105: case VK_RIGHT:
106: return AK_RT;
107: case VK_CONTROL:
108: return scancode == 0x11d ? AK_RCTRL : AK_CTRL;
109: case VK_RETURN:
110: return keycode > 0xff ? 0x43 : 0x44;
111: case VK_CAPITAL:
112: return -4;
113: case VK_F1:
114: if (helppressed ())
115: return -10 - shiftpressed ();
116: return 0x50;
117: case VK_F2:
118: if (helppressed ())
119: return -12 - shiftpressed ();
120: return 0x51;
121: case VK_F3:
122: if (helppressed ())
123: return -14 - shiftpressed ();
124: return 0x52;
125: case VK_F4:
126: if (helppressed ())
127: return -16 - shiftpressed ();
128: return 0x53;
129: case VK_F5:
130: return 0x54;
131: case VK_F6:
132: return 0x55;
133: case VK_F7:
134: return 0x56;
135: case VK_F8:
136: return 0x57;
137: case VK_F9:
138: return 0x58;
139: case VK_F10:
140: return 0x59;
141: case VK_NEXT:
142: return 0x5f;
143: }
144:
145: switch (scancode) {
146: case 0x01:
147: return 0x45;
148: case 0x29:
149: return 0x00;
150: case 0x02:
151: return 0x01;
152: case 0x03:
153: return 0x02;
154: case 0x04:
155: return 0x03;
156: case 0x05:
157: return 0x04;
158: case 0x06:
159: return 0x05;
160: case 0x07:
161: return 0x06;
162: case 0x08:
163: return 0x07;
164: case 0x09:
165: return 0x08;
166: case 0x0a:
167: return 0x09;
168: case 0x0b:
169: return 0x0a;
170: case 0x0c:
171: return 0x0b;
172: case 0x0d:
173: return 0x0c;
174: case 0x57:
175: return 0x0d;
176: case 0x0e:
177: return 0x41;
178: case 0x0f:
179: return 0x42;
180: case 0x10:
181: return 0x10;
182: case 0x11:
183: return 0x11;
184: case 0x12:
185: return 0x12;
186: case 0x13:
187: return 0x13;
188: case 0x14:
189: return 0x14;
190: case 0x15:
191: return 0x15;
192: case 0x16:
193: return 0x16;
194: case 0x17:
195: return 0x17;
196: case 0x18:
197: return 0x18;
198: case 0x19:
199: return 0x19;
200: case 0x1a:
201: return 0x1a;
202: case 0x1b:
203: return 0x1b;
204: /* special handling for caps lock: return 0x63*/
205: case 0x3a:
206: return 0x62;
207: case 0x1e:
208: return 0x20;
209: case 0x1f:
210: return 0x21;
211: case 0x20:
212: return 0x22;
213: case 0x21:
214: return 0x23;
215: case 0x22:
216: return 0x24;
217: case 0x23:
218: return 0x25;
219: case 0x24:
220: return 0x26;
221: case 0x25:
222: return 0x27;
223: case 0x26:
224: return 0x28;
225: case 0x27:
226: return 0x29;
227: case 0x28:
228: return 0x2a;
229: case 0x2b:
230: return 0x2b;
231: case 0x2a:
232: return 0x60;
233: case 0x56:
234: return 0x30;
235: case 0x2c:
236: return 0x31;
237: case 0x2d:
238: return 0x32;
239: case 0x2e:
240: return 0x33;
241: case 0x2f:
242: return 0x34;
243: case 0x30:
244: return 0x35;
245: case 0x31:
246: return 0x36;
247: case 0x32:
248: return 0x37;
249: case 0x33:
250: return 0x38;
251: case 0x34:
252: return 0x39;
253: case 0x35:
254: return 0x3a;
255: case 0x36:
256: return 0x61;
257: case 0x38:
258: return 0x64;
259: case 0x39:
260: return 0x40;
261: case 0x153:
262: return 0x46;
263: case 0x51:
264: return 0x5f;
265: case 0x52:
266: return 0x66;
267: case 0x47:
268: return 0x67;
269: case 0x4b:
270: return 0x4f;
271: case 0x50:
272: return 0x4d;
273: case 0x4d:
274: return 0x4e;
275: case 0x48:
276: return 0x4c;
277: case 0x4e:
278: return 0x5e;
279: case 0x4a:
280: return 0x4a;
281: case 0x37:
282: return 0x5d;
283: }
284:
285: return -1;
286: }
287:
288: int my_kbd_handler (int keycode, int scancode, int newstate)
289: {
290: int akey = scancode2amiga (keycode, scancode);
291:
292: if (akey < 0) {
293: switch (akey) {
294: case -2:
295: if (newstate)
296: DisplayGUI ();
297:
298: return 0;
299:
300: case -3:
301: #if 0
302: if (newstate)
303: toggle_sound = 1;
304: #endif
305: return 0;
306: case -4:
307: if (newstate) {
308: akey = 0x62;
309: newstate = getcapslock ();
310: }
311: break;
312: default:
313: if (newstate && akey >= -17 && akey <= -10) {
314: char tmpbuf[80];
315: akey = -10 - akey;
316:
317: if (akey & 1) {
318: akey >>= 1;
319: disk_eject (akey);
320: return 0;
321: }
322: akey >>= 1;
323:
324: sprintf (tmpbuf, "Insert disk into drive df%d:...", akey);
325:
326: requestfname (tmpbuf, changed_prefs.df[akey]);
327:
328: }
329: return 0;
330: }
331: }
332: if (akey == AK_inhibit) {
333: if (newstate)
334: inhibit_frame ^= 1;
335: return 0;
336: }
337: if (keystate[akey] == newstate)
338: return 0;
339: keystate[akey] = newstate;
340:
341: if (newstate)
342: record_key (akey << 1);
343: else
344: record_key ((akey << 1) + 1);
345:
346: /* "Affengriff" */
347: if (keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI])
348: uae_reset ();
349:
350: return 0;
351: }
352:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.