|
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 Gemdos |
|
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 /* To save state of keyboard */ |
|
43 |
|
44 static unsigned char gemdos_currentkeyboard[ATARIBIOS_MAXKEYS]; |
|
45 static unsigned char gemdos_previouskeyboard[ATARIBIOS_MAXKEYS]; |
|
46 static SDL_bool use_dev_mouse = SDL_FALSE; |
|
47 |
|
48 enum { |
|
49 DEV_BUSY=0, |
|
50 DEV_READY |
|
51 }; |
|
52 |
|
53 static void UpdateSpecialKeys(int special_keys_state); |
|
54 |
|
55 void AtariGemdos_InitOSKeymap(_THIS) |
|
56 { |
|
57 int i, vectors_mask; |
|
58 unsigned long dummy; |
|
59 |
|
60 SDL_memset(gemdos_currentkeyboard, 0, sizeof(gemdos_currentkeyboard)); |
|
61 SDL_memset(gemdos_previouskeyboard, 0, sizeof(gemdos_previouskeyboard)); |
|
62 |
|
63 use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE; |
|
64 |
|
65 vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS; /* XBIOS joystick events */ |
|
66 if (!use_dev_mouse) { |
|
67 vectors_mask |= ATARI_XBIOS_MOUSEEVENTS; /* XBIOS mouse events */ |
|
68 } |
|
69 /* if (Getcookie(C_MiNT, &dummy)==C_FOUND) { |
|
70 vectors_mask = 0; |
|
71 }*/ |
|
72 SDL_AtariXbios_InstallVectors(vectors_mask); |
|
73 } |
|
74 |
|
75 void AtariGemdos_PumpEvents(_THIS) |
|
76 { |
|
77 int i; |
|
78 SDL_keysym keysym; |
|
79 |
|
80 /* Update pressed keys */ |
|
81 SDL_memset(gemdos_currentkeyboard, 0, ATARIBIOS_MAXKEYS); |
|
82 |
|
83 while (Cconis()!=DEV_BUSY) { |
|
84 unsigned long key_pressed; |
|
85 key_pressed=Cnecin(); |
|
86 gemdos_currentkeyboard[(key_pressed>>16)&(ATARIBIOS_MAXKEYS-1)]=0xFF; |
|
87 } |
|
88 |
|
89 /* Read special keys */ |
|
90 UpdateSpecialKeys(Kbshift(-1)); |
|
91 |
|
92 /* Now generate events */ |
|
93 for (i=0; i<ATARIBIOS_MAXKEYS; i++) { |
|
94 /* Key pressed ? */ |
|
95 if (gemdos_currentkeyboard[i] && !gemdos_previouskeyboard[i]) |
|
96 SDL_PrivateKeyboard(SDL_PRESSED, |
|
97 SDL_Atari_TranslateKey(i, &keysym, SDL_TRUE)); |
|
98 |
|
99 /* Key unpressed ? */ |
|
100 if (gemdos_previouskeyboard[i] && !gemdos_currentkeyboard[i]) |
|
101 SDL_PrivateKeyboard(SDL_RELEASED, |
|
102 SDL_Atari_TranslateKey(i, &keysym, SDL_FALSE)); |
|
103 } |
|
104 |
|
105 if (use_dev_mouse) { |
|
106 SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE); |
|
107 } else { |
|
108 SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE); |
|
109 } |
|
110 |
|
111 /* Will be previous table */ |
|
112 SDL_memcpy(gemdos_previouskeyboard, gemdos_currentkeyboard, sizeof(gemdos_previouskeyboard)); |
|
113 } |
|
114 |
|
115 static void UpdateSpecialKeys(int special_keys_state) |
|
116 { |
|
117 #define UPDATE_SPECIAL_KEYS(numbit,scancode) \ |
|
118 { \ |
|
119 if (special_keys_state & (1<<(numbit))) { \ |
|
120 gemdos_currentkeyboard[scancode]=0xFF; \ |
|
121 } \ |
|
122 } |
|
123 |
|
124 UPDATE_SPECIAL_KEYS(K_RSHIFT, SCANCODE_RIGHTSHIFT); |
|
125 UPDATE_SPECIAL_KEYS(K_LSHIFT, SCANCODE_LEFTSHIFT); |
|
126 UPDATE_SPECIAL_KEYS(K_CTRL, SCANCODE_LEFTCONTROL); |
|
127 UPDATE_SPECIAL_KEYS(K_ALT, SCANCODE_LEFTALT); |
|
128 UPDATE_SPECIAL_KEYS(K_CAPSLOCK, SCANCODE_CAPSLOCK); |
|
129 } |
|
130 |
|
131 void AtariGemdos_ShutdownEvents(void) |
|
132 { |
|
133 SDL_AtariXbios_RestoreVectors(); |
|
134 if (use_dev_mouse) { |
|
135 SDL_AtariDevMouse_Close(); |
|
136 } |
|
137 } |