1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 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 (at) 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 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 } 132