[Tuxnes-devel] SDL joystick patch
Brought to you by:
tmmm
From: W. M. P. <mi...@fl...> - 2002-03-30 21:52:51
|
Enclosed you should find a patch to tuxnes that causes SDL to handle joystick input when the SDL renderer is chosen. Once I finish my next objective, SDL sound, it should be easy to port tuxnes to many different platforms. This patch requires my SDL patch, which I emailed to this mailing list a while ago. My SDL patch is also available at http://www.flyn.org. Please let me know what you think. Could the tuxnes SourceForge maintainers add the ability to submit patches using SourceForge? ================================================================================ diff -u --new-file --recursive tuxnes-0.75-sdl/Makefile.am tuxnes-0.75-sdl-js/Makefile.am --- tuxnes-0.75-sdl/Makefile.am Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-sdl-js/Makefile.am Wed Mar 27 19:56:26 2002 @@ -4,9 +4,9 @@ bin_SCRIPTS = romfixer noinst_PROGRAMS = comptbl -tuxnes_SOURCES = x86.S d6502.c dynrec.c emu.c fb.c gamegenie.c io.c mapper.c \ - sdl.c sound.c sound.h ggi.c x11.c w.c consts.h gamegenie.h globals.h \ - mapper.h renderer.c renderer.h ntsc_pal.c unzip.c unzip.h \ +tuxnes_SOURCES = x86.S d6502.c dynrec.c emu.c fb.c gamegenie.c io.c js.c \ + mapper.c sdl.c sound.c sound.h ggi.c x11.c w.c consts.h gamegenie.h \ + globals.h mapper.h renderer.c renderer.h ntsc_pal.c unzip.c unzip.h \ ziploader.c ziploader.h EXTRA_tuxnes_SOURCES = pixels.h tuxnes_LDADD = table.o diff -u --new-file --recursive tuxnes-0.75-sdl/configure.in tuxnes-0.75-sdl-js/configure.in --- tuxnes-0.75-sdl/configure.in Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-sdl-js/configure.in Fri Mar 29 21:04:35 2002 @@ -145,9 +145,10 @@ if test "x$with_sdl" != "xno"; then OCPPFLAGS="$CPPFLAGS" - CPPFLAGS="-I/usr/local/include" + CPPFLAGS="-I/usr/local/include -lpthread" AC_CHECK_HEADERS(SDL/SDL.h, CFLAGS="$CFLAGS -I/usr/local/include") AC_CHECK_LIB(SDL, SDL_Init) + AC_CHECK_LIB(pthread, pthread_create) CPPFLAGS="$OCPPFLAGS" fi diff -u --new-file --recursive tuxnes-0.75-sdl/emu.c tuxnes-0.75-sdl-js/emu.c --- tuxnes-0.75-sdl/emu.c Wed Apr 11 23:45:47 2001 +++ tuxnes-0.75-sdl-js/emu.c Sat Mar 30 22:07:53 2002 @@ -26,9 +26,6 @@ #include <errno.h> #include <fcntl.h> #include <getopt.h> -#ifdef HAVE_LINUX_JOYSTICK_H -#include <linux/joystick.h> -#endif /* HAVE_LINUX_JOYSTICK_H */ #include <pwd.h> #include <signal.h> #include <stdio.h> @@ -77,10 +74,6 @@ int verbose = 0; /* joystick variables */ -unsigned char jsaxes[2] = {2, 2}; -unsigned char jsbuttons[2] = {2, 2}; -int jsfd[2] = {-1, -1}; -int jsversion[2] = {0x000800, 0x000800}; char *jsdevice[2] = {0, 0}; char *rendname = "auto"; @@ -1612,56 +1605,6 @@ } basefilename[baseend - basestart + 1] = '\0'; - /* initialize joysticks */ - { - int stick; - - for (stick = 0; stick < 2; stick ++) - { - if (jsdevice[stick]) - { -#ifdef HAVE_LINUX_JOYSTICK_H - if ((jsfd[stick] = open (jsdevice[stick], O_RDONLY)) < 0) - { - perror (jsdevice[stick]); - } - else - { - ioctl (jsfd[stick], JSIOCGVERSION, jsversion + stick); - ioctl (jsfd[stick], JSIOCGAXES, jsaxes + stick); - ioctl (jsfd[stick], JSIOCGBUTTONS, jsbuttons + stick); - fcntl (jsfd[stick], F_SETFL, O_NONBLOCK); /* set joystick to non-blocking */ - if( jsbuttons[stick] == 2 ) - { /* modify button map for a 2-button joystick */ - if( !js_usermapped2button[stick][0] ) - js_nesmaps[stick].button[0] = BUTTONB; - if( !js_usermapped2button[stick][1] ) - js_nesmaps[stick].button[1] = BUTTONA; - } - - if (verbose) - { - fprintf (stderr, - "Joystick %d (%s) has %d axes and %d buttons. Driver version is %d.%d.%d.\n", - stick + 1, - jsdevice[stick], - jsaxes[stick], - jsbuttons[stick], - jsversion[stick] >> 16, - (jsversion[stick] >> 8) & 0xff, - jsversion[stick] & 0xff); - } - } -#else - fprintf (stderr, - "Joystick support was disabled at compile-time. To enable it, make sure\n" - "you are running a recent version of the Linux kernel with the joystick\n" - "driver enabled, and install the header file <linux/joystick.h>.\n"); -#endif /* HAVE_LINUX_JOYSTICK_H */ - } - } - } - /* Select a sound sample format */ { struct SampleFormat *match = 0; @@ -2195,7 +2138,7 @@ renderer = match; } - /* Initialize graphic display */ + /* Initialize graphic display -- SDL needs to be initialized before js. */ if (renderer->InitDisplay (argc, argv)) { fprintf (stderr, @@ -2204,6 +2147,18 @@ exit (1); } + /* initialize joysticks */ + { + int stick; + for (stick = 0; stick < 2; stick ++) + { + if (jsdevice[stick] || ! strcmp ("sdl", renderer->name)) + { + renderer->InitJoystick(stick); + } + } + } + /* trap traps */ if (! disassemble) if ((oldtraphandler = signal (SIGTRAP, &traphandler)) == SIG_ERR) diff -u --new-file --recursive tuxnes-0.75-sdl/ggi.c tuxnes-0.75-sdl-js/ggi.c --- tuxnes-0.75-sdl/ggi.c Wed Apr 11 23:45:47 2001 +++ tuxnes-0.75-sdl-js/ggi.c Wed Mar 27 20:03:22 2002 @@ -38,7 +38,6 @@ void quit(void); void START(void); void fbinit(void); -void HandleJoystickLinux(int); #ifdef HAVE_GGI #include <ggi/gii.h> @@ -1292,16 +1291,6 @@ do { struct timeval tv = { 0, 0 }; - /* Handle joystick input */ - if (jsfd[0] >= 0) - { - HandleJoystickLinux(0); - } - if (jsfd[1] >= 0) - { - HandleJoystickLinux(1); - } - /* Handle GGI input */ while (ggiEventPoll(visualGGI, emKeyPress | emKeyRelease, &tv)) { ggi_event ev; diff -u --new-file --recursive tuxnes-0.75-sdl/globals.h tuxnes-0.75-sdl-js/globals.h --- tuxnes-0.75-sdl/globals.h Wed Apr 11 23:45:47 2001 +++ tuxnes-0.75-sdl-js/globals.h Sat Mar 30 21:43:31 2002 @@ -68,10 +68,6 @@ extern int *palette, *palette2; extern char *tuxnesdir; extern char *basefilename; /* filename without extension */ -extern unsigned char jsaxes[2]; -extern unsigned char jsbuttons[2]; -extern int jsfd[2]; -extern int jsversion[2]; extern char *jsdevice[2]; extern struct js_nesmap { unsigned char button[JS_MAX_BUTTONS]; diff -u --new-file --recursive tuxnes-0.75-sdl/io.c tuxnes-0.75-sdl-js/io.c --- tuxnes-0.75-sdl/io.c Wed Apr 11 23:45:47 2001 +++ tuxnes-0.75-sdl-js/io.c Wed Mar 27 20:08:00 2002 @@ -502,6 +502,8 @@ last_clock = CLOCK; renderer->UpdateDisplay (); + renderer->HandleJoystick (0); + renderer->HandleJoystick (1); /*printf("donmi: stack at %x\n",STACKPTR); */ diff -u --new-file --recursive tuxnes-0.75-sdl/js.c tuxnes-0.75-sdl-js/js.c --- tuxnes-0.75-sdl/js.c Thu Jan 1 01:00:00 1970 +++ tuxnes-0.75-sdl-js/js.c Sat Mar 30 22:09:28 2002 @@ -0,0 +1,409 @@ +/* + * This file is part of the TuxNES project codebase. + * + * Please see the README and COPYING files for more information regarding + * this project. + * + * Description: This file handles joystick input. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_FEATURES_H +#include <features.h> +#endif /* HAVE_FEATRES_H */ + +#include <stdio.h> +#include <string.h> +#include "globals.h" +#include "renderer.h" + +#ifdef HAVE_LINUX_JOYSTICK_H +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> +#include <linux/joystick.h> +#endif /* HAVE_LINUX_JOYSTICK_H */ + +char jsaxes[2] = { 2, 2 }; +char jsbuttons[2] = { 2, 2 }; +int jsfd[2] = { -1, -1 }; +int jsversion[2] = { 0x000800, 0x000800 }; + +#ifdef HAVE_SDL +#include <SDL/SDL.h> + +SDL_Joystick *sdl_js; + +/* ============================ InitJoystickSDL () ========================= */ +void InitJoystickSDL(int stick) +{ + SDL_JoystickEventState(SDL_ENABLE); + if (! (sdl_js = SDL_JoystickOpen(stick))) + printf (stderr, "Error initializing joystick %d\n", stick);; +} + +/* ============================ handle_key () ============================== */ +static void handle_key(SDL_KeyboardEvent * ev) +{ + if (ev->keysym.sym == SDLK_ESCAPE) + exit(0); + /* the coin and dipswitch inputs work only in VS UniSystem mode */ + if (unisystem) + switch (ev->keysym.sym) { + case SDLK_LEFTBRACKET: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + coinslot ^= 1; + } else if (ev->type == SDL_KEYDOWN) + coinslot |= 1; + else + coinslot &= ~1; + break; + case SDLK_RIGHTBRACKET: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + coinslot ^= 2; + } else if (ev->type == SDL_KEYDOWN) + coinslot |= 2; + else + coinslot &= ~2; + break; + case SDLK_BACKSLASH: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + coinslot ^= 4; + } else if (ev->type == SDL_KEYDOWN) + coinslot |= 4; + else + coinslot &= ~4; + break; + case SDLK_q: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x01; + break; + case SDLK_w: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x02; + break; + case SDLK_e: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x04; + break; + case SDLK_r: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x08; + break; + case SDLK_t: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x10; + break; + case SDLK_y: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x20; + break; + case SDLK_u: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x40; + break; + case SDLK_i: + if (ev->type == SDL_KEYDOWN) + dipswitches ^= 0x80; + break; + default: + break; + } + switch (ev->keysym.sym) { + /* controller 1 keyboard mapping */ + case SDLK_RETURN: + case SDLK_KP_ENTER: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= STARTBUTTON; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= STARTBUTTON; + else + controller[0] &= ~STARTBUTTON; + break; + case SDLK_TAB: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= SELECTBUTTON; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= SELECTBUTTON; + else + controller[0] &= ~SELECTBUTTON; + break; + case SDLK_UP: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= UP; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= UP; + else + controller[0] &= ~UP; + break; + case SDLK_DOWN: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= DOWN; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= DOWN; + else + controller[0] &= ~DOWN; + break; + case SDLK_LEFT: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= LEFT; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= LEFT; + else + controller[0] &= ~LEFT; + break; + case SDLK_RIGHT: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= RIGHT; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= RIGHT; + else + controller[0] &= ~RIGHT; + break; + case SDLK_HOME: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controllerd[0] ^= (UP | LEFT); + } else if (ev->type == SDL_KEYDOWN) + controllerd[0] |= (UP | LEFT); + else + controllerd[0] &= ~(UP | LEFT); + break; + case SDLK_PAGEUP: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controllerd[0] ^= (UP | RIGHT); + } else if (ev->type == SDL_KEYDOWN) + controllerd[0] |= (UP | RIGHT); + else + controllerd[0] &= ~(UP | RIGHT); + break; + case SDLK_END: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controllerd[0] ^= (DOWN | LEFT); + } else if (ev->type == SDL_KEYDOWN) + controllerd[0] |= (DOWN | LEFT); + else + controllerd[0] &= ~(DOWN | LEFT); + break; + case SDLK_PAGEDOWN: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controllerd[0] ^= (DOWN | RIGHT); + } else if (ev->type == SDL_KEYDOWN) + controllerd[0] |= (DOWN | RIGHT); + else + controllerd[0] &= ~(DOWN | RIGHT); + break; + case SDLK_z: + case SDLK_x: + case SDLK_d: + case SDLK_INSERT: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= BUTTONB; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= BUTTONB; + else + controller[0] &= ~BUTTONB; + break; + case SDLK_a: + case SDLK_c: + case SDLK_SPACE: + case SDLK_DELETE: + if (renderer_config.sticky_keys) { + if (ev->type == SDL_KEYDOWN) + controller[0] ^= BUTTONA; + } else if (ev->type == SDL_KEYDOWN) + controller[0] |= BUTTONA; + else + controller[0] &= ~BUTTONA; + break; + case SDLK_F7: + case SDLK_PRINT: + case SDLK_s: + SaveScreenshotSDL(); + break; + default: + break; + } +} + +/* ============================ HandleJoystickSDL () ======================= */ +void HandleJoystickSDL(int stick) +{ + /* Handles all input, actually. */ + SDL_Event event; + int axis_i; + while (SDL_PollEvent(&event)) { + switch (event.type) { + int nes_button; + case SDL_KEYDOWN: + case SDL_KEYUP: + handle_key(&event.key); + break; + case SDL_QUIT: + exit(0); + case SDL_JOYAXISMOTION: + /* Left-right movement */ + if (event.jaxis.value < -JS_IGNORE) { + js_axismeso[event.jaxis.axis] = + js_nesmaps[stick].axis[event.jaxis.axis].neg; + controller[stick] &= + ~js_nesmaps[stick].axis[event.jaxis.axis].pos; + } else if (event.jaxis.value > JS_IGNORE) { + js_axismeso[event.jaxis.axis] = + js_nesmaps[stick].axis[event.jaxis.axis].pos; + controller[stick] &= + ~js_nesmaps[stick].axis[event.jaxis.axis].neg; + } else { + js_axismeso[event.jaxis.axis] = 0; + controller[stick] &= + ~js_nesmaps[stick].axis[event.jaxis.axis].neg; + controller[stick] &= + ~js_nesmaps[stick].axis[event.jaxis.axis].pos; + } + for (axis_i = JS_MAX_AXES; --axis_i >= 0;) + controller[stick] |= js_axismeso[axis_i]; + break; + case SDL_JOYBUTTONDOWN: + nes_button = js_nesmaps[stick].button[event.jbutton.button]; + if (nes_button != PAUSEDISPLAY) { + controller[stick] |= nes_button; + } else { + renderer_data.pause_display = !renderer_data.pause_display; + desync = 1; + } + break; + case SDL_JOYBUTTONUP: + nes_button = js_nesmaps[stick].button[event.jbutton.button]; + if (nes_button != PAUSEDISPLAY) { + controller[stick] &= ~nes_button; + } else { + renderer_data.pause_display = !renderer_data.pause_display; + desync = 1; + } + break; + } + } +} +#endif /* HAVE_SDL */ + +/* ============================ InitJoystickLinux () ======================= */ +void InitJoystickLinux(int stick) +{ +#ifdef HAVE_LINUX_JOYSTICK_H + if ((jsfd[stick] = open(jsdevice[stick], O_RDONLY)) < 0) { + perror(jsdevice[stick]); + } else { + ioctl(jsfd[stick], JSIOCGVERSION, jsversion + stick); + ioctl(jsfd[stick], JSIOCGAXES, jsaxes + stick); + ioctl(jsfd[stick], JSIOCGBUTTONS, jsbuttons + stick); + fcntl(jsfd[stick], F_SETFL, O_NONBLOCK); /* set joystick to non-blocking */ + if (jsbuttons[stick] == 2) { /* modify button map for a 2-button joystick */ + if (!js_usermapped2button[stick][0]) + js_nesmaps[stick].button[0] = BUTTONB; + if (!js_usermapped2button[stick][1]) + js_nesmaps[stick].button[1] = BUTTONA; + } + if (verbose) { + fprintf(stderr, + "Joystick %d (%s) has %d axes and %d buttons. Driver version is %d.%d.%d.\n", + stick + 1, + jsdevice[stick], + jsaxes[stick], + jsbuttons[stick], + jsversion[stick] >> 16, + (jsversion[stick] >> 8) & 0xff, + jsversion[stick] & 0xff); + } + } +#else + fprintf(stderr, + "Joystick support was disabled at compile-time. To enable it, make sure\n" + "you are running a recent version of the Linux kernel with the joystick\n" + "driver enabled, and install the header file <linux/joystick.h>.\n"); +#endif /* HAVE_LINUX_JOYSTICK_H */ +} + +/* ============================ HandleJoystickLinux () ===================== */ +void HandleJoystickLinux(int stick) +{ +#ifdef HAVE_LINUX_JOYSTICK_H + struct js_event js; + int nes_button; + int axis_i; + while (read(jsfd[stick], &js, sizeof(struct js_event)) == + sizeof(struct js_event)) { + /* verbose joystick reporting */ +/* if (verbose) */ +/* { */ +/* fprintf (stderr, "%s: type %d number %d value %d\n", */ +/* jsdevice[stick], js.type, js.number, js.value); */ +/* } */ + switch (js.type) { + case 1: /* button report */ + nes_button = js_nesmaps[stick].button[js.number]; + printf("%d\n", js.number); + if (nes_button != PAUSEDISPLAY) { + if (js.value) + controller[stick] |= nes_button; + else + controller[stick] &= ~nes_button; + } else /* (nes_button == PAUSEDISPLAY) */ if (js.value) { + renderer_data.pause_display = !renderer_data.pause_display; + desync = 1; + } + break; + case 2: /* axis report */ + if (js.value < -JS_IGNORE) { + js_axismeso[js.number] = + js_nesmaps[stick].axis[js.number].neg; + controller[stick] &= + ~js_nesmaps[stick].axis[js.number].pos; + } else if (js.value > JS_IGNORE) { + js_axismeso[js.number] = + js_nesmaps[stick].axis[js.number].pos; + controller[stick] &= + ~js_nesmaps[stick].axis[js.number].neg; + } else { + js_axismeso[js.number] = 0; + controller[stick] &= + ~js_nesmaps[stick].axis[js.number].neg; + controller[stick] &= + ~js_nesmaps[stick].axis[js.number].pos; + } + for (axis_i = JS_MAX_AXES; --axis_i >= 0;) + controller[stick] |= js_axismeso[axis_i]; + break; + } + } + if (errno != EAGAIN) { + if (errno) { + perror(jsdevice[stick]); + } else { + fprintf(stderr, + "%s: device violates joystick protocol, disabling\n", + jsdevice[stick]); + close(jsfd[stick]); + jsfd[stick] = -1; + } + } +#endif /* HAVE_LINUX_JOYSTICK_H */ +} diff -u --new-file --recursive tuxnes-0.75-sdl/js.h tuxnes-0.75-sdl-js/js.h --- tuxnes-0.75-sdl/js.h Thu Jan 1 01:00:00 1970 +++ tuxnes-0.75-sdl-js/js.h Wed Mar 27 20:17:06 2002 @@ -0,0 +1,28 @@ +/* + * This file is part of the TuxNES project codebase. + * + * Please see the README and COPYING files for more information regarding + * this project. + * + * Description: This file handles joystick input. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_FEATURES_H +#include <features.h> +#endif /* HAVE_FEATRES_H */ + +#ifdef HAVE_LINUX_JOYSTICK_H +#include <linux/joystick.h> +#endif /* HAVE_LINUX_JOYSTICK_H */ + +#ifdef HAVE_SDL +void InitJoystickSDL(int stick); +void HandleJoystickSDL(int stick); +#endif /* HAVE_SDL */ + +void InitJoystickLinux(int stick); +void HandleJoystickLinux(int stick); diff -u --new-file --recursive tuxnes-0.75-sdl/renderer.c tuxnes-0.75-sdl-js/renderer.c --- tuxnes-0.75-sdl/renderer.c Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-sdl-js/renderer.c Fri Mar 29 21:02:50 2002 @@ -26,6 +26,7 @@ #include "mapper.h" #include "renderer.h" #include "sound.h" +#include "js.h" #ifdef HAVE_X extern int InitDisplayX11(int argc, char **argv); @@ -57,6 +58,8 @@ int InitDisplayNone(int argc, char **argv); void UpdateColorsNone(void); void UpdateDisplayNone(void); +void InitJoystickNone(int stick); +void HandleJoystickNone(int stick); /* imports */ extern void fbinit(void); @@ -67,36 +70,43 @@ #ifdef HAVE_X { "x11", "X11 renderer", 0, - InitDisplayX11, UpdateDisplayX11, UpdateColorsX11 }, + InitDisplayX11, UpdateDisplayX11, UpdateColorsX11, InitJoystickLinux, + HandleJoystickLinux }, { "diff", "differential X11 renderer", RENDERER_DIFF, - InitDisplayX11, UpdateDisplayX11, UpdateColorsX11 }, + InitDisplayX11, UpdateDisplayX11, UpdateColorsX11, InitJoystickLinux, + HandleJoystickLinux }, { "old", "old X11 renderer (tile-based)", RENDERER_OLD, - InitDisplayX11, UpdateDisplayOldX11, UpdateColorsX11 }, + InitDisplayX11, UpdateDisplayOldX11, UpdateColorsX11, InitJoystickLinux, + HandleJoystickLinux }, #endif /* HAVE_X */ #ifdef HAVE_SDL { "sdl", "SDL renderer", 0, - InitDisplaySDL, UpdateDisplaySDL, UpdateColorsSDL }, + InitDisplaySDL, UpdateDisplaySDL, UpdateColorsSDL, InitJoystickSDL, + HandleJoystickSDL }, #endif /* HAVE_SDL */ #ifdef HAVE_GGI { "ggi", "GGI renderer", 0, - InitDisplayGGI, UpdateDisplayGGI, UpdateColorsGGI }, + InitDisplayGGI, UpdateDisplayGGI, UpdateColorsGGI, InitJoystickLinux, + HandleJoystickLinux }, #endif /* HAVE_GGI */ #ifdef HAVE_W { "w", "W renderer", 0, - InitDisplayW, UpdateDisplayW, UpdateColorsW }, + InitDisplayW, UpdateDisplayW, UpdateColorsW, InitJoystickLinux, + HandleJoystickLinux }, #endif /* HAVE_W */ { "auto", "Choose one automatically", 0, - InitDisplayAuto, 0, 0 }, + InitDisplayAuto, 0, 0, 0, 0 }, { "none", "Don't draw anything", 0, - InitDisplayNone, UpdateDisplayNone, UpdateColorsNone }, - { 0, 0, 0, 0, 0, 0 } /* terminator */ + InitDisplayNone, UpdateDisplayNone, UpdateColorsNone, InitJoystickNone, + HandleJoystickNone }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* terminator */ }, *renderer = 0; struct RendererConfig renderer_config = { @@ -228,19 +238,6 @@ usleep (16666 * (frame - timeframe - 1)); } - /* Input loop */ - do { - /* Handle joystick input */ - if (jsfd[0] >= 0) - { - HandleJoystickLinux(0); - } - if (jsfd[1] >= 0) - { - HandleJoystickLinux(1); - } - } while (renderer_data.pause_display); - /* Check the time. If we're getting behind, skip next frame to stay in sync. */ gettimeofday (&time, NULL); timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ @@ -262,3 +259,15 @@ { /* no-op */ } + +void +InitJoystickNone(int stick) +{ + /* no-op */ +} + +void +HandleJoystickNone(int stick) +{ + /* no-op */ +} diff -u --new-file --recursive tuxnes-0.75-sdl/renderer.h tuxnes-0.75-sdl-js/renderer.h --- tuxnes-0.75-sdl/renderer.h Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-sdl-js/renderer.h Wed Mar 27 20:08:20 2002 @@ -50,6 +50,8 @@ int (*InitDisplay)(int argc, char **argv); void (*UpdateDisplay)(void); void (*UpdateColors)(void); + void (*InitJoystick)(int stick); + void (*HandleJoystick)(int stick); }; /* the currently selected renderer */ diff -u --new-file --recursive tuxnes-0.75-sdl/sdl.c tuxnes-0.75-sdl-js/sdl.c --- tuxnes-0.75-sdl/sdl.c Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-sdl-js/sdl.c Sat Mar 30 15:56:56 2002 @@ -85,7 +85,7 @@ /* ============================ SaveScreenshotSDL () ======================= */ -static void SaveScreenshotSDL(void) +void SaveScreenshotSDL(void) { int status; /* make sure we don't over-write screenshots written by a concurrent TuxNES process */ @@ -116,7 +116,7 @@ } bpp = BPP; bytes_per_line = 256 * magstep * BPP / 8; - if (SDL_Init(SDL_INIT_VIDEO) < 0) { + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); exit(1); } @@ -128,7 +128,7 @@ SDL_GetError()); exit(1); } - SDL_WM_ToggleFullScreen(screen); + //SDL_WM_ToggleFullScreen(screen); rfb = fb = screen->pixels; for (i = 0; i < 64; i++) { unsigned char r, g, b; @@ -144,212 +144,12 @@ return 0; } -/* ============================ handle_key () ============================== */ -static void handle_key(SDL_KeyboardEvent * ev) -{ - if (ev->keysym.sym == SDLK_ESCAPE) - exit(0); - - /* the coin and dipswitch inputs work only in VS UniSystem mode */ - if (unisystem) - switch (ev->keysym.sym) { - case SDLK_LEFTBRACKET: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - coinslot ^= 1; - } else if (ev->type == SDL_KEYDOWN) - coinslot |= 1; - else - coinslot &= ~1; - break; - case SDLK_RIGHTBRACKET: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - coinslot ^= 2; - } else if (ev->type == SDL_KEYDOWN) - coinslot |= 2; - else - coinslot &= ~2; - break; - case SDLK_BACKSLASH: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - coinslot ^= 4; - } else if (ev->type == SDL_KEYDOWN) - coinslot |= 4; - else - coinslot &= ~4; - break; - case SDLK_q: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x01; - break; - case SDLK_w: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x02; - break; - case SDLK_e: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x04; - break; - case SDLK_r: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x08; - break; - case SDLK_t: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x10; - break; - case SDLK_y: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x20; - break; - case SDLK_u: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x40; - break; - case SDLK_i: - if (ev->type == SDL_KEYDOWN) - dipswitches ^= 0x80; - break; - default: - break; - } - - switch (ev->keysym.sym) { - /* controller 1 keyboard mapping */ - case SDLK_RETURN: - case SDLK_KP_ENTER: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= STARTBUTTON; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= STARTBUTTON; - else - controller[0] &= ~STARTBUTTON; - break; - case SDLK_TAB: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= SELECTBUTTON; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= SELECTBUTTON; - else - controller[0] &= ~SELECTBUTTON; - break; - case SDLK_UP: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= UP; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= UP; - else - controller[0] &= ~UP; - break; - case SDLK_DOWN: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= DOWN; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= DOWN; - else - controller[0] &= ~DOWN; - break; - case SDLK_LEFT: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= LEFT; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= LEFT; - else - controller[0] &= ~LEFT; - break; - case SDLK_RIGHT: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= RIGHT; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= RIGHT; - else - controller[0] &= ~RIGHT; - break; - case SDLK_HOME: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controllerd[0] ^= (UP | LEFT); - } else if (ev->type == SDL_KEYDOWN) - controllerd[0] |= (UP | LEFT); - else - controllerd[0] &= ~(UP | LEFT); - break; - case SDLK_PAGEUP: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controllerd[0] ^= (UP | RIGHT); - } else if (ev->type == SDL_KEYDOWN) - controllerd[0] |= (UP | RIGHT); - else - controllerd[0] &= ~(UP | RIGHT); - break; - case SDLK_END: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controllerd[0] ^= (DOWN | LEFT); - } else if (ev->type == SDL_KEYDOWN) - controllerd[0] |= (DOWN | LEFT); - else - controllerd[0] &= ~(DOWN | LEFT); - break; - case SDLK_PAGEDOWN: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controllerd[0] ^= (DOWN | RIGHT); - } else if (ev->type == SDL_KEYDOWN) - controllerd[0] |= (DOWN | RIGHT); - else - controllerd[0] &= ~(DOWN | RIGHT); - break; - case SDLK_z: - case SDLK_x: - case SDLK_d: - case SDLK_INSERT: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= BUTTONB; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= BUTTONB; - else - controller[0] &= ~BUTTONB; - break; - case SDLK_a: - case SDLK_c: - case SDLK_SPACE: - case SDLK_DELETE: - if (renderer_config.sticky_keys) { - if (ev->type == SDL_KEYDOWN) - controller[0] ^= BUTTONA; - } else if (ev->type == SDL_KEYDOWN) - controller[0] |= BUTTONA; - else - controller[0] &= ~BUTTONA; - break; - case SDLK_F7: - case SDLK_PRINT: - case SDLK_s: - SaveScreenshotSDL(); - break; - default: - break; - } -} - /* ============================ UpdateDisplaySDL () ======================== */ void UpdateDisplaySDL(void) { struct timeval time; unsigned static int frame; unsigned int timeframe; - SDL_Event event; /* FIXME: Write SDL audio handler */ UpdateAudio(); gettimeofday(&time, NULL); @@ -374,25 +174,6 @@ if (frame > timeframe + 1 && frameskip == 0) { usleep(16666 * (frame - timeframe - 1)); } - - /* FIXME: write SDL handler */ - if (jsfd[0] >= 0) - HandleJoystickLinux(0); - - if (jsfd[1] >= 0) - HandleJoystickLinux(1); - - while (SDL_PollEvent(&event)) { - switch (event.type) { - case SDL_KEYDOWN: - case SDL_KEYUP: - handle_key(&event.key); - break; - case SDL_QUIT: - exit(0); - } - } - gettimeofday(&time, NULL); timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ if (halfspeed) diff -u --new-file --recursive tuxnes-0.75-sdl/w.c tuxnes-0.75-sdl-js/w.c --- tuxnes-0.75-sdl/w.c Wed Apr 11 23:45:48 2001 +++ tuxnes-0.75-sdl-js/w.c Wed Mar 27 20:03:56 2002 @@ -45,7 +45,6 @@ void quit(void); void START(void); void fbinit(void); -void HandleJoystickLinux(int); #ifdef HAVE_W #include <Wlib.h> @@ -1082,16 +1081,6 @@ do { WEVENT *ev; - /* Handle joystick input */ - if (jsfd[0] >= 0) - { - HandleJoystickLinux(0); - } - if (jsfd[1] >= 0) - { - HandleJoystickLinux(1); - } - /* Handle W input */ while ((ev = w_queryevent (0, 0, 0, 0))) { switch (ev -> type) diff -u --new-file --recursive tuxnes-0.75-sdl/x11.c tuxnes-0.75-sdl-js/x11.c --- tuxnes-0.75-sdl/x11.c Wed Apr 11 23:45:48 2001 +++ tuxnes-0.75-sdl-js/x11.c Wed Mar 27 20:32:53 2002 @@ -37,15 +37,12 @@ #include <endian.h> #endif -#ifdef HAVE_LINUX_JOYSTICK_H -#include <linux/joystick.h> -#endif /* HAVE_LINUX_JOYSTICK_H */ - #include "consts.h" #include "globals.h" #include "mapper.h" #include "renderer.h" #include "sound.h" +#include "js.h" #ifdef HAVE_X @@ -122,9 +119,6 @@ unsigned char redrawall = 1; /* Redraw all scanlines */ unsigned char palette_cache[tilecachedepth][32]; -/* imports */ -void HandleJoystickLinux(int); - #ifdef HAVE_X /* exported functions */ @@ -841,85 +835,6 @@ fbinit (); return 0; } -#endif /* HAVE_X */ - -void -HandleJoystickLinux(int stick) -{ -#ifdef HAVE_LINUX_JOYSTICK_H - struct js_event js; - int nes_button; - int axis_i; - - while (read (jsfd[stick], &js, sizeof (struct js_event)) == - sizeof (struct js_event)) - { - /* verbose joystick reporting */ -/* if (verbose) */ -/* { */ -/* fprintf (stderr, "%s: type %d number %d value %d\n", */ -/* jsdevice[stick], js.type, js.number, js.value); */ -/* } */ - - switch (js.type) - { - case 1: /* button report */ - nes_button = js_nesmaps[stick].button[js.number]; - if( nes_button != PAUSEDISPLAY ) - { - if( js.value ) - controller[stick] |= nes_button; - else - controller[stick] &= ~nes_button; - } - else /* (nes_button == PAUSEDISPLAY) */ - if( js.value ) - { - renderer_data.pause_display = ! renderer_data.pause_display; - desync = 1; - } - break; - case 2: /* axis report */ - if (js.value < -JS_IGNORE) - { - js_axismeso[js.number] = js_nesmaps[stick].axis[js.number].neg; - controller[stick] &= ~js_nesmaps[stick].axis[js.number].pos; - } - else if (js.value > JS_IGNORE) - { - js_axismeso[js.number] = js_nesmaps[stick].axis[js.number].pos; - controller[stick] &= ~js_nesmaps[stick].axis[js.number].neg; - } - else - { - js_axismeso[js.number] = 0; - controller[stick] &= ~js_nesmaps[stick].axis[js.number].neg; - controller[stick] &= ~js_nesmaps[stick].axis[js.number].pos; - } - for( axis_i = JS_MAX_AXES; --axis_i >= 0; ) - controller[stick] |= js_axismeso[axis_i]; - break; - } - } - - if (errno != EAGAIN) - { - if (errno) - { - perror (jsdevice[stick]); - } - else - { - fprintf (stderr, "%s: device violates joystick protocol, disabling\n", - jsdevice[stick]); - close (jsfd[stick]); - jsfd[stick] = -1; - } - } -#endif /* HAVE_LINUX_JOYSTICK_H */ -} - -#ifdef HAVE_X void HandleKeyboardX11(XEvent ev) @@ -1588,16 +1503,6 @@ /* Input loop */ do { - /* Handle joystick input */ - if (jsfd[0] >= 0) - { - HandleJoystickLinux(0); - } - if (jsfd[1] >= 0) - { - HandleJoystickLinux(1); - } - /* Handle X input */ while (XPending (display) || ev.type == -1) { @@ -1782,16 +1687,6 @@ /* Input loop */ do { - /* Handle joystick input */ - if (jsfd[0] >= 0) - { - HandleJoystickLinux(0); - } - if (jsfd[1] >= 0) - { - HandleJoystickLinux(1); - } - /* Handle X input */ while (XPending (display) || ev.type == -1) { ================================================================================ -- Mike :wq |