Date: Fri, 30 Nov 2012 16:48:46 GMT From: Green Dog <fiziologus@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: ports/174017: [emulators/snes9x] Update to 1.53 Message-ID: <201211301648.qAUGmkIN076416@red.freebsd.org> Resent-Message-ID: <201211301650.qAUGo0v5001641@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 174017 >Category: ports >Synopsis: [emulators/snes9x] Update to 1.53 >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Fri Nov 30 16:50:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Green Dog >Release: FreeBSD-9.0 >Organization: >Environment: >Description: [emulators/snes9x] Update to 1.53 New MASTER_SITES Reorganited and refresh patch files OptionNG Minor change >How-To-Repeat: >Fix: Patch attached with submission follows: diff -ruN snes9x.orig/Makefile snes9x/Makefile --- snes9x.orig/Makefile 2012-11-17 09:57:23.000000000 +0400 +++ snes9x/Makefile 2012-11-30 18:40:57.000000000 +0400 @@ -6,40 +6,40 @@ # PORTNAME= snes9x -PORTVERSION= 1.51 -PORTREVISION= 4 +PORTVERSION= 1.53 CATEGORIES= emulators MASTER_SITES= http://files.ipherswipsite.com/snes9x/ \ - http://www.lysator.liu.se/snes9x/${PORTVERSION}/ + https://sites.google.com/site/bearoso/${PORTNAME}/ \ + http://www.s9x-w32.de/dl/ \ + http://snesemu.black-ship.net/emus/snes9x/ \ + http://camoy.sdf.org/mirror/snes9x/ \ + http://bigkidtennis.com/snes9x/ DISTNAME= ${PORTNAME}-${PORTVERSION}-src MAINTAINER= acm@FreeBSD.org COMMENT= Super Nintendo Entertainment System(SNES) Emulator -LIB_DEPENDS= png15:${PORTSDIR}/graphics/png - USE_BZIP2= yes USE_XORG= x11 sm ice xext USE_GMAKE= yes +# Force GCC (clang freeze in filters/hq2x.cpp) +USE_GCC= 4.2+ GNU_CONFIGURE= yes -CONFIGURE_ARGS+= --without-extensions CPPFLAGS+= -I${LOCALBASE}/include LDFLAGS+= -L${LOCALBASE}/lib -MAKE_ARGS= INCLUDES="-I${WRKSRC}/unzip -I${WRKSRC} -I${LOCALBASE}/include \ - ${PTHREAD_CFLAGS}" LDLIBS="-L${LOCALBASE}/lib ${PTHREAD_LIBS}" \ - OPTIMISE="${CXXFLAGS}" WRKSRC= ${WRKDIR}/${DISTNAME} +CONFIGURE_WRKSRC= ${WRKSRC}/unix +BUILD_WRKSRC= ${CONFIGURE_WRKSRC} -PLIST_FILES= bin/${PORTNAME} +PLIST_FILES= bin/${PORTNAME} etc/${PORTNAME}/snes9x.conf SUB_FILES= pkg-message -OPTIONS= DEBUG "Enable debug information" off \ - OPENGL "Enable OpenGL support" off \ - SCREENSHOT "Enable screenshot support" on \ - X86_ASM "Use i386 optimization (only for i386)" on \ - MMX "Enable MMX (only for i386)" off \ - JMA "Enable JMA archive decompression support" on \ - NETPLAY "Enable network support" on +OPTIONS_DEFINE= DEBUG SCREENSHOT JMA NETPLAY +OPTIONS_DEFAULT= SCREENSHOT JMA NETPLAY + +SCREENSHOT_DESC= Enable screenshot support +JMA_DESC= Enable screenshot support +NETPLAY_DESC= Enable network support .include <bsd.port.pre.mk> @@ -49,65 +49,45 @@ README .endif -.if defined(WITH_DEBUG) -CONFIGURE_ARGS+= --with-debug +.if ${PORT_OPTIONS:MDEBUG} +CONFIGURE_ARGS+= --enable-debug .else -CONFIGURE_ARGS+= --without-debug +CONFIGURE_ARGS+= --disable-debug .endif -.if ${ARCH} == "i386" -.if !defined(WITHOUT_X86_ASM) -BUILD_DEPENDS+= nasm:${PORTSDIR}/devel/nasm -CONFIGURE_ARGS+= --with-assembler -.else -CONFIGURE_ARGS+= --without-assembler -.endif - -.if defined(WITH_MMX) && !defined(PACKAGE_BUILDING) -CONFIGURE_ARGS+= --with-mmx -.else -CONFIGURE_ARGS+= --without-mmx -.endif -.endif - -.if defined(WITH_OPENGL) -USE_GL= yes -CONFIGURE_ARGS+= --with-opengl -SNES9X_BIN= osnes9x -.else -SNES9X_BIN= snes9x -.endif - -.if !defined(WITHOUT_SCREENSHOT) +.if ${PORT_OPTIONS:MSCREENSHOT} LIB_DEPENDS+= png15:${PORTSDIR}/graphics/png -CONFIGURE_ARGS+= --with-screenshot +CONFIGURE_ARGS+= --enable-screenshot .else -CONFIGURE_ARGS+= --without-screenshot +CONFIGURE_ARGS+= --disable-screenshot .endif -.if !defined(WITHOUT_JMA) -CONFIGURE_ARGS+= --with-jma-decomp +.if ${PORT_OPTIONS:MJMA} +CONFIGURE_ARGS+= --enable-jma .else -CONFIGURE_ARGS+= --without-jma-decomp +CONFIGURE_ARGS+= --disable-jma .endif -.if !defined(WITHOUT_NETPLAY) -CONFIGURE_ARGS+= --with-netplay +.if ${PORT_OPTIONS:MNETPLAY} +CONFIGURE_ARGS+= --enable-netplay .else -CONFIGURE_ARGS+= --without-netplay +CONFIGURE_ARGS+= --disable-netplay .endif .if exists(/usr/lib/libusbhid.a) -CONFIGURE_ARGS+= --with-joystick +CONFIGURE_ARGS+= --enable-gamepad .else -CONFIGURE_ARGS+= --without-joystick +CONFIGURE_ARGS+= --disable-gamepad .endif post-patch: - @${REINPLACE_CMD} -i "" -e 's|Pitch2|Pitch|g' ${WRKSRC}/unix/opengl.cpp + ${REINPLACE_CMD} -e "s|linux|freebsd|g" \ + -e "s|lpng|lpng15|g" ${WRKSRC}/unix/configure + ${REINPLACE_CMD} -e 's|-DMITSHM||' ${WRKSRC}/unix/Makefile.in + ${REINPLACE_CMD} -e "s|%%PREFIX%%|${PREFIX}|" ${WRKSRC}/port.h do-install: -.if !defined(NOPORTDOCS) +.if ${PORT_OPTIONS:MDOCS} ${MKDIR} ${DOCSDIR} .for FILE in control* changes.txt hardware.txt porting.html faqs.txt \ snapshots.txt snes9x.conf.default @@ -115,7 +95,9 @@ .endfor ${INSTALL_DATA} ${WRKSRC}/unix/docs/readme_unix.txt ${DOCSDIR}/README .endif - ${INSTALL_PROGRAM} ${WRKSRC}/${SNES9X_BIN} ${PREFIX}/bin/${PORTNAME} + ${INSTALL_PROGRAM} ${BUILD_WRKSRC}/snes9x ${PREFIX}/bin/${PORTNAME} + ${MKDIR} ${PREFIX}/etc/${PORTNAME} + ${INSTALL_PROGRAM} ${WRKSRC}/doc/snes9x.conf.default ${PREFIX}/etc/${PORTNAME}/snes9x.conf post-install: @${CAT} ${PKGMESSAGE} diff -ruN snes9x.orig/distinfo snes9x/distinfo --- snes9x.orig/distinfo 2011-07-02 21:14:16.000000000 +0400 +++ snes9x/distinfo 2012-11-29 21:43:04.000000000 +0400 @@ -1,2 +1,2 @@ -SHA256 (snes9x-1.51-src.tar.bz2) = 70c8f41fc7f1e000605127e0f4261e3eb52c72019b3cbf9bc8061b0b8ccdf687 -SIZE (snes9x-1.51-src.tar.bz2) = 1707256 +SHA256 (snes9x-1.53-src.tar.bz2) = 9f7c5d2d0fa3fe753611cf94e8879b73b8bb3c0eab97cdbcb6ab7376efa78dc3 +SIZE (snes9x-1.53-src.tar.bz2) = 1838746 diff -ruN snes9x.orig/files/patch-2XSAI.CPP snes9x/files/patch-2XSAI.CPP --- snes9x.orig/files/patch-2XSAI.CPP 2004-05-30 03:59:56.000000000 +0400 +++ snes9x/files/patch-2XSAI.CPP 1970-01-01 03:00:00.000000000 +0300 @@ -1,12 +0,0 @@ ---- 2xsai.cpp.orig Fri Dec 5 02:03:08 2003 -+++ 2xsai.cpp Sun Jan 25 01:41:08 2004 -@@ -81,7 +81,8 @@ - #include "port.h" - #include "gfx.h" - --#if (defined(USE_X86_ASM) && (defined (__i386__) || defined (__i486__) || \ -+#if (defined(USE_X86_ASM) && defined(ASMKREED) && \ -+ (defined (__i386__) || defined (__i486__) || \ - defined (__i586__) || defined (__WIN32__) || defined (__DJGPP))) - # ifndef MMX - # define MMX diff -ruN snes9x.orig/files/patch-3d.h snes9x/files/patch-3d.h --- snes9x.orig/files/patch-3d.h 2003-10-20 08:20:31.000000000 +0400 +++ snes9x/files/patch-3d.h 1970-01-01 03:00:00.000000000 +0300 @@ -1,11 +0,0 @@ ---- 3d.h.orig Wed Aug 13 06:27:16 2003 -+++ 3d.h Fri Sep 12 00:05:49 2003 -@@ -80,7 +80,7 @@ - #include <GL/gl.h> - #include <GL/glu.h> - --#ifdef __linux__ -+#if defined(__linux__) || defined(__FreeBSD__) - #include <GL/glx.h> - #endif - diff -ruN snes9x.orig/files/patch-Makefile.in snes9x/files/patch-Makefile.in --- snes9x.orig/files/patch-Makefile.in 2006-12-27 20:27:37.000000000 +0300 +++ snes9x/files/patch-Makefile.in 1970-01-01 03:00:00.000000000 +0300 @@ -1,19 +0,0 @@ ---- Makefile.in Tue Dec 26 16:46:56 2006 -+++ Makefile.in Tue Dec 26 16:49:20 2006 -@@ -138,7 +138,6 @@ - - ifdef THREAD_SOUND - CPUDEFINES += -DUSE_THREADS --EXTRALIBS += -lpthread - endif - - ifdef GLIDE -@@ -150,7 +149,7 @@ - ifdef OPENGL - OPENGLOBJS = unix/opengl.o - OPENGLDEFINES = -DUSE_OPENGL --OPENGLLIBS = -lGL -lGLU -ldl -+OPENGLLIBS = -lGL -lGLU - endif - - ifdef AIDO diff -ruN snes9x.orig/files/patch-ad snes9x/files/patch-ad --- snes9x.orig/files/patch-ad 2007-10-04 09:43:03.000000000 +0400 +++ snes9x/files/patch-ad 1970-01-01 03:00:00.000000000 +0300 @@ -1,29 +0,0 @@ ---- memmap.cpp 2007-10-03 11:11:07.000000000 -0500 -+++ memmap.cpp 2007-10-03 11:11:34.000000000 -0500 -@@ -169,7 +169,7 @@ - #include <ctype.h> - #include <assert.h> - --#ifdef __linux -+#if defined(__linux) || defined(__FreeBSD__) - #include <unistd.h> - #endif - -@@ -1473,7 +1473,7 @@ - { - fwrite((char *) Multi.sramB, size, 1, file); - fclose(file); --#ifdef __linux -+#if defined(__linux) || defined(__FreeBSD__) - chown(name, getuid(), getgid()); - #endif - } -@@ -1502,7 +1502,7 @@ - { - fwrite((char *) SRAM, size, 1, file); - fclose(file); --#ifdef __linux -+#if defined(__linux) || defined(__FreeBSD__) - chown(sramName, getuid(), getgid()); - #endif - if (Settings.SPC7110RTC) diff -ruN snes9x.orig/files/patch-ae snes9x/files/patch-ae --- snes9x.orig/files/patch-ae 2006-12-27 20:27:37.000000000 +0300 +++ snes9x/files/patch-ae 1970-01-01 03:00:00.000000000 +0300 @@ -1,13 +0,0 @@ ---- port.h.orig Fri Jun 30 08:40:56 2006 -+++ port.h Tue Dec 26 23:09:22 2006 -@@ -360,6 +360,10 @@ - #define SYS_CONFIG_FILE "/etc/snes9x/snes9x.conf" - #endif - -+#ifdef __FreeBSD__ -+#define TITLE "Snes9X: FreeBSD" -+#endif -+ - #ifndef TITLE - #define TITLE "Snes9x" - #endif diff -ruN snes9x.orig/files/patch-af snes9x/files/patch-af --- snes9x.orig/files/patch-af 2007-10-04 09:43:03.000000000 +0400 +++ snes9x/files/patch-af 1970-01-01 03:00:00.000000000 +0300 @@ -1,455 +0,0 @@ ---- unix/unix.cpp 2007-04-28 19:51:08.000000000 -0500 -+++ unix/unix.cpp 2007-10-03 16:53:16.000000000 -0500 -@@ -173,7 +173,7 @@ - #include <fcntl.h> - #include <sys/time.h> - /* FIXME: Linux alpha (aristocat) has a broken timercmp. Make testcase */ --#if defined(__linux) -+#if defined(__linux) || defined(__FreeBSD__) - # ifndef timercmp - # define timercmp(tvp, uvp, cmp)\ - ((tvp)->tv_sec cmp (uvp)->tv_sec ||\ -@@ -197,7 +197,7 @@ - pthread_mutex_t mutex; - #endif - --#if !defined(NOSOUND) && defined(__linux) -+#if !defined(NOSOUND) && (defined(__linux) || defined(__FreeBSD__)) - #include <sys/soundcard.h> - #include <sys/mman.h> - #endif -@@ -210,6 +210,11 @@ - #endif - #endif - -+#if defined(__FreeBSD__) -+typedef sig_t SIG_PF; -+#include <err.h> -+#endif -+ - //Breaks sol9 and probably others. - //#if defined(__sun) && defined(__GNUC__) - //typedef void (*SIG_PF)(); -@@ -233,11 +238,12 @@ - - #ifdef NETPLAY_SUPPORT - #include "netplay.h" -- - #ifdef _DEBUG - #define NP_DEBUG 2 - #endif -+#endif - -+#if defined(NETPLAY_SUPPORT) || defined(JOYSTICK_SUPPORT) - /* accessors into controls.cpp static variables */ - uint16 MovieGetJoypad(int i); - void MovieSetJoypad(int i, uint16 buttons); -@@ -245,22 +251,86 @@ - /* Joypads status information */ - uint32 old_joypads[8]; - uint32 joypads[8]; -- - #endif - - #ifdef JOYSTICK_SUPPORT -+#define JOYSTICK_MAX_DEVICES 4 -+int JoystickShift = 0; -+uint8 js_mod [8] = {0, 0, 0, 0, 0, 0, 0, 0}; - #if defined(__linux) -+#define JOYSTICK_MAX_BUTTONS 4 - #include <linux/joystick.h> --uint8 js_mod [8] = {0, 0, 0, 0, 0, 0, 0, 0}; - int js_fd [8] = {-1, -1, -1, -1, -1, -1, -1, -1}; - char *js_device [8] = {"/dev/js0", "/dev/js1", "/dev/js2", "/dev/js3", "/dev/js4", "/dev/js5", "/dev/js6", "/dev/js7" }; - #endif - -+#if defined(__FreeBSD__) -+#include <sys/types.h> -+#include <sys/param.h> -+ -+extern "C" { -+#define class klass -+#include <dev/usb/usb.h> -+#include <dev/usb/usbhid.h> -+#undef class -+ -+#if __FreeBSD_version < 500111 -+#include <libusbhid.h> -+#else -+#include <usbhid.h> -+#endif -+} -+ -+#define JOYSTICK_MAX_BUTTONS 16 -+ -+#define JOYSTICK_MAP_BUTTON_INITIALIZER \ -+ { \ -+ SNES_Y_MASK, SNES_B_MASK, SNES_A_MASK, \ -+ SNES_X_MASK, SNES_TL_MASK, SNES_TR_MASK, \ -+ SNES_TL_MASK, SNES_TR_MASK, \ -+ SNES_SELECT_MASK, SNES_START_MASK, 0, 0, 0, 0, 0, 0 \ -+ } -+ -+int js_map_button[JOYSTICK_MAX_BUTTONS][16] = { -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER, -+ JOYSTICK_MAP_BUTTON_INITIALIZER -+}; -+char *js_device [4] = {"/dev/uhid0", "/dev/uhid1", "/dev/uhid2", "/dev/uhid3"}; -+struct js_range { -+ int min, max, lower_third, higher_third; -+}; -+struct js_info { -+ char *buf; -+ int reportlen; -+ int offset; -+ struct js_range x, y; -+ int buttons; -+ struct hid_item *hids; -+ int fd; -+ int joy; -+} js_info[4]; -+int js_count = 0; -+#endif -+ - void InitJoysticks (); - void ReadJoysticks (); - #endif - --#if !defined(NOSOUND) && defined (__linux) -+#if !defined(NOSOUND) && (defined (__linux) || defined(__FreeBSD__)) - #define CONFIGURABLE_SOUND_DEVICE - char *sound_device = "/dev/dsp"; - #endif -@@ -285,7 +355,7 @@ - const char *inc_format="%03d"; - - //FIXME: I see no reason not to configureenable this for all Unixen --#if defined(DEBUGGER) && (defined(__linux) || defined(__sun)) -+#if defined(DEBUGGER) && (defined(__linux) || defined(__sun) || defined(__FreeBSD__)) - static void sigbrkhandler(int) - { - CPU.Flags |= DEBUG_MODE_FLAG; -@@ -326,22 +396,54 @@ - - void S9xParseArg (char **argv, int &i, int argc) - { -+#ifdef JOYSTICK_SUPPORT - if (strcmp (argv [i], "-j") == 0 || - strcasecmp (argv [i], "-nojoy") == 0) { --#ifdef JOYSTICK_SUPPORT - Settings.JoystickEnabled = FALSE; -+ } -+ -+#ifdef __FreeBSD__ -+ else if (strcasecmp(argv[i], "-joyshift") == 0) -+ JoystickShift = 1; -+#endif -+ else if (strncasecmp(argv[i], "-joydev", sizeof("-joydev") - 1) == 0) { -+ char *end, *snum = argv[i] + sizeof("-joydev") - 1; -+ unsigned long num; -+ -+ if (*snum == '\0' || argc < i + 1) -+ S9xUsage(); -+ if ((num = strtoul(snum, &end, 10)) < JOYSTICK_MAX_DEVICES && -+ num > 0 && *end == '\0') -+ js_device[num - 1] = argv[++i]; -+ else -+ S9xUsage (); -+ } -+ else if (strncasecmp(argv[i], "-joymap", sizeof("-joymap") - 1) == 0) { -+ static const int button_masks[] = { -+ SNES_A_MASK, SNES_B_MASK, SNES_X_MASK, SNES_Y_MASK, -+ SNES_TL_MASK, SNES_TR_MASK, SNES_START_MASK, SNES_SELECT_MASK -+ }; -+ char *end, *snum = argv[i] + sizeof("-joymap") - 1; -+ unsigned long num; -+ int *js_buttons, b; -+ -+ if (argc < i + (sizeof(button_masks) / sizeof(int)) || *snum == '\0') -+ S9xUsage(); -+ num = strtoul(snum, &end, 10); -+ if (*end != '\0') -+ S9xUsage(); -+ if (num == 0 || num > 4) /* hardcode: max joysticks */ -+ S9xUsage(); -+ js_buttons = js_map_button[num - 1]; -+ for (b = 0; b < (sizeof(button_masks) / sizeof(int)); b++) -+ if ((num = strtoul(argv[++i], &end, 10)) <= 16 && num != 0 && -+ *end == '\0') -+ js_buttons[num - 1] = button_masks[b]; -+ } -+ -+ else - #endif -- } else if (strncasecmp (argv [i], "-joydev", 7) == 0 && argv[i][7]>='1' && argv[i][7]<='8' && argv[i][8]=='\0') -- { -- int j = argv[i][7]-'1'; -- if (i + 1 < argc) { --#ifdef JOYSTICK_SUPPORT -- js_device[j] = argv[++i]; --#else -- S9xMessage(S9X_WARNING, S9X_USAGE, "Joystick support is not available!"); --#endif -- } else S9xUsage (); -- } else if (strcasecmp (argv [i], "-sounddev") == 0) { -+ if (strcasecmp (argv [i], "-sounddev") == 0) { - if (i + 1 < argc) { - #if defined(CONFIGURABLE_SOUND_DEVICE) - sound_device = argv[++i]; -@@ -552,7 +654,7 @@ - #if !defined(__MSDOS) && defined(DEBUGGER) - #if defined(__unix) && !defined(__NeXT__) - struct sigaction sa; --#if defined(__linux) -+#if defined(__linux) || defined(__FreeBSD__) - sa.sa_handler = sigbrkhandler; - #else - sa.sa_handler = (SIG_PF) sigbrkhandler; -@@ -770,6 +872,7 @@ - } - - #ifdef JOYSTICK_SUPPORT -+#ifdef __linux - void InitJoysticks () - { - #ifdef JSIOCGVERSION -@@ -854,6 +957,189 @@ - } - #endif - } -+#endif -+#if defined(__FreeBSD__) -+ -+/* -+ * USB HID code for FreeBSD/NetBSD -+ * Brian Feldman <green@FreeBSD.org> -+ * -+ * Reference used: -+ * X-Mame USB HID joystick driver for NetBSD. -+ * -+ * Written by Krister Walfridsson <cato@df.lth.se> -+ */ -+ -+int -+InitJoystickFd(int fd, char *dev) { -+ report_desc_t rd; -+ struct hid_data *d; -+ struct hid_item h, new_h; -+ struct js_info *my_info; -+ int reportlen, report_id, is_joystick; -+ -+ my_info = &js_info[js_count]; -+ rd = hid_get_report_desc(fd); -+ if (rd == 0) { -+ warn("%s", dev); -+ return (-1); -+ } -+ report_id = 0; -+#if __FreeBSD_version < 500111 -+ reportlen = hid_report_size(rd, report_id, hid_input); -+#else -+ reportlen = hid_report_size(rd, hid_input, report_id); -+#endif -+ my_info->buf = (char *)malloc(reportlen); -+ if (my_info->buf == NULL) -+ err(1, "malloc"); -+ my_info->reportlen = reportlen; -+ my_info->offset = report_id != 0; -+ my_info->buttons = 0; -+ my_info->hids = NULL; -+ -+ is_joystick = 0; -+#if __FreeBSD_version < 500111 -+ for (d = hid_start_parse(rd, 1 << hid_input); -+#else -+ for (d = hid_start_parse(rd, 1 << hid_input, report_id); -+#endif -+ hid_get_item(d, &h);) { -+ int usage, page, link_it = 0; -+ struct js_range *axis; -+ -+ page = HID_PAGE(h.usage); -+ usage = HID_USAGE(h.usage); -+ if (!is_joystick) -+ is_joystick = (h.kind == hid_collection && -+ page == HUP_GENERIC_DESKTOP && -+ (usage == HUG_JOYSTICK || usage == HUG_GAME_PAD)); -+ if (h.kind != hid_input || !is_joystick) -+ continue; -+ axis = NULL; -+ if (page == HUP_GENERIC_DESKTOP) { -+ switch (usage) { -+ case HUG_X: -+ case HUG_RX: -+ axis = &my_info->x; -+ break; -+ case HUG_Y: -+ case HUG_RY: -+ axis = &my_info->y; -+ break; -+ } -+ } -+ if (axis != NULL) { -+ axis->min = h.logical_minimum; -+ axis->max = h.logical_maximum; -+ axis->lower_third = axis->min + -+ (axis->max - axis->min) / 3; -+ axis->higher_third = axis->min + -+ (axis->max - axis->min) * 2 / 3; -+ link_it = 1; -+ } -+ if (!link_it) { -+ if (page != HUP_BUTTON || usage > 16) -+ continue; -+ if (usage > my_info->buttons) -+ my_info->buttons = usage; -+ } -+ new_h = h; -+ new_h.next = my_info->hids; -+ my_info->hids = (struct hid_item *) -+ malloc(sizeof(*my_info->hids)); -+ if (my_info->hids == NULL) -+ err(1, "malloc"); -+ *my_info->hids = new_h; -+ } -+ printf("Joystick %s: %d buttons, X range %d - %d, Y range %d - %d\n", -+ dev, my_info->buttons, my_info->x.min, my_info->x.max, -+ my_info->y.min, my_info->y.max); -+ my_info->fd = fd; -+ if (JoystickShift) { -+ my_info->joy = js_count + 1; -+ } else -+ my_info->joy = js_count; -+ return (0); -+} -+ -+void -+InitJoysticks() { -+ int i, fd; -+ -+ for (i = 0; i < (sizeof(js_device) / sizeof(js_device[0])); i++) { -+ fd = open(js_device[i], O_RDONLY | O_NONBLOCK); -+ if (fd == -1) -+ continue; -+ if (InitJoystickFd(fd, js_device[i]) == 0) -+ js_count++; -+ else -+ close(fd); -+ } -+} -+ -+void -+ReadJoysticks() { -+ struct hid_item *h; -+ int page, usage, njoy, joy; -+ -+ for (njoy = 0; njoy < js_count; njoy++) { -+ struct js_info *jsi; -+ -+ jsi = &js_info[njoy]; -+ joy = jsi->joy; -+ -+ if (read(jsi->fd, jsi->buf, jsi->reportlen) != jsi->reportlen) -+ continue; -+ for (h = jsi->hids; h != NULL; h = h->next) { -+ int d; -+ -+ d = hid_get_data(jsi->buf + jsi->offset, h); -+ page = HID_PAGE(h->usage); -+ usage = HID_USAGE(h->usage); -+ -+ switch (page) { -+ case HUP_GENERIC_DESKTOP: -+ switch (usage) { -+ case HUG_X: -+ case HUG_RX: -+ if (d < jsi->x.lower_third) { -+ joypads[joy] |= SNES_LEFT_MASK; -+ joypads[joy] &= ~SNES_RIGHT_MASK; -+ } else if (d < jsi->x.higher_third) { -+ joypads[joy] &= ~SNES_LEFT_MASK; -+ joypads[joy] &= ~SNES_RIGHT_MASK; -+ } else { -+ joypads[joy] &= ~SNES_LEFT_MASK; -+ joypads[joy] |= SNES_RIGHT_MASK; -+ } -+ break; -+ case HUG_Y: -+ case HUG_RY: -+ if (d < jsi->y.lower_third) { -+ joypads[joy] |= SNES_UP_MASK; -+ joypads[joy] &= ~SNES_DOWN_MASK; -+ } else if (d < jsi->y.higher_third) { -+ joypads[joy] &= ~SNES_UP_MASK; -+ joypads[joy] &= ~SNES_DOWN_MASK; -+ } else { -+ joypads[joy] &= ~SNES_UP_MASK; -+ joypads[joy] |= SNES_DOWN_MASK; -+ } -+ break; -+ } -+ break; -+ case HUP_BUTTON: -+ if (d) -+ joypads[joy] |= js_map_button[njoy][usage - 1]; -+ else -+ joypads[joy] &= ~js_map_button[njoy][usage - 1]; -+ break; -+ } -+ } -+ } -+} -+#endif // defined(__FreeBSD__) - #endif // defined (JOYSTICK_SUPPORT) - - START_EXTERN_C -@@ -1716,7 +2002,7 @@ - } - #endif - --#if !defined(NOSOUND) && defined(__linux) -+#if !defined(NOSOUND) && (defined(__linux) || defined(__FreeBSD__)) - static int Rates[8] = - { - 0, 8000, 11025, 16000, 22050, 32000, 44100, 48000 -@@ -1847,7 +2133,7 @@ - #endif - - --#if !defined(NOSOUND) && (defined (__linux) || defined (__sun)) -+#if !defined(NOSOUND) && (defined (__linux) || defined (__sun) || defined(__FreeBSD__)) - void S9xUnixProcessSound (void) - { - } -@@ -1890,7 +2176,7 @@ - } - #endif - --#if !defined(NOSOUND) && (defined (__linux) || defined (__sun)) -+#if !defined(NOSOUND) && (defined (__linux) || defined (__sun) || defined(__FreeBSD__)) - void S9xGenerateSound () - { - /* Linux and Sun versions */ -@@ -1985,7 +2271,7 @@ - /* If not, this will be called by timer */ - if (Settings.Mute) - return NULL; --#ifdef __linux -+#if defined(__linux) || defined(__FreeBSD__) - audio_buf_info info; - - if (!Settings.ThreadSound && diff -ruN snes9x.orig/files/patch-ag snes9x/files/patch-ag --- snes9x.orig/files/patch-ag 1999-12-29 10:12:58.000000000 +0300 +++ snes9x/files/patch-ag 1970-01-01 03:00:00.000000000 +0300 @@ -1,32 +0,0 @@ -diff -ru ../../work/release/unix/xf86.cpp ./unix/xf86.cpp ---- ../../work/release/unix/xf86.cpp Tue Sep 22 06:36:50 1998 -+++ ./unix/xf86.cpp Wed Dec 29 01:54:04 1999 -@@ -4,16 +4,20 @@ - Question/comments regarding this file only: maciej@imsa.edu - */ - --#ifdef __linux -+#if defined(__linux) || defined(__FreeBSD__) - //#define USE_XF86VIDMODE - -+#ifdef __linux - #include <asm/ioctls.h> -+#endif -+#include <sys/types.h> - #include <sys/ioctl.h> - #include <sys/time.h> -+#ifdef __linux - #include <linux/ioctl.h> -+#endif - - #include <fcntl.h> --#include <sys/types.h> - - #include <string.h> - #include <ctype.h> -@@ -833,4 +837,4 @@ - ret = 1; - return (ret); - } --#endif /* __linux */ -+#endif /* __linux || __FreeBSD__ */ diff -ruN snes9x.orig/files/patch-ah snes9x/files/patch-ah --- snes9x.orig/files/patch-ah 2007-10-04 09:43:04.000000000 +0400 +++ snes9x/files/patch-ah 1970-01-01 03:00:00.000000000 +0300 @@ -1,24 +0,0 @@ ---- unzip/unzip.h 2007-10-03 12:28:47.000000000 -0500 -+++ unzip/unzip.h 2007-10-03 12:30:22.000000000 -0500 -@@ -41,14 +41,18 @@ - #ifndef _unz_H - #define _unz_H - --#ifdef __cplusplus --extern "C" { --#endif -+#include <sys/types.h> - - #ifndef _ZLIB_H - #include <zlib.h> - #endif - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define ZEXPORT -+ - #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) - /* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ diff -ruN snes9x.orig/files/patch-configure snes9x/files/patch-configure --- snes9x.orig/files/patch-configure 2007-10-04 09:43:04.000000000 +0400 +++ snes9x/files/patch-configure 1970-01-01 03:00:00.000000000 +0300 @@ -1,124 +0,0 @@ ---- configure.orig 2007-04-29 16:03:52.000000000 -0500 -+++ configure 2007-10-03 14:33:44.000000000 -0500 -@@ -860,6 +860,7 @@ - --with(out)-opengl Use OpenGL for output (default: without) - --with(out)-aido Use a shared memory area for output (default: without) - --with(out)-assembler Use assembler cores if available (default: with) -+ --with(out)-mmx Use assembler cores if available (default: with) - --with(out)-zsnesc4 Use ZSNES C4 core if available (default: same as --with-assembler) - --with(out)-zsnesfx Use ZSNES SuperFX core if available (default: same as --with-assembler) - --with(out)-correct-vram-reads Use Correct VRAM read logic (default: with) -@@ -5873,7 +5874,9 @@ - ZSNESFX='#ZSNESFX=1' - ZSNESC4='#ZSNESC4=1' - ASMCPU='' -+if test yes = "$with_mmx"; then - ASMKREED='#ASMKREED=1' -+fi - SDD1_DECOMP='#SDD1_DECOMP=1' - JMA='#JMA=1' - SPC700ASM='' -@@ -5995,6 +5998,60 @@ - echo "$as_me:$LINENO: result: $snes9x_cv_i386_cpu" >&5 - echo "${ECHO_T}$snes9x_cv_i386_cpu" >&6 - -+echo "$as_me:$LINENO: checking if the OS is FreeBSD" >&5 -+echo $ECHO_N "checking if the OS is FreeBSD... $ECHO_C" >&6 -+if test "${snes9x_cv_freebsd_os+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ -+ cat >conftest.$ac_ext <<_ACEOF -+#line 3885 "configure" -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+#ifdef __FreeBSD__ -+/* */ -+#else -+#error Not FreeBSD. -+#endif -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ snes9x_cv_freebsd_os=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+snes9x_cv_freebsd_os=no -+fi -+rm -f conftest.$ac_objext conftest.$ac_ext -+fi -+ -+echo "$as_me:$LINENO: result: $snes9x_cv_freebsd_os" >&5 -+echo "${ECHO_T}$snes9x_cv_freebsd_os" >&6 -+ -+ - echo "$as_me:$LINENO: checking if the OS is Linux" >&5 - echo $ECHO_N "checking if the OS is Linux... $ECHO_C" >&6 - if test "${snes9x_cv_linux_os+set}" = set; then -@@ -6365,7 +6422,10 @@ - with_joystick=yes - fi; - --if test yes = "$snes9x_cv_linux_os" -a yes = "$with_joystick"; then -+if test yes = "$snes9x_cv_freebsd_os" -a yes = "$with_joystick"; then -+ JOYDEFINES=' -DJOYSTICK_SUPPORT' -+ SYSLIBS="$SYSLIBS"' -lusbhid' -+elif test yes = "$snes9x_cv_linux_os" -a yes = "$with_joystick"; then - JOYDEFINES=' -DJOYSTICK_SUPPORT' - else - with_joystick="no" -@@ -6396,6 +6456,13 @@ - CPUINC='-Ish' - fi - -+# Check whether --with-mmx or --without-mmx was given. -+if test "${with_mmx+set}" = set -a yes = "$with_assembler"; then -+ withval="$with_mmx" -+ -+else -+ with_mmx=no -+fi; - - # Check whether --with-sdd1-decomp or --without-sdd1-decomp was given. - if test "${with_sdd1_decomp+set}" = set; then -@@ -9758,7 +9825,7 @@ - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - --#if defined(__linux) || defined(__sun) || defined(__sgi) -+#if defined(__linux) || defined(__sun) || defined(__sgi) || defined(__FreeBSD__) - /* */ - #else - #error No sound for this platform -@@ -10013,6 +10080,7 @@ - sound support....... $snes9x_cv_sound - display system...... $snes9x_info_display - joystick support.... $with_joystick -+using mmx code.... $with_mmx - netplay support..... $with_netplay - SDD1 decompression.. $with_sdd1_decomp - JMA decompression... $with_jma_decomp diff -ruN snes9x.orig/files/patch-memmap.cpp snes9x/files/patch-memmap.cpp --- snes9x.orig/files/patch-memmap.cpp 1970-01-01 03:00:00.000000000 +0300 +++ snes9x/files/patch-memmap.cpp 2012-11-30 01:48:45.000000000 +0400 @@ -0,0 +1,20 @@ +--- memmap.cpp.orig 2011-04-24 17:38:10.000000000 +0400 ++++ memmap.cpp 2012-11-30 01:47:27.000000000 +0400 +@@ -2069,7 +2069,7 @@ + size_t ignore; + ignore = fwrite((char *) Multi.sramB, size, 1, file); + fclose(file); +- #ifdef __linux ++ #ifdef __FreeBSD__ + ignore = chown(name, getuid(), getgid()); + #endif + } +@@ -2089,7 +2089,7 @@ + size_t ignore; + ignore = fwrite((char *) SRAM, size, 1, file); + fclose(file); +- #ifdef __linux ++ #ifdef __FreeBSD__ + ignore = chown(sramName, getuid(), getgid()); + #endif + diff -ruN snes9x.orig/files/patch-port.h snes9x/files/patch-port.h --- snes9x.orig/files/patch-port.h 1970-01-01 03:00:00.000000000 +0300 +++ snes9x/files/patch-port.h 2012-11-30 02:27:13.000000000 +0400 @@ -0,0 +1,14 @@ +--- port.h.orig 2011-04-24 17:38:10.000000000 +0400 ++++ port.h 2012-11-30 02:26:23.000000000 +0400 +@@ -327,6 +327,11 @@ + #define SYS_CONFIG_FILE "/etc/snes9x/snes9x.conf" + #endif + ++#ifdef __FreeBSD__ ++#define TITLE "Snes9x: FreeBSD" ++#define SYS_CONFIG_FILE "%%PREFIX%%/etc/snes9x/snes9x.conf" ++#endif ++ + #ifndef TITLE + #define TITLE "Snes9x" + #endif diff -ruN snes9x.orig/files/patch-snes9x.cpp snes9x/files/patch-snes9x.cpp --- snes9x.orig/files/patch-snes9x.cpp 1970-01-01 03:00:00.000000000 +0300 +++ snes9x/files/patch-snes9x.cpp 2012-11-30 03:11:51.000000000 +0400 @@ -0,0 +1,31 @@ +--- snes9x.cpp.orig 2011-04-24 17:38:10.000000000 +0400 ++++ snes9x.cpp 2012-11-30 02:51:24.000000000 +0400 +@@ -199,6 +199,7 @@ + #endif + + #define S9X_CONF_FILE_NAME "snes9x.conf" ++#define S9X_CONF_FILE_LOC ".config/snes9x" + + static char *rom_filename = NULL; + +@@ -346,13 +347,18 @@ + + if (!skip) + { ++ std::string fname; ++ ++ fname = S9xGetDirectory(HOME_DIR); ++ fname += SLASH_STR S9X_CONF_FILE_LOC; ++ fname += SLASH_STR S9X_CONF_FILE_NAME; ++ try_load_config_file(fname.c_str(), conf); ++ + #ifdef SYS_CONFIG_FILE + try_load_config_file(SYS_CONFIG_FILE, conf); + S9xParsePortConfig(conf, 0); + #endif + +- std::string fname; +- + fname = S9xGetDirectory(DEFAULT_DIR); + fname += SLASH_STR S9X_CONF_FILE_NAME; + try_load_config_file(fname.c_str(), conf); diff -ruN snes9x.orig/files/patch-unix-configure snes9x/files/patch-unix-configure --- snes9x.orig/files/patch-unix-configure 1970-01-01 03:00:00.000000000 +0300 +++ snes9x/files/patch-unix-configure 2012-11-30 04:25:48.000000000 +0400 @@ -0,0 +1,10 @@ +--- unix/configure.orig 2011-04-24 17:38:10.000000000 +0400 ++++ unix/configure 2012-11-30 04:12:07.000000000 +0400 +@@ -4520,6 +4520,7 @@ + if test "x$enable_gamepad" = "xyes"; then + if test "x$snes9x_cv_linux_os" = "xyes"; then + S9XDEFS="$S9XDEFS -DJOYSTICK_SUPPORT" ++ S9XLIBS="$S9XLIBS -lusbhid" + else + { echo "$as_me:$LINENO: WARNING: Your OS is not Linux. Build without gamepad support." >&5 + echo "$as_me: WARNING: Your OS is not Linux. Build without gamepad support." >&2;} diff -ruN snes9x.orig/files/patch-unix-unix.cpp snes9x/files/patch-unix-unix.cpp --- snes9x.orig/files/patch-unix-unix.cpp 1970-01-01 03:00:00.000000000 +0300 +++ snes9x/files/patch-unix-unix.cpp 2012-11-30 03:36:13.000000000 +0400 @@ -0,0 +1,331 @@ +--- unix/unix.cpp.orig 2011-04-24 17:38:10.000000000 +0400 ++++ unix/unix.cpp 2012-11-30 03:24:29.000000000 +0400 +@@ -202,7 +202,12 @@ + #include <sys/mman.h> + #endif + #ifdef JOYSTICK_SUPPORT +-#include <linux/joystick.h> ++//#include <linux/joystick.h> ++#endif ++ ++#ifdef __FreeBSD__ ++typedef sig_t SIG_PF; ++#include <err.h> + #endif + + #include "snes9x.h" +@@ -242,7 +247,11 @@ + static volatile bool8 block_signal = FALSE; + static volatile bool8 block_generate_sound = FALSE; + ++#ifdef __FreeBSD__ ++static const char *sound_device = "/dev/dsp"; ++#else + static const char *sound_device = NULL; ++#endif + + static const char *s9x_base_dir = NULL, + *rom_filename = NULL, +@@ -301,8 +310,65 @@ + + #ifdef JOYSTICK_SUPPORT + static uint8 js_mod[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; +-static int js_fd[8] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +-static const char *js_device[8] = { "/dev/js0", "/dev/js1", "/dev/js2", "/dev/js3", "/dev/js4", "/dev/js5", "/dev/js6", "/dev/js7" }; ++#define JOYSTICK_MAX_DEVICES 4 ++int JoystickShift = 0; ++static const char *js_device[4] = { "/dev/uhid0", "/dev/uhid1", "/dev/uhid2", "/dev/uhid3" }; ++#if defined(__FreeBSD__) ++#include <sys/types.h> ++#include <sys/param.h> ++ ++extern "C" { ++#define class klass ++#include <dev/usb/usb.h> ++#include <dev/usb/usbhid.h> ++#undef class ++ ++#include <usbhid.h> ++} ++ ++#define JOYSTICK_MAX_BUTTONS 16 ++ ++#define JOYSTICK_MAP_BUTTON_INITIALIZER \ ++ { \ ++ SNES_Y_MASK, SNES_B_MASK, SNES_A_MASK, \ ++ SNES_X_MASK, SNES_TL_MASK, SNES_TR_MASK, \ ++ SNES_TL_MASK, SNES_TR_MASK, \ ++ SNES_SELECT_MASK, SNES_START_MASK, 0, 0, 0, 0, 0, 0 \ ++ } ++ ++int js_map_button[JOYSTICK_MAX_BUTTONS][16] = { ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER, ++ JOYSTICK_MAP_BUTTON_INITIALIZER ++}; ++struct js_range { ++ int min, max, lower_third, higher_third; ++}; ++struct js_info { ++ char *buf; ++ int reportlen; ++ int offset; ++ struct js_range x, y; ++ int buttons; ++ struct hid_item *hids; ++ int fd; ++ int joy; ++} js_info[4]; ++int js_count = 0; ++#endif + #endif + + #ifdef NETPLAY_SUPPORT +@@ -464,15 +530,44 @@ + if (!strcasecmp(argv[i], "-nogamepad")) + unixSettings.JoystickEnabled = FALSE; + else +- if (!strncasecmp(argv[i], "-paddev", 7) && +- argv[i][7] >= '1' && argv[i][7] <= '8' && argv[i][8] == '\0') +- { +- int j = argv[i][7] - '1'; ++#ifdef __FreeBSD__ ++ if (strcasecmp(argv[i], "-joyshift") == 0) ++ JoystickShift = 1; ++ else ++#endif ++ if (strncasecmp(argv[i], "-paddev", sizeof("-paddev") - 1) == 0) { ++ char *end, *snum = argv[i] + sizeof("-paddev") - 1; ++ unsigned long num; + +- if (i + 1 < argc) +- js_device[j] = argv[++i]; ++ if (*snum == '\0' || argc < i + 1) ++ S9xUsage(); ++ if ((num = strtoul(snum, &end, 10)) < JOYSTICK_MAX_DEVICES && ++ num > 0 && *end == '\0') ++ js_device[num - 1] = argv[++i]; + else ++ S9xUsage (); ++ } ++ else if (strncasecmp(argv[i], "-joymap", sizeof("-joymap") - 1) == 0) { ++ static const int button_masks[] = { ++ SNES_A_MASK, SNES_B_MASK, SNES_X_MASK, SNES_Y_MASK, ++ SNES_TL_MASK, SNES_TR_MASK, SNES_START_MASK, SNES_SELECT_MASK ++ }; ++ char *end, *snum = argv[i] + sizeof("-joymap") - 1; ++ unsigned long num; ++ int *js_buttons, b; ++ ++ if (argc < i + (sizeof(button_masks) / sizeof(int)) || *snum == '\0') ++ S9xUsage(); ++ num = strtoul(snum, &end, 10); ++ if (*end != '\0') + S9xUsage(); ++ if (num == 0 || num > 4) /* hardcode: max joysticks */ ++ S9xUsage(); ++ js_buttons = js_map_button[num - 1]; ++ for (b = 0; b < (sizeof(button_masks) / sizeof(int)); b++) ++ if ((num = strtoul(argv[++i], &end, 10)) <= 16 && num != 0 && ++ end == '\0') ++ js_buttons[num - 1] = button_masks[b]; + } + else + #endif +@@ -1261,7 +1356,7 @@ + } + + #ifdef JOYSTICK_SUPPORT +- ++#ifdef __linux + static void InitJoysticks (void) + { + #ifdef JSIOCGVERSION +@@ -1347,7 +1442,174 @@ + } + #endif + } ++#endif ++#ifdef __FreeBSD__ ++ ++/* ++ * USB HID code for FreeBSD/NetBSD ++ * Brian Feldman <green@FreeBSD.org> ++ * ++ * Reference used: ++ * X-Mame USB HID joystick driver for NetBSD. ++ * ++ * Written by Krister Walfridsson <cato@df.lth.se> ++ */ ++ ++int ++InitJoystickFd(int fd, const char *dev) { ++ report_desc_t rd; ++ struct hid_data *d; ++ struct hid_item h, new_h; ++ struct js_info *my_info; ++ int reportlen, report_id, is_joystick; ++ ++ my_info = &js_info[js_count]; ++ rd = hid_get_report_desc(fd); ++ if (rd == 0) { ++ warn("%s", dev); ++ return (-1); ++ } ++ report_id = 0; ++ reportlen = hid_report_size(rd, hid_input, report_id); ++ my_info->buf = (char *)malloc(reportlen); ++ if (my_info->buf == NULL) ++ err(1, "malloc"); ++ my_info->reportlen = reportlen; ++ my_info->offset = report_id != 0; ++ my_info->buttons = 0; ++ my_info->hids = NULL; ++ is_joystick = 0; ++ for (d = hid_start_parse(rd, 1 << hid_input, report_id); hid_get_item(d, &h);) { ++ int usage, page, link_it = 0; ++ struct js_range *axis; ++ ++ page = HID_PAGE(h.usage); ++ usage = HID_USAGE(h.usage); ++ if (!is_joystick) ++ is_joystick = (h.kind == hid_collection && ++ page == HUP_GENERIC_DESKTOP && ++ (usage == HUG_JOYSTICK || usage == HUG_GAME_PAD)); ++ if (h.kind != hid_input || !is_joystick) ++ continue; ++ axis = NULL; ++ if (page == HUP_GENERIC_DESKTOP) { ++ switch (usage) { ++ case HUG_X: ++ case HUG_RX: ++ axis = &my_info->x; ++ break; ++ case HUG_Y: ++ case HUG_RY: ++ axis = &my_info->y; ++ break; ++ } ++ } ++ if (axis != NULL) { ++ axis->min = h.logical_minimum; ++ axis->max = h.logical_maximum; ++ axis->lower_third = axis->min + (axis->max - axis->min) / 3; ++ axis->higher_third = axis->min + (axis->max - axis->min) * 2 / 3; ++ link_it = 1; ++ } ++ if (!link_it) { ++ if (page != HUP_BUTTON || usage > 16) ++ continue; ++ if (usage > my_info->buttons) ++ my_info->buttons = usage; ++ } ++ new_h = h; ++ new_h.next = my_info->hids; ++ my_info->hids = (struct hid_item *) malloc(sizeof(*my_info->hids)); ++ if (my_info->hids == NULL) ++ err(1, "malloc"); ++ *my_info->hids = new_h; ++ } ++ printf("Joystick %s: %d buttons, X range %d - %d, Y range %d - %d\n", ++ dev, my_info->buttons, my_info->x.min, my_info->x.max, ++ my_info->y.min, my_info->y.max); ++ my_info->fd = fd; ++ if (JoystickShift) { ++ my_info->joy = js_count + 1; ++ } else ++ my_info->joy = js_count; ++ return (0); ++} ++ ++static void InitJoysticks() { ++ int i, fd; ++ ++ for (i = 0; i < (sizeof(js_device) / sizeof(js_device[0])); i++) { ++ fd = open(js_device[i], O_RDONLY | O_NONBLOCK); ++ if (fd == -1) ++ continue; ++ if (InitJoystickFd(fd, js_device[i]) == 0) ++ js_count++; ++ else ++ close(fd); ++ } ++} ++ ++static void ReadJoysticks() { ++ struct hid_item *h; ++ int page, usage, njoy, joy; ++ ++ for (njoy = 0; njoy < js_count; njoy++) { ++ struct js_info *jsi; + ++ jsi = &js_info[njoy]; ++ joy = jsi->joy; ++ ++ if (read(jsi->fd, jsi->buf, jsi->reportlen) != jsi->reportlen) ++ continue; ++ for (h = jsi->hids; h != NULL; h = h->next) { ++ int d; ++ ++ d = hid_get_data(jsi->buf + jsi->offset, h); ++ page = HID_PAGE(h->usage); ++ usage = HID_USAGE(h->usage); ++ ++ switch (page) { ++ case HUP_GENERIC_DESKTOP: ++ switch (usage) { ++ case HUG_X: ++ case HUG_RX: ++ if (d < jsi->x.lower_third) { ++ joypads[joy] |= SNES_LEFT_MASK; ++ joypads[joy] &= ~SNES_RIGHT_MASK; ++ } else if (d < jsi->x.higher_third) { ++ joypads[joy] &= ~SNES_LEFT_MASK; ++ joypads[joy] &= ~SNES_RIGHT_MASK; ++ } else { ++ joypads[joy] &= ~SNES_LEFT_MASK; ++ joypads[joy] |= SNES_RIGHT_MASK; ++ } ++ break; ++ case HUG_Y: ++ case HUG_RY: ++ if (d < jsi->y.lower_third) { ++ joypads[joy] |= SNES_UP_MASK; ++ joypads[joy] &= ~SNES_DOWN_MASK; ++ } else if (d < jsi->y.higher_third) { ++ joypads[joy] &= ~SNES_UP_MASK; ++ joypads[joy] &= ~SNES_DOWN_MASK; ++ } else { ++ joypads[joy] &= ~SNES_UP_MASK; ++ joypads[joy] |= SNES_DOWN_MASK; ++ } ++ break; ++ } ++ break; ++ case HUP_BUTTON: ++ if (d) ++ joypads[joy] |= js_map_button[njoy][usage - 1]; ++ else ++ joypads[joy] &= ~js_map_button[njoy][usage - 1]; ++ break; ++ } ++ } ++ } ++} ++#endif // defined(__FreeBSD__) + #endif + + static void SoundTrigger (void) diff -ruN snes9x.orig/files/patch-unzip-unzip.h snes9x/files/patch-unzip-unzip.h --- snes9x.orig/files/patch-unzip-unzip.h 1970-01-01 03:00:00.000000000 +0300 +++ snes9x/files/patch-unzip-unzip.h 2012-11-30 03:05:39.000000000 +0400 @@ -0,0 +1,34 @@ +--- unzip/unzip.h.orig 2011-04-24 17:38:10.000000000 +0400 ++++ unzip/unzip.h 2012-11-30 03:04:33.000000000 +0400 +@@ -45,12 +45,10 @@ + #ifndef _unz_H + #define _unz_H + +-#ifdef __cplusplus +-extern "C" { +-#endif ++#include <sys/types.h> + + #ifndef _ZLIB_H +-#include "zlib.h" ++#include <zlib.h> + #endif + + #ifndef _ZLIBIOAPI_H +@@ -58,9 +56,15 @@ + #endif + + #ifdef HAVE_BZIP2 +-#include "bzlib.h" ++#include <bzlib.h> ++#endif ++ ++#ifdef __cplusplus ++extern "C" { + #endif + ++#define ZEXPORT ++ + #define Z_BZIP2ED 12 + + #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) diff -ruN snes9x.orig/files/pkg-message.in snes9x/files/pkg-message.in --- snes9x.orig/files/pkg-message.in 2006-12-27 20:27:37.000000000 +0300 +++ snes9x/files/pkg-message.in 2012-11-30 19:07:32.000000000 +0400 @@ -4,7 +4,7 @@ 1) You can run the emulator using: - # (o)snes9x -y2 -ts /path/to/rom_file + # snes9x -v6 /path/to/rom_file 2) You can see all options that you can use with snes9x at: @@ -12,15 +12,15 @@ or only typing: - # (o)snes9x + # snes9x -3) Also you can define a config file, see an example at: +3) Also you can define a config file in - %%DOCSDIR%%/snes9x.conf.default +${HOME}/.config/snes9x/snes9x.conf or - and you can select this config file using: +${PREFIX}/etc/snes9x/snes9x.conf (default conf file) - # (o)snes9x -conf /path/to/conf_file +Example in ${DOCSDIR}/snes9x.conf.default 4) Enjoy it ;) >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211301648.qAUGmkIN076416>