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