From d55965c12987f5ec521e3d36907aecdcfa7450bf Mon Sep 17 00:00:00 2001 From: Dagen Brock Date: Fri, 29 Jan 2016 12:13:04 -0600 Subject: [PATCH] working joystick --- src/joystick_driver.c | 93 ++++++++++++++++++++++++++++++++++++++----- src/osxdriver.c | 13 ++++-- 2 files changed, 93 insertions(+), 13 deletions(-) diff --git a/src/joystick_driver.c b/src/joystick_driver.c index 7dfa6b0..78db7ab 100644 --- a/src/joystick_driver.c +++ b/src/joystick_driver.c @@ -1,21 +1,21 @@ /* GSport - an Apple //gs Emulator Copyright (C) 2010 - 2013 by GSport contributors - + Based on the KEGS emulator written by and Copyright (C) 2003 Kent Dickey - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -32,9 +32,16 @@ # include #endif +#ifdef HAVE_SDL +# include "SDL.h" +static SDL_Joystick *joy0, *joy1; +SDL_Joystick *gGameController = NULL; +#endif + extern int g_joystick_native_type1; /* in paddles.c */ extern int g_joystick_native_type2; /* in paddles.c */ extern int g_joystick_native_type; /* in paddles.c */ +extern int g_joystick_type; extern int g_paddle_buttons; extern int g_paddle_val[]; @@ -248,6 +255,74 @@ joystick_update_buttons() } #endif + +#ifdef HAVE_SDL +# define JOYSTICK_DEFINED +void +joystick_init() +{ + int i; + if( SDL_Init( SDL_INIT_JOYSTICK ) < 0 ) { + printf( "SDL could not initialize joystick! SDL Error: %s\n", SDL_GetError() ); + } else { + printf( "SDL initialize joystick successfully.\n"); + } + if (SDL_NumJoysticks()<1) { + printf ("No joysticks detected\n"); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + } + gGameController = SDL_JoystickOpen( 0 ); + if( gGameController == NULL ) { + printf( "Warning: Unable to open game controller! SDL Error: %s\n", SDL_GetError() ); + } + g_joystick_native_type = 2; + g_joystick_native_type1 = 2; + g_joystick_native_type2 = -1; + for(i = 0; i < 4; i++) { + g_paddle_val[i] = 180; + } + g_paddle_buttons = 1; + g_joystick_type = JOYSTICK_TYPE_NATIVE_1; + SDL_JoystickUpdate(); + joystick_update(0.0); +} + +void +joystick_update(double dcycs) +{ + if (gGameController) { + SDL_JoystickUpdate(); + g_paddle_val[0] = (int)SDL_JoystickGetAxis(gGameController, 0); + g_paddle_val[1] = (int)SDL_JoystickGetAxis(gGameController, 1); + if (SDL_JoystickGetButton(gGameController, 0)) { + g_paddle_buttons = g_paddle_buttons | 1; + } else { + g_paddle_buttons = g_paddle_buttons & (~1); + } + if (SDL_JoystickGetButton(gGameController, 1)) { + g_paddle_buttons = g_paddle_buttons | 2; + } else { + g_paddle_buttons = g_paddle_buttons & (~2); + } + paddle_update_trigger_dcycs(dcycs); + } + +} + +void +joystick_update_buttons() +{ +} + +void joystick_shut() { + SDL_JoystickClose( gGameController ); + gGameController = NULL; +} +#endif + + + + #ifndef JOYSTICK_DEFINED /* stubs for the routines */ void diff --git a/src/osxdriver.c b/src/osxdriver.c index 1843400..d23a9c4 100644 --- a/src/osxdriver.c +++ b/src/osxdriver.c @@ -19,6 +19,10 @@ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +// This is an experimental video driver for the KEGS/GSport emulator. +// It requires SDL2 libraries to build. I've tested on Mac, but should +// be easy to port to other platforms. -DagenBrock + // @todo: mouse clip bugs.. great western shootout. // @todo: force refresh after screen mode change @@ -293,8 +297,7 @@ void sdl_push_kimage(Kimage *kimage_ptr, int pixel_size = 4; src_ptr = kimage_ptr->data_ptr + (srcy * kimage_ptr->width_act + srcx) * pixel_size; //src_ptr = kimage_ptr->data_ptr; - //src_ptr = kimage_ptr->data_ptr; - //src_ptr = xim->data; + SDL_Rect dstrect; dstrect.x = destx; dstrect.y = desty; @@ -303,6 +306,7 @@ void sdl_push_kimage(Kimage *kimage_ptr, int pitch = 640; if (width < 560) { pitch = EFF_BORDER_WIDTH; + // This is another bad hack. Possibly not cross platform. pitch = BORDER_WIDTH+72; //printf("EFF_BORDER_WIDTH : %d" ,EFF_BORDER_WIDTH); } @@ -340,12 +344,14 @@ x_get_kimage(Kimage *kimage_ptr) { kimage_ptr->data_ptr = data; } + void check_input_events() { check_input_events_sdl(); } + void check_input_events_sdl() { @@ -379,7 +385,6 @@ check_input_events_sdl() } - int sdl_keysym_to_a2code(int keysym, int is_up) { @@ -423,7 +428,6 @@ sdl_keysym_to_a2code(int keysym, int is_up) } - void handle_sdl_key_event(SDL_Event event) { @@ -517,6 +521,7 @@ x_push_kimage(Kimage *kimage_ptr, int destx, int desty, int srcx, int srcy, int sdl_push_kimage(kimage_ptr, destx, desty, srcx, srcy, width, height); } + // called by src/sim65816.c void x_dialog_create_gsport_conf(const char *str)