|
1 /* |
|
2 SDL - Simple DirectMedia Layer |
|
3 Copyright (C) 1997-2006 Sam Lantinga |
|
4 |
|
5 This library is free software; you can redistribute it and/or |
|
6 modify it under the terms of the GNU Lesser General Public |
|
7 License as published by the Free Software Foundation; either |
|
8 version 2.1 of the License, or (at your option) any later version. |
|
9 |
|
10 This library is distributed in the hope that it will be useful, |
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 Lesser General Public License for more details. |
|
14 |
|
15 You should have received a copy of the GNU Lesser General Public |
|
16 License along with this library; if not, write to the Free Software |
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|
18 |
|
19 Sam Lantinga |
|
20 slouken@libsdl.org |
|
21 */ |
|
22 #include "SDL_config.h" |
|
23 |
|
24 /* |
|
25 * Atari keyboard events manager, using BIOS |
|
26 * |
|
27 * Patrice Mandin |
|
28 */ |
|
29 |
|
30 /* Mint includes */ |
|
31 #include <mint/osbind.h> |
|
32 #include <mint/cookie.h> |
|
33 |
|
34 #include "../../events/SDL_sysevents.h" |
|
35 #include "../../events/SDL_events_c.h" |
|
36 |
|
37 #include "SDL_atarikeys.h" |
|
38 #include "SDL_atarievents_c.h" |
|
39 #include "SDL_xbiosevents_c.h" |
|
40 #include "SDL_ataridevmouse_c.h" |
|
41 |
|
42 static unsigned char bios_currentkeyboard[ATARIBIOS_MAXKEYS]; |
|
43 static unsigned char bios_previouskeyboard[ATARIBIOS_MAXKEYS]; |
|
44 static SDL_bool use_dev_mouse = SDL_FALSE; |
|
45 |
|
46 static void UpdateSpecialKeys(int special_keys_state); |
|
47 |
|
48 void AtariBios_InitOSKeymap(_THIS) |
|
49 { |
|
50 int i, vectors_mask; |
|
51 unsigned long dummy; |
|
52 |
|
53 SDL_memset(bios_currentkeyboard, 0, sizeof(bios_currentkeyboard)); |
|
54 SDL_memset(bios_previouskeyboard, 0, sizeof(bios_previouskeyboard)); |
|
55 |
|
56 use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE; |
|
57 |
|
58 vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS; /* XBIOS joystick events */ |
|
59 if (!use_dev_mouse) { |
|
60 vectors_mask |= ATARI_XBIOS_MOUSEEVENTS; /* XBIOS mouse events */ |
|
61 } |
|
62 /* if (Getcookie(C_MiNT, &dummy)==C_FOUND) { |
|
63 vectors_mask = 0; |
|
64 }*/ |
|
65 |
|
66 SDL_AtariXbios_InstallVectors(vectors_mask); |
|
67 } |
|
68 |
|
69 void AtariBios_PumpEvents(_THIS) |
|
70 { |
|
71 int i; |
|
72 SDL_keysym keysym; |
|
73 |
|
74 /* Update pressed keys */ |
|
75 SDL_memset(bios_currentkeyboard, 0, ATARIBIOS_MAXKEYS); |
|
76 |
|
77 while (Bconstat(_CON)) { |
|
78 unsigned long key_pressed; |
|
79 key_pressed=Bconin(_CON); |
|
80 bios_currentkeyboard[(key_pressed>>16)&(ATARIBIOS_MAXKEYS-1)]=0xFF; |
|
81 } |
|
82 |
|
83 /* Read special keys */ |
|
84 UpdateSpecialKeys(Kbshift(-1)); |
|
85 |
|
86 /* Now generate events */ |
|
87 for (i=0; i<ATARIBIOS_MAXKEYS; i++) { |
|
88 /* Key pressed ? */ |
|
89 if (bios_currentkeyboard[i] && !bios_previouskeyboard[i]) |
|
90 SDL_PrivateKeyboard(SDL_PRESSED, |
|
91 SDL_Atari_TranslateKey(i, &keysym, SDL_TRUE)); |
|
92 |
|
93 /* Key unpressed ? */ |
|
94 if (bios_previouskeyboard[i] && !bios_currentkeyboard[i]) |
|
95 SDL_PrivateKeyboard(SDL_RELEASED, |
|
96 SDL_Atari_TranslateKey(i, &keysym, SDL_FALSE)); |
|
97 } |
|
98 |
|
99 if (use_dev_mouse) { |
|
100 SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE); |
|
101 } else { |
|
102 SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE); |
|
103 } |
|
104 |
|
105 /* Will be previous table */ |
|
106 SDL_memcpy(bios_previouskeyboard, bios_currentkeyboard, sizeof(bios_previouskeyboard)); |
|
107 } |
|
108 |
|
109 static void UpdateSpecialKeys(int special_keys_state) |
|
110 { |
|
111 #define UPDATE_SPECIAL_KEYS(numbit,scancode) \ |
|
112 { \ |
|
113 if (special_keys_state & (1<<(numbit))) { \ |
|
114 bios_currentkeyboard[scancode]=0xFF; \ |
|
115 } \ |
|
116 } |
|
117 |
|
118 UPDATE_SPECIAL_KEYS(K_RSHIFT, SCANCODE_RIGHTSHIFT); |
|
119 UPDATE_SPECIAL_KEYS(K_LSHIFT, SCANCODE_LEFTSHIFT); |
|
120 UPDATE_SPECIAL_KEYS(K_CTRL, SCANCODE_LEFTCONTROL); |
|
121 UPDATE_SPECIAL_KEYS(K_ALT, SCANCODE_LEFTALT); |
|
122 UPDATE_SPECIAL_KEYS(K_CAPSLOCK, SCANCODE_CAPSLOCK); |
|
123 } |
|
124 |
|
125 void AtariBios_ShutdownEvents(void) |
|
126 { |
|
127 SDL_AtariXbios_RestoreVectors(); |
|
128 if (use_dev_mouse) { |
|
129 SDL_AtariDevMouse_Close(); |
|
130 } |
|
131 } |