146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * Atari keyboard events manager, using Gemdos 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * Patrice Mandin 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Mint includes */ 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <mint/osbind.h> 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <mint/cookie.h> 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_sysevents.h" 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h" 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_atarikeys.h" 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_atarievents_c.h" 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_xbiosevents_c.h" 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_ataridevmouse_c.h" 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* To save state of keyboard */ 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic unsigned char gemdos_currentkeyboard[ATARIBIOS_MAXKEYS]; 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic unsigned char gemdos_previouskeyboard[ATARIBIOS_MAXKEYS]; 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_bool use_dev_mouse = SDL_FALSE; 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerenum { 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DEV_BUSY=0, 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DEV_READY 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void UpdateSpecialKeys(int special_keys_state); 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid AtariGemdos_InitOSKeymap(_THIS) 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i, vectors_mask; 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned long dummy; 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(gemdos_currentkeyboard, 0, sizeof(gemdos_currentkeyboard)); 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(gemdos_previouskeyboard, 0, sizeof(gemdos_previouskeyboard)); 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE; 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS; /* XBIOS joystick events */ 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!use_dev_mouse) { 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vectors_mask |= ATARI_XBIOS_MOUSEEVENTS; /* XBIOS mouse events */ 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* if (Getcookie(C_MiNT, &dummy)==C_FOUND) { 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vectors_mask = 0; 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }*/ 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_AtariXbios_InstallVectors(vectors_mask); 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid AtariGemdos_PumpEvents(_THIS) 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_keysym keysym; 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Update pressed keys */ 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(gemdos_currentkeyboard, 0, ATARIBIOS_MAXKEYS); 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (Cconis()!=DEV_BUSY) { 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned long key_pressed; 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner key_pressed=Cnecin(); 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner gemdos_currentkeyboard[(key_pressed>>16)&(ATARIBIOS_MAXKEYS-1)]=0xFF; 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Read special keys */ 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UpdateSpecialKeys(Kbshift(-1)); 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Now generate events */ 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; i<ATARIBIOS_MAXKEYS; i++) { 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Key pressed ? */ 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (gemdos_currentkeyboard[i] && !gemdos_previouskeyboard[i]) 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_PRESSED, 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Atari_TranslateKey(i, &keysym, SDL_TRUE)); 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Key unpressed ? */ 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (gemdos_previouskeyboard[i] && !gemdos_currentkeyboard[i]) 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_RELEASED, 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Atari_TranslateKey(i, &keysym, SDL_FALSE)); 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (use_dev_mouse) { 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE); 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE); 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Will be previous table */ 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(gemdos_previouskeyboard, gemdos_currentkeyboard, sizeof(gemdos_previouskeyboard)); 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void UpdateSpecialKeys(int special_keys_state) 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define UPDATE_SPECIAL_KEYS(numbit,scancode) \ 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { \ 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (special_keys_state & (1<<(numbit))) { \ 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner gemdos_currentkeyboard[scancode]=0xFF; \ 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } \ 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UPDATE_SPECIAL_KEYS(K_RSHIFT, SCANCODE_RIGHTSHIFT); 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UPDATE_SPECIAL_KEYS(K_LSHIFT, SCANCODE_LEFTSHIFT); 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UPDATE_SPECIAL_KEYS(K_CTRL, SCANCODE_LEFTCONTROL); 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UPDATE_SPECIAL_KEYS(K_ALT, SCANCODE_LEFTALT); 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UPDATE_SPECIAL_KEYS(K_CAPSLOCK, SCANCODE_CAPSLOCK); 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid AtariGemdos_ShutdownEvents(void) 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_AtariXbios_RestoreVectors(); 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (use_dev_mouse) { 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_AtariDevMouse_Close(); 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 138