Home | History | Annotate | Download | only in ataricommon
      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
     26  *
     27  *	Patrice Mandin
     28  *
     29  *	This routines choose what the final event manager will be
     30  */
     31 
     32 #include <mint/cookie.h>
     33 #include <mint/osbind.h>
     34 
     35 #include "../../events/SDL_sysevents.h"
     36 #include "../../events/SDL_events_c.h"
     37 
     38 #include "SDL_atarikeys.h"
     39 #include "SDL_atarievents_c.h"
     40 #include "SDL_biosevents_c.h"
     41 #include "SDL_gemdosevents_c.h"
     42 #include "SDL_ikbdevents_c.h"
     43 
     44 enum {
     45 	MCH_ST=0,
     46 	MCH_STE,
     47 	MCH_TT,
     48 	MCH_F30,
     49 	MCH_CLONE,
     50 	MCH_ARANYM
     51 };
     52 
     53 /* The translation tables from a console scancode to a SDL keysym */
     54 static SDLKey keymap[ATARIBIOS_MAXKEYS];
     55 static char *keytab_normal;
     56 
     57 void (*Atari_ShutdownEvents)(void);
     58 
     59 static void Atari_InitializeEvents(_THIS)
     60 {
     61 	const char *envr;
     62 	long cookie_mch;
     63 
     64 	/* Test if we are on an Atari machine or not */
     65 	if (Getcookie(C__MCH, &cookie_mch) == C_NOTFOUND) {
     66 		cookie_mch = 0;
     67 	}
     68 	cookie_mch >>= 16;
     69 
     70 	/* Default is Ikbd, the faster except for clones */
     71 	switch(cookie_mch) {
     72 		case MCH_ST:
     73 		case MCH_STE:
     74 		case MCH_TT:
     75 		case MCH_F30:
     76 		case MCH_ARANYM:
     77 			this->InitOSKeymap=AtariIkbd_InitOSKeymap;
     78 			this->PumpEvents=AtariIkbd_PumpEvents;
     79 			Atari_ShutdownEvents=AtariIkbd_ShutdownEvents;
     80 			break;
     81 		default:
     82 			this->InitOSKeymap=AtariGemdos_InitOSKeymap;
     83 			this->PumpEvents=AtariGemdos_PumpEvents;
     84 			Atari_ShutdownEvents=AtariGemdos_ShutdownEvents;
     85 			break;
     86 	}
     87 
     88 	envr = SDL_getenv("SDL_ATARI_EVENTSDRIVER");
     89 
     90  	if (!envr) {
     91 		return;
     92 	}
     93 
     94 	if (SDL_strcmp(envr, "ikbd") == 0) {
     95 		this->InitOSKeymap=AtariIkbd_InitOSKeymap;
     96 		this->PumpEvents=AtariIkbd_PumpEvents;
     97 		Atari_ShutdownEvents=AtariIkbd_ShutdownEvents;
     98 	}
     99 
    100 	if (SDL_strcmp(envr, "gemdos") == 0) {
    101 		this->InitOSKeymap=AtariGemdos_InitOSKeymap;
    102 		this->PumpEvents=AtariGemdos_PumpEvents;
    103 		Atari_ShutdownEvents=AtariGemdos_ShutdownEvents;
    104 	}
    105 
    106 	if (SDL_strcmp(envr, "bios") == 0) {
    107 		this->InitOSKeymap=AtariBios_InitOSKeymap;
    108 		this->PumpEvents=AtariBios_PumpEvents;
    109 		Atari_ShutdownEvents=AtariBios_ShutdownEvents;
    110 	}
    111 }
    112 
    113 void Atari_InitOSKeymap(_THIS)
    114 {
    115 	Atari_InitializeEvents(this);
    116 
    117 	SDL_Atari_InitInternalKeymap(this);
    118 
    119 	/* Call choosen routine */
    120 	this->InitOSKeymap(this);
    121 }
    122 
    123 void SDL_Atari_InitInternalKeymap(_THIS)
    124 {
    125 	int i;
    126 	_KEYTAB *key_tables;
    127 
    128 	/* Read system tables for scancode -> ascii translation */
    129 	key_tables = (_KEYTAB *) Keytbl(KT_NOCHANGE, KT_NOCHANGE, KT_NOCHANGE);
    130 	keytab_normal = key_tables->unshift;
    131 
    132 	/* Initialize keymap */
    133 	for ( i=0; i<ATARIBIOS_MAXKEYS; i++ )
    134 		keymap[i] = SDLK_UNKNOWN;
    135 
    136 	/* Functions keys */
    137 	for ( i = 0; i<10; i++ )
    138 		keymap[SCANCODE_F1 + i] = SDLK_F1+i;
    139 
    140 	/* Cursor keypad */
    141 	keymap[SCANCODE_HELP] = SDLK_HELP;
    142 	keymap[SCANCODE_UNDO] = SDLK_UNDO;
    143 	keymap[SCANCODE_INSERT] = SDLK_INSERT;
    144 	keymap[SCANCODE_CLRHOME] = SDLK_HOME;
    145 	keymap[SCANCODE_UP] = SDLK_UP;
    146 	keymap[SCANCODE_DOWN] = SDLK_DOWN;
    147 	keymap[SCANCODE_RIGHT] = SDLK_RIGHT;
    148 	keymap[SCANCODE_LEFT] = SDLK_LEFT;
    149 
    150 	/* Special keys */
    151 	keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE;
    152 	keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE;
    153 	keymap[SCANCODE_TAB] = SDLK_TAB;
    154 	keymap[SCANCODE_ENTER] = SDLK_RETURN;
    155 	keymap[SCANCODE_DELETE] = SDLK_DELETE;
    156 	keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL;
    157 	keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT;
    158 	keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT;
    159 	keymap[SCANCODE_LEFTALT] = SDLK_LALT;
    160 	keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
    161 }
    162 
    163 void Atari_PumpEvents(_THIS)
    164 {
    165 	Atari_InitializeEvents(this);
    166 
    167 	/* Call choosen routine */
    168 	this->PumpEvents(this);
    169 }
    170 
    171 /* Atari to Unicode charset translation table */
    172 
    173 Uint16 SDL_AtariToUnicodeTable[256]={
    174 	/* Standard ASCII characters from 0x00 to 0x7e */
    175 	/* Unicode stuff from 0x7f to 0xff */
    176 
    177 	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
    178 	0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
    179 	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
    180 	0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
    181 	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
    182 	0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
    183 	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
    184 	0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
    185 
    186 	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
    187 	0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
    188 	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
    189 	0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
    190 	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
    191 	0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
    192 	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
    193 	0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x0394,
    194 
    195 	0x00C7,0x00FC,0x00E9,0x00E2,0x00E4,0x00E0,0x00E5,0x00E7,
    196 	0x00EA,0x00EB,0x00E8,0x00EF,0x00EE,0x00EC,0x00C4,0x00C5,
    197 	0x00C9,0x00E6,0x00C6,0x00F4,0x00F6,0x00F2,0x00FB,0x00F9,
    198 	0x00FF,0x00D6,0x00DC,0x00A2,0x00A3,0x00A5,0x00DF,0x0192,
    199 	0x00E1,0x00ED,0x00F3,0x00FA,0x00F1,0x00D1,0x00AA,0x00BA,
    200 	0x00BF,0x2310,0x00AC,0x00BD,0x00BC,0x00A1,0x00AB,0x00BB,
    201 	0x00C3,0x00F5,0x00D8,0x00F8,0x0153,0x0152,0x00C0,0x00C3,
    202 	0x00D5,0x00A8,0x00B4,0x2020,0x00B6,0x00A9,0x00AE,0x2122,
    203 
    204 	0x0133,0x0132,0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,
    205 	0x05D6,0x05D7,0x05D8,0x05D9,0x05DB,0x05DC,0x05DE,0x05E0,
    206 	0x05E1,0x05E2,0x05E4,0x05E6,0x05E7,0x05E8,0x05E9,0x05EA,
    207 	0x05DF,0x05DA,0x05DD,0x05E3,0x05E5,0x00A7,0x2038,0x221E,
    208 	0x03B1,0x03B2,0x0393,0x03C0,0x03A3,0x03C3,0x00B5,0x03C4,
    209 	0x03A6,0x0398,0x03A9,0x03B4,0x222E,0x03C6,0x2208,0x2229,
    210 	0x2261,0x00B1,0x2265,0x2264,0x2320,0x2321,0x00F7,0x2248,
    211 	0x00B0,0x2022,0x00B7,0x221A,0x207F,0x00B2,0x00B3,0x00AF
    212 };
    213 
    214 SDL_keysym *SDL_Atari_TranslateKey(int scancode, SDL_keysym *keysym,
    215 	SDL_bool pressed)
    216 {
    217 	int asciicode = 0;
    218 
    219 	/* Set the keysym information */
    220 	keysym->scancode = scancode;
    221 	keysym->mod = KMOD_NONE;
    222 	keysym->sym = keymap[scancode];
    223 	keysym->unicode = 0;
    224 
    225 	if (keysym->sym == SDLK_UNKNOWN) {
    226 		keysym->sym = asciicode = keytab_normal[scancode];
    227 	}
    228 
    229 	if (SDL_TranslateUNICODE && pressed) {
    230 		keysym->unicode = SDL_AtariToUnicodeTable[asciicode];
    231 	}
    232 
    233 	return(keysym);
    234 }
    235